mirror of
				https://git.hush.is/hush/hush3.git
				synced 2025-11-04 00:03:26 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			9073 lines
		
	
	
		
			939 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			9073 lines
		
	
	
		
			939 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
diff -crB ./configure.ac ../../komodo-jl777/configure.ac
 | 
						||
*** ./configure.ac	2017-01-03 10:40:50.155326332 +0000
 | 
						||
--- ../../komodo-jl777/configure.ac	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 2,8 ****
 | 
						||
  AC_PREREQ([2.60])
 | 
						||
  define(_CLIENT_VERSION_MAJOR, 1)
 | 
						||
  define(_CLIENT_VERSION_MINOR, 0)
 | 
						||
! define(_CLIENT_VERSION_REVISION, 0)
 | 
						||
  define(_CLIENT_VERSION_BUILD, 50)
 | 
						||
  define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
 | 
						||
  define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
 | 
						||
--- 2,8 ----
 | 
						||
  AC_PREREQ([2.60])
 | 
						||
  define(_CLIENT_VERSION_MAJOR, 1)
 | 
						||
  define(_CLIENT_VERSION_MINOR, 0)
 | 
						||
! define(_CLIENT_VERSION_REVISION, 3)
 | 
						||
  define(_CLIENT_VERSION_BUILD, 50)
 | 
						||
  define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
 | 
						||
  define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
 | 
						||
Only in ../../komodo-jl777/contrib: bitcoin-cli.bash-completion
 | 
						||
diff -crB ./contrib/bitcoind.bash-completion ../../komodo-jl777/contrib/bitcoind.bash-completion
 | 
						||
*** ./contrib/bitcoind.bash-completion	2017-01-03 10:40:50.159326534 +0000
 | 
						||
--- ../../komodo-jl777/contrib/bitcoind.bash-completion	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,102 ****
 | 
						||
! # bash programmable completion for bitcoind(1) and bitcoin-cli(1)
 | 
						||
! # Copyright (c) 2012,2014 Christian von Roques <roques@mti.ag>
 | 
						||
  # Distributed under the MIT software license, see the accompanying
 | 
						||
  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
 | 
						||
  
 | 
						||
! have bitcoind && {
 | 
						||
! 
 | 
						||
! # call $bitcoind for RPC
 | 
						||
! _bitcoin_rpc() {
 | 
						||
!     # determine already specified args necessary for RPC
 | 
						||
!     local rpcargs=()
 | 
						||
!     for i in ${COMP_LINE}; do
 | 
						||
!         case "$i" in
 | 
						||
!             -conf=*|-proxy*|-rpc*)
 | 
						||
!                 rpcargs=( "${rpcargs[@]}" "$i" )
 | 
						||
!                 ;;
 | 
						||
!         esac
 | 
						||
!     done
 | 
						||
!     $bitcoind "${rpcargs[@]}" "$@"
 | 
						||
! }
 | 
						||
! 
 | 
						||
! # Add bitcoin accounts to COMPREPLY
 | 
						||
! _bitcoin_accounts() {
 | 
						||
!     local accounts
 | 
						||
!     accounts=$(_bitcoin_rpc listaccounts | awk '/".*"/ { a=$1; gsub(/"/, "", a); print a}')
 | 
						||
!     COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) )
 | 
						||
! }
 | 
						||
! 
 | 
						||
! _bitcoind() {
 | 
						||
      local cur prev words=() cword
 | 
						||
      local bitcoind
 | 
						||
  
 | 
						||
!     # save and use original argument to invoke bitcoind
 | 
						||
!     # bitcoind might not be in $PATH
 | 
						||
      bitcoind="$1"
 | 
						||
  
 | 
						||
      COMPREPLY=()
 | 
						||
      _get_comp_words_by_ref -n = cur prev words cword
 | 
						||
  
 | 
						||
-     if ((cword > 4)); then
 | 
						||
-         case ${words[cword-4]} in
 | 
						||
-             listtransactions)
 | 
						||
-                 COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
 | 
						||
-                 return 0
 | 
						||
-                 ;;
 | 
						||
-             signrawtransaction)
 | 
						||
-                 COMPREPLY=( $( compgen -W "ALL NONE SINGLE ALL|ANYONECANPAY NONE|ANYONECANPAY SINGLE|ANYONECANPAY" -- "$cur" ) )
 | 
						||
-                 return 0
 | 
						||
-                 ;;
 | 
						||
-         esac
 | 
						||
-     fi
 | 
						||
- 
 | 
						||
-     if ((cword > 3)); then
 | 
						||
-         case ${words[cword-3]} in
 | 
						||
-             addmultisigaddress)
 | 
						||
-                 _bitcoin_accounts
 | 
						||
-                 return 0
 | 
						||
-                 ;;
 | 
						||
-             getbalance|gettxout|importaddress|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock)
 | 
						||
-                 COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
 | 
						||
-                 return 0
 | 
						||
-                 ;;
 | 
						||
-         esac
 | 
						||
-     fi
 | 
						||
- 
 | 
						||
-     if ((cword > 2)); then
 | 
						||
-         case ${words[cword-2]} in
 | 
						||
-             addnode)
 | 
						||
-                 COMPREPLY=( $( compgen -W "add remove onetry" -- "$cur" ) )
 | 
						||
-                 return 0
 | 
						||
-                 ;;
 | 
						||
-             getblock|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction)
 | 
						||
-                 COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
 | 
						||
-                 return 0
 | 
						||
-                 ;;
 | 
						||
-             move|setaccount)
 | 
						||
-                 _bitcoin_accounts
 | 
						||
-                 return 0
 | 
						||
-                 ;;
 | 
						||
-         esac
 | 
						||
-     fi
 | 
						||
- 
 | 
						||
-     case "$prev" in
 | 
						||
-         backupwallet|dumpwallet|importwallet)
 | 
						||
-             _filedir
 | 
						||
-             return 0
 | 
						||
-             ;;
 | 
						||
-         getmempool|lockunspent|setgenerate)
 | 
						||
-             COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
 | 
						||
-             return 0
 | 
						||
-             ;;
 | 
						||
-         getaccountaddress|getaddressesbyaccount|getbalance|getnewaddress|getreceivedbyaccount|listtransactions|move|sendfrom|sendmany)
 | 
						||
-             _bitcoin_accounts
 | 
						||
-             return 0
 | 
						||
-             ;;
 | 
						||
-     esac
 | 
						||
- 
 | 
						||
      case "$cur" in
 | 
						||
!         -conf=*|-pid=*|-loadblock=*|-wallet=*|-rpcsslcertificatechainfile=*|-rpcsslprivatekeyfile=*)
 | 
						||
              cur="${cur#*=}"
 | 
						||
              _filedir
 | 
						||
              return 0
 | 
						||
--- 1,21 ----
 | 
						||
! # bash programmable completion for bitcoind(1) and bitcoin-qt(1)
 | 
						||
! # Copyright (c) 2012-2016 The Bitcoin Core developers
 | 
						||
  # Distributed under the MIT software license, see the accompanying
 | 
						||
  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
 | 
						||
  
 | 
						||
! _zcashd() {
 | 
						||
      local cur prev words=() cword
 | 
						||
      local bitcoind
 | 
						||
  
 | 
						||
!     # save and use original argument to invoke bitcoind for -help
 | 
						||
!     # it might not be in $PATH
 | 
						||
      bitcoind="$1"
 | 
						||
  
 | 
						||
      COMPREPLY=()
 | 
						||
      _get_comp_words_by_ref -n = cur prev words cword
 | 
						||
  
 | 
						||
      case "$cur" in
 | 
						||
!         -conf=*|-pid=*|-loadblock=*|-rootcertificates=*|-rpccookiefile=*|-wallet=*|-rpcsslcertificatechainfile=*|-rpcsslprivatekeyfile=*)
 | 
						||
              cur="${cur#*=}"
 | 
						||
              _filedir
 | 
						||
              return 0
 | 
						||
***************
 | 
						||
*** 110,129 ****
 | 
						||
              return 0
 | 
						||
              ;;
 | 
						||
          *)
 | 
						||
-             local helpopts commands
 | 
						||
  
 | 
						||
!             # only parse --help if senseful
 | 
						||
              if [[ -z "$cur" || "$cur" =~ ^- ]]; then
 | 
						||
!                 helpopts=$($bitcoind --help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' )
 | 
						||
              fi
 | 
						||
  
 | 
						||
-             # only parse help if senseful
 | 
						||
-             if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then
 | 
						||
-                 commands=$(_bitcoin_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }')
 | 
						||
-             fi
 | 
						||
- 
 | 
						||
-             COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) )
 | 
						||
- 
 | 
						||
              # Prevent space if an argument is desired
 | 
						||
              if [[ $COMPREPLY == *= ]]; then
 | 
						||
                  compopt -o nospace
 | 
						||
--- 29,42 ----
 | 
						||
              return 0
 | 
						||
              ;;
 | 
						||
          *)
 | 
						||
  
 | 
						||
!             # only parse -help if senseful
 | 
						||
              if [[ -z "$cur" || "$cur" =~ ^- ]]; then
 | 
						||
!                 local helpopts
 | 
						||
!                 helpopts=$($bitcoind -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' )
 | 
						||
!                 COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) )
 | 
						||
              fi
 | 
						||
  
 | 
						||
              # Prevent space if an argument is desired
 | 
						||
              if [[ $COMPREPLY == *= ]]; then
 | 
						||
                  compopt -o nospace
 | 
						||
***************
 | 
						||
*** 131,140 ****
 | 
						||
              return 0
 | 
						||
              ;;
 | 
						||
      esac
 | 
						||
! }
 | 
						||
! 
 | 
						||
! complete -F _bitcoind bitcoind bitcoin-cli
 | 
						||
! }
 | 
						||
  
 | 
						||
  # Local variables:
 | 
						||
  # mode: shell-script
 | 
						||
--- 44,51 ----
 | 
						||
              return 0
 | 
						||
              ;;
 | 
						||
      esac
 | 
						||
! } &&
 | 
						||
! complete -F _zcashd zcashd
 | 
						||
  
 | 
						||
  # Local variables:
 | 
						||
  # mode: shell-script
 | 
						||
Only in ../../komodo-jl777/contrib: bitcoin-tx.bash-completion
 | 
						||
diff -crB ./contrib/DEBIAN/changelog ../../komodo-jl777/contrib/DEBIAN/changelog
 | 
						||
*** ./contrib/DEBIAN/changelog	2017-01-03 10:40:50.155326332 +0000
 | 
						||
--- ../../komodo-jl777/contrib/DEBIAN/changelog	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,3 ****
 | 
						||
--- 1,21 ----
 | 
						||
+ zcash (1.0.3) jessie; urgency=medium
 | 
						||
+ 
 | 
						||
+   * 1.0.3 release.
 | 
						||
+ 
 | 
						||
+  -- Zcash Company <team@z.cash>  Wed, 17 Nov 2016 15:56:00 -0700
 | 
						||
+ 
 | 
						||
+ zcash (1.0.2) jessie; urgency=medium
 | 
						||
+ 
 | 
						||
+   * 1.0.2 release.
 | 
						||
+ 
 | 
						||
+  -- Zcash Company <team@z.cash>  Mon, 07 Nov 2016 19:01:35 -0600
 | 
						||
+ 
 | 
						||
+ zcash (1.0.1) jessie; urgency=medium
 | 
						||
+ 
 | 
						||
+   * 1.0.1 release.
 | 
						||
+ 
 | 
						||
+  -- Zcash Company <team@z.cash>  Thu, 03 Nov 2016 23:21:09 -0500
 | 
						||
+ 
 | 
						||
  zcash (1.0.0-sprout) jessie; urgency=medium
 | 
						||
  
 | 
						||
    * 1.0.0 release.
 | 
						||
diff -crB ./contrib/DEBIAN/control ../../komodo-jl777/contrib/DEBIAN/control
 | 
						||
*** ./contrib/DEBIAN/control	2017-01-03 10:40:50.155326332 +0000
 | 
						||
--- ../../komodo-jl777/contrib/DEBIAN/control	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 10,16 ****
 | 
						||
  Vcs-Git: https://github.com/zcash/zcash.git
 | 
						||
  Vcs-Browser: https://github.com/zcash/zcash
 | 
						||
  Package: zcash
 | 
						||
! Version: 1.0.0-sprout
 | 
						||
  Architecture: amd64
 | 
						||
  Depends: libgomp1
 | 
						||
  Description: An implementation of the "Zerocash" protocol.
 | 
						||
--- 10,16 ----
 | 
						||
  Vcs-Git: https://github.com/zcash/zcash.git
 | 
						||
  Vcs-Browser: https://github.com/zcash/zcash
 | 
						||
  Package: zcash
 | 
						||
! Version: 1.0.3
 | 
						||
  Architecture: amd64
 | 
						||
  Depends: libgomp1
 | 
						||
  Description: An implementation of the "Zerocash" protocol.
 | 
						||
diff -crB ./contrib/DEBIAN/manpages/zcash-cli.1 ../../komodo-jl777/contrib/DEBIAN/manpages/zcash-cli.1
 | 
						||
*** ./contrib/DEBIAN/manpages/zcash-cli.1	2017-01-03 10:40:50.155326332 +0000
 | 
						||
--- ../../komodo-jl777/contrib/DEBIAN/manpages/zcash-cli.1	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,9 ****
 | 
						||
  .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
 | 
						||
! .TH ZCASH-CLI "1" "October 2016" "Zcash RPC client version v1.0.0-409dcb7" "User Commands"
 | 
						||
  .SH NAME
 | 
						||
  zcash-cli \- RPC client for the Zcash daemon
 | 
						||
  .SH DESCRIPTION
 | 
						||
! Zcash RPC client version v1.0.0
 | 
						||
  .SS "Usage:"
 | 
						||
  .TP
 | 
						||
  zcash\-cli [options] <command> [params]
 | 
						||
--- 1,9 ----
 | 
						||
  .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
 | 
						||
! .TH ZCASH-CLI "1" "November 2016" "Zcash RPC client version v1.0.3" "User Commands"
 | 
						||
  .SH NAME
 | 
						||
  zcash-cli \- RPC client for the Zcash daemon
 | 
						||
  .SH DESCRIPTION
 | 
						||
! Zcash RPC client version v1.0.3
 | 
						||
  .SS "Usage:"
 | 
						||
  .TP
 | 
						||
  zcash\-cli [options] <command> [params]
 | 
						||
diff -crB ./contrib/DEBIAN/manpages/zcashd.1 ../../komodo-jl777/contrib/DEBIAN/manpages/zcashd.1
 | 
						||
*** ./contrib/DEBIAN/manpages/zcashd.1	2017-01-03 10:40:50.155326332 +0000
 | 
						||
--- ../../komodo-jl777/contrib/DEBIAN/manpages/zcashd.1	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,9 ****
 | 
						||
  .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
 | 
						||
! .TH ZCASHD "1" "October 2016" "Zcash Daemon version v1.0.0-409dcb7" "User Commands"
 | 
						||
  .SH NAME
 | 
						||
  zcashd \- Network daemon for interacting with the Zcash blockchain
 | 
						||
  .SH DESCRIPTION
 | 
						||
! Zcash Daemon version v1.0.0
 | 
						||
  .SS "Usage:"
 | 
						||
  .TP
 | 
						||
  zcashd [options]
 | 
						||
--- 1,9 ----
 | 
						||
  .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
 | 
						||
! .TH ZCASHD "1" "November 2016" "Zcash Daemon version v1.0.3" "User Commands"
 | 
						||
  .SH NAME
 | 
						||
  zcashd \- Network daemon for interacting with the Zcash blockchain
 | 
						||
  .SH DESCRIPTION
 | 
						||
! Zcash Daemon version v1.0.3
 | 
						||
  .SS "Usage:"
 | 
						||
  .TP
 | 
						||
  zcashd [options]
 | 
						||
***************
 | 
						||
*** 62,68 ****
 | 
						||
  .HP
 | 
						||
  \fB\-par=\fR<n>
 | 
						||
  .IP
 | 
						||
! Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 =
 | 
						||
  leave that many cores free, default: 0)
 | 
						||
  .HP
 | 
						||
  \fB\-pid=\fR<file>
 | 
						||
--- 62,68 ----
 | 
						||
  .HP
 | 
						||
  \fB\-par=\fR<n>
 | 
						||
  .IP
 | 
						||
! Set the number of script verification threads (\fB\-8\fR to 16, 0 = auto, <0 =
 | 
						||
  leave that many cores free, default: 0)
 | 
						||
  .HP
 | 
						||
  \fB\-pid=\fR<file>
 | 
						||
diff -crB ./contrib/gitian-descriptors/gitian-linux.yml ../../komodo-jl777/contrib/gitian-descriptors/gitian-linux.yml
 | 
						||
*** ./contrib/gitian-descriptors/gitian-linux.yml	2017-01-03 10:40:50.159326534 +0000
 | 
						||
--- ../../komodo-jl777/contrib/gitian-descriptors/gitian-linux.yml	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,5 ****
 | 
						||
  ---
 | 
						||
! name: "zcash-1.0.0"
 | 
						||
  enable_cache: true
 | 
						||
  distro: "debian"
 | 
						||
  suites:
 | 
						||
--- 1,5 ----
 | 
						||
  ---
 | 
						||
! name: "zcash-1.0.3"
 | 
						||
  enable_cache: true
 | 
						||
  distro: "debian"
 | 
						||
  suites:
 | 
						||
diff -crB ./depends/packages/miniupnpc.mk ../../komodo-jl777/depends/packages/miniupnpc.mk
 | 
						||
*** ./depends/packages/miniupnpc.mk	2017-01-03 10:40:50.179327547 +0000
 | 
						||
--- ../../komodo-jl777/depends/packages/miniupnpc.mk	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 3,8 ****
 | 
						||
--- 3,9 ----
 | 
						||
  $(package)_download_path=http://miniupnp.free.fr/files
 | 
						||
  $(package)_file_name=$(package)-$($(package)_version).tar.gz
 | 
						||
  $(package)_sha256_hash=d434ceb8986efbe199c5ca53f90ed53eab290b1e6d0530b717eb6fa49d61f93b
 | 
						||
+ $(package)_patches=fix-solaris-compilation.patch strlen-before-memcmp.patch patch-strlen-patch.patch
 | 
						||
  
 | 
						||
  define $(package)_set_vars
 | 
						||
  $(package)_build_opts=CC="$($(package)_cc)"
 | 
						||
***************
 | 
						||
*** 14,20 ****
 | 
						||
  define $(package)_preprocess_cmds
 | 
						||
    mkdir dll && \
 | 
						||
    sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \
 | 
						||
!   sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw
 | 
						||
  endef
 | 
						||
  
 | 
						||
  define $(package)_build_cmds
 | 
						||
--- 15,24 ----
 | 
						||
  define $(package)_preprocess_cmds
 | 
						||
    mkdir dll && \
 | 
						||
    sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \
 | 
						||
!   sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw && \
 | 
						||
!   patch -p2 < $($(package)_patch_dir)/fix-solaris-compilation.patch && \
 | 
						||
!   patch -p2 < $($(package)_patch_dir)/strlen-before-memcmp.patch && \
 | 
						||
!   patch -p2 < $($(package)_patch_dir)/patch-strlen-patch.patch
 | 
						||
  endef
 | 
						||
  
 | 
						||
  define $(package)_build_cmds
 | 
						||
Only in ../../komodo-jl777/depends/patches: miniupnpc
 | 
						||
Only in ../../komodo-jl777/doc: authors.md
 | 
						||
diff -crB ./doc/developer-notes.md ../../komodo-jl777/doc/developer-notes.md
 | 
						||
*** ./doc/developer-notes.md	2017-01-03 10:40:50.191328153 +0000
 | 
						||
--- ../../komodo-jl777/doc/developer-notes.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 102,108 ****
 | 
						||
  If the code is behaving strangely, take a look in the debug.log file in the data directory;
 | 
						||
  error and debugging messages are written there.
 | 
						||
  
 | 
						||
! The -debug=... command-line option controls debugging; running with just -debug will turn
 | 
						||
  on all categories (and give you a very large debug.log file).
 | 
						||
  
 | 
						||
  The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
 | 
						||
--- 102,108 ----
 | 
						||
  If the code is behaving strangely, take a look in the debug.log file in the data directory;
 | 
						||
  error and debugging messages are written there.
 | 
						||
  
 | 
						||
! The -debug=... command-line option controls debugging; running with just -debug or -debug=1 will turn
 | 
						||
  on all categories (and give you a very large debug.log file).
 | 
						||
  
 | 
						||
  The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
 | 
						||
diff -crB ./doc/payment-api.md ../../komodo-jl777/doc/payment-api.md
 | 
						||
*** ./doc/payment-api.md	2017-01-03 10:40:50.191328153 +0000
 | 
						||
--- ../../komodo-jl777/doc/payment-api.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 29,35 ****
 | 
						||
  RPC calls by category:
 | 
						||
  
 | 
						||
  * Accounting: z_getbalance, z_gettotalbalance
 | 
						||
! * Addresses : z_getnewaddress, z_listaddresses
 | 
						||
  * Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
 | 
						||
  * Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
 | 
						||
  * Payment : z_listreceivedbyaddress, z_sendmany
 | 
						||
--- 29,35 ----
 | 
						||
  RPC calls by category:
 | 
						||
  
 | 
						||
  * Accounting: z_getbalance, z_gettotalbalance
 | 
						||
! * Addresses : z_getnewaddress, z_listaddresses, z_validateaddress
 | 
						||
  * Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
 | 
						||
  * Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
 | 
						||
  * Payment : z_listreceivedbyaddress, z_sendmany
 | 
						||
***************
 | 
						||
*** 55,60 ****
 | 
						||
--- 55,61 ----
 | 
						||
  --- | --- | ---
 | 
						||
  z_getnewaddress | | Return a new zaddr for sending and receiving payments. The spending key for this zaddr will be added to the node’s wallet.<br><br>Output:<br>zN68D8hSs3...
 | 
						||
  z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for which you have a spending key.<br><br>Output:<br>{ [“z123…”, “z456...”, “z789...”] }
 | 
						||
+ z_validateaddress | | Return information about a given zaddr.<br><br>Output:<br>{"isvalid" : true,<br>"address" : "zcWsmq...",<br>"payingkey" : "f5bb3c...",<br>"transmissionkey" : "7a58c7...",<br>"ismine" : true}
 | 
						||
  
 | 
						||
  ### Key Management
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 70,76 ****
 | 
						||
  Command | Parameters | Description
 | 
						||
  --- | --- | ---
 | 
						||
  z_listreceivedbyaddress<br> | zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.<br><br>Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result.  Use 0 to count unconfirmed transactions.<br><br>Output:<br>[{<br>“txid”: “4a0f…”,<br>“amount”: 0.54,<br>“memo”:”F0FF…”,}, {...}, {...}<br>]
 | 
						||
! z_sendmany<br> | fromaddress amounts [minconf=1] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs.  The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay.  Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>The transaction fee will be determined by the node’s wallet.  Any transparent change will be sent to a new transparent address.  Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid.  You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
 | 
						||
  
 | 
						||
  ### Operations
 | 
						||
  
 | 
						||
--- 71,77 ----
 | 
						||
  Command | Parameters | Description
 | 
						||
  --- | --- | ---
 | 
						||
  z_listreceivedbyaddress<br> | zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.<br><br>Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result.  Use 0 to count unconfirmed transactions.<br><br>Output:<br>[{<br>“txid”: “4a0f…”,<br>“amount”: 0.54,<br>“memo”:”F0FF…”,}, {...}, {...}<br>]
 | 
						||
! z_sendmany<br> | fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs.  The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay.  Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>Optionally set a transaction fee, which by default is 0.0001 ZEC.<br><br>Any transparent change will be sent to a new transparent address.  Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid.  You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
 | 
						||
  
 | 
						||
  ### Operations
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 97,99 ****
 | 
						||
--- 98,168 ----
 | 
						||
  z_getoperationresult <br>| [operationids] | Return OperationStatus JSON objects for all completed operations the node is currently aware of, and then remove the operation from memory.<br><br>Operationids is an optional array to filter which operations you want to receive status objects for.<br><br>Output is a list of operation status objects, where the status is either "failed", "cancelled" or "success".<br>[<br>{“operationid”: “opid-11ee…”,<br>“status”: “cancelled”},<br>{“operationid”: “opid-9876”, “status”: ”failed”},<br>{“operationid”: “opid-0e0e”,<br>“status”:”success”,<br>“execution_time”:”25”,<br>“result”: {“txid”:”af3887654…”,...}<br>},<br>]
 | 
						||
  z_getoperationstatus <br>| [operationids] | Return OperationStatus JSON objects for all operations the node is currently aware of.<br><br>Operationids is an optional array to filter which operations you want to receive status objects for.<br><br>Output is a list of operation status objects.<br>[<br>{“operationid”: “opid-12ee…”,<br>“status”: “queued”},<br>{“operationid”: “opd-098a…”, “status”: ”executing”},<br>{“operationid”: “opid-9876”, “status”: ”failed”}<br>]<br><br>When the operation succeeds, the status object will also include the result.<br><br>{“operationid”: “opid-0e0e”,<br>“status”:”success”,<br>“execution_time”:”25”,<br>“result”: {“txid”:”af3887654…”,...}<br>}
 | 
						||
  z_listoperationids <br>| [state] | Return a list of operationids for all operations which the node is currently aware of.<br><br>State is an optional string parameter to filter the operations you want listed by their state.  Acceptable parameter values are ‘queued’, ‘executing’, ‘success’, ‘failed’, ‘cancelled’.<br><br>[“opid-0e0e…”, “opid-1af4…”, … ]
 | 
						||
+ 
 | 
						||
+ ## Asynchronous RPC call Error Codes
 | 
						||
+ 
 | 
						||
+ Zcash error codes are defined in https://github.com/zcash/zcash/blob/master/src/rpcprotocol.h
 | 
						||
+ 
 | 
						||
+ ### z_sendmany error codes
 | 
						||
+ 
 | 
						||
+ RPC_INVALID_PARAMETER (-8) | _Invalid, missing or duplicate parameter_
 | 
						||
+ ---------------------------| -------------------------------------------------
 | 
						||
+ "Minconf cannot be negative" | Cannot accept negative minimum confirmation number.
 | 
						||
+ "Minimum number of confirmations cannot be less than 0" | Cannot accept negative minimum confirmation number.
 | 
						||
+ "From address parameter missing" | Missing an address to send funds from.
 | 
						||
+ "No recipients" | Missing recipient addresses.
 | 
						||
+ "Memo must be in hexadecimal format" | Encrypted memo field data must be in hexadecimal format.
 | 
						||
+ "Memo size of __ is too big, maximum allowed is __ " | Encrypted memo field data exceeds maximum size of 512 bytes.
 | 
						||
+ "From address does not belong to this node, zaddr spending key not found." | Sender address spending key not found.
 | 
						||
+ "Invalid parameter, expected object" | Expected object.
 | 
						||
+ "Invalid parameter, unknown key: __" | Unknown key.
 | 
						||
+ "Invalid parameter, expected valid size" | Invalid size.
 | 
						||
+ "Invalid parameter, expected hex txid" | Invalid txid.
 | 
						||
+ "Invalid parameter, vout must be positive" | Invalid vout.
 | 
						||
+ "Invalid parameter, duplicated address" | Address is duplicated.
 | 
						||
+ "Invalid parameter, amounts array is empty" | Amounts array is empty.
 | 
						||
+ "Invalid parameter, unknown key" | Key not found.
 | 
						||
+ "Invalid parameter, unknown address format" | Unknown address format.
 | 
						||
+ "Invalid parameter, size of memo" | Invalid memo field size.
 | 
						||
+ "Invalid parameter, amount must be positive" | Invalid or negative amount.
 | 
						||
+ "Invalid parameter, too many zaddr outputs" | z_address outputs exceed maximum allowed.
 | 
						||
+ "Invalid parameter, expected memo data in hexadecimal format" | Encrypted memo field is not in hexadecimal format.
 | 
						||
+ "Invalid parameter, size of memo is larger than maximum allowed __ " | Encrypted memo field data exceeds maximum size of 512 bytes.
 | 
						||
+ 
 | 
						||
+ 
 | 
						||
+ RPC_INVALID_ADDRESS_OR_KEY (-5) | _Invalid address or key_
 | 
						||
+ --------------------------------| ---------------------------
 | 
						||
+ "Invalid from address, no spending key found for zaddr" | z_address spending key not found.
 | 
						||
+ "Invalid output address, not a valid taddr."            | Transparent output address is invalid.
 | 
						||
+ "Invalid from address, should be a taddr or zaddr."     | Sender address is invalid.
 | 
						||
+ "From address does not belong to this node, zaddr spending key not found."  | Sender address spending key not found.
 | 
						||
+ 
 | 
						||
+ 
 | 
						||
+ RPC_WALLET_INSUFFICIENT_FUNDS (-6) | _Not enough funds in wallet or account_
 | 
						||
+ -----------------------------------| ------------------------------------------
 | 
						||
+ "Insufficient funds, no UTXOs found for taddr from address." | Insufficient funds for sending address.
 | 
						||
+ "Could not find any non-coinbase UTXOs to spend. Coinbase UTXOs can only be sent to a single zaddr recipient." | Must send Coinbase UTXO to a single z_address.
 | 
						||
+ "Could not find any non-coinbase UTXOs to spend." | No available non-coinbase UTXOs.
 | 
						||
+ "Insufficient funds, no unspent notes found for zaddr from address." | Insufficient funds for sending address.
 | 
						||
+ "Insufficient transparent funds, have __, need __ plus fee __" | Insufficient funds from transparent address.
 | 
						||
+ "Insufficient protected funds, have __, need __ plus fee __" | Insufficient funds from shielded address.
 | 
						||
+ 
 | 
						||
+ RPC_WALLET_ERROR (-4) | _Unspecified problem with wallet_
 | 
						||
+ ----------------------| -------------------------------------
 | 
						||
+ "Could not find previous JoinSplit anchor" | Try restarting node with `-reindex`.
 | 
						||
+ "Error decrypting output note of previous JoinSplit: __"  |
 | 
						||
+ "Could not find witness for note commitment" | Try restarting node with `-reindex`.
 | 
						||
+ "Witness for note commitment is null" | Missing witness for note commitement.
 | 
						||
+ "Witness for spendable note does not have same anchor as change input" | Invalid anchor for spendable note witness.
 | 
						||
+ "Not enough funds to pay miners fee" | Retry with sufficient funds.
 | 
						||
+ "Missing hex data for raw transaction" | Raw transaction data is null.
 | 
						||
+ "Missing hex data for signed transaction" | Hex value for signed transaction is null.
 | 
						||
+ "Send raw transaction did not return an error or a txid." |
 | 
						||
+ 
 | 
						||
+ RPC_WALLET_ENCRYPTION_FAILED (-16)                                       | _Failed to encrypt the wallet_
 | 
						||
+ -------------------------------------------------------------------------| -------------------------------------
 | 
						||
+ "Failed to sign transaction"                                             | Transaction was not signed, sign transaction and retry.
 | 
						||
+ 
 | 
						||
+ RPC_WALLET_KEYPOOL_RAN_OUT (-12)                                         | _Keypool ran out, call keypoolrefill first_
 | 
						||
+ -------------------------------------------------------------------------| -----------------------------------------------
 | 
						||
+ "Could not generate a taddr to use as a change address"                  | Call keypoolrefill and retry.
 | 
						||
diff -crB ./doc/release-notes/release-notes-0.11.2.z6.md ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z6.md
 | 
						||
*** ./doc/release-notes/release-notes-0.11.2.z6.md	2017-01-03 10:40:50.191328153 +0000
 | 
						||
--- ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z6.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,19 ****
 | 
						||
! Jack Grigg:
 | 
						||
        Equihash: Only compare the first n/(k+1) bits when sorting.
 | 
						||
        Randomise the nonce in the block header.
 | 
						||
        Clear mempool before using it for benchmark test, fix parameter name.
 | 
						||
        Fix memory leak in large tx benchmark.
 | 
						||
  
 | 
						||
! Sean Bowe:
 | 
						||
        Increase block size to 2MB and update performance test.
 | 
						||
        Make sigop limit `20000` just as in Bitcoin, ignoring our change to the blocksize limit.
 | 
						||
        Remove the mainnet checkpoints.
 | 
						||
        Fix performance test for block verification.
 | 
						||
        Make `validatelargetx` test more accurate.
 | 
						||
  
 | 
						||
! Taylor Hornby:
 | 
						||
        Add example mock test of CheckTransaction.
 | 
						||
  
 | 
						||
! aniemerg:
 | 
						||
        Suppress Libsnark Debugging Info.
 | 
						||
- 
 | 
						||
--- 1,18 ----
 | 
						||
! Jack Grigg (4):
 | 
						||
        Equihash: Only compare the first n/(k+1) bits when sorting.
 | 
						||
        Randomise the nonce in the block header.
 | 
						||
        Clear mempool before using it for benchmark test, fix parameter name.
 | 
						||
        Fix memory leak in large tx benchmark.
 | 
						||
  
 | 
						||
! Sean Bowe (5):
 | 
						||
        Increase block size to 2MB and update performance test.
 | 
						||
        Make sigop limit `20000` just as in Bitcoin, ignoring our change to the blocksize limit.
 | 
						||
        Remove the mainnet checkpoints.
 | 
						||
        Fix performance test for block verification.
 | 
						||
        Make `validatelargetx` test more accurate.
 | 
						||
  
 | 
						||
! Taylor Hornby (1):
 | 
						||
        Add example mock test of CheckTransaction.
 | 
						||
  
 | 
						||
! aniemerg (1):
 | 
						||
        Suppress Libsnark Debugging Info.
 | 
						||
diff -crB ./doc/release-notes/release-notes-0.11.2.z9.md ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z9.md
 | 
						||
*** ./doc/release-notes/release-notes-0.11.2.z9.md	2017-01-03 10:40:50.191328153 +0000
 | 
						||
--- ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z9.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,5 ****
 | 
						||
! 
 | 
						||
! Sean Bowe:
 | 
						||
        Change memo field size and relocate `ciphertexts` field of JoinSplit description.
 | 
						||
        Implement zkSNARK compression.
 | 
						||
        Perform curve parameter initialization at start of gtest suite.
 | 
						||
--- 1,4 ----
 | 
						||
! Sean Bowe (6):
 | 
						||
        Change memo field size and relocate `ciphertexts` field of JoinSplit description.
 | 
						||
        Implement zkSNARK compression.
 | 
						||
        Perform curve parameter initialization at start of gtest suite.
 | 
						||
***************
 | 
						||
*** 7,13 ****
 | 
						||
        Enable MONTGOMERY_OUTPUT everywhere.
 | 
						||
        Update proving/verifying keys.
 | 
						||
  
 | 
						||
! Jack Grigg:
 | 
						||
        Add support for spending keys to the basic key store.
 | 
						||
        Merge AddSpendingKeyPaymentAddress into AddSpendingKey to simplify API.
 | 
						||
        Add methods for byte array expansion and compression.
 | 
						||
--- 6,12 ----
 | 
						||
        Enable MONTGOMERY_OUTPUT everywhere.
 | 
						||
        Update proving/verifying keys.
 | 
						||
  
 | 
						||
! Jack Grigg (11):
 | 
						||
        Add support for spending keys to the basic key store.
 | 
						||
        Merge AddSpendingKeyPaymentAddress into AddSpendingKey to simplify API.
 | 
						||
        Add methods for byte array expansion and compression.
 | 
						||
***************
 | 
						||
*** 20,26 ****
 | 
						||
        Add separate lock for SpendingKey key store operations.
 | 
						||
        Test conversion between solution indices and minimal representation.
 | 
						||
  
 | 
						||
! Daira Hopwood:
 | 
						||
        Move bigint arithmetic implementations to libsnark.
 | 
						||
        Add mostly-static checks on consistency of Equihash parameters, MAX_HEADERS_RESULTS, and MAX_PROTOCOL_MESSAGE_LENGTH.
 | 
						||
        Change some asserts in equihash.cpp to be static.
 | 
						||
--- 19,25 ----
 | 
						||
        Add separate lock for SpendingKey key store operations.
 | 
						||
        Test conversion between solution indices and minimal representation.
 | 
						||
  
 | 
						||
! Daira Hopwood (6):
 | 
						||
        Move bigint arithmetic implementations to libsnark.
 | 
						||
        Add mostly-static checks on consistency of Equihash parameters, MAX_HEADERS_RESULTS, and MAX_PROTOCOL_MESSAGE_LENGTH.
 | 
						||
        Change some asserts in equihash.cpp to be static.
 | 
						||
***************
 | 
						||
*** 28,57 ****
 | 
						||
        Increment version numbers for z9 release.
 | 
						||
        Add these release notes for z9.
 | 
						||
  
 | 
						||
! Taylor Hornby:
 | 
						||
        Disable hardening when building for coverage reports.
 | 
						||
        Upgrade libsodium for AVX2-detection bugfix.
 | 
						||
        Fix inconsistent optimization flags; single source of truth.
 | 
						||
        Add -fwrapv -fno-strict-aliasing; fix libzcash flags.
 | 
						||
        Use libsodium's s < L check, instead checking that libsodium checks that.
 | 
						||
  
 | 
						||
! Simon Liu:
 | 
						||
        Fixes #1193 so that during verification benchmarking it does not unncessarily create thousands of CTransaction objects.
 | 
						||
        Closes #701 by adding documentation about the Payment RPC interface.
 | 
						||
        Add note about zkey and encrypted wallets.
 | 
						||
  
 | 
						||
! Gaurav Rana:
 | 
						||
        Update zcash-cli stop message.
 | 
						||
  
 | 
						||
! Tom Ritter:
 | 
						||
        Clarify comment about nonce space for Note Encryption.
 | 
						||
  
 | 
						||
! Robert C. Seacord:
 | 
						||
        Memory safety and correctness fixes found in NCC audit.
 | 
						||
  
 | 
						||
! Patrick Strateman (merged by Taylor Hornby):
 | 
						||
        Pull in some DoS mitigations from upstream. (#1258)
 | 
						||
  
 | 
						||
! Wladimir J. van der Laan:
 | 
						||
        net: correctly initialize nMinPingUsecTime.
 | 
						||
- 
 | 
						||
--- 27,55 ----
 | 
						||
        Increment version numbers for z9 release.
 | 
						||
        Add these release notes for z9.
 | 
						||
  
 | 
						||
! Taylor Hornby (5):
 | 
						||
        Disable hardening when building for coverage reports.
 | 
						||
        Upgrade libsodium for AVX2-detection bugfix.
 | 
						||
        Fix inconsistent optimization flags; single source of truth.
 | 
						||
        Add -fwrapv -fno-strict-aliasing; fix libzcash flags.
 | 
						||
        Use libsodium's s < L check, instead checking that libsodium checks that.
 | 
						||
  
 | 
						||
! Simon Liu (3):
 | 
						||
        Fixes #1193 so that during verification benchmarking it does not unncessarily create thousands of CTransaction objects.
 | 
						||
        Closes #701 by adding documentation about the Payment RPC interface.
 | 
						||
        Add note about zkey and encrypted wallets.
 | 
						||
  
 | 
						||
! Gaurav Rana (1):
 | 
						||
        Update zcash-cli stop message.
 | 
						||
  
 | 
						||
! Tom Ritter (1):
 | 
						||
        Clarify comment about nonce space for Note Encryption.
 | 
						||
  
 | 
						||
! Robert C. Seacord (1):
 | 
						||
        Memory safety and correctness fixes found in NCC audit.
 | 
						||
  
 | 
						||
! Patrick Strateman (1):
 | 
						||
        Pull in some DoS mitigations from upstream. (#1258)
 | 
						||
  
 | 
						||
! Wladimir J. van der Laan (1):
 | 
						||
        net: correctly initialize nMinPingUsecTime.
 | 
						||
Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.1.md
 | 
						||
Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.2.md
 | 
						||
Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.3.md
 | 
						||
diff -crB ./doc/release-process.md ../../komodo-jl777/doc/release-process.md
 | 
						||
*** ./doc/release-process.md	2017-01-03 10:40:50.191328153 +0000
 | 
						||
--- ../../komodo-jl777/doc/release-process.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 38,43 ****
 | 
						||
--- 38,45 ----
 | 
						||
      contrib/DEBIAN/control
 | 
						||
      contrib/gitian-descriptors/gitian-linux.yml
 | 
						||
  
 | 
						||
+     Build and commit to update versions, and then perform the following commands:
 | 
						||
+ 
 | 
						||
      help2man -n "RPC client for the Zcash daemon" src/zcash-cli > contrib/DEBIAN/manpages/zcash-cli.1
 | 
						||
      help2man -n "Network daemon for interacting with the Zcash blockchain" src/zcashd > contrib/DEBIAN/manpages/zcashd.1
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 57,66 ****
 | 
						||
  
 | 
						||
  ### B2. Write release notes
 | 
						||
  
 | 
						||
! git shortlog helps a lot, for example:
 | 
						||
  
 | 
						||
!     $ git shortlog --no-merges v${ZCASH_RELEASE_PREV}..HEAD \
 | 
						||
!         > ./doc/release-notes/release-notes-${ZCASH_RELEASE}.md
 | 
						||
  
 | 
						||
  Update the Debian package changelog:
 | 
						||
  
 | 
						||
--- 59,67 ----
 | 
						||
  
 | 
						||
  ### B2. Write release notes
 | 
						||
  
 | 
						||
! Run the release-notes.py script to generate release notes and update authors.md file. For example:
 | 
						||
  
 | 
						||
!     $ python zcutil/release-notes.py --version $ZCASH_RELEASE
 | 
						||
  
 | 
						||
  Update the Debian package changelog:
 | 
						||
  
 | 
						||
diff -crB ./doc/security-warnings.md ../../komodo-jl777/doc/security-warnings.md
 | 
						||
*** ./doc/security-warnings.md	2017-01-03 10:40:50.191328153 +0000
 | 
						||
--- ../../komodo-jl777/doc/security-warnings.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 35,44 ****
 | 
						||
    from the earlier issue).
 | 
						||
  
 | 
						||
  - We were concerned about the resistance of the algorithm used to derive wallet
 | 
						||
!   encryption keys (inherited from Bitcoin) to dictionary attacks by a powerful
 | 
						||
!   attacker. If and when we re-enable wallet encryption, it is likely to be with
 | 
						||
!   a modern passphrase-based key derivation algorithm designed for greater
 | 
						||
!   resistance to dictionary attack, such as Argon2i.
 | 
						||
  
 | 
						||
  You should use full-disk encryption (or encryption of your home directory) to
 | 
						||
  protect your wallet at rest, and should assume (even unprivileged) users who are
 | 
						||
--- 35,44 ----
 | 
						||
    from the earlier issue).
 | 
						||
  
 | 
						||
  - We were concerned about the resistance of the algorithm used to derive wallet
 | 
						||
!   encryption keys (inherited from [Bitcoin](https://bitcoin.org/en/secure-your-wallet))
 | 
						||
!   to dictionary attacks by a powerful attacker. If and when we re-enable wallet 
 | 
						||
!   encryption, it is likely to be with a modern passphrase-based key derivation 
 | 
						||
!   algorithm designed for greater resistance to dictionary attack, such as Argon2i.
 | 
						||
  
 | 
						||
  You should use full-disk encryption (or encryption of your home directory) to
 | 
						||
  protect your wallet at rest, and should assume (even unprivileged) users who are
 | 
						||
diff -crB ./doc/tor.md ../../komodo-jl777/doc/tor.md
 | 
						||
*** ./doc/tor.md	2017-01-03 10:40:50.191328153 +0000
 | 
						||
--- ../../komodo-jl777/doc/tor.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 18,24 ****
 | 
						||
  	-proxy=ip:port  Set the proxy server. If SOCKS5 is selected (default), this proxy
 | 
						||
  	                server will be used to try to reach .onion addresses as well.
 | 
						||
  
 | 
						||
! 	-onion=ip:port  Set the proxy server to use for tor hidden services. You do not
 | 
						||
  	                need to set this if it's the same as -proxy. You can use -noonion
 | 
						||
  	                to explicitly disable access to hidden service.
 | 
						||
  
 | 
						||
--- 18,24 ----
 | 
						||
  	-proxy=ip:port  Set the proxy server. If SOCKS5 is selected (default), this proxy
 | 
						||
  	                server will be used to try to reach .onion addresses as well.
 | 
						||
  
 | 
						||
! 	-onion=ip:port  Set the proxy server to use for Tor hidden services. You do not
 | 
						||
  	                need to set this if it's the same as -proxy. You can use -noonion
 | 
						||
  	                to explicitly disable access to hidden service.
 | 
						||
  
 | 
						||
diff -crB ./Dockerfile ../../komodo-jl777/Dockerfile
 | 
						||
*** ./Dockerfile	2017-01-03 10:40:50.151326129 +0000
 | 
						||
--- ../../komodo-jl777/Dockerfile	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,15 ****
 | 
						||
! FROM ubuntu:16.04
 | 
						||
! MAINTAINER Mihail Fedorov <mit-license@fedorov.net>
 | 
						||
! 
 | 
						||
! # All the stuff
 | 
						||
! # And clean out packages, keep space minimal
 | 
						||
! RUN apt-get -y update && \
 | 
						||
!     apt-get -y upgrade && \
 | 
						||
!     apt-get -y install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev \
 | 
						||
!     unzip python zlib1g-dev wget bsdmainutils automake libboost-all-dev libssl-dev libprotobuf-dev \
 | 
						||
!     protobuf-compiler libqt4-dev libqrencode-dev libdb++-dev software-properties-common libcurl4-openssl-dev && \
 | 
						||
!     apt-get clean && \
 | 
						||
!     rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 | 
						||
  
 | 
						||
  ADD ./ /komodo
 | 
						||
  ENV HOME /komodo
 | 
						||
--- 1,5 ----
 | 
						||
! FROM kolobus/ubuntu:komodo
 | 
						||
! MAINTAINER Mihail Fedorov <tech@fedorov.net>
 | 
						||
  
 | 
						||
  ADD ./ /komodo
 | 
						||
  ENV HOME /komodo
 | 
						||
***************
 | 
						||
*** 19,25 ****
 | 
						||
  RUN cd /komodo && \
 | 
						||
      ./autogen.sh && \
 | 
						||
      ./configure --with-incompatible-bdb --with-gui || true && \
 | 
						||
!     ./zcutil/build.sh -j4
 | 
						||
  
 | 
						||
  # Unknown stuff goes here
 | 
						||
  
 | 
						||
--- 9,15 ----
 | 
						||
  RUN cd /komodo && \
 | 
						||
      ./autogen.sh && \
 | 
						||
      ./configure --with-incompatible-bdb --with-gui || true && \
 | 
						||
!     ./zcutil/build.sh -j$(nproc)
 | 
						||
  
 | 
						||
  # Unknown stuff goes here
 | 
						||
  
 | 
						||
diff -crB ./.git/config ../../komodo-jl777/.git/config
 | 
						||
*** ./.git/config	2017-01-03 10:40:50.131325117 +0000
 | 
						||
--- ../../komodo-jl777/.git/config	2017-01-03 09:49:08.884507813 +0000
 | 
						||
***************
 | 
						||
*** 4,11 ****
 | 
						||
  	bare = false
 | 
						||
  	logallrefupdates = true
 | 
						||
  [remote "origin"]
 | 
						||
! 	url = https://github.com/j-cimb-barker/komodo.git
 | 
						||
  	fetch = +refs/heads/*:refs/remotes/origin/*
 | 
						||
  [branch "master"]
 | 
						||
  	remote = origin
 | 
						||
  	merge = refs/heads/master
 | 
						||
--- 4,14 ----
 | 
						||
  	bare = false
 | 
						||
  	logallrefupdates = true
 | 
						||
  [remote "origin"]
 | 
						||
! 	url = https://github.com/jl777/komodo.git
 | 
						||
  	fetch = +refs/heads/*:refs/remotes/origin/*
 | 
						||
  [branch "master"]
 | 
						||
  	remote = origin
 | 
						||
  	merge = refs/heads/master
 | 
						||
+ [branch "dev"]
 | 
						||
+ 	remote = origin
 | 
						||
+ 	merge = refs/heads/dev
 | 
						||
diff -crB ./.git/HEAD ../../komodo-jl777/.git/HEAD
 | 
						||
*** ./.git/HEAD	2017-01-03 10:40:50.131325117 +0000
 | 
						||
--- ../../komodo-jl777/.git/HEAD	2017-01-03 09:49:08.884507813 +0000
 | 
						||
***************
 | 
						||
*** 1 ****
 | 
						||
! ref: refs/heads/master
 | 
						||
--- 1 ----
 | 
						||
! ref: refs/heads/dev
 | 
						||
Binary files ./.git/index and ../../komodo-jl777/.git/index differ
 | 
						||
diff -crB ./.git/logs/HEAD ../../komodo-jl777/.git/logs/HEAD
 | 
						||
*** ./.git/logs/HEAD	2017-01-03 10:40:50.131325117 +0000
 | 
						||
--- ../../komodo-jl777/.git/logs/HEAD	2017-01-03 09:49:08.884507813 +0000
 | 
						||
***************
 | 
						||
*** 1 ****
 | 
						||
! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000	clone: from https://github.com/j-cimb-barker/komodo.git
 | 
						||
--- 1,2 ----
 | 
						||
! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000	clone: from https://github.com/jl777/komodo.git
 | 
						||
! d03fbd981fce86504b78d2a9582e4da988d59823 26ac06c4f5a6b4dc3163b36a1e5d24bfa7eccbd2 joel <joel@abigail> 1483436948 +0000	checkout: moving from master to dev
 | 
						||
Only in ../../komodo-jl777/.git/logs/refs/heads: dev
 | 
						||
diff -crB ./.git/logs/refs/heads/master ../../komodo-jl777/.git/logs/refs/heads/master
 | 
						||
*** ./.git/logs/refs/heads/master	2017-01-03 10:40:50.131325117 +0000
 | 
						||
--- ../../komodo-jl777/.git/logs/refs/heads/master	2017-01-03 09:48:21.598032424 +0000
 | 
						||
***************
 | 
						||
*** 1 ****
 | 
						||
! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000	clone: from https://github.com/j-cimb-barker/komodo.git
 | 
						||
--- 1 ----
 | 
						||
! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000	clone: from https://github.com/jl777/komodo.git
 | 
						||
diff -crB ./.git/logs/refs/remotes/origin/HEAD ../../komodo-jl777/.git/logs/refs/remotes/origin/HEAD
 | 
						||
*** ./.git/logs/refs/remotes/origin/HEAD	2017-01-03 10:40:50.131325117 +0000
 | 
						||
--- ../../komodo-jl777/.git/logs/refs/remotes/origin/HEAD	2017-01-03 09:48:21.598032424 +0000
 | 
						||
***************
 | 
						||
*** 1 ****
 | 
						||
! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000	clone: from https://github.com/j-cimb-barker/komodo.git
 | 
						||
--- 1 ----
 | 
						||
! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000	clone: from https://github.com/jl777/komodo.git
 | 
						||
Only in ./.git/objects/pack: pack-12e7bdf654b29f95604673fb1b3ee01a9bd52369.idx
 | 
						||
Only in ./.git/objects/pack: pack-12e7bdf654b29f95604673fb1b3ee01a9bd52369.pack
 | 
						||
Only in ../../komodo-jl777/.git/objects/pack: pack-3d08e40e89111c75a81ccd6099e05e09fd0e0f08.idx
 | 
						||
Only in ../../komodo-jl777/.git/objects/pack: pack-3d08e40e89111c75a81ccd6099e05e09fd0e0f08.pack
 | 
						||
diff -crB ./.git/packed-refs ../../komodo-jl777/.git/packed-refs
 | 
						||
*** ./.git/packed-refs	2017-01-03 10:40:50.131325117 +0000
 | 
						||
--- ../../komodo-jl777/.git/packed-refs	2017-01-03 09:48:21.598032424 +0000
 | 
						||
***************
 | 
						||
*** 2,10 ****
 | 
						||
  fcd361184f09fe17546698b0d13caddac5b63500 refs/remotes/origin/PoS
 | 
						||
  730a5006cbbfb0607ed93067db1a74d57584eb1f refs/remotes/origin/acspeed
 | 
						||
  80259d4b4f193c7c438f3c057ce70af3beb1a099 refs/remotes/origin/auto
 | 
						||
! 060c9a92939c62bbedb5fe560bf8ef6856e2b8f1 refs/remotes/origin/beta
 | 
						||
  ba9104dd7e9b6ba2b68ad352253ac8f3298092f4 refs/remotes/origin/dPoW
 | 
						||
! cb42e5518262235ed4e4dbff43179e0308114d6a refs/remotes/origin/dev
 | 
						||
  76b6eacf41395ddd2badd5d5dc3352e603c59df2 refs/remotes/origin/kolo
 | 
						||
  bb40eb8b043a1e63c3dc3b1c2e4d0f6e67e771d4 refs/remotes/origin/kolo-dev
 | 
						||
  d03fbd981fce86504b78d2a9582e4da988d59823 refs/remotes/origin/master
 | 
						||
--- 2,10 ----
 | 
						||
  fcd361184f09fe17546698b0d13caddac5b63500 refs/remotes/origin/PoS
 | 
						||
  730a5006cbbfb0607ed93067db1a74d57584eb1f refs/remotes/origin/acspeed
 | 
						||
  80259d4b4f193c7c438f3c057ce70af3beb1a099 refs/remotes/origin/auto
 | 
						||
! f6f296f1acf8c2b177451ed0c9f8660f3a80ec3d refs/remotes/origin/beta
 | 
						||
  ba9104dd7e9b6ba2b68ad352253ac8f3298092f4 refs/remotes/origin/dPoW
 | 
						||
! 26ac06c4f5a6b4dc3163b36a1e5d24bfa7eccbd2 refs/remotes/origin/dev
 | 
						||
  76b6eacf41395ddd2badd5d5dc3352e603c59df2 refs/remotes/origin/kolo
 | 
						||
  bb40eb8b043a1e63c3dc3b1c2e4d0f6e67e771d4 refs/remotes/origin/kolo-dev
 | 
						||
  d03fbd981fce86504b78d2a9582e4da988d59823 refs/remotes/origin/master
 | 
						||
Only in ../../komodo-jl777/.git/refs/heads: dev
 | 
						||
diff -crB ./.gitignore ../../komodo-jl777/.gitignore
 | 
						||
*** ./.gitignore	2017-01-03 10:40:50.151326129 +0000
 | 
						||
--- ../../komodo-jl777/.gitignore	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 65,70 ****
 | 
						||
--- 65,71 ----
 | 
						||
  *.a
 | 
						||
  *.pb.cc
 | 
						||
  *.pb.h
 | 
						||
+ .vscode
 | 
						||
  
 | 
						||
  *.log
 | 
						||
  *.trs
 | 
						||
diff -crB ./Makefile.am ../../komodo-jl777/Makefile.am
 | 
						||
*** ./Makefile.am	2017-01-03 10:40:50.151326129 +0000
 | 
						||
--- ../../komodo-jl777/Makefile.am	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 258,267 ****
 | 
						||
  	@qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1
 | 
						||
  endif
 | 
						||
  
 | 
						||
! dist_noinst_SCRIPTS = autogen.sh
 | 
						||
  
 | 
						||
  EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/zcash $(DIST_DOCS) $(BIN_CHECKS)
 | 
						||
  
 | 
						||
  CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
 | 
						||
  
 | 
						||
  .INTERMEDIATE: $(COVERAGE_INFO)
 | 
						||
--- 258,271 ----
 | 
						||
  	@qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1
 | 
						||
  endif
 | 
						||
  
 | 
						||
! dist_bin_SCRIPTS = zcutil/fetch-params.sh
 | 
						||
! dist_noinst_SCRIPTS = autogen.sh zcutil/build-debian-package.sh zcutil/build.sh
 | 
						||
  
 | 
						||
  EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/zcash $(DIST_DOCS) $(BIN_CHECKS)
 | 
						||
  
 | 
						||
+ install-exec-hook:
 | 
						||
+ 	mv $(DESTDIR)$(bindir)/fetch-params.sh $(DESTDIR)$(bindir)/zcash-fetch-params
 | 
						||
+ 
 | 
						||
  CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
 | 
						||
  
 | 
						||
  .INTERMEDIATE: $(COVERAGE_INFO)
 | 
						||
Only in .: patches
 | 
						||
diff -crB ./qa/pull-tester/rpc-tests.sh ../../komodo-jl777/qa/pull-tester/rpc-tests.sh
 | 
						||
*** ./qa/pull-tester/rpc-tests.sh	2017-01-03 10:40:50.195328356 +0000
 | 
						||
--- ../../komodo-jl777/qa/pull-tester/rpc-tests.sh	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 11,16 ****
 | 
						||
--- 11,17 ----
 | 
						||
  #Run the tests
 | 
						||
  
 | 
						||
  testScripts=(
 | 
						||
+     'wallet_treestate.py'
 | 
						||
      'wallet_protectcoinbase.py'
 | 
						||
      'wallet.py'
 | 
						||
      'wallet_nullifiers.py'
 | 
						||
diff -crB ./qa/rpc-tests/httpbasics.py ../../komodo-jl777/qa/rpc-tests/httpbasics.py
 | 
						||
*** ./qa/rpc-tests/httpbasics.py	2017-01-03 10:40:50.195328356 +0000
 | 
						||
--- ../../komodo-jl777/qa/rpc-tests/httpbasics.py	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 38,50 ****
 | 
						||
          conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
 | 
						||
          out1 = conn.getresponse().read();
 | 
						||
          assert_equal('"error":null' in out1, True)
 | 
						||
!         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
 | 
						||
!         
 | 
						||
!         #send 2nd request without closing connection
 | 
						||
!         conn.request('POST', '/', '{"method": "getchaintips"}', headers)
 | 
						||
!         out2 = conn.getresponse().read();
 | 
						||
!         assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
 | 
						||
!         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
 | 
						||
          conn.close()
 | 
						||
          
 | 
						||
          #same should be if we add keep-alive because this should be the std. behaviour
 | 
						||
--- 38,46 ----
 | 
						||
          conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
 | 
						||
          out1 = conn.getresponse().read();
 | 
						||
          assert_equal('"error":null' in out1, True)
 | 
						||
! 
 | 
						||
!         # TODO #1856: Re-enable support for persistent connections.
 | 
						||
!         assert_equal(conn.sock!=None, False)
 | 
						||
          conn.close()
 | 
						||
          
 | 
						||
          #same should be if we add keep-alive because this should be the std. behaviour
 | 
						||
***************
 | 
						||
*** 55,67 ****
 | 
						||
          conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
 | 
						||
          out1 = conn.getresponse().read();
 | 
						||
          assert_equal('"error":null' in out1, True)
 | 
						||
!         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
 | 
						||
!         
 | 
						||
!         #send 2nd request without closing connection
 | 
						||
!         conn.request('POST', '/', '{"method": "getchaintips"}', headers)
 | 
						||
!         out2 = conn.getresponse().read();
 | 
						||
!         assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
 | 
						||
!         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
 | 
						||
          conn.close()
 | 
						||
          
 | 
						||
          #now do the same with "Connection: close"
 | 
						||
--- 51,59 ----
 | 
						||
          conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
 | 
						||
          out1 = conn.getresponse().read();
 | 
						||
          assert_equal('"error":null' in out1, True)
 | 
						||
! 
 | 
						||
!         # TODO #1856: Re-enable support for persistent connections.
 | 
						||
!         assert_equal(conn.sock!=None, False)
 | 
						||
          conn.close()
 | 
						||
          
 | 
						||
          #now do the same with "Connection: close"
 | 
						||
***************
 | 
						||
*** 96,102 ****
 | 
						||
          conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
 | 
						||
          out1 = conn.getresponse().read();
 | 
						||
          assert_equal('"error":null' in out1, True)
 | 
						||
!         assert_equal(conn.sock!=None, True) #connection must be closed because bitcoind should use keep-alive by default
 | 
						||
          
 | 
						||
  if __name__ == '__main__':
 | 
						||
      HTTPBasicsTest ().main ()
 | 
						||
--- 88,97 ----
 | 
						||
          conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
 | 
						||
          out1 = conn.getresponse().read();
 | 
						||
          assert_equal('"error":null' in out1, True)
 | 
						||
! 
 | 
						||
!         # TODO #1856: Re-enable support for persistent connections.
 | 
						||
!         assert_equal(conn.sock!=None, False)
 | 
						||
!         conn.close()
 | 
						||
          
 | 
						||
  if __name__ == '__main__':
 | 
						||
      HTTPBasicsTest ().main ()
 | 
						||
diff -crB ./qa/rpc-tests/wallet_protectcoinbase.py ../../komodo-jl777/qa/rpc-tests/wallet_protectcoinbase.py
 | 
						||
*** ./qa/rpc-tests/wallet_protectcoinbase.py	2017-01-03 10:40:50.199328558 +0000
 | 
						||
--- ../../komodo-jl777/qa/rpc-tests/wallet_protectcoinbase.py	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 8,14 ****
 | 
						||
  from test_framework.util import *
 | 
						||
  from time import *
 | 
						||
  
 | 
						||
! class Wallet2Test (BitcoinTestFramework):
 | 
						||
  
 | 
						||
      def setup_chain(self):
 | 
						||
          print("Initializing test directory "+self.options.tmpdir)
 | 
						||
--- 8,14 ----
 | 
						||
  from test_framework.util import *
 | 
						||
  from time import *
 | 
						||
  
 | 
						||
! class WalletProtectCoinbaseTest (BitcoinTestFramework):
 | 
						||
  
 | 
						||
      def setup_chain(self):
 | 
						||
          print("Initializing test directory "+self.options.tmpdir)
 | 
						||
***************
 | 
						||
*** 23,43 ****
 | 
						||
          self.is_network_split=False
 | 
						||
          self.sync_all()
 | 
						||
  
 | 
						||
!     def wait_for_operationd_success(self, myopid):
 | 
						||
          print('waiting for async operation {}'.format(myopid))
 | 
						||
          opids = []
 | 
						||
          opids.append(myopid)
 | 
						||
!         timeout = 120
 | 
						||
          status = None
 | 
						||
          for x in xrange(1, timeout):
 | 
						||
              results = self.nodes[0].z_getoperationresult(opids)
 | 
						||
              if len(results)==0:
 | 
						||
                  sleep(1)
 | 
						||
              else:
 | 
						||
                  status = results[0]["status"]
 | 
						||
                  break
 | 
						||
          print('...returned status: {}'.format(status))
 | 
						||
!         assert_equal("success", status)
 | 
						||
  
 | 
						||
      def run_test (self):
 | 
						||
          print "Mining blocks..."
 | 
						||
--- 23,55 ----
 | 
						||
          self.is_network_split=False
 | 
						||
          self.sync_all()
 | 
						||
  
 | 
						||
!     # Returns txid if operation was a success or None
 | 
						||
!     def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None):
 | 
						||
          print('waiting for async operation {}'.format(myopid))
 | 
						||
          opids = []
 | 
						||
          opids.append(myopid)
 | 
						||
!         timeout = 300
 | 
						||
          status = None
 | 
						||
+         errormsg = None
 | 
						||
+         txid = None
 | 
						||
          for x in xrange(1, timeout):
 | 
						||
              results = self.nodes[0].z_getoperationresult(opids)
 | 
						||
              if len(results)==0:
 | 
						||
                  sleep(1)
 | 
						||
              else:
 | 
						||
                  status = results[0]["status"]
 | 
						||
+                 if status == "failed":
 | 
						||
+                     errormsg = results[0]['error']['message']
 | 
						||
+                 elif status == "success":
 | 
						||
+                     txid = results[0]['result']['txid']
 | 
						||
                  break
 | 
						||
          print('...returned status: {}'.format(status))
 | 
						||
!         assert_equal(in_status, status)
 | 
						||
!         if errormsg is not None:
 | 
						||
!             assert(in_errormsg is not None)
 | 
						||
!             assert_equal(in_errormsg in errormsg, True)
 | 
						||
!             print('...returned error: {}'.format(errormsg))
 | 
						||
!         return txid
 | 
						||
  
 | 
						||
      def run_test (self):
 | 
						||
          print "Mining blocks..."
 | 
						||
***************
 | 
						||
*** 94,100 ****
 | 
						||
          recipients = []
 | 
						||
          recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')})
 | 
						||
          myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
 | 
						||
!         self.wait_for_operationd_success(myopid)
 | 
						||
          self.sync_all()
 | 
						||
          self.nodes[1].generate(1)
 | 
						||
          self.sync_all()
 | 
						||
--- 106,112 ----
 | 
						||
          recipients = []
 | 
						||
          recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')})
 | 
						||
          myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
 | 
						||
!         self.wait_and_assert_operationid_status(myopid)
 | 
						||
          self.sync_all()
 | 
						||
          self.nodes[1].generate(1)
 | 
						||
          self.sync_all()
 | 
						||
***************
 | 
						||
*** 109,116 ****
 | 
						||
          recipients = []
 | 
						||
          recipients.append({"address":mytaddr, "amount":Decimal('10.0')})
 | 
						||
          myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
 | 
						||
!         self.wait_for_operationd_success(myopid)
 | 
						||
          self.sync_all()
 | 
						||
          self.nodes[1].generate(1)
 | 
						||
          self.sync_all()
 | 
						||
  
 | 
						||
--- 121,134 ----
 | 
						||
          recipients = []
 | 
						||
          recipients.append({"address":mytaddr, "amount":Decimal('10.0')})
 | 
						||
          myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
 | 
						||
!         mytxid = self.wait_and_assert_operationid_status(myopid)
 | 
						||
!         assert(mytxid is not None)
 | 
						||
          self.sync_all()
 | 
						||
+ 
 | 
						||
+         # check that priority of the tx sending from a zaddr is not 0
 | 
						||
+         mempool = self.nodes[0].getrawmempool(True)
 | 
						||
+         assert(Decimal(mempool[mytxid]['startingpriority']) >= Decimal('1000000000000'))
 | 
						||
+ 
 | 
						||
          self.nodes[1].generate(1)
 | 
						||
          self.sync_all()
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 120,125 ****
 | 
						||
--- 138,152 ----
 | 
						||
          assert_equal(Decimal(resp["private"]), Decimal('9.9998'))
 | 
						||
          assert_equal(Decimal(resp["total"]), Decimal('39.9998'))
 | 
						||
  
 | 
						||
+         # z_sendmany will return an error if there is transparent change output considered dust.
 | 
						||
+         # UTXO selection in z_sendmany sorts in ascending order, so smallest utxos are consumed first.
 | 
						||
+         # At this point in time, unspent notes all have a value of 10.0 and standard z_sendmany fee is 0.0001.
 | 
						||
+         recipients = []
 | 
						||
+         amount = Decimal('10.0') - Decimal('0.00010000') - Decimal('0.00000001')    # this leaves change at 1 zatoshi less than dust threshold
 | 
						||
+         recipients.append({"address":self.nodes[0].getnewaddress(), "amount":amount })
 | 
						||
+         myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
 | 
						||
+         self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 0.00000545 more to avoid creating invalid change output 0.00000001 (dust threshold is 0.00000546)")
 | 
						||
+ 
 | 
						||
          # Send will fail because send amount is too big, even when including coinbase utxos
 | 
						||
          errorString = ""
 | 
						||
          try:
 | 
						||
***************
 | 
						||
*** 128,133 ****
 | 
						||
--- 155,168 ----
 | 
						||
              errorString = e.error['message']
 | 
						||
          assert_equal("Insufficient funds" in errorString, True)
 | 
						||
  
 | 
						||
+         # z_sendmany will fail because of insufficient funds
 | 
						||
+         recipients = []
 | 
						||
+         recipients.append({"address":self.nodes[1].getnewaddress(), "amount":Decimal('10000.0')})
 | 
						||
+         myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
 | 
						||
+         self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 10000.0001")
 | 
						||
+         myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
 | 
						||
+         self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient protected funds, have 9.9998, need 10000.0001")
 | 
						||
+ 
 | 
						||
          # Send will fail because of insufficient funds unless sender uses coinbase utxos
 | 
						||
          try:
 | 
						||
              self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 21)
 | 
						||
***************
 | 
						||
*** 135,140 ****
 | 
						||
--- 170,227 ----
 | 
						||
              errorString = e.error['message']
 | 
						||
          assert_equal("Insufficient funds, coinbase funds can only be spent after they have been sent to a zaddr" in errorString, True)
 | 
						||
  
 | 
						||
+         # Verify that mempools accept tx with joinsplits which have at least the default z_sendmany fee.
 | 
						||
+         # If this test passes, it confirms that issue #1851 has been resolved, where sending from
 | 
						||
+         # a zaddr to 1385 taddr recipients fails because the default fee was considered too low
 | 
						||
+         # given the tx size, resulting in mempool rejection.
 | 
						||
+         errorString = ''
 | 
						||
+         recipients = []
 | 
						||
+         num_t_recipients = 2500
 | 
						||
+         amount_per_recipient = Decimal('0.00000546') # dust threshold
 | 
						||
+         # Note that regtest chainparams does not require standard tx, so setting the amount to be
 | 
						||
+         # less than the dust threshold, e.g. 0.00000001 will not result in mempool rejection.
 | 
						||
+         for i in xrange(0,num_t_recipients):
 | 
						||
+             newtaddr = self.nodes[2].getnewaddress()
 | 
						||
+             recipients.append({"address":newtaddr, "amount":amount_per_recipient})
 | 
						||
+         myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
 | 
						||
+         try:
 | 
						||
+             self.wait_and_assert_operationid_status(myopid)
 | 
						||
+         except JSONRPCException as e:
 | 
						||
+             print("JSONRPC error: "+e.error['message'])
 | 
						||
+             assert(False)
 | 
						||
+         except Exception as e:
 | 
						||
+             print("Unexpected exception caught during testing: "+str(sys.exc_info()[0]))
 | 
						||
+             assert(False)
 | 
						||
+ 
 | 
						||
+         self.sync_all()
 | 
						||
+         self.nodes[1].generate(1)
 | 
						||
+         self.sync_all()
 | 
						||
+ 
 | 
						||
+         # check balance
 | 
						||
+         node2balance = amount_per_recipient * num_t_recipients
 | 
						||
+         assert_equal(self.nodes[2].getbalance(), node2balance)
 | 
						||
+ 
 | 
						||
+         # Send will fail because fee is negative
 | 
						||
+         try:
 | 
						||
+             self.nodes[0].z_sendmany(myzaddr, recipients, 1, -1)
 | 
						||
+         except JSONRPCException,e:
 | 
						||
+             errorString = e.error['message']
 | 
						||
+         assert_equal("Invalid amount" in errorString, True)
 | 
						||
+ 
 | 
						||
+         # Send will fail because fee is larger than MAX_MONEY
 | 
						||
+         try:
 | 
						||
+             self.nodes[0].z_sendmany(myzaddr, recipients, 1, Decimal('21000000.00000001'))
 | 
						||
+         except JSONRPCException,e:
 | 
						||
+             errorString = e.error['message']
 | 
						||
+         assert_equal("Invalid amount" in errorString, True)
 | 
						||
+ 
 | 
						||
+         # Send will fail because fee is larger than sum of outputs
 | 
						||
+         try:
 | 
						||
+             self.nodes[0].z_sendmany(myzaddr, recipients, 1, (amount_per_recipient * num_t_recipients) + Decimal('0.00000001'))
 | 
						||
+         except JSONRPCException,e:
 | 
						||
+             errorString = e.error['message']
 | 
						||
+         assert_equal("is greater than the sum of outputs" in errorString, True)
 | 
						||
+ 
 | 
						||
          # Send will succeed because the balance of non-coinbase utxos is 10.0
 | 
						||
          try:
 | 
						||
              self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 9)
 | 
						||
***************
 | 
						||
*** 146,152 ****
 | 
						||
          self.sync_all()
 | 
						||
  
 | 
						||
          # check balance
 | 
						||
!         assert_equal(self.nodes[2].getbalance(), 9)
 | 
						||
  
 | 
						||
  if __name__ == '__main__':
 | 
						||
!     Wallet2Test ().main ()
 | 
						||
--- 233,263 ----
 | 
						||
          self.sync_all()
 | 
						||
  
 | 
						||
          # check balance
 | 
						||
!         node2balance = node2balance + 9
 | 
						||
!         assert_equal(self.nodes[2].getbalance(), node2balance)
 | 
						||
! 
 | 
						||
!         # Check that chained joinsplits in a single tx are created successfully.
 | 
						||
!         recipients = []
 | 
						||
!         num_recipients = 3
 | 
						||
!         amount_per_recipient = Decimal('0.002')
 | 
						||
!         minconf = 1
 | 
						||
!         send_amount = num_recipients * amount_per_recipient
 | 
						||
!         custom_fee = Decimal('0.00012345')
 | 
						||
!         zbalance = self.nodes[0].z_getbalance(myzaddr)
 | 
						||
!         for i in xrange(0,num_recipients):
 | 
						||
!             newzaddr = self.nodes[2].z_getnewaddress()
 | 
						||
!             recipients.append({"address":newzaddr, "amount":amount_per_recipient})
 | 
						||
!         myopid = self.nodes[0].z_sendmany(myzaddr, recipients, minconf, custom_fee)
 | 
						||
!         self.wait_and_assert_operationid_status(myopid)
 | 
						||
!         self.sync_all()
 | 
						||
!         self.nodes[1].generate(1)
 | 
						||
!         self.sync_all()
 | 
						||
! 
 | 
						||
!         # check balances
 | 
						||
!         resp = self.nodes[2].z_gettotalbalance()
 | 
						||
!         assert_equal(Decimal(resp["private"]), send_amount)
 | 
						||
!         resp = self.nodes[0].z_getbalance(myzaddr)
 | 
						||
!         assert_equal(Decimal(resp), zbalance - custom_fee - send_amount)
 | 
						||
  
 | 
						||
  if __name__ == '__main__':
 | 
						||
!     WalletProtectCoinbaseTest().main()
 | 
						||
diff -crB ./qa/rpc-tests/wallet.py ../../komodo-jl777/qa/rpc-tests/wallet.py
 | 
						||
*** ./qa/rpc-tests/wallet.py	2017-01-03 10:40:50.199328558 +0000
 | 
						||
--- ../../komodo-jl777/qa/rpc-tests/wallet.py	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 244,249 ****
 | 
						||
--- 244,295 ----
 | 
						||
          myvjoinsplits = mytxdetails["vjoinsplit"]
 | 
						||
          assert_equal(0, len(myvjoinsplits))
 | 
						||
  
 | 
						||
+         # z_sendmany is expected to fail if tx size breaks limit
 | 
						||
+         myzaddr = self.nodes[0].z_getnewaddress()
 | 
						||
+ 
 | 
						||
+         recipients = []
 | 
						||
+         num_t_recipients = 3000
 | 
						||
+         amount_per_recipient = Decimal('0.00000001')
 | 
						||
+         errorString = ''
 | 
						||
+         for i in xrange(0,num_t_recipients):
 | 
						||
+             newtaddr = self.nodes[2].getnewaddress()
 | 
						||
+             recipients.append({"address":newtaddr, "amount":amount_per_recipient})
 | 
						||
+         try:
 | 
						||
+             self.nodes[0].z_sendmany(myzaddr, recipients)
 | 
						||
+         except JSONRPCException,e:
 | 
						||
+             errorString = e.error['message']
 | 
						||
+         assert("Too many outputs, size of raw transaction" in errorString)
 | 
						||
+ 
 | 
						||
+         recipients = []
 | 
						||
+         num_t_recipients = 2000
 | 
						||
+         num_z_recipients = 50
 | 
						||
+         amount_per_recipient = Decimal('0.00000001')
 | 
						||
+         errorString = ''
 | 
						||
+         for i in xrange(0,num_t_recipients):
 | 
						||
+             newtaddr = self.nodes[2].getnewaddress()
 | 
						||
+             recipients.append({"address":newtaddr, "amount":amount_per_recipient})
 | 
						||
+         for i in xrange(0,num_z_recipients):
 | 
						||
+             newzaddr = self.nodes[2].z_getnewaddress()
 | 
						||
+             recipients.append({"address":newzaddr, "amount":amount_per_recipient})
 | 
						||
+         try:
 | 
						||
+             self.nodes[0].z_sendmany(myzaddr, recipients)
 | 
						||
+         except JSONRPCException,e:
 | 
						||
+             errorString = e.error['message']
 | 
						||
+         assert("size of raw transaction would be larger than limit" in errorString)
 | 
						||
+ 
 | 
						||
+         recipients = []
 | 
						||
+         num_z_recipients = 100
 | 
						||
+         amount_per_recipient = Decimal('0.00000001')
 | 
						||
+         errorString = ''
 | 
						||
+         for i in xrange(0,num_z_recipients):
 | 
						||
+             newzaddr = self.nodes[2].z_getnewaddress()
 | 
						||
+             recipients.append({"address":newzaddr, "amount":amount_per_recipient})
 | 
						||
+         try:
 | 
						||
+             self.nodes[0].z_sendmany(myzaddr, recipients)
 | 
						||
+         except JSONRPCException,e:
 | 
						||
+             errorString = e.error['message']
 | 
						||
+         assert("Invalid parameter, too many zaddr outputs" in errorString)
 | 
						||
+ 
 | 
						||
          # add zaddr to node 2
 | 
						||
          myzaddr = self.nodes[2].z_getnewaddress()
 | 
						||
  
 | 
						||
Only in ../../komodo-jl777/qa/rpc-tests: wallet_treestate.py
 | 
						||
diff -crB ./qa/rpc-tests/zcjoinsplit.py ../../komodo-jl777/qa/rpc-tests/zcjoinsplit.py
 | 
						||
*** ./qa/rpc-tests/zcjoinsplit.py	2017-01-03 10:40:50.203328760 +0000
 | 
						||
--- ../../komodo-jl777/qa/rpc-tests/zcjoinsplit.py	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 36,41 ****
 | 
						||
--- 36,49 ----
 | 
						||
          receive_result = self.nodes[0].zcrawreceive(zcsecretkey, joinsplit_result["encryptednote1"])
 | 
						||
          assert_equal(receive_result["exists"], True)
 | 
						||
  
 | 
						||
+         # The pure joinsplit we create should be mined in the next block
 | 
						||
+         # despite other transactions being in the mempool.
 | 
						||
+         addrtest = self.nodes[0].getnewaddress()
 | 
						||
+         for xx in range(0,10):
 | 
						||
+             self.nodes[0].generate(1)
 | 
						||
+             for x in range(0,50):
 | 
						||
+                 self.nodes[0].sendtoaddress(addrtest, 0.01);
 | 
						||
+ 
 | 
						||
          joinsplit_tx = self.nodes[0].createrawtransaction([], {})
 | 
						||
          joinsplit_result = self.nodes[0].zcrawjoinsplit(joinsplit_tx, {receive_result["note"] : zcsecretkey}, {zcaddress: 39.8}, 0, 0.1)
 | 
						||
  
 | 
						||
diff -crB ./qa/zcash/performance-measurements.sh ../../komodo-jl777/qa/zcash/performance-measurements.sh
 | 
						||
*** ./qa/zcash/performance-measurements.sh	2017-01-03 10:40:50.203328760 +0000
 | 
						||
--- ../../komodo-jl777/qa/zcash/performance-measurements.sh	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 88,93 ****
 | 
						||
--- 88,99 ----
 | 
						||
              validatelargetx)
 | 
						||
                  zcash_rpc zcbenchmark validatelargetx 5
 | 
						||
                  ;;
 | 
						||
+             trydecryptnotes)
 | 
						||
+                 zcash_rpc zcbenchmark trydecryptnotes 1000 "${@:3}"
 | 
						||
+                 ;;
 | 
						||
+             incnotewitnesses)
 | 
						||
+                 zcash_rpc zcbenchmark incnotewitnesses 100 "${@:3}"
 | 
						||
+                 ;;
 | 
						||
              *)
 | 
						||
                  zcashd_stop
 | 
						||
                  echo "Bad arguments."
 | 
						||
***************
 | 
						||
*** 116,121 ****
 | 
						||
--- 122,133 ----
 | 
						||
              verifyequihash)
 | 
						||
                  zcash_rpc zcbenchmark verifyequihash 1
 | 
						||
                  ;;
 | 
						||
+             trydecryptnotes)
 | 
						||
+                 zcash_rpc zcbenchmark trydecryptnotes 1 "${@:3}"
 | 
						||
+                 ;;
 | 
						||
+             incnotewitnesses)
 | 
						||
+                 zcash_rpc zcbenchmark incnotewitnesses 1 "${@:3}"
 | 
						||
+                 ;;
 | 
						||
              *)
 | 
						||
                  zcashd_massif_stop
 | 
						||
                  echo "Bad arguments."
 | 
						||
***************
 | 
						||
*** 145,150 ****
 | 
						||
--- 157,168 ----
 | 
						||
              verifyequihash)
 | 
						||
                  zcash_rpc zcbenchmark verifyequihash 1
 | 
						||
                  ;;
 | 
						||
+             trydecryptnotes)
 | 
						||
+                 zcash_rpc zcbenchmark trydecryptnotes 1 "${@:3}"
 | 
						||
+                 ;;
 | 
						||
+             incnotewitnesses)
 | 
						||
+                 zcash_rpc zcbenchmark incnotewitnesses 1 "${@:3}"
 | 
						||
+                 ;;
 | 
						||
              *)
 | 
						||
                  zcashd_valgrind_stop
 | 
						||
                  echo "Bad arguments."
 | 
						||
diff -crB ./README.md ../../komodo-jl777/README.md
 | 
						||
*** ./README.md	2017-01-03 10:40:50.151326129 +0000
 | 
						||
--- ../../komodo-jl777/README.md	2017-01-03 09:49:08.848505929 +0000
 | 
						||
***************
 | 
						||
*** 1,43 ****
 | 
						||
- <<<<<<< HEAD
 | 
						||
  
 | 
						||
- Zcash
 | 
						||
- =====
 | 
						||
-  
 | 
						||
- https://z.cash/
 | 
						||
-  
 | 
						||
- Where do I begin?
 | 
						||
- -----------------
 | 
						||
- 
 | 
						||
- We have a guide for joining the public testnet: https://github.com/zcash/zcash/wiki/Beta-Guide
 | 
						||
- 
 | 
						||
- What is Zcash?
 | 
						||
- --------------
 | 
						||
-  
 | 
						||
- Zcash is an implementation of the "Zerocash" protocol. Based on Bitcoin's code, it intends to
 | 
						||
- offer a far higher standard of privacy and anonymity through a sophisticiated zero-knowledge
 | 
						||
- proving scheme which preserves confidentiality of transaction metadata.
 | 
						||
-  
 | 
						||
- **Zcash is unfinished and highly experimental.** Use at your own risk.
 | 
						||
-  
 | 
						||
- Participation in the Zcash project is subject to a [Code of Conduct](code_of_conduct.md).
 | 
						||
-  
 | 
						||
- =======
 | 
						||
- Zcash 1.0.0
 | 
						||
- ===========
 | 
						||
  
 | 
						||
  What is Zcash?
 | 
						||
  --------------
 | 
						||
  
 | 
						||
  [Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol.
 | 
						||
  Based on Bitcoin's code, it intends to offer a far higher standard of privacy
 | 
						||
! and anonymity through a sophisticated zero-knowledge proving scheme that
 | 
						||
! preserves confidentiality of transaction metadata. Technical details are
 | 
						||
! available in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf).
 | 
						||
  
 | 
						||
  This software is the Zcash client. It downloads and stores the entire history
 | 
						||
  of Zcash transactions; depending on the speed of your computer and network
 | 
						||
  connection, the synchronization process could take a day or more once the
 | 
						||
! block chain has reached a significant size.
 | 
						||
  
 | 
						||
  Security Warnings
 | 
						||
  -----------------
 | 
						||
--- 1,18 ----
 | 
						||
  
 | 
						||
  
 | 
						||
  What is Zcash?
 | 
						||
  --------------
 | 
						||
  
 | 
						||
  [Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol.
 | 
						||
  Based on Bitcoin's code, it intends to offer a far higher standard of privacy
 | 
						||
! through a sophisticated zero-knowledge proving scheme that preserves
 | 
						||
! confidentiality of transaction metadata. Technical details are available
 | 
						||
! in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf).
 | 
						||
  
 | 
						||
  This software is the Zcash client. It downloads and stores the entire history
 | 
						||
  of Zcash transactions; depending on the speed of your computer and network
 | 
						||
  connection, the synchronization process could take a day or more once the
 | 
						||
! blockchain has reached a significant size.
 | 
						||
  
 | 
						||
  Security Warnings
 | 
						||
  -----------------
 | 
						||
***************
 | 
						||
*** 165,173 ****
 | 
						||
  
 | 
						||
  Where do I begin?
 | 
						||
  -----------------
 | 
						||
! 
 | 
						||
! We have a guide for joining the public testnet:
 | 
						||
! https://github.com/zcash/zcash/wiki/Beta-Guide
 | 
						||
  
 | 
						||
  ### Need Help?
 | 
						||
  
 | 
						||
--- 140,147 ----
 | 
						||
  
 | 
						||
  Where do I begin?
 | 
						||
  -----------------
 | 
						||
! We have a guide for joining the main Zcash network:
 | 
						||
! https://github.com/zcash/zcash/wiki/1.0-User-Guide
 | 
						||
  
 | 
						||
  ### Need Help?
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 182,188 ****
 | 
						||
  --------
 | 
						||
  
 | 
						||
  Build Zcash along with most dependencies from source by running
 | 
						||
! ./zcutil/build.sh. Currently only Linux is supported.
 | 
						||
  
 | 
						||
  License
 | 
						||
  -------
 | 
						||
--- 156,162 ----
 | 
						||
  --------
 | 
						||
  
 | 
						||
  Build Zcash along with most dependencies from source by running
 | 
						||
! ./zcutil/build.sh. Currently only Linux is officially supported.
 | 
						||
  
 | 
						||
  License
 | 
						||
  -------
 | 
						||
diff -crB ./src/assetchains ../../komodo-jl777/src/assetchains
 | 
						||
*** ./src/assetchains	2017-01-03 10:40:50.211329166 +0000
 | 
						||
--- ../../komodo-jl777/src/assetchains	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 3,96 ****
 | 
						||
  source pubkey.txt
 | 
						||
  echo $pubkey
 | 
						||
  
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SUPERNET -ac_supply=816061 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=DEX -ac_supply=999999 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=PANGEA -ac_supply=999999 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BET -ac_supply=999999 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CRYPTO -ac_supply=999999 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HODL -ac_supply=9999999 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SHARK -ac_supply=1401 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BOTS -ac_supply=999999 -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=MGW -ac_supply=999999 -addnode=78.47.196.146 $1 &
 | 
						||
  
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=EUR -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=JPY -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=GBP -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=AUD -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CAD -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CHF -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=NZD -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CNY -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=RUB -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=MXN -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BRL -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=INR -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HKD -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=TRY -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=ZAR -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=PLN -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=NOK -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SEK -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=DKK -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CZK -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HUF -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=ILS -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=KRW -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=MYR -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=PHP -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=RON -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SGD -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=THB -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BGN -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=IDR -addnode=78.47.196.146 $1 &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HRK -addnode=78.47.196.146 $1 &
 | 
						||
! 
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"timeout\":60000,\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"REVS\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! 
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SUPERNET\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DEX\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PANGEA\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JUMBLR\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BET\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CRYPTO\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HODL\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SHARK\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BOTS\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MGW\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}"
 | 
						||
!  
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JPY\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"GBP\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"AUD\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CAD\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHF\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NZD\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CNY\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RUB\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MXN\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BRL\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"INR\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HKD\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"TRY\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ZAR\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PLN\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NOK\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEK\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DKK\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CZK\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUF\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ILS\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KRW\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MYR\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PHP\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RON\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SGD\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"THB\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BGN\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"IDR\",\"pubkey\":\"$pubkey\"}"
 | 
						||
! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HRK\",\"pubkey\":\"$pubkey\"}"
 | 
						||
  
 | 
						||
--- 3,50 ----
 | 
						||
  source pubkey.txt
 | 
						||
  echo $pubkey
 | 
						||
  
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SUPERNET -ac_supply=816061 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=DEX -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=PANGEA -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BET -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CRYPTO -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HODL -ac_supply=9999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SHARK -ac_supply=1401 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BOTS -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=MGW -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
 | 
						||
  
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=EUR -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=JPY -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=GBP -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=AUD -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CAD -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CHF -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=NZD -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CNY -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=RUB -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=MXN -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BRL -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=INR -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HKD -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=TRY -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=ZAR -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=PLN -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=NOK -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SEK -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=DKK -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=CZK -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HUF -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=ILS -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=KRW -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=MYR -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=PHP -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=RON -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=SGD -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=THB -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=BGN -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=IDR -addnode=78.47.196.146 $1 -gen &
 | 
						||
! ./komodod -pubkey=$pubkey -ac_name=HRK -addnode=78.47.196.146 $1 -gen &
 | 
						||
  
 | 
						||
diff -crB ./src/bitcoind.cpp ../../komodo-jl777/src/bitcoind.cpp
 | 
						||
*** ./src/bitcoind.cpp	2017-01-03 10:40:50.215329368 +0000
 | 
						||
--- ../../komodo-jl777/src/bitcoind.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 41,47 ****
 | 
						||
      // Tell the main threads to shutdown.
 | 
						||
      while (!fShutdown)
 | 
						||
      {
 | 
						||
!         MilliSleep(10000);
 | 
						||
          komodo_passport_iteration();
 | 
						||
          fShutdown = ShutdownRequested();
 | 
						||
      }
 | 
						||
--- 41,47 ----
 | 
						||
      // Tell the main threads to shutdown.
 | 
						||
      while (!fShutdown)
 | 
						||
      {
 | 
						||
!         MilliSleep(16000);
 | 
						||
          komodo_passport_iteration();
 | 
						||
          fShutdown = ShutdownRequested();
 | 
						||
      }
 | 
						||
diff -crB ./src/chainparams.cpp ../../komodo-jl777/src/chainparams.cpp
 | 
						||
*** ./src/chainparams.cpp	2017-01-03 10:40:50.215329368 +0000
 | 
						||
--- ../../komodo-jl777/src/chainparams.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 43,48 ****
 | 
						||
--- 43,49 ----
 | 
						||
      CMainParams()
 | 
						||
      {
 | 
						||
          strNetworkID = "main";
 | 
						||
+         strCurrencyUnits = "KMD";
 | 
						||
          consensus.fCoinbaseMustBeProtected = false;//true;
 | 
						||
          consensus.nSubsidySlowStartInterval = 20000;
 | 
						||
          consensus.nSubsidyHalvingInterval = 840000;
 | 
						||
***************
 | 
						||
*** 119,129 ****
 | 
						||
          checkpointData = (Checkpoints::CCheckpointData)
 | 
						||
          {
 | 
						||
              boost::assign::map_list_of
 | 
						||
!             ( 0, consensus.hashGenesisBlock),
 | 
						||
!             genesis.nTime, // * UNIX timestamp of last checkpoint block
 | 
						||
!             0,   // * total number of transactions between genesis and last checkpoint
 | 
						||
!                  //   (the tx=... number in the SetBestChain debug.log lines)
 | 
						||
!             0    // * estimated number of transactions per day after checkpoint
 | 
						||
          };
 | 
						||
          if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
 | 
						||
          {
 | 
						||
--- 120,134 ----
 | 
						||
          checkpointData = (Checkpoints::CCheckpointData)
 | 
						||
          {
 | 
						||
              boost::assign::map_list_of
 | 
						||
!             (0, consensus.hashGenesisBlock),
 | 
						||
!             //(2500, uint256S("0x0e6a3d5a46eba97c4e7618d66a39f115729e1176433c98481124c2bf733aa54e"))
 | 
						||
!             //(15000, uint256S("0x00f0bd236790e903321a2d22f85bd6bf8a505f6ef4eddb20458a65d37e14d142")),
 | 
						||
!             //(100000, uint256S("0x0f02eb1f3a4b89df9909fec81a4bd7d023e32e24e1f5262d9fc2cc36a715be6f")),
 | 
						||
!             1481120910,     // * UNIX timestamp of last checkpoint block
 | 
						||
!             110415,         // * total number of transactions between genesis and last checkpoint
 | 
						||
!                             //   (the tx=... number in the SetBestChain debug.log lines)
 | 
						||
!             4240            // * estimated number of transactions per day after checkpoint
 | 
						||
!                             //   total number of tx / (checkpoint block height / (24 * 24))
 | 
						||
          };
 | 
						||
          if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
 | 
						||
          {
 | 
						||
***************
 | 
						||
*** 160,165 ****
 | 
						||
--- 165,171 ----
 | 
						||
  public:
 | 
						||
      CTestNetParams() {
 | 
						||
          strNetworkID = "test";
 | 
						||
+         strCurrencyUnits = "TAZ";
 | 
						||
          consensus.nMajorityEnforceBlockUpgrade = 51;
 | 
						||
          consensus.nMajorityRejectBlockOutdated = 75;
 | 
						||
          consensus.nMajorityWindow = 400;
 | 
						||
***************
 | 
						||
*** 222,227 ****
 | 
						||
--- 228,234 ----
 | 
						||
  public:
 | 
						||
      CRegTestParams() {
 | 
						||
          strNetworkID = "regtest";
 | 
						||
+         strCurrencyUnits = "REG";
 | 
						||
          consensus.fCoinbaseMustBeProtected = false;
 | 
						||
          consensus.nSubsidySlowStartInterval = 0;
 | 
						||
          consensus.nSubsidyHalvingInterval = 150;
 | 
						||
diff -crB ./src/chainparams.h ../../komodo-jl777/src/chainparams.h
 | 
						||
*** ./src/chainparams.h	2017-01-03 10:40:50.215329368 +0000
 | 
						||
--- ../../komodo-jl777/src/chainparams.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 69,74 ****
 | 
						||
--- 69,75 ----
 | 
						||
      int64_t PruneAfterHeight() const { return nPruneAfterHeight; }
 | 
						||
      unsigned int EquihashN() const { return nEquihashN; }
 | 
						||
      unsigned int EquihashK() const { return nEquihashK; }
 | 
						||
+     std::string CurrencyUnits() const { return strCurrencyUnits; }
 | 
						||
      /** Make miner stop after a block is found. In RPC, don't return until nGenProcLimit blocks are generated */
 | 
						||
      bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; }
 | 
						||
      /** In the future use NetworkIDString() for RPC fields */
 | 
						||
***************
 | 
						||
*** 107,112 ****
 | 
						||
--- 108,114 ----
 | 
						||
      std::vector<CDNSSeedData> vSeeds;
 | 
						||
      std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
 | 
						||
      std::string strNetworkID;
 | 
						||
+     std::string strCurrencyUnits;
 | 
						||
      CBlock genesis;
 | 
						||
      std::vector<SeedSpec6> vFixedSeeds;
 | 
						||
      bool fRequireRPCPassword = false;
 | 
						||
diff -crB ./src/clientversion.h ../../komodo-jl777/src/clientversion.h
 | 
						||
*** ./src/clientversion.h	2017-01-03 10:40:50.215329368 +0000
 | 
						||
--- ../../komodo-jl777/src/clientversion.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 16,22 ****
 | 
						||
  //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
 | 
						||
  #define CLIENT_VERSION_MAJOR 1
 | 
						||
  #define CLIENT_VERSION_MINOR 0
 | 
						||
! #define CLIENT_VERSION_REVISION 0
 | 
						||
  #define CLIENT_VERSION_BUILD 50
 | 
						||
  
 | 
						||
  //! Set to true for release, false for prerelease or test build
 | 
						||
--- 16,22 ----
 | 
						||
  //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
 | 
						||
  #define CLIENT_VERSION_MAJOR 1
 | 
						||
  #define CLIENT_VERSION_MINOR 0
 | 
						||
! #define CLIENT_VERSION_REVISION 3
 | 
						||
  #define CLIENT_VERSION_BUILD 50
 | 
						||
  
 | 
						||
  //! Set to true for release, false for prerelease or test build
 | 
						||
diff -crB ./src/coins.cpp ../../komodo-jl777/src/coins.cpp
 | 
						||
*** ./src/coins.cpp	2017-01-03 10:40:50.215329368 +0000
 | 
						||
--- ../../komodo-jl777/src/coins.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 6,11 ****
 | 
						||
--- 6,12 ----
 | 
						||
  
 | 
						||
  #include "memusage.h"
 | 
						||
  #include "random.h"
 | 
						||
+ #include "version.h"
 | 
						||
  
 | 
						||
  #include <assert.h>
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 176,186 ****
 | 
						||
      // case restoring the "old" anchor during a reorg must
 | 
						||
      // have no effect.
 | 
						||
      if (currentRoot != newrt) {
 | 
						||
!         CAnchorsMap::iterator ret = cacheAnchors.insert(std::make_pair(currentRoot, CAnchorsCacheEntry())).first;
 | 
						||
  
 | 
						||
!         ret->second.entered = false;
 | 
						||
!         ret->second.flags = CAnchorsCacheEntry::DIRTY;
 | 
						||
  
 | 
						||
          hashAnchor = newrt;
 | 
						||
      }
 | 
						||
  }
 | 
						||
--- 177,196 ----
 | 
						||
      // case restoring the "old" anchor during a reorg must
 | 
						||
      // have no effect.
 | 
						||
      if (currentRoot != newrt) {
 | 
						||
!         // Bring the current best anchor into our local cache
 | 
						||
!         // so that its tree exists in memory.
 | 
						||
!         {
 | 
						||
!             ZCIncrementalMerkleTree tree;
 | 
						||
!             assert(GetAnchorAt(currentRoot, tree));
 | 
						||
!         }
 | 
						||
  
 | 
						||
!         // Mark the anchor as unentered, removing it from view
 | 
						||
!         cacheAnchors[currentRoot].entered = false;
 | 
						||
  
 | 
						||
+         // Mark the cache entry as dirty so it's propagated
 | 
						||
+         cacheAnchors[currentRoot].flags = CAnchorsCacheEntry::DIRTY;
 | 
						||
+ 
 | 
						||
+         // Mark the new root as the best anchor
 | 
						||
          hashAnchor = newrt;
 | 
						||
      }
 | 
						||
  }
 | 
						||
***************
 | 
						||
*** 303,318 ****
 | 
						||
              CAnchorsMap::iterator parent_it = cacheAnchors.find(child_it->first);
 | 
						||
  
 | 
						||
              if (parent_it == cacheAnchors.end()) {
 | 
						||
!                 if (child_it->second.entered) {
 | 
						||
!                     // Parent doesn't have an entry, but child has a new commitment root.
 | 
						||
! 
 | 
						||
!                     CAnchorsCacheEntry& entry = cacheAnchors[child_it->first];
 | 
						||
!                     entry.entered = true;
 | 
						||
!                     entry.tree = child_it->second.tree;
 | 
						||
!                     entry.flags = CAnchorsCacheEntry::DIRTY;
 | 
						||
  
 | 
						||
!                     cachedCoinsUsage += memusage::DynamicUsage(entry.tree);
 | 
						||
!                 }
 | 
						||
              } else {
 | 
						||
                  if (parent_it->second.entered != child_it->second.entered) {
 | 
						||
                      // The parent may have removed the entry.
 | 
						||
--- 313,324 ----
 | 
						||
              CAnchorsMap::iterator parent_it = cacheAnchors.find(child_it->first);
 | 
						||
  
 | 
						||
              if (parent_it == cacheAnchors.end()) {
 | 
						||
!                 CAnchorsCacheEntry& entry = cacheAnchors[child_it->first];
 | 
						||
!                 entry.entered = child_it->second.entered;
 | 
						||
!                 entry.tree = child_it->second.tree;
 | 
						||
!                 entry.flags = CAnchorsCacheEntry::DIRTY;
 | 
						||
  
 | 
						||
!                 cachedCoinsUsage += memusage::DynamicUsage(entry.tree);
 | 
						||
              } else {
 | 
						||
                  if (parent_it->second.entered != child_it->second.entered) {
 | 
						||
                      // The parent may have removed the entry.
 | 
						||
***************
 | 
						||
*** 332,345 ****
 | 
						||
              CNullifiersMap::iterator parent_it = cacheNullifiers.find(child_it->first);
 | 
						||
  
 | 
						||
              if (parent_it == cacheNullifiers.end()) {
 | 
						||
!                 if (child_it->second.entered) {
 | 
						||
!                     // Parent doesn't have an entry, but child has a SPENT nullifier.
 | 
						||
!                     // Move the spent nullifier up.
 | 
						||
! 
 | 
						||
!                     CNullifiersCacheEntry& entry = cacheNullifiers[child_it->first];
 | 
						||
!                     entry.entered = true;
 | 
						||
!                     entry.flags = CNullifiersCacheEntry::DIRTY;
 | 
						||
!                 }
 | 
						||
              } else {
 | 
						||
                  if (parent_it->second.entered != child_it->second.entered) {
 | 
						||
                      parent_it->second.entered = child_it->second.entered;
 | 
						||
--- 338,346 ----
 | 
						||
              CNullifiersMap::iterator parent_it = cacheNullifiers.find(child_it->first);
 | 
						||
  
 | 
						||
              if (parent_it == cacheNullifiers.end()) {
 | 
						||
!                 CNullifiersCacheEntry& entry = cacheNullifiers[child_it->first];
 | 
						||
!                 entry.entered = child_it->second.entered;
 | 
						||
!                 entry.flags = CNullifiersCacheEntry::DIRTY;
 | 
						||
              } else {
 | 
						||
                  if (parent_it->second.entered != child_it->second.entered) {
 | 
						||
                      parent_it->second.entered = child_it->second.entered;
 | 
						||
***************
 | 
						||
*** 469,474 ****
 | 
						||
--- 470,476 ----
 | 
						||
  {
 | 
						||
      if (tx.IsCoinBase())
 | 
						||
          return 0.0;
 | 
						||
+     CAmount nTotalIn = 0;
 | 
						||
      double dResult = 0.0;
 | 
						||
      BOOST_FOREACH(const CTxIn& txin, tx.vin)
 | 
						||
      {
 | 
						||
***************
 | 
						||
*** 477,484 ****
 | 
						||
--- 479,512 ----
 | 
						||
          if (!coins->IsAvailable(txin.prevout.n)) continue;
 | 
						||
          if (coins->nHeight < nHeight) {
 | 
						||
              dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight);
 | 
						||
+             nTotalIn += coins->vout[txin.prevout.n].nValue;
 | 
						||
          }
 | 
						||
      }
 | 
						||
+ 
 | 
						||
+     // If a transaction contains a joinsplit, we boost the priority of the transaction.
 | 
						||
+     // Joinsplits do not reveal any information about the value or age of a note, so we
 | 
						||
+     // cannot apply the priority algorithm used for transparent utxos.  Instead, we pick a
 | 
						||
+     // very large number and multiply it by the transaction's fee per 1000 bytes of data.
 | 
						||
+     // One trillion, 1000000000000, is equivalent to 1 ZEC utxo * 10000 blocks (~17 days).
 | 
						||
+     if (tx.vjoinsplit.size() > 0) {
 | 
						||
+         unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
 | 
						||
+         nTotalIn += tx.GetJoinSplitValueIn();
 | 
						||
+         CAmount fee = nTotalIn - tx.GetValueOut();
 | 
						||
+         CFeeRate feeRate(fee, nTxSize);
 | 
						||
+         CAmount feePerK = feeRate.GetFeePerK();
 | 
						||
+ 
 | 
						||
+         if (feePerK == 0) {
 | 
						||
+             feePerK = 1;
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         dResult += 1000000000000 * double(feePerK);
 | 
						||
+         // We cast feePerK from int64_t to double because if feePerK is a large number, say
 | 
						||
+         // close to MAX_MONEY, the multiplication operation will result in an integer overflow.
 | 
						||
+         // The variable dResult should never overflow since a 64-bit double in C++ is typically
 | 
						||
+         // a double-precision floating-point number as specified by IEE 754, with a maximum
 | 
						||
+         // value DBL_MAX of 1.79769e+308.
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
      return tx.ComputePriority(dResult);
 | 
						||
  }
 | 
						||
  
 | 
						||
Only in ../../komodo-jl777/src: dpowassets
 | 
						||
Only in ../../komodo-jl777/src: fundnotaries
 | 
						||
diff -crB ./src/gtest/test_checkblock.cpp ../../komodo-jl777/src/gtest/test_checkblock.cpp
 | 
						||
*** ./src/gtest/test_checkblock.cpp	2017-01-03 10:40:50.227329975 +0000
 | 
						||
--- ../../komodo-jl777/src/gtest/test_checkblock.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 29,31 ****
 | 
						||
--- 29,74 ----
 | 
						||
      EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "version-too-low", false)).Times(1);
 | 
						||
      EXPECT_FALSE(CheckBlock(0,0,block, state, false, false));
 | 
						||
  }
 | 
						||
+ 
 | 
						||
+ TEST(ContextualCheckBlock, BadCoinbaseHeight) {
 | 
						||
+     SelectParams(CBaseChainParams::MAIN);
 | 
						||
+ 
 | 
						||
+     // Create a block with no height in scriptSig
 | 
						||
+     CMutableTransaction mtx;
 | 
						||
+     mtx.vin.resize(1);
 | 
						||
+     mtx.vin[0].prevout.SetNull();
 | 
						||
+     mtx.vin[0].scriptSig = CScript() << OP_0;
 | 
						||
+     mtx.vout.resize(1);
 | 
						||
+     mtx.vout[0].scriptPubKey = CScript() << OP_TRUE;
 | 
						||
+     mtx.vout[0].nValue = 0;
 | 
						||
+     CTransaction tx {mtx};
 | 
						||
+     CBlock block;
 | 
						||
+     block.vtx.push_back(tx);
 | 
						||
+ 
 | 
						||
+     // Treating block as genesis should pass
 | 
						||
+     MockCValidationState state;
 | 
						||
+     EXPECT_TRUE(ContextualCheckBlock(block, state, NULL));
 | 
						||
+ 
 | 
						||
+     // Treating block as non-genesis should fail
 | 
						||
+     mtx.vout.push_back(CTxOut(GetBlockSubsidy(1, Params().GetConsensus())/5, Params().GetFoundersRewardScriptAtHeight(1)));
 | 
						||
+     CTransaction tx2 {mtx};
 | 
						||
+     block.vtx[0] = tx2;
 | 
						||
+     CBlock prev;
 | 
						||
+     CBlockIndex indexPrev {prev};
 | 
						||
+     indexPrev.nHeight = 0;
 | 
						||
+     EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1);
 | 
						||
+     EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev));
 | 
						||
+ 
 | 
						||
+     // Setting to an incorrect height should fail
 | 
						||
+     mtx.vin[0].scriptSig = CScript() << 2 << OP_0;
 | 
						||
+     CTransaction tx3 {mtx};
 | 
						||
+     block.vtx[0] = tx3;
 | 
						||
+     EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1);
 | 
						||
+     EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev));
 | 
						||
+ 
 | 
						||
+     // After correcting the scriptSig, should pass
 | 
						||
+     mtx.vin[0].scriptSig = CScript() << 1 << OP_0;
 | 
						||
+     CTransaction tx4 {mtx};
 | 
						||
+     block.vtx[0] = tx4;
 | 
						||
+     EXPECT_TRUE(ContextualCheckBlock(block, state, &indexPrev));
 | 
						||
+ }
 | 
						||
diff -crB ./src/gtest/test_joinsplit.cpp ../../komodo-jl777/src/gtest/test_joinsplit.cpp
 | 
						||
*** ./src/gtest/test_joinsplit.cpp	2017-01-03 10:40:50.227329975 +0000
 | 
						||
--- ../../komodo-jl777/src/gtest/test_joinsplit.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 15,20 ****
 | 
						||
--- 15,23 ----
 | 
						||
  
 | 
						||
  void test_full_api(ZCJoinSplit* js)
 | 
						||
  {
 | 
						||
+     // Create verification context.
 | 
						||
+     auto verifier = libzcash::ProofVerifier::Strict();
 | 
						||
+ 
 | 
						||
      // The recipient's information.
 | 
						||
      SpendingKey recipient_key = SpendingKey::random();
 | 
						||
      PaymentAddress recipient_addr = recipient_key.address();
 | 
						||
***************
 | 
						||
*** 69,74 ****
 | 
						||
--- 72,78 ----
 | 
						||
      // Verify the transaction:
 | 
						||
      ASSERT_TRUE(js->verify(
 | 
						||
          proof,
 | 
						||
+         verifier,
 | 
						||
          pubKeyHash,
 | 
						||
          randomSeed,
 | 
						||
          macs,
 | 
						||
***************
 | 
						||
*** 143,148 ****
 | 
						||
--- 147,153 ----
 | 
						||
      // Verify the transaction:
 | 
						||
      ASSERT_TRUE(js->verify(
 | 
						||
          proof,
 | 
						||
+         verifier,
 | 
						||
          pubKeyHash,
 | 
						||
          randomSeed,
 | 
						||
          macs,
 | 
						||
***************
 | 
						||
*** 154,159 ****
 | 
						||
--- 159,222 ----
 | 
						||
      ));
 | 
						||
  }
 | 
						||
  
 | 
						||
+ // Invokes the API (but does not compute a proof)
 | 
						||
+ // to test exceptions
 | 
						||
+ void invokeAPI(
 | 
						||
+     ZCJoinSplit* js,
 | 
						||
+     const boost::array<JSInput, 2>& inputs,
 | 
						||
+     const boost::array<JSOutput, 2>& outputs,
 | 
						||
+     uint64_t vpub_old,
 | 
						||
+     uint64_t vpub_new,
 | 
						||
+     const uint256& rt
 | 
						||
+ ) {
 | 
						||
+     uint256 ephemeralKey;
 | 
						||
+     uint256 randomSeed;
 | 
						||
+     uint256 pubKeyHash = random_uint256();
 | 
						||
+     boost::array<uint256, 2> macs;
 | 
						||
+     boost::array<uint256, 2> nullifiers;
 | 
						||
+     boost::array<uint256, 2> commitments;
 | 
						||
+     boost::array<ZCNoteEncryption::Ciphertext, 2> ciphertexts;
 | 
						||
+ 
 | 
						||
+     boost::array<Note, 2> output_notes;
 | 
						||
+ 
 | 
						||
+     ZCProof proof = js->prove(
 | 
						||
+         inputs,
 | 
						||
+         outputs,
 | 
						||
+         output_notes,
 | 
						||
+         ciphertexts,
 | 
						||
+         ephemeralKey,
 | 
						||
+         pubKeyHash,
 | 
						||
+         randomSeed,
 | 
						||
+         macs,
 | 
						||
+         nullifiers,
 | 
						||
+         commitments,
 | 
						||
+         vpub_old,
 | 
						||
+         vpub_new,
 | 
						||
+         rt,
 | 
						||
+         false
 | 
						||
+     );
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ void invokeAPIFailure(
 | 
						||
+     ZCJoinSplit* js,
 | 
						||
+     const boost::array<JSInput, 2>& inputs,
 | 
						||
+     const boost::array<JSOutput, 2>& outputs,
 | 
						||
+     uint64_t vpub_old,
 | 
						||
+     uint64_t vpub_new,
 | 
						||
+     const uint256& rt,
 | 
						||
+     std::string reason
 | 
						||
+ )
 | 
						||
+ {
 | 
						||
+     try {
 | 
						||
+         invokeAPI(js, inputs, outputs, vpub_old, vpub_new, rt);
 | 
						||
+         FAIL() << "It worked, when it shouldn't have!";
 | 
						||
+     } catch(std::invalid_argument const & err) {
 | 
						||
+         EXPECT_EQ(err.what(), reason);
 | 
						||
+     } catch(...) {
 | 
						||
+         FAIL() << "Expected invalid_argument exception.";
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  TEST(joinsplit, h_sig)
 | 
						||
  {
 | 
						||
      auto js = ZCJoinSplit::Unopened();
 | 
						||
***************
 | 
						||
*** 233,242 ****
 | 
						||
--- 296,515 ----
 | 
						||
      delete js;
 | 
						||
  }
 | 
						||
  
 | 
						||
+ void increment_note_witnesses(
 | 
						||
+     const uint256& element,
 | 
						||
+     std::vector<ZCIncrementalWitness>& witnesses,
 | 
						||
+     ZCIncrementalMerkleTree& tree
 | 
						||
+ )
 | 
						||
+ {
 | 
						||
+     tree.append(element);
 | 
						||
+     for (ZCIncrementalWitness& w : witnesses) {
 | 
						||
+         w.append(element);
 | 
						||
+     }
 | 
						||
+     witnesses.push_back(tree.witness());
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  TEST(joinsplit, full_api_test)
 | 
						||
  {
 | 
						||
      auto js = ZCJoinSplit::Generate();
 | 
						||
  
 | 
						||
+     {
 | 
						||
+         std::vector<ZCIncrementalWitness> witnesses;
 | 
						||
+         ZCIncrementalMerkleTree tree;
 | 
						||
+         increment_note_witnesses(uint256(), witnesses, tree);
 | 
						||
+         SpendingKey sk = SpendingKey::random();
 | 
						||
+         PaymentAddress addr = sk.address();
 | 
						||
+         Note note1(addr.a_pk, 100, random_uint256(), random_uint256());
 | 
						||
+         increment_note_witnesses(note1.cm(), witnesses, tree);
 | 
						||
+         Note note2(addr.a_pk, 100, random_uint256(), random_uint256());
 | 
						||
+         increment_note_witnesses(note2.cm(), witnesses, tree);
 | 
						||
+         Note note3(addr.a_pk, 2100000000000001, random_uint256(), random_uint256());
 | 
						||
+         increment_note_witnesses(note3.cm(), witnesses, tree);
 | 
						||
+         Note note4(addr.a_pk, 1900000000000000, random_uint256(), random_uint256());
 | 
						||
+         increment_note_witnesses(note4.cm(), witnesses, tree);
 | 
						||
+         Note note5(addr.a_pk, 1900000000000000, random_uint256(), random_uint256());
 | 
						||
+         increment_note_witnesses(note5.cm(), witnesses, tree);
 | 
						||
+ 
 | 
						||
+         // Should work
 | 
						||
+         invokeAPI(js,
 | 
						||
+         {
 | 
						||
+             JSInput(),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         0,
 | 
						||
+         tree.root());
 | 
						||
+ 
 | 
						||
+         // lhs > MAX_MONEY
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         2100000000000001,
 | 
						||
+         0,
 | 
						||
+         tree.root(),
 | 
						||
+         "nonsensical vpub_old value");
 | 
						||
+ 
 | 
						||
+         // rhs > MAX_MONEY
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         2100000000000001,
 | 
						||
+         tree.root(),
 | 
						||
+         "nonsensical vpub_new value");
 | 
						||
+ 
 | 
						||
+         // input witness for the wrong element
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(witnesses[0], note1, sk),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         100,
 | 
						||
+         tree.root(),
 | 
						||
+         "witness of wrong element for joinsplit input");
 | 
						||
+ 
 | 
						||
+         // input witness doesn't match up with
 | 
						||
+         // real root
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(witnesses[1], note1, sk),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         100,
 | 
						||
+         uint256(),
 | 
						||
+         "joinsplit not anchored to the correct root");
 | 
						||
+ 
 | 
						||
+         // input is in the tree now! this should work
 | 
						||
+         invokeAPI(js,
 | 
						||
+         {
 | 
						||
+             JSInput(witnesses[1], note1, sk),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         100,
 | 
						||
+         tree.root());
 | 
						||
+ 
 | 
						||
+         // Wrong secret key
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(witnesses[1], note1, SpendingKey::random()),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         0,
 | 
						||
+         tree.root(),
 | 
						||
+         "input note not authorized to spend with given key");
 | 
						||
+ 
 | 
						||
+         // Absurd input value
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(witnesses[3], note3, sk),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         0,
 | 
						||
+         tree.root(),
 | 
						||
+         "nonsensical input note value");
 | 
						||
+ 
 | 
						||
+         // Absurd total input value
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(witnesses[4], note4, sk),
 | 
						||
+             JSInput(witnesses[5], note5, sk)
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         0,
 | 
						||
+         tree.root(),
 | 
						||
+         "nonsensical left hand size of joinsplit balance");
 | 
						||
+ 
 | 
						||
+         // Absurd output value
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(addr, 2100000000000001),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         0,
 | 
						||
+         tree.root(),
 | 
						||
+         "nonsensical output value");
 | 
						||
+ 
 | 
						||
+         // Absurd total output value
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(addr, 1900000000000000),
 | 
						||
+             JSOutput(addr, 1900000000000000)
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         0,
 | 
						||
+         tree.root(),
 | 
						||
+         "nonsensical right hand side of joinsplit balance");
 | 
						||
+ 
 | 
						||
+         // Absurd total output value
 | 
						||
+         invokeAPIFailure(js,
 | 
						||
+         {
 | 
						||
+             JSInput(),
 | 
						||
+             JSInput()
 | 
						||
+         },
 | 
						||
+         {
 | 
						||
+             JSOutput(addr, 1900000000000000),
 | 
						||
+             JSOutput()
 | 
						||
+         },
 | 
						||
+         0,
 | 
						||
+         0,
 | 
						||
+         tree.root(),
 | 
						||
+         "invalid joinsplit balance");
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
      test_full_api(js);
 | 
						||
  
 | 
						||
      js->saveProvingKey("./zcashTest.pk");
 | 
						||
diff -crB ./src/gtest/test_merkletree.cpp ../../komodo-jl777/src/gtest/test_merkletree.cpp
 | 
						||
*** ./src/gtest/test_merkletree.cpp	2017-01-03 10:40:50.227329975 +0000
 | 
						||
--- ../../komodo-jl777/src/gtest/test_merkletree.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 5,10 ****
 | 
						||
--- 5,11 ----
 | 
						||
  #include "test/data/merkle_serialization.json.h"
 | 
						||
  #include "test/data/merkle_witness_serialization.json.h"
 | 
						||
  #include "test/data/merkle_path.json.h"
 | 
						||
+ #include "test/data/merkle_commitments.json.h"
 | 
						||
  
 | 
						||
  #include <iostream>
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 55,86 ****
 | 
						||
  }
 | 
						||
  
 | 
						||
  template<typename Tree, typename Witness>
 | 
						||
! void test_tree(Array root_tests, Array ser_tests, Array witness_ser_tests, Array path_tests) {
 | 
						||
      Array::iterator root_iterator = root_tests.begin();
 | 
						||
      Array::iterator ser_iterator = ser_tests.begin();
 | 
						||
      Array::iterator witness_ser_iterator = witness_ser_tests.begin();
 | 
						||
      Array::iterator path_iterator = path_tests.begin();
 | 
						||
  
 | 
						||
-     uint256 test_commitment = uint256S("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
 | 
						||
- 
 | 
						||
      Tree tree;
 | 
						||
  
 | 
						||
      // The root of the tree at this point is expected to be the root of the
 | 
						||
      // empty tree.
 | 
						||
      ASSERT_TRUE(tree.root() == Tree::empty_root());
 | 
						||
  
 | 
						||
      // We need to witness at every single point in the tree, so
 | 
						||
      // that the consistency of the tree and the merkle paths can
 | 
						||
      // be checked.
 | 
						||
      vector<Witness> witnesses;
 | 
						||
  
 | 
						||
      for (size_t i = 0; i < 16; i++) {
 | 
						||
          // Witness here
 | 
						||
          witnesses.push_back(tree.witness());
 | 
						||
  
 | 
						||
          // Now append a commitment to the tree
 | 
						||
          tree.append(test_commitment);
 | 
						||
  
 | 
						||
          // Check tree root consistency
 | 
						||
          expect_test_vector(root_iterator, tree.root());
 | 
						||
  
 | 
						||
--- 56,101 ----
 | 
						||
  }
 | 
						||
  
 | 
						||
  template<typename Tree, typename Witness>
 | 
						||
! void test_tree(
 | 
						||
!     Array commitment_tests,
 | 
						||
!     Array root_tests,
 | 
						||
!     Array ser_tests,
 | 
						||
!     Array witness_ser_tests,
 | 
						||
!     Array path_tests
 | 
						||
! )
 | 
						||
! {
 | 
						||
!     Array::iterator commitment_iterator = commitment_tests.begin();
 | 
						||
      Array::iterator root_iterator = root_tests.begin();
 | 
						||
      Array::iterator ser_iterator = ser_tests.begin();
 | 
						||
      Array::iterator witness_ser_iterator = witness_ser_tests.begin();
 | 
						||
      Array::iterator path_iterator = path_tests.begin();
 | 
						||
  
 | 
						||
      Tree tree;
 | 
						||
  
 | 
						||
      // The root of the tree at this point is expected to be the root of the
 | 
						||
      // empty tree.
 | 
						||
      ASSERT_TRUE(tree.root() == Tree::empty_root());
 | 
						||
  
 | 
						||
+     // The tree doesn't have a 'last' element added since it's blank.
 | 
						||
+     ASSERT_THROW(tree.last(), std::runtime_error);
 | 
						||
+ 
 | 
						||
      // We need to witness at every single point in the tree, so
 | 
						||
      // that the consistency of the tree and the merkle paths can
 | 
						||
      // be checked.
 | 
						||
      vector<Witness> witnesses;
 | 
						||
  
 | 
						||
      for (size_t i = 0; i < 16; i++) {
 | 
						||
+         uint256 test_commitment = uint256S((commitment_iterator++)->get_str());
 | 
						||
+ 
 | 
						||
          // Witness here
 | 
						||
          witnesses.push_back(tree.witness());
 | 
						||
  
 | 
						||
          // Now append a commitment to the tree
 | 
						||
          tree.append(test_commitment);
 | 
						||
  
 | 
						||
+         // Last element added to the tree was `test_commitment`
 | 
						||
+         ASSERT_TRUE(tree.last() == test_commitment);
 | 
						||
+ 
 | 
						||
          // Check tree root consistency
 | 
						||
          expect_test_vector(root_iterator, tree.root());
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 95,100 ****
 | 
						||
--- 110,116 ----
 | 
						||
  
 | 
						||
              if (first) {
 | 
						||
                  ASSERT_THROW(wit.path(), std::runtime_error);
 | 
						||
+                 ASSERT_THROW(wit.element(), std::runtime_error);
 | 
						||
              } else {
 | 
						||
                  auto path = wit.path();
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 119,125 ****
 | 
						||
  
 | 
						||
                      std::vector<bool> commitment_bv;
 | 
						||
                      {
 | 
						||
!                         std::vector<unsigned char> commitment_v(test_commitment.begin(), test_commitment.end());
 | 
						||
                          commitment_bv = convertBytesVectorToVector(commitment_v);
 | 
						||
                      }
 | 
						||
  
 | 
						||
--- 135,142 ----
 | 
						||
  
 | 
						||
                      std::vector<bool> commitment_bv;
 | 
						||
                      {
 | 
						||
!                         uint256 witnessed_commitment = wit.element();
 | 
						||
!                         std::vector<unsigned char> commitment_v(witnessed_commitment.begin(), witnessed_commitment.end());
 | 
						||
                          commitment_bv = convertBytesVectorToVector(commitment_v);
 | 
						||
                      }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 174,181 ****
 | 
						||
      Array ser_tests = read_json(std::string(json_tests::merkle_serialization, json_tests::merkle_serialization + sizeof(json_tests::merkle_serialization)));
 | 
						||
      Array witness_ser_tests = read_json(std::string(json_tests::merkle_witness_serialization, json_tests::merkle_witness_serialization + sizeof(json_tests::merkle_witness_serialization)));
 | 
						||
      Array path_tests = read_json(std::string(json_tests::merkle_path, json_tests::merkle_path + sizeof(json_tests::merkle_path)));
 | 
						||
  
 | 
						||
!     test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(root_tests, ser_tests, witness_ser_tests, path_tests);
 | 
						||
  }
 | 
						||
  
 | 
						||
  TEST(merkletree, emptyroots) {
 | 
						||
--- 191,199 ----
 | 
						||
      Array ser_tests = read_json(std::string(json_tests::merkle_serialization, json_tests::merkle_serialization + sizeof(json_tests::merkle_serialization)));
 | 
						||
      Array witness_ser_tests = read_json(std::string(json_tests::merkle_witness_serialization, json_tests::merkle_witness_serialization + sizeof(json_tests::merkle_witness_serialization)));
 | 
						||
      Array path_tests = read_json(std::string(json_tests::merkle_path, json_tests::merkle_path + sizeof(json_tests::merkle_path)));
 | 
						||
+     Array commitment_tests = read_json(std::string(json_tests::merkle_commitments, json_tests::merkle_commitments + sizeof(json_tests::merkle_commitments)));
 | 
						||
  
 | 
						||
!     test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(commitment_tests, root_tests, ser_tests, witness_ser_tests, path_tests);
 | 
						||
  }
 | 
						||
  
 | 
						||
  TEST(merkletree, emptyroots) {
 | 
						||
Only in ../../komodo-jl777/src/gtest: test_metrics.cpp
 | 
						||
diff -crB ./src/gtest/test_proofs.cpp ../../komodo-jl777/src/gtest/test_proofs.cpp
 | 
						||
*** ./src/gtest/test_proofs.cpp	2017-01-03 10:40:50.227329975 +0000
 | 
						||
--- ../../komodo-jl777/src/gtest/test_proofs.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 336,341 ****
 | 
						||
--- 336,364 ----
 | 
						||
      auto example = libsnark::generate_r1cs_example_with_field_input<curve_Fr>(250, 4);
 | 
						||
      example.constraint_system.swap_AB_if_beneficial();
 | 
						||
      auto kp = libsnark::r1cs_ppzksnark_generator<curve_pp>(example.constraint_system);
 | 
						||
+     auto vkprecomp = libsnark::r1cs_ppzksnark_verifier_process_vk(kp.vk);
 | 
						||
+ 
 | 
						||
+     for (size_t i = 0; i < 20; i++) {
 | 
						||
+         auto badproof = ZCProof::random_invalid();
 | 
						||
+         auto proof = badproof.to_libsnark_proof<libsnark::r1cs_ppzksnark_proof<curve_pp>>();
 | 
						||
+         
 | 
						||
+         auto verifierEnabled = ProofVerifier::Strict();
 | 
						||
+         auto verifierDisabled = ProofVerifier::Disabled();
 | 
						||
+         // This verifier should catch the bad proof
 | 
						||
+         ASSERT_FALSE(verifierEnabled.check(
 | 
						||
+             kp.vk,
 | 
						||
+             vkprecomp,
 | 
						||
+             example.primary_input,
 | 
						||
+             proof
 | 
						||
+         ));
 | 
						||
+         // This verifier won't!
 | 
						||
+         ASSERT_TRUE(verifierDisabled.check(
 | 
						||
+             kp.vk,
 | 
						||
+             vkprecomp,
 | 
						||
+             example.primary_input,
 | 
						||
+             proof
 | 
						||
+         ));
 | 
						||
+     }
 | 
						||
  
 | 
						||
      for (size_t i = 0; i < 20; i++) {
 | 
						||
          auto proof = libsnark::r1cs_ppzksnark_prover<curve_pp>(
 | 
						||
***************
 | 
						||
*** 345,350 ****
 | 
						||
--- 368,390 ----
 | 
						||
              example.constraint_system
 | 
						||
          );
 | 
						||
  
 | 
						||
+         {
 | 
						||
+             auto verifierEnabled = ProofVerifier::Strict();
 | 
						||
+             auto verifierDisabled = ProofVerifier::Disabled();
 | 
						||
+             ASSERT_TRUE(verifierEnabled.check(
 | 
						||
+                 kp.vk,
 | 
						||
+                 vkprecomp,
 | 
						||
+                 example.primary_input,
 | 
						||
+                 proof
 | 
						||
+             ));
 | 
						||
+             ASSERT_TRUE(verifierDisabled.check(
 | 
						||
+                 kp.vk,
 | 
						||
+                 vkprecomp,
 | 
						||
+                 example.primary_input,
 | 
						||
+                 proof
 | 
						||
+             ));
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
          ASSERT_TRUE(libsnark::r1cs_ppzksnark_verifier_strong_IC<curve_pp>(
 | 
						||
              kp.vk,
 | 
						||
              example.primary_input,
 | 
						||
diff -crB ./src/gtest/test_random.cpp ../../komodo-jl777/src/gtest/test_random.cpp
 | 
						||
*** ./src/gtest/test_random.cpp	2017-01-03 10:40:50.227329975 +0000
 | 
						||
--- ../../komodo-jl777/src/gtest/test_random.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 24,27 ****
 | 
						||
--- 24,35 ----
 | 
						||
      std::vector<int> em2 {0, 1, 2, 3, 4};
 | 
						||
      EXPECT_EQ(ea2, a2);
 | 
						||
      EXPECT_EQ(em2, m2);
 | 
						||
+ 
 | 
						||
+     auto a3 = a;
 | 
						||
+     auto m3 = m;
 | 
						||
+     MappedShuffle(a3.begin(), m3.begin(), a3.size(), GenIdentity);
 | 
						||
+     std::vector<int> ea3 {8, 4, 6, 3, 5};
 | 
						||
+     std::vector<int> em3 {0, 1, 2, 3, 4};
 | 
						||
+     EXPECT_EQ(ea3, a3);
 | 
						||
+     EXPECT_EQ(em3, m3);
 | 
						||
  }
 | 
						||
diff -crB ./src/init.cpp ../../komodo-jl777/src/init.cpp
 | 
						||
*** ./src/init.cpp	2017-01-03 10:40:50.227329975 +0000
 | 
						||
--- ../../komodo-jl777/src/init.cpp	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 62,68 ****
 | 
						||
  bool fFeeEstimatesInitialized = false;
 | 
						||
  
 | 
						||
  #ifdef WIN32
 | 
						||
! // Win32 LevelDB doesn't use filedescriptors, and the ones used for
 | 
						||
  // accessing block files don't count towards the fd_set size limit
 | 
						||
  // anyway.
 | 
						||
  #define MIN_CORE_FILEDESCRIPTORS 0
 | 
						||
--- 62,68 ----
 | 
						||
  bool fFeeEstimatesInitialized = false;
 | 
						||
  
 | 
						||
  #ifdef WIN32
 | 
						||
! // Win32 LevelDB doesn't use file descriptors, and the ones used for
 | 
						||
  // accessing block files don't count towards the fd_set size limit
 | 
						||
  // anyway.
 | 
						||
  #define MIN_CORE_FILEDESCRIPTORS 0
 | 
						||
***************
 | 
						||
*** 348,354 ****
 | 
						||
          strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)",
 | 
						||
              FormatMoney(CWallet::minTxFee.GetFeePerK())));
 | 
						||
      strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())));
 | 
						||
!     strUsage += HelpMessageOpt("-rescan", _("Rescan the block chain for missing wallet transactions") + " " + _("on startup"));
 | 
						||
      strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup"));
 | 
						||
      strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0));
 | 
						||
      strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1));
 | 
						||
--- 348,354 ----
 | 
						||
          strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)",
 | 
						||
              FormatMoney(CWallet::minTxFee.GetFeePerK())));
 | 
						||
      strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())));
 | 
						||
!     strUsage += HelpMessageOpt("-rescan", _("Rescan the blockchain for missing wallet transactions") + " " + _("on startup"));
 | 
						||
      strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup"));
 | 
						||
      strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0));
 | 
						||
      strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1));
 | 
						||
***************
 | 
						||
*** 380,386 ****
 | 
						||
      if (mode == HMM_BITCOIN_QT)
 | 
						||
          debugCategories += ", qt";
 | 
						||
      strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
 | 
						||
!         _("If <category> is not supplied, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
 | 
						||
  #ifdef ENABLE_WALLET
 | 
						||
      strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
 | 
						||
      strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
 | 
						||
--- 380,386 ----
 | 
						||
      if (mode == HMM_BITCOIN_QT)
 | 
						||
          debugCategories += ", qt";
 | 
						||
      strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
 | 
						||
!         _("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
 | 
						||
  #ifdef ENABLE_WALLET
 | 
						||
      strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
 | 
						||
      strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
 | 
						||
***************
 | 
						||
*** 425,431 ****
 | 
						||
      strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8232, 18232));
 | 
						||
      strUsage += HelpMessageOpt("-rpcallowip=<ip>", _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times"));
 | 
						||
      strUsage += HelpMessageOpt("-rpcthreads=<n>", strprintf(_("Set the number of threads to service RPC calls (default: %d)"), 4));
 | 
						||
!     strUsage += HelpMessageOpt("-rpckeepalive", strprintf(_("RPC support for HTTP persistent connections (default: %d)"), 1));
 | 
						||
  
 | 
						||
      // Disabled until we can lock notes and also tune performance of libsnark which by default uses multiple threads
 | 
						||
      //strUsage += HelpMessageOpt("-rpcasyncthreads=<n>", strprintf(_("Set the number of threads to service Async RPC calls (default: %d)"), 1));
 | 
						||
--- 425,434 ----
 | 
						||
      strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8232, 18232));
 | 
						||
      strUsage += HelpMessageOpt("-rpcallowip=<ip>", _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times"));
 | 
						||
      strUsage += HelpMessageOpt("-rpcthreads=<n>", strprintf(_("Set the number of threads to service RPC calls (default: %d)"), 4));
 | 
						||
! 
 | 
						||
!     // TODO #1856: Re-enable support for persistent connections.
 | 
						||
!     // Disabled to avoid rpc deadlock #1680, until we backport upstream changes which replace boost::asio with libevent, or another solution is implemented.
 | 
						||
!     //strUsage += HelpMessageOpt("-rpckeepalive", strprintf(_("RPC support for HTTP persistent connections (default: %d)"), 1));
 | 
						||
  
 | 
						||
      // Disabled until we can lock notes and also tune performance of libsnark which by default uses multiple threads
 | 
						||
      //strUsage += HelpMessageOpt("-rpcasyncthreads=<n>", strprintf(_("Set the number of threads to service Async RPC calls (default: %d)"), 1));
 | 
						||
***************
 | 
						||
*** 447,452 ****
 | 
						||
--- 450,460 ----
 | 
						||
          strUsage += HelpMessageOpt("-min", _("Start minimized"));
 | 
						||
          strUsage += HelpMessageOpt("-rootcertificates=<file>", _("Set SSL root certificates for payment request (default: -system-)"));
 | 
						||
          strUsage += HelpMessageOpt("-splash", _("Show splash screen on startup (default: 1)"));
 | 
						||
+     } else if (mode == HMM_BITCOIND) {
 | 
						||
+         strUsage += HelpMessageGroup(_("Metrics Options (only if -daemon and -printtoconsole are not set):"));
 | 
						||
+         strUsage += HelpMessageOpt("-showmetrics", _("Show metrics on stdout (default: 1 if running in a console, 0 otherwise)"));
 | 
						||
+         strUsage += HelpMessageOpt("-metricsui", _("Set to 1 for a persistent metrics screen, 0 for sequential metrics output (default: 1 if running in a console, 0 otherwise)"));
 | 
						||
+         strUsage += HelpMessageOpt("-metricsrefreshtime", strprintf(_("Number of seconds between metrics refreshes (default: %u if running in a console, %u otherwise)"), 1, 600));
 | 
						||
      }
 | 
						||
  
 | 
						||
      return strUsage;
 | 
						||
***************
 | 
						||
*** 538,548 ****
 | 
						||
      RenameThread("zcash-loadblk");
 | 
						||
      // -reindex
 | 
						||
      if (fReindex) {
 | 
						||
- #ifdef ENABLE_WALLET
 | 
						||
-         if (pwalletMain) {
 | 
						||
-             pwalletMain->ClearNoteWitnessCache();
 | 
						||
-         }
 | 
						||
- #endif
 | 
						||
          CImportingNow imp;
 | 
						||
          int nFile = 0;
 | 
						||
          while (true) {
 | 
						||
--- 546,551 ----
 | 
						||
***************
 | 
						||
*** 980,1000 ****
 | 
						||
      CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
 | 
						||
      threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
 | 
						||
  
 | 
						||
      if ((chainparams.NetworkIDString() != "regtest") &&
 | 
						||
!             GetBoolArg("-showmetrics", false) &&
 | 
						||
              !fPrintToConsole && !GetBoolArg("-daemon", false)) {
 | 
						||
          // Start the persistent metrics interface
 | 
						||
          ConnectMetricsScreen();
 | 
						||
          threadGroup.create_thread(&ThreadShowMetricsScreen);
 | 
						||
      }
 | 
						||
  
 | 
						||
-     // Initialize Zcash circuit parameters
 | 
						||
-     ZC_LoadParams();
 | 
						||
      // These must be disabled for now, they are buggy and we probably don't
 | 
						||
      // want any of libsnark's profiling in production anyway.
 | 
						||
      libsnark::inhibit_profiling_info = true;
 | 
						||
      libsnark::inhibit_profiling_counters = true;
 | 
						||
  
 | 
						||
      /* Start the RPC server already.  It will be started in "warmup" mode
 | 
						||
       * and not really process calls already (but it will signify connections
 | 
						||
       * that the server is there and will be ready later).  Warmup mode will
 | 
						||
--- 983,1007 ----
 | 
						||
      CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
 | 
						||
      threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
 | 
						||
  
 | 
						||
+     // Count uptime
 | 
						||
+     MarkStartTime();
 | 
						||
+ 
 | 
						||
      if ((chainparams.NetworkIDString() != "regtest") &&
 | 
						||
!             GetBoolArg("-showmetrics", 0) &&
 | 
						||
              !fPrintToConsole && !GetBoolArg("-daemon", false)) {
 | 
						||
          // Start the persistent metrics interface
 | 
						||
          ConnectMetricsScreen();
 | 
						||
          threadGroup.create_thread(&ThreadShowMetricsScreen);
 | 
						||
      }
 | 
						||
  
 | 
						||
      // These must be disabled for now, they are buggy and we probably don't
 | 
						||
      // want any of libsnark's profiling in production anyway.
 | 
						||
      libsnark::inhibit_profiling_info = true;
 | 
						||
      libsnark::inhibit_profiling_counters = true;
 | 
						||
  
 | 
						||
+     // Initialize Zcash circuit parameters
 | 
						||
+     ZC_LoadParams();
 | 
						||
+ 
 | 
						||
      /* Start the RPC server already.  It will be started in "warmup" mode
 | 
						||
       * and not really process calls already (but it will signify connections
 | 
						||
       * that the server is there and will be ready later).  Warmup mode will
 | 
						||
***************
 | 
						||
*** 1379,1385 ****
 | 
						||
--- 1386,1395 ----
 | 
						||
  
 | 
						||
          CBlockIndex *pindexRescan = chainActive.Tip();
 | 
						||
          if (GetBoolArg("-rescan", false))
 | 
						||
+         {
 | 
						||
+             pwalletMain->ClearNoteWitnessCache();
 | 
						||
              pindexRescan = chainActive.Genesis();
 | 
						||
+         }
 | 
						||
          else
 | 
						||
          {
 | 
						||
              CWalletDB walletdb(strWalletFile);
 | 
						||
diff -crB ./src/komodo_gateway.h ../../komodo-jl777/src/komodo_gateway.h
 | 
						||
*** ./src/komodo_gateway.h	2017-01-03 10:40:50.231330177 +0000
 | 
						||
--- ../../komodo-jl777/src/komodo_gateway.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 87,95 ****
 | 
						||
--- 87,105 ----
 | 
						||
      return(pax);
 | 
						||
  }
 | 
						||
  
 | 
						||
+ void komodo_paxdelete(struct pax_transaction *pax)
 | 
						||
+ {
 | 
						||
+     return; // breaks when out of order
 | 
						||
+     pthread_mutex_lock(&komodo_mutex);
 | 
						||
+     HASH_DELETE(hh,PAX,pax);
 | 
						||
+     pthread_mutex_unlock(&komodo_mutex);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  void komodo_gateway_deposit(char *coinaddr,uint64_t value,char *symbol,uint64_t fiatoshis,uint8_t *rmd160,uint256 txid,uint16_t vout,uint8_t type,int32_t height,int32_t otherheight,char *source,int32_t approved) // assetchain context
 | 
						||
  {
 | 
						||
      struct pax_transaction *pax; uint8_t buf[35]; int32_t addflag = 0; struct komodo_state *sp; char str[16],dest[16],*s;
 | 
						||
+     if ( KOMODO_PAX == 0 )
 | 
						||
+         return;
 | 
						||
      sp = komodo_stateptr(str,dest);
 | 
						||
      pthread_mutex_lock(&komodo_mutex);
 | 
						||
      pax_keyset(buf,txid,vout,type);
 | 
						||
***************
 | 
						||
*** 178,190 ****
 | 
						||
  int32_t komodo_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *kmdheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo)
 | 
						||
  {
 | 
						||
      struct pax_transaction p,*pax; int32_t i,n=0,j,len=0,incr,height,otherheight; uint8_t type,rmd160[20]; uint64_t fiatoshis; char symbol[16];
 | 
						||
!     incr = 34 + (iskomodo * (2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 4));
 | 
						||
!     for (i=0; i<4; i++)
 | 
						||
!         base[i] = opretbuf[opretlen-4+i];
 | 
						||
      //for (i=0; i<opretlen; i++)
 | 
						||
      //    printf("%02x",opretbuf[i]);
 | 
						||
      //printf(" opretlen.%d (%s)\n",opretlen,base);
 | 
						||
!     //printf(" opretlen.%d vs %d incr.%d\n",opretlen,(int32_t)(2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 4),incr);
 | 
						||
      //if ( ASSETCHAINS_SYMBOL[0] == 0 || strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0 )
 | 
						||
      {
 | 
						||
          type = opretbuf[0];
 | 
						||
--- 188,201 ----
 | 
						||
  int32_t komodo_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *kmdheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo)
 | 
						||
  {
 | 
						||
      struct pax_transaction p,*pax; int32_t i,n=0,j,len=0,incr,height,otherheight; uint8_t type,rmd160[20]; uint64_t fiatoshis; char symbol[16];
 | 
						||
!     if ( KOMODO_PAX == 0 )
 | 
						||
!         return(0);
 | 
						||
!     incr = 34 + (iskomodo * (2*sizeof(fiatoshis) + 2*sizeof(height) + 20));
 | 
						||
!     //41e77b91cb68dc2aa02fa88550eae6b6d44db676a7e935337b6d1392d9718f03cb0200305c90660400000000fbcbeb1f000000bde801006201000058e7945ad08ddba1eac9c9b6c8e1e97e8016a2d152
 | 
						||
      //for (i=0; i<opretlen; i++)
 | 
						||
      //    printf("%02x",opretbuf[i]);
 | 
						||
      //printf(" opretlen.%d (%s)\n",opretlen,base);
 | 
						||
!     //printf(" opretlen.%d vs %d incr.%d (%d)\n",opretlen,(int32_t)(2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 2),incr,opretlen/incr);
 | 
						||
      //if ( ASSETCHAINS_SYMBOL[0] == 0 || strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0 )
 | 
						||
      {
 | 
						||
          type = opretbuf[0];
 | 
						||
***************
 | 
						||
*** 215,220 ****
 | 
						||
--- 226,233 ----
 | 
						||
              }
 | 
						||
              else
 | 
						||
              {
 | 
						||
+                 for (i=0; i<4; i++)
 | 
						||
+                     base[i] = opretbuf[opretlen-4+i];
 | 
						||
                  for (j=0; j<32; j++)
 | 
						||
                  {
 | 
						||
                      ((uint8_t *)&txids[n])[j] = opretbuf[len++];
 | 
						||
***************
 | 
						||
*** 238,259 ****
 | 
						||
      return(n);
 | 
						||
  }
 | 
						||
  
 | 
						||
  uint64_t komodo_paxtotal()
 | 
						||
  {
 | 
						||
      struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[16],dest[16],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct komodo_state *basesp;
 | 
						||
      if ( komodo_isrealtime(&ht) == 0 )
 | 
						||
          return(0);
 | 
						||
      else
 | 
						||
      {
 | 
						||
          HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
          {
 | 
						||
              if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' )
 | 
						||
                  str = pax->symbol;
 | 
						||
              else str = pax->source;
 | 
						||
              basesp = komodo_stateptrget(str);
 | 
						||
!             if ( basesp != 0 && pax->didstats == 0 && pax->type == 'I' )
 | 
						||
              {
 | 
						||
!                 if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'D')) != 0 )
 | 
						||
                  {
 | 
						||
                      if ( pax2->fiatoshis != 0 )
 | 
						||
                      {
 | 
						||
--- 251,300 ----
 | 
						||
      return(n);
 | 
						||
  }
 | 
						||
  
 | 
						||
+ int32_t komodo_paxcmp(char *symbol,int32_t kmdheight,uint64_t value,uint64_t checkvalue,uint64_t seed)
 | 
						||
+ {
 | 
						||
+     int32_t ratio;
 | 
						||
+     if ( seed == 0 && checkvalue != 0 )
 | 
						||
+     {
 | 
						||
+         ratio = ((value << 6) / checkvalue);
 | 
						||
+         if ( ratio >= 63 && ratio <= 65 )
 | 
						||
+             return(0);
 | 
						||
+         else
 | 
						||
+         {
 | 
						||
+             if ( kmdheight >= 86150 )
 | 
						||
+                 printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
 | 
						||
+             return(-1);
 | 
						||
+         }
 | 
						||
+     }
 | 
						||
+     else if ( checkvalue != 0 )
 | 
						||
+     {
 | 
						||
+         ratio = ((value << 10) / checkvalue);
 | 
						||
+         if ( ratio >= 1023 && ratio <= 1025 )
 | 
						||
+             return(0);
 | 
						||
+     }
 | 
						||
+     return(value != checkvalue);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  uint64_t komodo_paxtotal()
 | 
						||
  {
 | 
						||
      struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[16],dest[16],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct komodo_state *basesp;
 | 
						||
+     if ( KOMODO_PAX == 0 )
 | 
						||
+         return(0);
 | 
						||
      if ( komodo_isrealtime(&ht) == 0 )
 | 
						||
          return(0);
 | 
						||
      else
 | 
						||
      {
 | 
						||
          HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
          {
 | 
						||
+             if ( pax->marked != 0 )
 | 
						||
+                 continue;
 | 
						||
              if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' )
 | 
						||
                  str = pax->symbol;
 | 
						||
              else str = pax->source;
 | 
						||
              basesp = komodo_stateptrget(str);
 | 
						||
!             if ( basesp != 0 && pax->didstats == 0 )
 | 
						||
              {
 | 
						||
!                 if ( pax->type == 'I' && (pax2= komodo_paxfind(pax->txid,pax->vout,'D')) != 0 )
 | 
						||
                  {
 | 
						||
                      if ( pax2->fiatoshis != 0 )
 | 
						||
                      {
 | 
						||
***************
 | 
						||
*** 267,305 ****
 | 
						||
                          pax->marked = pax->height;
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
              }
 | 
						||
          }
 | 
						||
      }
 | 
						||
      komodo_stateptr(symbol,dest);
 | 
						||
      HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
      {
 | 
						||
!         //printf("pax.%s marked.%d %.8f -> %.8f\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
 | 
						||
!         if ( strcmp(symbol,pax->symbol) == 0 )
 | 
						||
          {
 | 
						||
              if ( pax->marked == 0 )
 | 
						||
              {
 | 
						||
                  if ( komodo_is_issuer() != 0 )
 | 
						||
!                     total += pax->fiatoshis;
 | 
						||
!                 else if ( pax->approved != 0 )
 | 
						||
                  {
 | 
						||
                      if ( pax->validated != 0 )
 | 
						||
                          total += pax->komodoshis;
 | 
						||
                      else
 | 
						||
                      {
 | 
						||
                          seed = 0;
 | 
						||
                          checktoshis = komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis);
 | 
						||
                          //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->komodoshis/COIN,(double)checktoshis/COIN);
 | 
						||
                          //printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->komodoshis),pax->height,pax->otherheight);
 | 
						||
!                         if ( seed != 0 )
 | 
						||
                          {
 | 
						||
!                             if ( checktoshis >= pax->komodoshis )
 | 
						||
                              {
 | 
						||
                                  total += pax->komodoshis;
 | 
						||
                                  pax->validated = pax->komodoshis;
 | 
						||
                              } else pax->marked = pax->height;
 | 
						||
                          }
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
              }
 | 
						||
          }
 | 
						||
      }
 | 
						||
--- 308,382 ----
 | 
						||
                          pax->marked = pax->height;
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
+                 else if ( pax->type == 'W' )
 | 
						||
+                 {
 | 
						||
+                     //bitcoin_address(coinaddr,addrtype,rmd160,20);
 | 
						||
+                     if ( (checktoshis= komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis)) != 0 )
 | 
						||
+                     {
 | 
						||
+                         if ( komodo_paxcmp(pax->source,pax->height,pax->komodoshis,checktoshis,seed) != 0 )
 | 
						||
+                         {
 | 
						||
+                             pax->marked = pax->height;
 | 
						||
+                             //printf("WITHDRAW.%s mark <- %d %.8f != %.8f\n",pax->source,pax->height,dstr(checktoshis),dstr(pax->komodoshis));
 | 
						||
+                         }
 | 
						||
+                         else if ( pax->validated == 0 )
 | 
						||
+                         {
 | 
						||
+                             pax->validated = pax->komodoshis = checktoshis;
 | 
						||
+                             //int32_t j; for (j=0; j<32; j++)
 | 
						||
+                             //    printf("%02x",((uint8_t *)&pax->txid)[j]);
 | 
						||
+                             //if ( strcmp(str,ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
+                             //    printf(" v%d %p got WITHDRAW.%s kmd.%d ht.%d %.8f -> %.8f/%.8f\n",pax->vout,pax,pax->source,pax->height,pax->otherheight,dstr(pax->fiatoshis),dstr(pax->komodoshis),dstr(checktoshis));
 | 
						||
+                         }
 | 
						||
+                     }
 | 
						||
+                 }
 | 
						||
              }
 | 
						||
          }
 | 
						||
      }
 | 
						||
      komodo_stateptr(symbol,dest);
 | 
						||
      HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
      {
 | 
						||
!         pax->ready = 0;
 | 
						||
!         if ( 0 && pax->type == 'A' )
 | 
						||
!             printf("%p pax.%s <- %s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->symbol,pax->source,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0);
 | 
						||
!         if ( pax->marked != 0 )
 | 
						||
!             continue;
 | 
						||
!         if ( strcmp(symbol,pax->symbol) == 0 || pax->type == 'A' )
 | 
						||
          {
 | 
						||
              if ( pax->marked == 0 )
 | 
						||
              {
 | 
						||
                  if ( komodo_is_issuer() != 0 )
 | 
						||
!                 {
 | 
						||
!                     if ( pax->validated != 0 && pax->type == 'D' )
 | 
						||
!                     {
 | 
						||
!                         total += pax->fiatoshis;
 | 
						||
!                         pax->ready = 1;
 | 
						||
!                     }
 | 
						||
!                 }
 | 
						||
!                 else if ( pax->approved != 0 && pax->type == 'A' )
 | 
						||
                  {
 | 
						||
                      if ( pax->validated != 0 )
 | 
						||
+                     {
 | 
						||
                          total += pax->komodoshis;
 | 
						||
+                         pax->ready = 1;
 | 
						||
+                     }
 | 
						||
                      else
 | 
						||
                      {
 | 
						||
                          seed = 0;
 | 
						||
                          checktoshis = komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis);
 | 
						||
                          //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->komodoshis/COIN,(double)checktoshis/COIN);
 | 
						||
                          //printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->komodoshis),pax->height,pax->otherheight);
 | 
						||
!                         if ( seed != 0 && checktoshis != 0 )
 | 
						||
                          {
 | 
						||
!                             if ( checktoshis == pax->komodoshis )
 | 
						||
                              {
 | 
						||
                                  total += pax->komodoshis;
 | 
						||
                                  pax->validated = pax->komodoshis;
 | 
						||
+                                 pax->ready = 1;
 | 
						||
                              } else pax->marked = pax->height;
 | 
						||
                          }
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
+                 if ( 0 && pax->ready != 0 )
 | 
						||
+                     printf("%p (%c) pax.%s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->type,pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0);
 | 
						||
              }
 | 
						||
          }
 | 
						||
      }
 | 
						||
***************
 | 
						||
*** 307,373 ****
 | 
						||
      return(total);
 | 
						||
  }
 | 
						||
  
 | 
						||
! int32_t komodo_pending_withdraws(char *opretstr)
 | 
						||
  {
 | 
						||
!     struct pax_transaction *pax,*tmp; uint8_t opretbuf[16384]; int32_t ht,len=0; uint64_t total = 0;
 | 
						||
      if ( komodo_isrealtime(&ht) == 0 || ASSETCHAINS_SYMBOL[0] != 0 )
 | 
						||
          return(0);
 | 
						||
      HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
      {
 | 
						||
!         //printf("pax %s marked.%u approved.%u\n",pax->symbol,pax->marked,pax->approved);
 | 
						||
!         if ( pax->marked == 0 && strcmp((char *)"KMD",pax->symbol) == 0 && pax->approved == 0 )
 | 
						||
          {
 | 
						||
!             // add 'A' opreturn entry
 | 
						||
!             if ( len == 0 )
 | 
						||
!                 opretbuf[len++] = 'A';
 | 
						||
!             len += komodo_rwapproval(1,&opretbuf[len],pax);
 | 
						||
!             //printf("%s.(marked.%u approved.%d) %p\n",pax->source,pax->marked,pax->approved,pax);
 | 
						||
          }
 | 
						||
      }
 | 
						||
!     if ( len > 0 )
 | 
						||
!         init_hexbytes_noT(opretstr,opretbuf,len);
 | 
						||
!     else opretstr[0] = 0;
 | 
						||
!     fprintf(stderr,"komodo_pending_withdraws len.%d PAXTOTAL %.8f\n",len,dstr(komodo_paxtotal()));
 | 
						||
      return(len);
 | 
						||
  }
 | 
						||
  
 | 
						||
  int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo)
 | 
						||
  {
 | 
						||
      struct pax_transaction *pax,*tmp; char symbol[16],dest[16]; uint8_t *script,opcode,opret[16384],data[16384]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct komodo_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask;
 | 
						||
      sp = komodo_stateptr(symbol,dest);
 | 
						||
      strcpy(symbol,base);
 | 
						||
      PENDING_KOMODO_TX = 0;
 | 
						||
      if ( tokomodo == 0 )
 | 
						||
      {
 | 
						||
          opcode = 'I';
 | 
						||
          if ( komodo_isrealtime(&ht) == 0 )
 | 
						||
              return(0);
 | 
						||
!     } else opcode = 'X';
 | 
						||
      HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
      {
 | 
						||
-         //printf("pax.%s marked.%d %.8f -> %.8f\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
 | 
						||
-         if ( strcmp(symbol,"KMD") == 0 && pax->approved == 0 )
 | 
						||
-             continue;
 | 
						||
-         //else if ( strcmp(symbol,"KMD") != 0 )
 | 
						||
          {
 | 
						||
  #ifdef KOMODO_ASSETCHAINS_WAITNOTARIZE
 | 
						||
!             struct komodo_state *kmdsp = komodo_stateptrget((char *)"KMD");
 | 
						||
!             if ( kmdsp != 0 && kmdsp->NOTARIZED_HEIGHT >= pax->height ) // assumes same chain as notarize
 | 
						||
                  pax->validated = pax->komodoshis; //kmdsp->NOTARIZED_HEIGHT;
 | 
						||
  #endif
 | 
						||
          }
 | 
						||
!         if ( pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
 | 
						||
          {
 | 
						||
!             printf("miner: skip %s %.8f when avail %.8f\n",symbol,dstr(pax->fiatoshis),dstr(available));
 | 
						||
              continue;
 | 
						||
          }
 | 
						||
!         if ( pax->marked != 0 )
 | 
						||
              continue;
 | 
						||
!         if ( strcmp(pax->symbol,symbol) != 0 || pax->validated == 0 )
 | 
						||
          {
 | 
						||
              //printf("pax->symbol.%s != %s or null pax->validated %.8f\n",pax->symbol,symbol,dstr(pax->validated));
 | 
						||
              continue;
 | 
						||
          }
 | 
						||
          if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
 | 
						||
              printf("pax.%s marked.%d %.8f -> %.8f\n",ASSETCHAINS_SYMBOL,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
 | 
						||
          txNew->vout.resize(numvouts+1);
 | 
						||
--- 384,518 ----
 | 
						||
      return(total);
 | 
						||
  }
 | 
						||
  
 | 
						||
! static int _paxorder(const void *a,const void *b)
 | 
						||
  {
 | 
						||
! #define pax_a (*(struct pax_transaction **)a)
 | 
						||
! #define pax_b (*(struct pax_transaction **)b)
 | 
						||
!     uint64_t aval,bval;
 | 
						||
!     aval = pax_a->fiatoshis + pax_a->komodoshis + pax_a->height;
 | 
						||
!     bval = pax_b->fiatoshis + pax_b->komodoshis + pax_b->height;
 | 
						||
! 	if ( bval > aval )
 | 
						||
! 		return(-1);
 | 
						||
! 	else if ( bval < aval )
 | 
						||
! 		return(1);
 | 
						||
! 	return(0);
 | 
						||
! #undef pax_a
 | 
						||
! #undef pax_b
 | 
						||
! }
 | 
						||
! 
 | 
						||
! int32_t komodo_pending_withdraws(char *opretstr) // todo: enforce deterministic order
 | 
						||
! {
 | 
						||
!     struct pax_transaction *pax,*pax2,*tmp,*paxes[64]; uint8_t opretbuf[16384]; int32_t i,n,ht,len=0; uint64_t total = 0;
 | 
						||
!     if ( KOMODO_PAX == 0 )
 | 
						||
!         return(0);
 | 
						||
      if ( komodo_isrealtime(&ht) == 0 || ASSETCHAINS_SYMBOL[0] != 0 )
 | 
						||
          return(0);
 | 
						||
+     n = 0;
 | 
						||
      HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
      {
 | 
						||
!         if ( pax->type == 'W' )
 | 
						||
          {
 | 
						||
!             if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'A')) != 0 )
 | 
						||
!             {
 | 
						||
!                 if ( pax2->approved != 0 )
 | 
						||
!                     pax->approved = pax2->approved;
 | 
						||
!             }
 | 
						||
!             else if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'X')) != 0 )
 | 
						||
!                 pax->approved = pax->height;
 | 
						||
!                 //printf("pax %s marked.%u approved.%u validated.%llu\n",pax->symbol,pax->marked,pax->approved,(long long)pax->validated);
 | 
						||
!             if ( pax->marked == 0 && strcmp((char *)"KMD",pax->symbol) == 0 && pax->approved == 0 && pax->validated != 0 )
 | 
						||
!             {
 | 
						||
!                 if ( n < sizeof(paxes)/sizeof(*paxes) )
 | 
						||
!                 {
 | 
						||
!                     paxes[n++] = pax;
 | 
						||
!                     //int32_t j; for (j=0; j<32; j++)
 | 
						||
!                     //    printf("%02x",((uint8_t *)&pax->txid)[j]);
 | 
						||
!                     //printf(" %s.(kmdht.%d ht.%d marked.%u approved.%d validated %.8f) %.8f\n",pax->source,pax->height,pax->otherheight,pax->marked,pax->approved,dstr(pax->validated),dstr(pax->komodoshis));
 | 
						||
!                 }
 | 
						||
!             }
 | 
						||
          }
 | 
						||
      }
 | 
						||
!     opretstr[0] = 0;
 | 
						||
!     if ( n > 0 )
 | 
						||
!     {
 | 
						||
!         opretbuf[len++] = 'A';
 | 
						||
!         qsort(paxes,n,sizeof(*paxes),_paxorder);
 | 
						||
!         for (i=0; i<n; i++)
 | 
						||
!         {
 | 
						||
!             if ( len < (sizeof(opretbuf)>>3)*7 )
 | 
						||
!                 len += komodo_rwapproval(1,&opretbuf[len],paxes[i]);
 | 
						||
!         }
 | 
						||
!         if ( len > 0 )
 | 
						||
!             init_hexbytes_noT(opretstr,opretbuf,len);
 | 
						||
!     }
 | 
						||
!     //fprintf(stderr,"komodo_pending_withdraws len.%d PAXTOTAL %.8f\n",len,dstr(komodo_paxtotal()));
 | 
						||
      return(len);
 | 
						||
  }
 | 
						||
  
 | 
						||
  int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo)
 | 
						||
  {
 | 
						||
      struct pax_transaction *pax,*tmp; char symbol[16],dest[16]; uint8_t *script,opcode,opret[16384],data[16384]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct komodo_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask;
 | 
						||
+     if ( KOMODO_PAX == 0 )
 | 
						||
+         return(0);
 | 
						||
+     struct komodo_state *kmdsp = komodo_stateptrget((char *)"KMD");
 | 
						||
      sp = komodo_stateptr(symbol,dest);
 | 
						||
      strcpy(symbol,base);
 | 
						||
+     if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) < 0 )
 | 
						||
+         return(0);
 | 
						||
      PENDING_KOMODO_TX = 0;
 | 
						||
      if ( tokomodo == 0 )
 | 
						||
      {
 | 
						||
          opcode = 'I';
 | 
						||
          if ( komodo_isrealtime(&ht) == 0 )
 | 
						||
              return(0);
 | 
						||
!     }
 | 
						||
!     else
 | 
						||
!     {
 | 
						||
!         opcode = 'X';
 | 
						||
!         if ( komodo_paxtotal() == 0 )
 | 
						||
!             return(0);
 | 
						||
!     }
 | 
						||
      HASH_ITER(hh,PAX,pax,tmp)
 | 
						||
      {
 | 
						||
          {
 | 
						||
  #ifdef KOMODO_ASSETCHAINS_WAITNOTARIZE
 | 
						||
!             if ( kmdsp != 0 && (kmdsp->NOTARIZED_HEIGHT >= pax->height || kmdsp->CURRENT_HEIGHT > pax->height+30) ) // assumes same chain as notarize
 | 
						||
                  pax->validated = pax->komodoshis; //kmdsp->NOTARIZED_HEIGHT;
 | 
						||
+             else pax->validated = pax->ready = 0;
 | 
						||
  #endif
 | 
						||
          }
 | 
						||
!         if ( ASSETCHAINS_SYMBOL[0] != 0 && (pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis) )
 | 
						||
          {
 | 
						||
!             if ( strcmp(ASSETCHAINS_SYMBOL,symbol) == 0 )
 | 
						||
!                 printf("miner.[%s]: skip %s %.8f when avail %.8f\n",ASSETCHAINS_SYMBOL,symbol,dstr(pax->fiatoshis),dstr(available));
 | 
						||
              continue;
 | 
						||
          }
 | 
						||
!         /*printf("pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0);
 | 
						||
!         if ( pax->marked != 0 || (pax->type != 'D' && pax->type != 'A') || pax->ready == 0 )
 | 
						||
!         {
 | 
						||
!             printf("reject 2\n");
 | 
						||
              continue;
 | 
						||
!         }*/
 | 
						||
!         if ( ASSETCHAINS_SYMBOL[0] != 0 && (strcmp(pax->symbol,symbol) != 0 || pax->validated == 0) )
 | 
						||
          {
 | 
						||
              //printf("pax->symbol.%s != %s or null pax->validated %.8f\n",pax->symbol,symbol,dstr(pax->validated));
 | 
						||
              continue;
 | 
						||
          }
 | 
						||
+         if ( pax->ready == 0 )
 | 
						||
+             continue;
 | 
						||
+         if ( pax->type == 'A' && ASSETCHAINS_SYMBOL[0] == 0 )
 | 
						||
+         {
 | 
						||
+             if ( kmdsp != 0 )
 | 
						||
+             {
 | 
						||
+                 if ( (baseid= komodo_baseid(pax->symbol)) < 0 || ((1LL << baseid) & sp->RTmask) == 0 )
 | 
						||
+                 {
 | 
						||
+                     printf("not RT for (%s) %llx baseid.%d %llx\n",pax->symbol,(long long)sp->RTmask,baseid,(long long)(1LL<<baseid));
 | 
						||
+                     continue;
 | 
						||
+                 }
 | 
						||
+             } else continue;
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         //printf("redeem.%d? (%c) %p pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d approved.%d\n",tokomodo,pax->type,pax,pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0,pax->approved!=0);
 | 
						||
          if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
 | 
						||
              printf("pax.%s marked.%d %.8f -> %.8f\n",ASSETCHAINS_SYMBOL,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
 | 
						||
          txNew->vout.resize(numvouts+1);
 | 
						||
***************
 | 
						||
*** 392,398 ****
 | 
						||
          {
 | 
						||
              len += komodo_rwapproval(1,&data[len],pax);
 | 
						||
              PENDING_KOMODO_TX += pax->komodoshis;
 | 
						||
!             //printf(" vout.%u DEPOSIT %.8f <- pax.%s pending %.8f | ",pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,dstr(PENDING_KOMODO_TX));
 | 
						||
          }
 | 
						||
          if ( numvouts++ >= 64 )
 | 
						||
              break;
 | 
						||
--- 537,543 ----
 | 
						||
          {
 | 
						||
              len += komodo_rwapproval(1,&data[len],pax);
 | 
						||
              PENDING_KOMODO_TX += pax->komodoshis;
 | 
						||
!             printf(" vout.%u DEPOSIT %.8f <- pax.%s pending %.8f | ",pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,dstr(PENDING_KOMODO_TX));
 | 
						||
          }
 | 
						||
          if ( numvouts++ >= 64 )
 | 
						||
              break;
 | 
						||
***************
 | 
						||
*** 419,424 ****
 | 
						||
--- 564,571 ----
 | 
						||
  int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above block is valid pax pricing
 | 
						||
  {
 | 
						||
      int32_t i,j,n,num,opretlen,offset=1,errs=0,matched=0,kmdheights[64],otherheights[64]; uint256 hash,txids[64]; char symbol[16],base[16]; uint16_t vouts[64]; int8_t baseids[64]; uint8_t *script,opcode,rmd160s[64*20]; uint64_t available,deposited,issued,withdrawn,approved,redeemed; int64_t values[64],srcvalues[64]; struct pax_transaction *pax;
 | 
						||
+     if ( KOMODO_PAX == 0 )
 | 
						||
+         return(0);
 | 
						||
      memset(baseids,0xff,sizeof(baseids));
 | 
						||
      memset(values,0,sizeof(values));
 | 
						||
      memset(srcvalues,0,sizeof(srcvalues));
 | 
						||
***************
 | 
						||
*** 442,447 ****
 | 
						||
--- 589,603 ----
 | 
						||
      {
 | 
						||
          strcpy(symbol,ASSETCHAINS_SYMBOL);
 | 
						||
          opcode = 'I';
 | 
						||
+         if ( komodo_baseid(symbol) < 0 )
 | 
						||
+         {
 | 
						||
+             if ( block.vtx[0].vout.size() != 1 )
 | 
						||
+             {
 | 
						||
+                 printf("%s has more than one coinbase?\n",symbol);
 | 
						||
+                 return(-1);
 | 
						||
+             }
 | 
						||
+             return(0);
 | 
						||
+         }
 | 
						||
      }
 | 
						||
      if ( script[offset] == opcode && opretlen < block.vtx[0].vout[n-1].scriptPubKey.size() )
 | 
						||
      {
 | 
						||
***************
 | 
						||
*** 449,455 ****
 | 
						||
          {
 | 
						||
              for (i=1; i<n-1; i++)
 | 
						||
              {
 | 
						||
!                 if ( (pax= komodo_paxfinds(txids[i-1],vouts[i-1])) != 0 )
 | 
						||
                  {
 | 
						||
                      pax->type = opcode;
 | 
						||
                      if ( opcode == 'I' && pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
 | 
						||
--- 605,611 ----
 | 
						||
          {
 | 
						||
              for (i=1; i<n-1; i++)
 | 
						||
              {
 | 
						||
!                 if ( (pax= komodo_paxfinds(txids[i-1],vouts[i-1])) != 0 ) // finds... make sure right one
 | 
						||
                  {
 | 
						||
                      pax->type = opcode;
 | 
						||
                      if ( opcode == 'I' && pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
 | 
						||
***************
 | 
						||
*** 461,476 ****
 | 
						||
                      {
 | 
						||
                          if ( pax->marked != 0 && height >= 80820 )
 | 
						||
                          {
 | 
						||
!                             printf("%c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
 | 
						||
                              errs++;
 | 
						||
!                         } else matched++;
 | 
						||
                      }
 | 
						||
                      else
 | 
						||
                      {
 | 
						||
                          for (j=0; j<32; j++)
 | 
						||
                              printf("%02x",((uint8_t *)&txids[i-1])[j]);
 | 
						||
                          printf(" cant paxfind %c txid\n",opcode);
 | 
						||
!                         printf("%c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
                  else
 | 
						||
--- 617,638 ----
 | 
						||
                      {
 | 
						||
                          if ( pax->marked != 0 && height >= 80820 )
 | 
						||
                          {
 | 
						||
!                             printf(">>>>>>>>>>> %c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
 | 
						||
                              errs++;
 | 
						||
!                         }
 | 
						||
!                         else
 | 
						||
!                         {
 | 
						||
!                             if ( opcode == 'X' )
 | 
						||
!                                 printf("check deposit validates %s %.8f -> %.8f\n",CURRENCIES[baseids[i]],dstr(srcvalues[i]),dstr(values[i]));
 | 
						||
!                             matched++;
 | 
						||
!                         }
 | 
						||
                      }
 | 
						||
                      else
 | 
						||
                      {
 | 
						||
                          for (j=0; j<32; j++)
 | 
						||
                              printf("%02x",((uint8_t *)&txids[i-1])[j]);
 | 
						||
                          printf(" cant paxfind %c txid\n",opcode);
 | 
						||
!                         printf(">>>>>>>>>>> %c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
                  else
 | 
						||
***************
 | 
						||
*** 478,491 ****
 | 
						||
                      hash = block.GetHash();
 | 
						||
                      for (j=0; j<32; j++)
 | 
						||
                          printf("%02x",((uint8_t *)&hash)[j]);
 | 
						||
!                     printf(" ht.%d blockhash X couldnt find vout.[%d]\n",height,i);
 | 
						||
                  }
 | 
						||
              }
 | 
						||
!             if ( matched != num )
 | 
						||
              {
 | 
						||
                  printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d\n",symbol,height,opcode,matched,num);
 | 
						||
                  // can easily happen depending on order of loading
 | 
						||
!                 if ( height > 100000 ) //&& opcode == 'X' )
 | 
						||
                  {
 | 
						||
                      printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num);
 | 
						||
                      return(-1);
 | 
						||
--- 640,653 ----
 | 
						||
                      hash = block.GetHash();
 | 
						||
                      for (j=0; j<32; j++)
 | 
						||
                          printf("%02x",((uint8_t *)&hash)[j]);
 | 
						||
!                     printf(" kht.%d ht.%d %.8f %.8f blockhash couldnt find vout.[%d]\n",kmdheights[i-1],otherheights[i-1],dstr(values[i-1]),dstr(srcvalues[i]),i);
 | 
						||
                  }
 | 
						||
              }
 | 
						||
!             if ( height <= chainActive.Tip()->nHeight && matched != num )
 | 
						||
              {
 | 
						||
                  printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d\n",symbol,height,opcode,matched,num);
 | 
						||
                  // can easily happen depending on order of loading
 | 
						||
!                 if ( height > 200000 )
 | 
						||
                  {
 | 
						||
                      printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num);
 | 
						||
                      return(-1);
 | 
						||
***************
 | 
						||
*** 497,530 ****
 | 
						||
      return(0);
 | 
						||
  }
 | 
						||
  
 | 
						||
- int32_t komodo_paxcmp(char *symbol,int32_t kmdheight,uint64_t value,uint64_t checkvalue,uint64_t seed)
 | 
						||
- {
 | 
						||
-     int32_t ratio;
 | 
						||
-     if ( seed == 0 && checkvalue != 0 )
 | 
						||
-     {
 | 
						||
-         ratio = ((value << 6) / checkvalue);
 | 
						||
-         if ( ratio >= 63 && ratio <= 65 )
 | 
						||
-             return(0);
 | 
						||
-         else
 | 
						||
-         {
 | 
						||
-             if ( kmdheight >= 86150 )
 | 
						||
-                 printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
 | 
						||
-             return(-1);
 | 
						||
-         }
 | 
						||
-     }
 | 
						||
-     else if ( checkvalue != 0 )
 | 
						||
-     {
 | 
						||
-         ratio = ((value << 10) / checkvalue);
 | 
						||
-         if ( ratio >= 1023 && ratio <= 1025 )
 | 
						||
-             return(0);
 | 
						||
-     }
 | 
						||
-     return(value != checkvalue);
 | 
						||
- }
 | 
						||
- 
 | 
						||
  const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source)
 | 
						||
  {
 | 
						||
      uint8_t rmd160[20],rmd160s[64*20],addrtype,shortflag,pubkey33[33]; int32_t didstats,i,j,n,len,tokomodo,kmdheight,otherheights[64],kmdheights[64]; int8_t baseids[64]; char base[4],coinaddr[64],destaddr[64]; uint256 txids[64]; uint16_t vouts[64]; uint64_t convtoshis,seed; int64_t fiatoshis,komodoshis,checktoshis,values[64],srcvalues[64]; struct pax_transaction *pax,*pax2; struct komodo_state *basesp; double diff;
 | 
						||
      const char *typestr = "unknown";
 | 
						||
      memset(baseids,0xff,sizeof(baseids));
 | 
						||
      memset(values,0,sizeof(values));
 | 
						||
      memset(srcvalues,0,sizeof(srcvalues));
 | 
						||
--- 659,675 ----
 | 
						||
      return(0);
 | 
						||
  }
 | 
						||
  
 | 
						||
  const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source)
 | 
						||
  {
 | 
						||
      uint8_t rmd160[20],rmd160s[64*20],addrtype,shortflag,pubkey33[33]; int32_t didstats,i,j,n,len,tokomodo,kmdheight,otherheights[64],kmdheights[64]; int8_t baseids[64]; char base[4],coinaddr[64],destaddr[64]; uint256 txids[64]; uint16_t vouts[64]; uint64_t convtoshis,seed; int64_t fiatoshis,komodoshis,checktoshis,values[64],srcvalues[64]; struct pax_transaction *pax,*pax2; struct komodo_state *basesp; double diff;
 | 
						||
      const char *typestr = "unknown";
 | 
						||
+     if ( KOMODO_PAX == 0 )
 | 
						||
+         return("nopax");
 | 
						||
+     if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) < 0 )
 | 
						||
+     {
 | 
						||
+         //printf("komodo_opreturn skip %s\n",ASSETCHAINS_SYMBOL);
 | 
						||
+         return("assetchain");
 | 
						||
+     }
 | 
						||
      memset(baseids,0xff,sizeof(baseids));
 | 
						||
      memset(values,0,sizeof(values));
 | 
						||
      memset(srcvalues,0,sizeof(srcvalues));
 | 
						||
***************
 | 
						||
*** 546,552 ****
 | 
						||
              if ( kmdheight <= height )
 | 
						||
              {
 | 
						||
                  didstats = 0;
 | 
						||
!                 if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
                  {
 | 
						||
                      printf("(%s) (%s) kmdheight.%d vs height.%d check %.8f vs %.8f tokomodo.%d %d seed.%llx\n",ASSETCHAINS_SYMBOL,base,kmdheight,height,dstr(checktoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed);
 | 
						||
                      for (i=0; i<32; i++)
 | 
						||
--- 691,697 ----
 | 
						||
              if ( kmdheight <= height )
 | 
						||
              {
 | 
						||
                  didstats = 0;
 | 
						||
!                 if ( 0 && strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
                  {
 | 
						||
                      printf("(%s) (%s) kmdheight.%d vs height.%d check %.8f vs %.8f tokomodo.%d %d seed.%llx\n",ASSETCHAINS_SYMBOL,base,kmdheight,height,dstr(checktoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed);
 | 
						||
                      for (i=0; i<32; i++)
 | 
						||
***************
 | 
						||
*** 592,598 ****
 | 
						||
                              pax2->fiatoshis = pax->fiatoshis;
 | 
						||
                              pax2->komodoshis = pax->komodoshis;
 | 
						||
                              pax->marked = pax2->marked = pax->height;
 | 
						||
!                             pax->otherheight = height;
 | 
						||
                              if ( pax2->didstats == 0 )
 | 
						||
                              {
 | 
						||
                                  if ( (basesp= komodo_stateptrget(base)) != 0 )
 | 
						||
--- 737,743 ----
 | 
						||
                              pax2->fiatoshis = pax->fiatoshis;
 | 
						||
                              pax2->komodoshis = pax->komodoshis;
 | 
						||
                              pax->marked = pax2->marked = pax->height;
 | 
						||
!                             pax2->height = pax->height = height;
 | 
						||
                              if ( pax2->didstats == 0 )
 | 
						||
                              {
 | 
						||
                                  if ( (basesp= komodo_stateptrget(base)) != 0 )
 | 
						||
***************
 | 
						||
*** 632,638 ****
 | 
						||
                      {
 | 
						||
                          pax->type = opretbuf[0];
 | 
						||
                          strcpy(pax->source,(char *)&opretbuf[opretlen-4]);
 | 
						||
!                         if ( (pax2= komodo_paxfind(txids[i],vouts[i],'D')) != 0 )
 | 
						||
                          {
 | 
						||
                              // realtime path?
 | 
						||
                              pax->fiatoshis = pax2->fiatoshis;
 | 
						||
--- 777,783 ----
 | 
						||
                      {
 | 
						||
                          pax->type = opretbuf[0];
 | 
						||
                          strcpy(pax->source,(char *)&opretbuf[opretlen-4]);
 | 
						||
!                         if ( (pax2= komodo_paxfind(txids[i],vouts[i],'D')) != 0 && pax2->fiatoshis != 0 && pax2->komodoshis != 0 )
 | 
						||
                          {
 | 
						||
                              // realtime path?
 | 
						||
                              pax->fiatoshis = pax2->fiatoshis;
 | 
						||
***************
 | 
						||
*** 651,665 ****
 | 
						||
                                  }
 | 
						||
                              }
 | 
						||
                          }
 | 
						||
-                         komodo_paxmark(pax->height,txids[i],vouts[i],'D',height);
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
              } else printf("opreturn none issued?\n");
 | 
						||
          }
 | 
						||
-         if ( strcmp(source,ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
-             printf("source.%s opreturn[I] matches %s\n",source,(char *)&opretbuf[opretlen-4]);
 | 
						||
      }
 | 
						||
!     else if ( opretbuf[0] == 'W' && opretlen >= 38 )
 | 
						||
      {
 | 
						||
          tokomodo = 1;
 | 
						||
          iguana_rwnum(0,&opretbuf[34],sizeof(kmdheight),&kmdheight);
 | 
						||
--- 796,811 ----
 | 
						||
                                  }
 | 
						||
                              }
 | 
						||
                          }
 | 
						||
                      }
 | 
						||
+                     if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'I',height)) != 0 )
 | 
						||
+                         komodo_paxdelete(pax);
 | 
						||
+                     if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'D',height)) != 0 )
 | 
						||
+                         komodo_paxdelete(pax);
 | 
						||
                  }
 | 
						||
              } else printf("opreturn none issued?\n");
 | 
						||
          }
 | 
						||
      }
 | 
						||
!     else if ( opretbuf[0] == 'W' )//&& opretlen >= 38 )
 | 
						||
      {
 | 
						||
          tokomodo = 1;
 | 
						||
          iguana_rwnum(0,&opretbuf[34],sizeof(kmdheight),&kmdheight);
 | 
						||
***************
 | 
						||
*** 668,676 ****
 | 
						||
          bitcoin_address(coinaddr,addrtype,rmd160,20);
 | 
						||
          checktoshis = PAX_fiatdest(&seed,tokomodo,destaddr,pubkey33,coinaddr,kmdheight,base,value);
 | 
						||
          typestr = "withdraw";
 | 
						||
!         //printf("%s.height.%d vs height.%d check %.8f/%.8f vs %.8f tokomodo.%d %d seed.%llx -> (%s)\n",ASSETCHAINS_SYMBOL,kmdheight,height,dstr(checktoshis),dstr(komodoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed,coinaddr);
 | 
						||
          didstats = 0;
 | 
						||
!         if ( komodo_paxcmp(base,kmdheight,komodoshis,checktoshis,seed) == 0 )
 | 
						||
          {
 | 
						||
              if ( value != 0 && ((pax= komodo_paxfind(txid,vout,'W')) == 0 || pax->didstats == 0) )
 | 
						||
              {
 | 
						||
--- 814,823 ----
 | 
						||
          bitcoin_address(coinaddr,addrtype,rmd160,20);
 | 
						||
          checktoshis = PAX_fiatdest(&seed,tokomodo,destaddr,pubkey33,coinaddr,kmdheight,base,value);
 | 
						||
          typestr = "withdraw";
 | 
						||
!         if ( 0 && strcmp(base,"RUB") == 0 )
 | 
						||
!             printf("RUB WITHDRAW %s.height.%d vs height.%d check %.8f/%.8f vs %.8f tokomodo.%d %d seed.%llx -> (%s) len.%d\n",ASSETCHAINS_SYMBOL,kmdheight,height,dstr(checktoshis),dstr(komodoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed,coinaddr,opretlen);
 | 
						||
          didstats = 0;
 | 
						||
!         //if ( komodo_paxcmp(base,kmdheight,komodoshis,checktoshis,seed) == 0 )
 | 
						||
          {
 | 
						||
              if ( value != 0 && ((pax= komodo_paxfind(txid,vout,'W')) == 0 || pax->didstats == 0) )
 | 
						||
              {
 | 
						||
***************
 | 
						||
*** 679,697 ****
 | 
						||
                      basesp->withdrawn += value;
 | 
						||
                      didstats = 1;
 | 
						||
                      if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                         printf("########### %p withdrawn %s += %.8f\n",basesp,base,dstr(value));
 | 
						||
                  }
 | 
						||
!                 //printf("notarize %s %.8f -> %.8f kmd.%d other.%d\n",ASSETCHAINS_SYMBOL,dstr(value),dstr(komodoshis),kmdheight,height);
 | 
						||
              }
 | 
						||
!             komodo_gateway_deposit(coinaddr,komodoshis,(char *)"KMD",value,rmd160,txid,vout,'W',kmdheight,height,source,0);
 | 
						||
              if ( (pax= komodo_paxfind(txid,vout,'W')) != 0 )
 | 
						||
              {
 | 
						||
-                 if ( didstats != 0 )
 | 
						||
-                     pax->didstats = 1;
 | 
						||
                  pax->type = opretbuf[0];
 | 
						||
!                 pax->validated = komodoshis;
 | 
						||
              }
 | 
						||
!         }
 | 
						||
      }
 | 
						||
      else if ( tokomodo != 0 && opretbuf[0] == 'A' )
 | 
						||
      {
 | 
						||
--- 826,848 ----
 | 
						||
                      basesp->withdrawn += value;
 | 
						||
                      didstats = 1;
 | 
						||
                      if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                         printf("########### %p withdrawn %s += %.8f check %.8f\n",basesp,base,dstr(value),dstr(checktoshis));
 | 
						||
                  }
 | 
						||
!                 if ( 0 && strcmp(base,"RUB") == 0 && (pax == 0 || pax->approved == 0) )
 | 
						||
!                     printf("notarize %s %.8f -> %.8f kmd.%d other.%d\n",ASSETCHAINS_SYMBOL,dstr(value),dstr(komodoshis),kmdheight,height);
 | 
						||
              }
 | 
						||
!             komodo_gateway_deposit(coinaddr,0,(char *)"KMD",value,rmd160,txid,vout,'W',kmdheight,height,source,0);
 | 
						||
              if ( (pax= komodo_paxfind(txid,vout,'W')) != 0 )
 | 
						||
              {
 | 
						||
                  pax->type = opretbuf[0];
 | 
						||
!                 strcpy(pax->source,base);
 | 
						||
!                 strcpy(pax->symbol,"KMD");
 | 
						||
!                 pax->height = kmdheight;
 | 
						||
!                 pax->otherheight = height;
 | 
						||
!                 pax->komodoshis = komodoshis;
 | 
						||
              }
 | 
						||
!         } // else printf("withdraw %s paxcmp ht.%d %d error value %.8f -> %.8f vs %.8f\n",base,kmdheight,height,dstr(value),dstr(komodoshis),dstr(checktoshis));
 | 
						||
!         // need to allocate pax
 | 
						||
      }
 | 
						||
      else if ( tokomodo != 0 && opretbuf[0] == 'A' )
 | 
						||
      {
 | 
						||
***************
 | 
						||
*** 700,756 ****
 | 
						||
          {
 | 
						||
              for (i=0; i<opretlen; i++)
 | 
						||
                  printf("%02x",opretbuf[i]);
 | 
						||
!             printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()));
 | 
						||
          }
 | 
						||
          if ( (n= komodo_issued_opreturn(base,txids,vouts,values,srcvalues,kmdheights,otherheights,baseids,rmd160s,opretbuf,opretlen,1)) > 0 )
 | 
						||
          {
 | 
						||
              for (i=0; i<n; i++)
 | 
						||
              {
 | 
						||
                  if ( baseids[i] < 0 )
 | 
						||
-                     continue;
 | 
						||
-                 didstats = 0;
 | 
						||
-                 seed = 0;
 | 
						||
-                 checktoshis = komodo_paxprice(&seed,kmdheights[i],CURRENCIES[baseids[i]],(char *)"KMD",(uint64_t)srcvalues[i]);
 | 
						||
-                 /*printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",kmdheights[i],CURRENCIES[baseids[i]],(double)srcvalues[i]/COIN,(double)values[i]/COIN,(double)checktoshis/COIN);
 | 
						||
-                 for (j=0; j<32; j++)
 | 
						||
-                     printf("%02x",((uint8_t *)&txids[i])[j]);
 | 
						||
-                 printf(" v%d %.8f k.%d ht.%d base.%d\n",vouts[i],dstr(values[i]),kmdheights[i],otherheights[i],baseids[i]);*/
 | 
						||
-                 if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
 | 
						||
                  {
 | 
						||
!                     bitcoin_address(coinaddr,60,&rmd160s[i*20],20);
 | 
						||
!                     komodo_gateway_deposit(coinaddr,values[i],CURRENCIES[baseids[i]],srcvalues[i],&rmd160s[i*20],txids[i],vouts[i],'A',kmdheights[i],otherheights[i],CURRENCIES[baseids[i]],kmdheights[i]);
 | 
						||
!                     komodo_paxmark(height,txids[i],vouts[i],'W',height);
 | 
						||
!                     komodo_paxmark(height,txids[i],vouts[i],'A',height);
 | 
						||
!                     if ( srcvalues[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
 | 
						||
                      {
 | 
						||
!                         basesp->approved += srcvalues[i];
 | 
						||
!                         didstats = 1;
 | 
						||
!                         if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                             printf("########### %p approved %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
 | 
						||
                      }
 | 
						||
!                     //printf(" i.%d (%s) <- %.8f ADDFLAG APPROVED\n",i,coinaddr,dstr(values[i]));
 | 
						||
                  }
 | 
						||
!                 else if ( pax->didstats == 0 && srcvalues[i] != 0 )
 | 
						||
!                 {
 | 
						||
!                     if ( (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
 | 
						||
                      {
 | 
						||
!                         basesp->approved += srcvalues[i];
 | 
						||
!                         didstats = 1;
 | 
						||
!                         if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                             printf("########### %p approved %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
 | 
						||
                      }
 | 
						||
-                 } //else printf(" i.%d of n.%d pax.%p baseids[] %d\n",i,n,pax,baseids[i]);
 | 
						||
-                 if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) != 0 )
 | 
						||
-                 {
 | 
						||
-                     pax->type = opretbuf[0];
 | 
						||
-                     pax->approved = kmdheights[i];
 | 
						||
-                     if ( didstats != 0 )
 | 
						||
-                         pax->didstats = 1;
 | 
						||
-                     if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
-                         printf(" i.%d approved.%d <<<<<<<<<<<<< APPROVED %p\n",i,kmdheights[i],pax);
 | 
						||
                  }
 | 
						||
              }
 | 
						||
!         }
 | 
						||
          //printf("extra.[%d] after %.8f\n",n,dstr(komodo_paxtotal()));
 | 
						||
      }
 | 
						||
      else if ( opretbuf[0] == 'X' )
 | 
						||
--- 851,928 ----
 | 
						||
          {
 | 
						||
              for (i=0; i<opretlen; i++)
 | 
						||
                  printf("%02x",opretbuf[i]);
 | 
						||
!             printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f opretlen.%d\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()),opretlen);
 | 
						||
          }
 | 
						||
          if ( (n= komodo_issued_opreturn(base,txids,vouts,values,srcvalues,kmdheights,otherheights,baseids,rmd160s,opretbuf,opretlen,1)) > 0 )
 | 
						||
          {
 | 
						||
              for (i=0; i<n; i++)
 | 
						||
              {
 | 
						||
+                 //for (j=0; j<32; j++)
 | 
						||
+                 //    printf("%02x",((uint8_t *)&txids[i])[j]);
 | 
						||
+                 //printf(" v%d %.8f %.8f k.%d ht.%d base.%d\n",vouts[i],dstr(values[i]),dstr(srcvalues[i]),kmdheights[i],otherheights[i],baseids[i]);
 | 
						||
                  if ( baseids[i] < 0 )
 | 
						||
                  {
 | 
						||
!                     for (i=0; i<opretlen; i++)
 | 
						||
!                         printf("%02x",opretbuf[i]);
 | 
						||
!                     printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f opretlen.%d\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()),opretlen);
 | 
						||
!                     //printf("baseids[%d] %d\n",i,baseids[i]);
 | 
						||
!                     if ( (pax= komodo_paxfind(txids[i],vouts[i],'W')) != 0 || (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
 | 
						||
                      {
 | 
						||
!                         baseids[i] = komodo_baseid(pax->symbol);
 | 
						||
!                         printf("override neg1 with (%s)\n",pax->symbol);
 | 
						||
                      }
 | 
						||
!                     if ( baseids[i] < 0 )
 | 
						||
!                         continue;
 | 
						||
                  }
 | 
						||
!                 didstats = 0;
 | 
						||
!                 seed = 0;
 | 
						||
!                 checktoshis = komodo_paxprice(&seed,kmdheights[i],CURRENCIES[baseids[i]],(char *)"KMD",(uint64_t)values[i]);
 | 
						||
!                 //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",kmdheights[i],CURRENCIES[baseids[i]],(double)values[i]/COIN,(double)srcvalues[i]/COIN,(double)checktoshis/COIN);
 | 
						||
!                 if ( srcvalues[i] == checktoshis )
 | 
						||
!                 {
 | 
						||
!                     if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
 | 
						||
!                     {
 | 
						||
!                         bitcoin_address(coinaddr,60,&rmd160s[i*20],20);
 | 
						||
!                         komodo_gateway_deposit(coinaddr,srcvalues[i],CURRENCIES[baseids[i]],values[i],&rmd160s[i*20],txids[i],vouts[i],'A',kmdheights[i],otherheights[i],CURRENCIES[baseids[i]],kmdheights[i]);
 | 
						||
!                         if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
 | 
						||
!                             printf("unexpected null pax for approve\n");
 | 
						||
!                         else pax->validated = checktoshis;
 | 
						||
!                         if ( (pax2= komodo_paxfind(txids[i],vouts[i],'W')) != 0 )
 | 
						||
!                             pax2->approved = kmdheights[i];
 | 
						||
!                         komodo_paxmark(height,txids[i],vouts[i],'W',height);
 | 
						||
!                         //komodo_paxmark(height,txids[i],vouts[i],'A',height);
 | 
						||
!                         if ( values[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
 | 
						||
!                         {
 | 
						||
!                             basesp->approved += values[i];
 | 
						||
!                             didstats = 1;
 | 
						||
!                             if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                                 printf("pax.%p ########### %p approved %s += %.8f -> %.8f/%.8f kht.%d %d\n",pax,basesp,CURRENCIES[baseids[i]],dstr(values[i]),dstr(srcvalues[i]),dstr(checktoshis),kmdheights[i],otherheights[i]);
 | 
						||
!                         }
 | 
						||
!                         //printf(" i.%d (%s) <- %.8f ADDFLAG APPROVED\n",i,coinaddr,dstr(values[i]));
 | 
						||
!                     }
 | 
						||
!                     else if ( pax->didstats == 0 && srcvalues[i] != 0 )
 | 
						||
                      {
 | 
						||
!                         if ( (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
 | 
						||
!                         {
 | 
						||
!                             basesp->approved += values[i];
 | 
						||
!                             didstats = 1;
 | 
						||
!                             if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                                 printf("pax.%p ########### %p approved %s += %.8f -> %.8f/%.8f\n",pax,basesp,CURRENCIES[baseids[i]],dstr(values[i]),dstr(srcvalues[i]),dstr(checktoshis));
 | 
						||
!                         }
 | 
						||
!                     } //else printf(" i.%d of n.%d pax.%p baseids[] %d\n",i,n,pax,baseids[i]);
 | 
						||
!                     if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) != 0 )
 | 
						||
!                     {
 | 
						||
!                         pax->type = opretbuf[0];
 | 
						||
!                         pax->approved = kmdheights[i];
 | 
						||
!                         pax->validated = checktoshis;
 | 
						||
!                         if ( didstats != 0 )
 | 
						||
!                             pax->didstats = 1;
 | 
						||
!                         //if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                         //printf(" i.%d approved.%d <<<<<<<<<<<<< APPROVED %p\n",i,kmdheights[i],pax);
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
              }
 | 
						||
!         } else printf("n.%d from opreturns\n",n);
 | 
						||
          //printf("extra.[%d] after %.8f\n",n,dstr(komodo_paxtotal()));
 | 
						||
      }
 | 
						||
      else if ( opretbuf[0] == 'X' )
 | 
						||
***************
 | 
						||
*** 770,783 ****
 | 
						||
                  if ( (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
 | 
						||
                  {
 | 
						||
                      pax->type = opretbuf[0];
 | 
						||
!                     if ( baseids[i] >= 0 && srcvalues[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
 | 
						||
                      {
 | 
						||
!                         basesp->redeemed += srcvalues[i];
 | 
						||
                          pax->didstats = 1;
 | 
						||
!                         if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                             printf("########### %p redeemed %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
              }
 | 
						||
          } //else printf("komodo_issued_opreturn returned %d\n",n);
 | 
						||
      }
 | 
						||
--- 942,964 ----
 | 
						||
                  if ( (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
 | 
						||
                  {
 | 
						||
                      pax->type = opretbuf[0];
 | 
						||
!                     if ( height < 121842 ) // fields got switched around due to legacy issues and approves
 | 
						||
!                         value = srcvalues[i];
 | 
						||
!                     else value = values[i];
 | 
						||
!                     if ( baseids[i] >= 0 && value != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
 | 
						||
                      {
 | 
						||
!                         basesp->redeemed += value;
 | 
						||
                          pax->didstats = 1;
 | 
						||
!                         //if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
 | 
						||
!                             printf("ht.%d %.8f ########### %p redeemed %s += %.8f %.8f kht.%d ht.%d\n",height,dstr(value),basesp,CURRENCIES[baseids[i]],dstr(value),dstr(srcvalues[i]),kmdheights[i],otherheights[i]);
 | 
						||
                      }
 | 
						||
                  }
 | 
						||
+                 if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'W',height)) != 0 )
 | 
						||
+                     komodo_paxdelete(pax);
 | 
						||
+                 if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'A',height)) != 0 )
 | 
						||
+                     komodo_paxdelete(pax);
 | 
						||
+                 if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'X',height)) != 0 )
 | 
						||
+                     komodo_paxdelete(pax);
 | 
						||
              }
 | 
						||
          } //else printf("komodo_issued_opreturn returned %d\n",n);
 | 
						||
      }
 | 
						||
***************
 | 
						||
*** 788,802 ****
 | 
						||
  {
 | 
						||
      static long lastpos[34]; static char userpass[33][1024];
 | 
						||
      FILE *fp; int32_t baseid,isrealtime,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3]; cJSON *infoobj,*result; uint64_t RTmask = 0;
 | 
						||
      while ( KOMODO_INITDONE == 0 )
 | 
						||
      {
 | 
						||
!         fprintf(stderr,"PASSPORT iteration waiting for KOMODO_INITDONE\n");
 | 
						||
          sleep(3);
 | 
						||
      }
 | 
						||
      refsp = komodo_stateptr(symbol,dest);
 | 
						||
      if ( ASSETCHAINS_SYMBOL[0] == 0 )
 | 
						||
          refid = 33;
 | 
						||
!     else refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
 | 
						||
      //printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
 | 
						||
      for (baseid=32; baseid>=0; baseid--)
 | 
						||
      {
 | 
						||
--- 969,997 ----
 | 
						||
  {
 | 
						||
      static long lastpos[34]; static char userpass[33][1024];
 | 
						||
      FILE *fp; int32_t baseid,isrealtime,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3]; cJSON *infoobj,*result; uint64_t RTmask = 0;
 | 
						||
+     //printf("PASSPORT.(%s)\n",ASSETCHAINS_SYMBOL);
 | 
						||
      while ( KOMODO_INITDONE == 0 )
 | 
						||
      {
 | 
						||
!         fprintf(stderr,"[%s] PASSPORT iteration waiting for KOMODO_INITDONE\n",ASSETCHAINS_SYMBOL);
 | 
						||
          sleep(3);
 | 
						||
      }
 | 
						||
      refsp = komodo_stateptr(symbol,dest);
 | 
						||
      if ( ASSETCHAINS_SYMBOL[0] == 0 )
 | 
						||
          refid = 33;
 | 
						||
!     else
 | 
						||
!     {
 | 
						||
!         refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
 | 
						||
!         if ( refid == 0 )
 | 
						||
!         {
 | 
						||
!             KOMODO_PASSPORT_INITDONE = 1;
 | 
						||
!             return;
 | 
						||
!         }
 | 
						||
!     }
 | 
						||
!     if ( KOMODO_PAX == 0 )
 | 
						||
!     {
 | 
						||
!         KOMODO_PASSPORT_INITDONE = 1;
 | 
						||
!         return;
 | 
						||
!     }
 | 
						||
      //printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
 | 
						||
      for (baseid=32; baseid>=0; baseid--)
 | 
						||
      {
 | 
						||
***************
 | 
						||
*** 807,813 ****
 | 
						||
          {
 | 
						||
              komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
 | 
						||
              komodo_nameset(symbol,dest,base);
 | 
						||
!             if ( (fp= fopen(fname,"rb")) != 0 && (sp= komodo_stateptrget(symbol)) != 0 )
 | 
						||
              {
 | 
						||
                  fseek(fp,0,SEEK_END);
 | 
						||
                  if ( ftell(fp) > lastpos[baseid] )
 | 
						||
--- 1002,1009 ----
 | 
						||
          {
 | 
						||
              komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
 | 
						||
              komodo_nameset(symbol,dest,base);
 | 
						||
!             sp = komodo_stateptrget(symbol);
 | 
						||
!             if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 )
 | 
						||
              {
 | 
						||
                  fseek(fp,0,SEEK_END);
 | 
						||
                  if ( ftell(fp) > lastpos[baseid] )
 | 
						||
***************
 | 
						||
*** 822,840 ****
 | 
						||
                          printf("from.(%s) lastpos[%s] %ld\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid]);
 | 
						||
                  } //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
 | 
						||
                  fclose(fp);
 | 
						||
!             }
 | 
						||
              komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
 | 
						||
              if ( (fp= fopen(fname,"rb")) != 0 )
 | 
						||
              {
 | 
						||
                  if ( fread(buf,1,sizeof(buf),fp) == sizeof(buf) )
 | 
						||
                  {
 | 
						||
                      sp->CURRENT_HEIGHT = buf[0];
 | 
						||
!                     if ( buf[0] != 0 && buf[0] == buf[1] && buf[2] > time(NULL)-60 )
 | 
						||
                      {
 | 
						||
                          isrealtime = 1;
 | 
						||
                          RTmask |= (1LL << baseid);
 | 
						||
                          memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
 | 
						||
!                     } //else fprintf(stderr,"%s not RT\n",base);
 | 
						||
                  } //else fprintf(stderr,"%s size error RT\n",base);
 | 
						||
                  fclose(fp);
 | 
						||
              } //else fprintf(stderr,"%s open error RT\n",base);
 | 
						||
--- 1018,1036 ----
 | 
						||
                          printf("from.(%s) lastpos[%s] %ld\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid]);
 | 
						||
                  } //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
 | 
						||
                  fclose(fp);
 | 
						||
!             } else printf("error.(%s) %p\n",fname,sp);
 | 
						||
              komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
 | 
						||
              if ( (fp= fopen(fname,"rb")) != 0 )
 | 
						||
              {
 | 
						||
                  if ( fread(buf,1,sizeof(buf),fp) == sizeof(buf) )
 | 
						||
                  {
 | 
						||
                      sp->CURRENT_HEIGHT = buf[0];
 | 
						||
!                     if ( buf[0] != 0 && buf[0] >= buf[1] && buf[2] > time(NULL)-300 )
 | 
						||
                      {
 | 
						||
                          isrealtime = 1;
 | 
						||
                          RTmask |= (1LL << baseid);
 | 
						||
                          memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
 | 
						||
!                     } else fprintf(stderr,"[%s]: %s not RT %u %u %d\n",ASSETCHAINS_SYMBOL,base,buf[0],buf[1],(int32_t)(time(NULL)-buf[2]));
 | 
						||
                  } //else fprintf(stderr,"%s size error RT\n",base);
 | 
						||
                  fclose(fp);
 | 
						||
              } //else fprintf(stderr,"%s open error RT\n",base);
 | 
						||
***************
 | 
						||
*** 849,855 ****
 | 
						||
                  if ( buf[0] != 0 && buf[0] == buf[1] )
 | 
						||
                  {
 | 
						||
                      buf[2] = (uint32_t)time(NULL);
 | 
						||
!                     RTmask |= (1LL << baseid) | 1;
 | 
						||
                      memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
 | 
						||
                      if ( refid != 0 )
 | 
						||
                          memcpy(refsp->RTbufs[0],buf,sizeof(refsp->RTbufs[0]));
 | 
						||
--- 1045,1051 ----
 | 
						||
                  if ( buf[0] != 0 && buf[0] == buf[1] )
 | 
						||
                  {
 | 
						||
                      buf[2] = (uint32_t)time(NULL);
 | 
						||
!                     RTmask |= (1LL << baseid);
 | 
						||
                      memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
 | 
						||
                      if ( refid != 0 )
 | 
						||
                          memcpy(refsp->RTbufs[0],buf,sizeof(refsp->RTbufs[0]));
 | 
						||
***************
 | 
						||
*** 865,869 ****
 | 
						||
--- 1061,1066 ----
 | 
						||
      komodo_paxtotal();
 | 
						||
      refsp->RTmask = RTmask;
 | 
						||
      KOMODO_PASSPORT_INITDONE = 1;
 | 
						||
+     //printf("done PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
 | 
						||
  }
 | 
						||
  
 | 
						||
diff -crB ./src/komodo_globals.h ../../komodo-jl777/src/komodo_globals.h
 | 
						||
*** ./src/komodo_globals.h	2017-01-03 10:40:50.231330177 +0000
 | 
						||
--- ../../komodo-jl777/src/komodo_globals.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 36,42 ****
 | 
						||
  
 | 
						||
  int COINBASE_MATURITY = 100;
 | 
						||
  
 | 
						||
! int32_t IS_KOMODO_NOTARY,KOMODO_REWIND,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE;
 | 
						||
  std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES;
 | 
						||
  uint8_t NOTARY_PUBKEY33[33];
 | 
						||
  
 | 
						||
--- 36,42 ----
 | 
						||
  
 | 
						||
  int COINBASE_MATURITY = 100;
 | 
						||
  
 | 
						||
! int32_t IS_KOMODO_NOTARY,KOMODO_REWIND,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX;
 | 
						||
  std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES;
 | 
						||
  uint8_t NOTARY_PUBKEY33[33];
 | 
						||
  
 | 
						||
diff -crB ./src/komodo.h ../../komodo-jl777/src/komodo.h
 | 
						||
*** ./src/komodo.h	2017-01-03 10:40:50.231330177 +0000
 | 
						||
--- ../../komodo-jl777/src/komodo.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 23,29 ****
 | 
						||
  // a. automate notarization fee payouts
 | 
						||
  // b. automated distribution of test REVS snapshot
 | 
						||
  
 | 
						||
! //#define KOMODO_ASSETCHAINS_WAITNOTARIZE
 | 
						||
  #define KOMODO_PAXMAX (10000 * COIN)
 | 
						||
  
 | 
						||
  #include <stdint.h>
 | 
						||
--- 23,29 ----
 | 
						||
  // a. automate notarization fee payouts
 | 
						||
  // b. automated distribution of test REVS snapshot
 | 
						||
  
 | 
						||
! #define KOMODO_ASSETCHAINS_WAITNOTARIZE
 | 
						||
  #define KOMODO_PAXMAX (10000 * COIN)
 | 
						||
  
 | 
						||
  #include <stdint.h>
 | 
						||
***************
 | 
						||
*** 194,200 ****
 | 
						||
--- 194,203 ----
 | 
						||
      static FILE *fp; static int32_t errs;
 | 
						||
      struct komodo_state *sp; char fname[512],symbol[16],dest[16]; int32_t ht,func; uint8_t num,pubkeys[64][33];
 | 
						||
      if ( (sp= komodo_stateptr(symbol,dest)) == 0 )
 | 
						||
+     {
 | 
						||
+         KOMODO_INITDONE = (uint32_t)time(NULL);
 | 
						||
          return;
 | 
						||
+     }
 | 
						||
      if ( fp == 0 )
 | 
						||
      {
 | 
						||
          komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"komodostate");
 | 
						||
***************
 | 
						||
*** 281,287 ****
 | 
						||
                  errs++;
 | 
						||
              //komodo_eventadd_utxo(sp,symbol,height,notaryid,txhash,voutmask,numvouts);
 | 
						||
          }
 | 
						||
- //#ifdef KOMODO_PAX
 | 
						||
          else if ( pvals != 0 && numpvals > 0 )
 | 
						||
          {
 | 
						||
              int32_t i,nonz = 0;
 | 
						||
--- 284,289 ----
 | 
						||
***************
 | 
						||
*** 301,307 ****
 | 
						||
              }
 | 
						||
              //printf("save pvals height.%d numpvals.%d\n",height,numpvals);
 | 
						||
          }
 | 
						||
- //#endif
 | 
						||
          else if ( height != 0 )
 | 
						||
          {
 | 
						||
              //printf("ht.%d func N ht.%d errs.%d\n",height,NOTARIZED_HEIGHT,errs);
 | 
						||
--- 303,308 ----
 | 
						||
diff -crB ./src/komodo_interest.h ../../komodo-jl777/src/komodo_interest.h
 | 
						||
*** ./src/komodo_interest.h	2017-01-03 10:40:50.231330177 +0000
 | 
						||
--- ../../komodo-jl777/src/komodo_interest.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 21,29 ****
 | 
						||
      uint64_t total; int32_t ind,incr = 100000;
 | 
						||
      if ( height >= maxheight )
 | 
						||
      {
 | 
						||
!         interests = (uint64_t *)realloc(interests,(maxheight + incr) * sizeof(*interests) * 2);
 | 
						||
!         memset(&interests[maxheight << 1],0,incr * sizeof(*interests) * 2);
 | 
						||
!         maxheight += incr;
 | 
						||
      }
 | 
						||
      ind = (height << 1);
 | 
						||
      if ( paidinterest < 0 ) // request
 | 
						||
--- 21,37 ----
 | 
						||
      uint64_t total; int32_t ind,incr = 100000;
 | 
						||
      if ( height >= maxheight )
 | 
						||
      {
 | 
						||
!         if ( interests == 0 )
 | 
						||
!         {
 | 
						||
!             maxheight = height + incr;
 | 
						||
!             interests = (uint64_t *)calloc(maxheight,sizeof(*interests) * 2);
 | 
						||
!         }
 | 
						||
!         else
 | 
						||
!         {
 | 
						||
!             interests = (uint64_t *)realloc(interests,(maxheight + incr) * sizeof(*interests) * 2);
 | 
						||
!             memset(&interests[maxheight << 1],0,incr * sizeof(*interests) * 2);
 | 
						||
!             maxheight += incr;
 | 
						||
!         }
 | 
						||
      }
 | 
						||
      ind = (height << 1);
 | 
						||
      if ( paidinterest < 0 ) // request
 | 
						||
diff -crB ./src/komodo_pax.h ../../komodo-jl777/src/komodo_pax.h
 | 
						||
*** ./src/komodo_pax.h	2017-01-03 10:40:50.231330177 +0000
 | 
						||
--- ../../komodo-jl777/src/komodo_pax.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 429,434 ****
 | 
						||
--- 429,435 ----
 | 
						||
          height -= 10;
 | 
						||
      if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
 | 
						||
      {
 | 
						||
+         portable_mutex_lock(&komodo_mutex);
 | 
						||
          for (i=NUM_PRICES-1; i>=0; i--)
 | 
						||
          {
 | 
						||
              ptr = &PVALS[36 * i];
 | 
						||
***************
 | 
						||
*** 439,450 ****
 | 
						||
                      *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
 | 
						||
                      *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
 | 
						||
                  }
 | 
						||
                  if ( kmdbtc != 0 && btcusd != 0 )
 | 
						||
                      return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
 | 
						||
                  else return(0);
 | 
						||
              }
 | 
						||
          }
 | 
						||
!     } else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
 | 
						||
      return(0);
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 440,453 ----
 | 
						||
                      *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
 | 
						||
                      *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
 | 
						||
                  }
 | 
						||
+                 portable_mutex_unlock(&komodo_mutex);
 | 
						||
                  if ( kmdbtc != 0 && btcusd != 0 )
 | 
						||
                      return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
 | 
						||
                  else return(0);
 | 
						||
              }
 | 
						||
          }
 | 
						||
!         portable_mutex_unlock(&komodo_mutex);
 | 
						||
!     } //else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
 | 
						||
      return(0);
 | 
						||
  }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 473,479 ****
 | 
						||
      }
 | 
						||
      kmdbtc = komodo_paxcorrelation(kmdbtcs,numvotes,*seedp) * 539;
 | 
						||
      btcusd = komodo_paxcorrelation(btcusds,numvotes,*seedp) * 539;
 | 
						||
-     //printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
 | 
						||
      for (i=nonz=0; i<numvotes; i++)
 | 
						||
      {
 | 
						||
          if ( (votes[numvotes-1-i]= _komodo_paxprice(0,0,height-i,base,rel,100000,kmdbtc,btcusd)) == 0 )
 | 
						||
--- 476,481 ----
 | 
						||
***************
 | 
						||
*** 481,487 ****
 | 
						||
--- 483,493 ----
 | 
						||
          else nonz++;
 | 
						||
      }
 | 
						||
      if ( nonz <= (numvotes >> 1) )
 | 
						||
+     {
 | 
						||
+         //printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
 | 
						||
+         //printf("komodo_paxprice nonz.%d of numvotes.%d\n",nonz,numvotes);
 | 
						||
          return(0);
 | 
						||
+     }
 | 
						||
      return(komodo_paxcorrelation(votes,numvotes,*seedp) * basevolume / 100000);
 | 
						||
  }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 527,533 ****
 | 
						||
      if ( fiatoshis < 0 )
 | 
						||
          shortflag = 1, fiatoshis = -fiatoshis;
 | 
						||
      komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
 | 
						||
!     //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f seed.%llx\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN,(long long)*seedp);
 | 
						||
      if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
 | 
						||
      {
 | 
						||
          PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
 | 
						||
--- 533,540 ----
 | 
						||
      if ( fiatoshis < 0 )
 | 
						||
          shortflag = 1, fiatoshis = -fiatoshis;
 | 
						||
      komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
 | 
						||
!     if ( 0 && strcmp(base,"RUB") == 0 )
 | 
						||
!         printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f seed.%llx\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN,(long long)*seedp);
 | 
						||
      if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
 | 
						||
      {
 | 
						||
          PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
 | 
						||
diff -crB ./src/komodo_structs.h ../../komodo-jl777/src/komodo_structs.h
 | 
						||
*** ./src/komodo_structs.h	2017-01-03 10:40:50.231330177 +0000
 | 
						||
--- ../../komodo-jl777/src/komodo_structs.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 57,63 ****
 | 
						||
      UT_hash_handle hh;
 | 
						||
      uint256 txid;
 | 
						||
      uint64_t komodoshis,fiatoshis,validated;
 | 
						||
!     int32_t marked,height,otherheight,approved,didstats;
 | 
						||
      uint16_t vout;
 | 
						||
      char symbol[16],source[16],coinaddr[64]; uint8_t rmd160[20],type,buf[35];
 | 
						||
  };
 | 
						||
--- 57,63 ----
 | 
						||
      UT_hash_handle hh;
 | 
						||
      uint256 txid;
 | 
						||
      uint64_t komodoshis,fiatoshis,validated;
 | 
						||
!     int32_t marked,height,otherheight,approved,didstats,ready;
 | 
						||
      uint16_t vout;
 | 
						||
      char symbol[16],source[16],coinaddr[64]; uint8_t rmd160[20],type,buf[35];
 | 
						||
  };
 | 
						||
diff -crB ./src/komodo_utils.h ../../komodo-jl777/src/komodo_utils.h
 | 
						||
*** ./src/komodo_utils.h	2017-01-03 10:40:50.235330381 +0000
 | 
						||
--- ../../komodo-jl777/src/komodo_utils.h	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 1448,1454 ****
 | 
						||
--- 1448,1457 ----
 | 
						||
      IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
 | 
						||
      NOTARY_PUBKEY = GetArg("-pubkey", "");
 | 
						||
      if ( strlen(NOTARY_PUBKEY.c_str()) == 66 )
 | 
						||
+     {
 | 
						||
          USE_EXTERNAL_PUBKEY = 1;
 | 
						||
+         KOMODO_PAX = 1;
 | 
						||
+     } else KOMODO_PAX = GetArg("-pax",0);
 | 
						||
      name = GetArg("-ac_name","");
 | 
						||
      if ( (KOMODO_REWIND= GetArg("-rewind",0)) != 0 )
 | 
						||
          ;
 | 
						||
diff -crB ./src/main.cpp ../../komodo-jl777/src/main.cpp
 | 
						||
*** ./src/main.cpp	2017-01-03 10:40:50.255331392 +0000
 | 
						||
--- ../../komodo-jl777/src/main.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 26,31 ****
 | 
						||
--- 26,32 ----
 | 
						||
  #include "util.h"
 | 
						||
  #include "utilmoneystr.h"
 | 
						||
  #include "validationinterface.h"
 | 
						||
+ #include "wallet/asyncrpcoperation_sendmany.h"
 | 
						||
  
 | 
						||
  #include <sstream>
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 70,76 ****
 | 
						||
  bool fAlerts = DEFAULT_ALERTS;
 | 
						||
  
 | 
						||
  /** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
 | 
						||
! CFeeRate minRelayTxFee = CFeeRate(5000);
 | 
						||
  
 | 
						||
  CTxMemPool mempool(::minRelayTxFee);
 | 
						||
  
 | 
						||
--- 71,77 ----
 | 
						||
  bool fAlerts = DEFAULT_ALERTS;
 | 
						||
  
 | 
						||
  /** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
 | 
						||
! CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
 | 
						||
  
 | 
						||
  CTxMemPool mempool(::minRelayTxFee);
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 550,556 ****
 | 
						||
  
 | 
						||
  // Komodo globals
 | 
						||
  
 | 
						||
- #define KOMODO_PAX
 | 
						||
  #define KOMODO_ZCASH
 | 
						||
  #include "komodo.h"
 | 
						||
  
 | 
						||
--- 551,556 ----
 | 
						||
***************
 | 
						||
*** 871,878 ****
 | 
						||
          return false;
 | 
						||
      } else {
 | 
						||
          // Ensure that zk-SNARKs verify
 | 
						||
          BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
 | 
						||
!             if (!joinsplit.Verify(*pzcashParams, tx.joinSplitPubKey)) {
 | 
						||
                  return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"),
 | 
						||
                                      REJECT_INVALID, "bad-txns-joinsplit-verification-failed");
 | 
						||
              }
 | 
						||
--- 871,879 ----
 | 
						||
          return false;
 | 
						||
      } else {
 | 
						||
          // Ensure that zk-SNARKs verify
 | 
						||
+         auto verifier = libzcash::ProofVerifier::Strict();
 | 
						||
          BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
 | 
						||
!             if (!joinsplit.Verify(*pzcashParams, verifier, tx.joinSplitPubKey)) {
 | 
						||
                  return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"),
 | 
						||
                                      REJECT_INVALID, "bad-txns-joinsplit-verification-failed");
 | 
						||
              }
 | 
						||
***************
 | 
						||
*** 1211,1222 ****
 | 
						||
          CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx));
 | 
						||
          unsigned int nSize = entry.GetTxSize();
 | 
						||
  
 | 
						||
!         // Don't accept it if it can't get into a block
 | 
						||
!         CAmount txMinFee = GetMinRelayFee(tx, nSize, true);
 | 
						||
!         if (fLimitFree && nFees < txMinFee)
 | 
						||
!             return state.DoS(0, error("AcceptToMemoryPool: not enough fees %s, %d < %d",
 | 
						||
!                                       hash.ToString(), nFees, txMinFee),
 | 
						||
!                              REJECT_INSUFFICIENTFEE, "insufficient fee");
 | 
						||
  
 | 
						||
          // Require that free transactions have sufficient priority to be mined in the next block.
 | 
						||
          if (GetBoolArg("-relaypriority", false) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) {
 | 
						||
--- 1212,1228 ----
 | 
						||
          CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx));
 | 
						||
          unsigned int nSize = entry.GetTxSize();
 | 
						||
  
 | 
						||
!         // Accept a tx if it contains joinsplits and has at least the default fee specified by z_sendmany.
 | 
						||
!         if (tx.vjoinsplit.size() > 0 && nFees >= ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE) {
 | 
						||
!             // In future we will we have more accurate and dynamic computation of fees for tx with joinsplits.
 | 
						||
!         } else {
 | 
						||
!             // Don't accept it if it can't get into a block
 | 
						||
!             CAmount txMinFee = GetMinRelayFee(tx, nSize, true);
 | 
						||
!             if (fLimitFree && nFees < txMinFee)
 | 
						||
!                 return state.DoS(0, error("AcceptToMemoryPool: not enough fees %s, %d < %d",
 | 
						||
!                                         hash.ToString(), nFees, txMinFee),
 | 
						||
!                                 REJECT_INSUFFICIENTFEE, "insufficient fee");
 | 
						||
!         }
 | 
						||
  
 | 
						||
          // Require that free transactions have sufficient priority to be mined in the next block.
 | 
						||
          if (GetBoolArg("-relaypriority", false) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) {
 | 
						||
***************
 | 
						||
*** 1566,1572 ****
 | 
						||
      }
 | 
						||
  
 | 
						||
      // We define a condition where we should warn the user about as a fork of at least 7 blocks
 | 
						||
!     // with a tip within 72 blocks (+/- 12 hours if no one mines it) of ours
 | 
						||
      // We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network
 | 
						||
      // hash rate operating on the fork.
 | 
						||
      // or a chain that is entirely longer than ours and invalid (note that this should be detected by both)
 | 
						||
--- 1572,1578 ----
 | 
						||
      }
 | 
						||
  
 | 
						||
      // We define a condition where we should warn the user about as a fork of at least 7 blocks
 | 
						||
!     // with a tip within 72 blocks (+/- 3 hours if no one mines it) of ours
 | 
						||
      // We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network
 | 
						||
      // hash rate operating on the fork.
 | 
						||
      // or a chain that is entirely longer than ours and invalid (note that this should be detected by both)
 | 
						||
***************
 | 
						||
*** 3213,3219 ****
 | 
						||
  
 | 
						||
      // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
 | 
						||
      // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
 | 
						||
!     if (block.nVersion >= 2)
 | 
						||
      {
 | 
						||
          CScript expect = CScript() << nHeight;
 | 
						||
          if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
 | 
						||
--- 3219,3228 ----
 | 
						||
  
 | 
						||
      // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
 | 
						||
      // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
 | 
						||
!     // Since MIN_BLOCK_VERSION = 4 all blocks with nHeight > 0 should satisfy this.
 | 
						||
!     // This rule is not applied to the genesis block, which didn't include the height
 | 
						||
!     // in the coinbase.
 | 
						||
!     if (nHeight > 0)
 | 
						||
      {
 | 
						||
          CScript expect = CScript() << nHeight;
 | 
						||
          if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
 | 
						||
diff -crB ./src/main.h ../../komodo-jl777/src/main.h
 | 
						||
*** ./src/main.h	2017-01-03 10:40:50.255331392 +0000
 | 
						||
--- ../../komodo-jl777/src/main.h	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 48,57 ****
 | 
						||
  struct CNodeStateStats;
 | 
						||
  
 | 
						||
  /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
 | 
						||
! static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;
 | 
						||
  static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
 | 
						||
  /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
 | 
						||
! static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000;
 | 
						||
  /** Default for accepting alerts from the P2P network. */
 | 
						||
  static const bool DEFAULT_ALERTS = true;
 | 
						||
  /** Minimum alert priority for enabling safe mode. */
 | 
						||
--- 48,57 ----
 | 
						||
  struct CNodeStateStats;
 | 
						||
  
 | 
						||
  /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
 | 
						||
! static const unsigned int DEFAULT_BLOCK_MAX_SIZE = MAX_BLOCK_SIZE;
 | 
						||
  static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
 | 
						||
  /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
 | 
						||
! static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = DEFAULT_BLOCK_MAX_SIZE / 2;
 | 
						||
  /** Default for accepting alerts from the P2P network. */
 | 
						||
  static const bool DEFAULT_ALERTS = true;
 | 
						||
  /** Minimum alert priority for enabling safe mode. */
 | 
						||
***************
 | 
						||
*** 60,65 ****
 | 
						||
--- 60,67 ----
 | 
						||
  static const unsigned int MAX_P2SH_SIGOPS = 15;
 | 
						||
  /** The maximum number of sigops we're willing to relay/mine in a single tx */
 | 
						||
  static const unsigned int MAX_STANDARD_TX_SIGOPS = MAX_BLOCK_SIGOPS/5;
 | 
						||
+ /** Default for -minrelaytxfee, minimum relay fee for transactions */
 | 
						||
+ static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
 | 
						||
  /** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
 | 
						||
  static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
 | 
						||
  /** The maximum size of a blk?????.dat file (since 0.8) */
 | 
						||
***************
 | 
						||
*** 91,96 ****
 | 
						||
--- 93,102 ----
 | 
						||
  /** Maximum length of reject messages. */
 | 
						||
  static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111;
 | 
						||
  
 | 
						||
+ // Sanity check the magic numbers when we change them
 | 
						||
+ BOOST_STATIC_ASSERT(DEFAULT_BLOCK_MAX_SIZE <= MAX_BLOCK_SIZE);
 | 
						||
+ BOOST_STATIC_ASSERT(DEFAULT_BLOCK_PRIORITY_SIZE <= DEFAULT_BLOCK_MAX_SIZE);
 | 
						||
+ 
 | 
						||
  #define equihash_parameters_acceptable(N, K) \
 | 
						||
      ((CBlockHeader::HEADER_SIZE + equihash_solution_size(N, K))*MAX_HEADERS_RESULTS < \
 | 
						||
       MAX_PROTOCOL_MESSAGE_LENGTH-1000)
 | 
						||
diff -crB ./src/Makefile.am ../../komodo-jl777/src/Makefile.am
 | 
						||
*** ./src/Makefile.am	2017-01-03 10:40:50.211329166 +0000
 | 
						||
--- ../../komodo-jl777/src/Makefile.am	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 232,237 ****
 | 
						||
--- 232,239 ----
 | 
						||
  # when wallet enabled
 | 
						||
  libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES)
 | 
						||
  libbitcoin_wallet_a_SOURCES = \
 | 
						||
+   utiltest.cpp \
 | 
						||
+   utiltest.h \
 | 
						||
    zcbenchmarks.cpp \
 | 
						||
    zcbenchmarks.h \
 | 
						||
    wallet/asyncrpcoperation_sendmany.cpp \
 | 
						||
***************
 | 
						||
*** 516,525 ****
 | 
						||
  	@test -f $(PROTOC)
 | 
						||
  	$(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(<D) $<)
 | 
						||
  
 | 
						||
! if ENABLE_TESTS
 | 
						||
! include Makefile.test.include
 | 
						||
! include Makefile.gtest.include
 | 
						||
! endif
 | 
						||
  
 | 
						||
  if ENABLE_QT
 | 
						||
  include Makefile.qt.include
 | 
						||
--- 518,527 ----
 | 
						||
  	@test -f $(PROTOC)
 | 
						||
  	$(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(<D) $<)
 | 
						||
  
 | 
						||
! #if ENABLE_TESTS
 | 
						||
! #include Makefile.test.include
 | 
						||
! #include Makefile.gtest.include
 | 
						||
! #endif
 | 
						||
  
 | 
						||
  if ENABLE_QT
 | 
						||
  include Makefile.qt.include
 | 
						||
diff -crB ./src/Makefile.gtest.include ../../komodo-jl777/src/Makefile.gtest.include
 | 
						||
*** ./src/Makefile.gtest.include	2017-01-03 10:40:50.211329166 +0000
 | 
						||
--- ../../komodo-jl777/src/Makefile.gtest.include	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 5,11 ****
 | 
						||
  komodo_gtest_SOURCES = \
 | 
						||
  	gtest/main.cpp \
 | 
						||
  	gtest/utils.cpp \
 | 
						||
- 	gtest/test_checkblock.cpp \
 | 
						||
  	gtest/test_checktransaction.cpp \
 | 
						||
  	gtest/json_test_vectors.cpp \
 | 
						||
          gtest/json_test_vectors.h \
 | 
						||
--- 5,10 ----
 | 
						||
***************
 | 
						||
*** 18,23 ****
 | 
						||
--- 17,23 ----
 | 
						||
  	gtest/test_keystore.cpp \
 | 
						||
  	gtest/test_noteencryption.cpp \
 | 
						||
  	gtest/test_merkletree.cpp \
 | 
						||
+ 	gtest/test_metrics.cpp \
 | 
						||
  	gtest/test_pow.cpp \
 | 
						||
  	gtest/test_random.cpp \
 | 
						||
  	gtest/test_rpc.cpp \
 | 
						||
***************
 | 
						||
*** 26,32 ****
 | 
						||
--- 26,36 ----
 | 
						||
  	gtest/test_txid.cpp \
 | 
						||
  	gtest/test_libzcash_utils.cpp \
 | 
						||
  	gtest/test_proofs.cpp \
 | 
						||
+ 	gtest/test_checkblock.cpp
 | 
						||
+ if ENABLE_WALLET
 | 
						||
+ zcash_gtest_SOURCES += \
 | 
						||
  	wallet/gtest/test_wallet.cpp
 | 
						||
+ endif
 | 
						||
  
 | 
						||
  komodo_gtest_CPPFLAGS = -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC
 | 
						||
  
 | 
						||
diff -crB ./src/Makefile.test.include ../../komodo-jl777/src/Makefile.test.include
 | 
						||
*** ./src/Makefile.test.include	2017-01-03 10:40:50.211329166 +0000
 | 
						||
--- ../../komodo-jl777/src/Makefile.test.include	2017-01-03 09:49:08.856506348 +0000
 | 
						||
***************
 | 
						||
*** 31,36 ****
 | 
						||
--- 31,37 ----
 | 
						||
    test/data/merkle_serialization.json \
 | 
						||
    test/data/merkle_witness_serialization.json \
 | 
						||
    test/data/merkle_path.json \
 | 
						||
+   test/data/merkle_commitments.json \
 | 
						||
    test/data/g1_compressed.json \
 | 
						||
    test/data/g2_compressed.json
 | 
						||
  
 | 
						||
diff -crB ./src/metrics.cpp ../../komodo-jl777/src/metrics.cpp
 | 
						||
*** ./src/metrics.cpp	2017-01-03 10:40:50.255331392 +0000
 | 
						||
--- ../../komodo-jl777/src/metrics.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 5,13 ****
 | 
						||
--- 5,15 ----
 | 
						||
  #include "metrics.h"
 | 
						||
  
 | 
						||
  #include "chainparams.h"
 | 
						||
+ #include "main.h"
 | 
						||
  #include "ui_interface.h"
 | 
						||
  #include "util.h"
 | 
						||
  #include "utiltime.h"
 | 
						||
+ #include "utilmoneystr.h"
 | 
						||
  
 | 
						||
  #include <boost/thread.hpp>
 | 
						||
  #include <boost/thread/synchronized_value.hpp>
 | 
						||
***************
 | 
						||
*** 15,29 ****
 | 
						||
--- 17,65 ----
 | 
						||
  #include <sys/ioctl.h>
 | 
						||
  #include <unistd.h>
 | 
						||
  
 | 
						||
+ CCriticalSection cs_metrics;
 | 
						||
+ 
 | 
						||
+ boost::synchronized_value<int64_t> nNodeStartTime;
 | 
						||
  AtomicCounter transactionsValidated;
 | 
						||
  AtomicCounter ehSolverRuns;
 | 
						||
  AtomicCounter solutionTargetChecks;
 | 
						||
  AtomicCounter minedBlocks;
 | 
						||
  
 | 
						||
+ boost::synchronized_value<std::list<uint256>> trackedBlocks;
 | 
						||
+ 
 | 
						||
  boost::synchronized_value<std::list<std::string>> messageBox;
 | 
						||
  boost::synchronized_value<std::string> initMessage;
 | 
						||
  bool loaded = false;
 | 
						||
  
 | 
						||
+ extern int64_t GetNetworkHashPS(int lookup, int height);
 | 
						||
+ 
 | 
						||
+ void TrackMinedBlock(uint256 hash)
 | 
						||
+ {
 | 
						||
+     LOCK(cs_metrics);
 | 
						||
+     minedBlocks.increment();
 | 
						||
+     trackedBlocks->push_back(hash);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ void MarkStartTime()
 | 
						||
+ {
 | 
						||
+     *nNodeStartTime = GetTime();
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ int64_t GetUptime()
 | 
						||
+ {
 | 
						||
+     return GetTime() - *nNodeStartTime;
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ double GetLocalSolPS_INTERNAL(int64_t uptime)
 | 
						||
+ {
 | 
						||
+     return uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0;
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ double GetLocalSolPS()
 | 
						||
+ {
 | 
						||
+     return GetLocalSolPS_INTERNAL(GetUptime());
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  static bool metrics_ThreadSafeMessageBox(const std::string& message,
 | 
						||
                                        const std::string& caption,
 | 
						||
                                        unsigned int style)
 | 
						||
***************
 | 
						||
*** 64,71 ****
 | 
						||
      uiInterface.InitMessage.connect(metrics_InitMessage);
 | 
						||
  }
 | 
						||
  
 | 
						||
! void printMiningStatus(bool mining)
 | 
						||
  {
 | 
						||
      if (mining) {
 | 
						||
          int nThreads = GetArg("-genproclimit", 1);
 | 
						||
          if (nThreads < 0) {
 | 
						||
--- 100,122 ----
 | 
						||
      uiInterface.InitMessage.connect(metrics_InitMessage);
 | 
						||
  }
 | 
						||
  
 | 
						||
! int printNetworkStats()
 | 
						||
! {
 | 
						||
!     LOCK2(cs_main, cs_vNodes);
 | 
						||
! 
 | 
						||
!     std::cout << "           " << _("Block height") << " | " << chainActive.Height() << std::endl;
 | 
						||
!     std::cout << "  " << _("Network solution rate") << " | " << GetNetworkHashPS(120, -1) << " Sol/s" << std::endl;
 | 
						||
!     std::cout << "            " << _("Connections") << " | " << vNodes.size() << std::endl;
 | 
						||
!     std::cout << std::endl;
 | 
						||
! 
 | 
						||
!     return 4;
 | 
						||
! }
 | 
						||
! 
 | 
						||
! int printMiningStatus(bool mining)
 | 
						||
  {
 | 
						||
+     // Number of lines that are always displayed
 | 
						||
+     int lines = 1;
 | 
						||
+ 
 | 
						||
      if (mining) {
 | 
						||
          int nThreads = GetArg("-genproclimit", 1);
 | 
						||
          if (nThreads < 0) {
 | 
						||
***************
 | 
						||
*** 75,95 ****
 | 
						||
              else
 | 
						||
                  nThreads = boost::thread::hardware_concurrency();
 | 
						||
          }
 | 
						||
!         std::cout << strprintf(_("You are running %d mining threads."), nThreads) << std::endl;
 | 
						||
      } else {
 | 
						||
          std::cout << _("You are currently not mining.") << std::endl;
 | 
						||
          std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl;
 | 
						||
      }
 | 
						||
      std::cout << std::endl;
 | 
						||
  }
 | 
						||
  
 | 
						||
! int printMetrics(size_t cols, int64_t nStart, bool mining)
 | 
						||
  {
 | 
						||
      // Number of lines that are always displayed
 | 
						||
      int lines = 3;
 | 
						||
  
 | 
						||
      // Calculate uptime
 | 
						||
!     int64_t uptime = GetTime() - nStart;
 | 
						||
      int days = uptime / (24 * 60 * 60);
 | 
						||
      int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60);
 | 
						||
      int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60;
 | 
						||
--- 126,151 ----
 | 
						||
              else
 | 
						||
                  nThreads = boost::thread::hardware_concurrency();
 | 
						||
          }
 | 
						||
!         std::cout << strprintf(_("You are mining with the %s solver on %d threads."),
 | 
						||
!                                GetArg("-equihashsolver", "default"), nThreads) << std::endl;
 | 
						||
!         lines++;
 | 
						||
      } else {
 | 
						||
          std::cout << _("You are currently not mining.") << std::endl;
 | 
						||
          std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl;
 | 
						||
+         lines += 2;
 | 
						||
      }
 | 
						||
      std::cout << std::endl;
 | 
						||
+ 
 | 
						||
+     return lines;
 | 
						||
  }
 | 
						||
  
 | 
						||
! int printMetrics(size_t cols, bool mining)
 | 
						||
  {
 | 
						||
      // Number of lines that are always displayed
 | 
						||
      int lines = 3;
 | 
						||
  
 | 
						||
      // Calculate uptime
 | 
						||
!     int64_t uptime = GetUptime();
 | 
						||
      int days = uptime / (24 * 60 * 60);
 | 
						||
      int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60);
 | 
						||
      int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60;
 | 
						||
***************
 | 
						||
*** 110,128 ****
 | 
						||
      std::cout << strDuration << std::endl;
 | 
						||
      lines += (strDuration.size() / cols);
 | 
						||
  
 | 
						||
!     std::cout << "- " << strprintf(_("You have validated %d transactions!"), transactionsValidated.get()) << std::endl;
 | 
						||
  
 | 
						||
!     if (mining) {
 | 
						||
!         double solps = uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0;
 | 
						||
          std::string strSolps = strprintf("%.4f Sol/s", solps);
 | 
						||
          std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl;
 | 
						||
          std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl;
 | 
						||
          lines += 2;
 | 
						||
  
 | 
						||
!         int mined = minedBlocks.get();
 | 
						||
          if (mined > 0) {
 | 
						||
              std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl;
 | 
						||
!             lines++;
 | 
						||
          }
 | 
						||
      }
 | 
						||
      std::cout << std::endl;
 | 
						||
--- 166,233 ----
 | 
						||
      std::cout << strDuration << std::endl;
 | 
						||
      lines += (strDuration.size() / cols);
 | 
						||
  
 | 
						||
!     int validatedCount = transactionsValidated.get();
 | 
						||
!     if (validatedCount > 1) {
 | 
						||
!       std::cout << "- " << strprintf(_("You have validated %d transactions!"), validatedCount) << std::endl;
 | 
						||
!     } else if (validatedCount == 1) {
 | 
						||
!       std::cout << "- " << _("You have validated a transaction!") << std::endl;
 | 
						||
!     } else {
 | 
						||
!       std::cout << "- " << _("You have validated no transactions.") << std::endl;
 | 
						||
!     }
 | 
						||
  
 | 
						||
!     if (mining && loaded) {
 | 
						||
!         double solps = GetLocalSolPS_INTERNAL(uptime);
 | 
						||
          std::string strSolps = strprintf("%.4f Sol/s", solps);
 | 
						||
          std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl;
 | 
						||
          std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl;
 | 
						||
          lines += 2;
 | 
						||
  
 | 
						||
!         int mined = 0;
 | 
						||
!         int orphaned = 0;
 | 
						||
!         CAmount immature {0};
 | 
						||
!         CAmount mature {0};
 | 
						||
!         {
 | 
						||
!             LOCK2(cs_main, cs_metrics);
 | 
						||
!             boost::strict_lock_ptr<std::list<uint256>> u = trackedBlocks.synchronize();
 | 
						||
!             auto consensusParams = Params().GetConsensus();
 | 
						||
!             auto tipHeight = chainActive.Height();
 | 
						||
! 
 | 
						||
!             // Update orphans and calculate subsidies
 | 
						||
!             std::list<uint256>::iterator it = u->begin();
 | 
						||
!             while (it != u->end()) {
 | 
						||
!                 auto hash = *it;
 | 
						||
!                 if (mapBlockIndex.count(hash) > 0 &&
 | 
						||
!                         chainActive.Contains(mapBlockIndex[hash])) {
 | 
						||
!                     int height = mapBlockIndex[hash]->nHeight;
 | 
						||
!                     CAmount subsidy = GetBlockSubsidy(height, consensusParams);
 | 
						||
!                     if ((height > 0) && (height <= consensusParams.GetLastFoundersRewardBlockHeight())) {
 | 
						||
!                         subsidy -= subsidy/5;
 | 
						||
!                     }
 | 
						||
!                     if (std::max(0, COINBASE_MATURITY - (tipHeight - height)) > 0) {
 | 
						||
!                         immature += subsidy;
 | 
						||
!                     } else {
 | 
						||
!                         mature += subsidy;
 | 
						||
!                     }
 | 
						||
!                     it++;
 | 
						||
!                 } else {
 | 
						||
!                     it = u->erase(it);
 | 
						||
!                 }
 | 
						||
!             }
 | 
						||
! 
 | 
						||
!             mined = minedBlocks.get();
 | 
						||
!             orphaned = mined - u->size();
 | 
						||
!         }
 | 
						||
! 
 | 
						||
          if (mined > 0) {
 | 
						||
+             std::string units = Params().CurrencyUnits();
 | 
						||
              std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl;
 | 
						||
!             std::cout << "  "
 | 
						||
!                       << strprintf(_("Orphaned: %d blocks, Immature: %u %s, Mature: %u %s"),
 | 
						||
!                                      orphaned,
 | 
						||
!                                      FormatMoney(immature), units,
 | 
						||
!                                      FormatMoney(mature), units)
 | 
						||
!                       << std::endl;
 | 
						||
!             lines += 2;
 | 
						||
          }
 | 
						||
      }
 | 
						||
      std::cout << std::endl;
 | 
						||
***************
 | 
						||
*** 171,194 ****
 | 
						||
      // Make this thread recognisable as the metrics screen thread
 | 
						||
      RenameThread("zcash-metrics-screen");
 | 
						||
  
 | 
						||
!     // Clear screen
 | 
						||
!     std::cout << "\e[2J";
 | 
						||
! 
 | 
						||
!     // Print art
 | 
						||
!     std::cout << METRICS_ART << std::endl;
 | 
						||
!     std::cout << std::endl;
 | 
						||
! 
 | 
						||
!     // Thank you text
 | 
						||
!     std::cout << _("Thank you for running a Zcash node!") << std::endl;
 | 
						||
!     std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl;
 | 
						||
!     std::cout << std::endl;
 | 
						||
! 
 | 
						||
!     // Miner status
 | 
						||
!     bool mining = GetBoolArg("-gen", false);
 | 
						||
!     printMiningStatus(mining);
 | 
						||
! 
 | 
						||
!     // Count uptime
 | 
						||
!     int64_t nStart = GetTime();
 | 
						||
  
 | 
						||
      while (true) {
 | 
						||
          // Number of lines that are always displayed
 | 
						||
--- 276,299 ----
 | 
						||
      // Make this thread recognisable as the metrics screen thread
 | 
						||
      RenameThread("zcash-metrics-screen");
 | 
						||
  
 | 
						||
!     // Determine whether we should render a persistent UI or rolling metrics
 | 
						||
!     bool isTTY = isatty(STDOUT_FILENO);
 | 
						||
!     bool isScreen = GetBoolArg("-metricsui", isTTY);
 | 
						||
!     int64_t nRefresh = GetArg("-metricsrefreshtime", isTTY ? 1 : 600);
 | 
						||
! 
 | 
						||
!     if (isScreen) {
 | 
						||
!         // Clear screen
 | 
						||
!         std::cout << "\e[2J";
 | 
						||
! 
 | 
						||
!         // Print art
 | 
						||
!         std::cout << METRICS_ART << std::endl;
 | 
						||
!         std::cout << std::endl;
 | 
						||
! 
 | 
						||
!         // Thank you text
 | 
						||
!         std::cout << _("Thank you for running a Zcash node!") << std::endl;
 | 
						||
!         std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl;
 | 
						||
!         std::cout << std::endl;
 | 
						||
!     }
 | 
						||
  
 | 
						||
      while (true) {
 | 
						||
          // Number of lines that are always displayed
 | 
						||
***************
 | 
						||
*** 196,202 ****
 | 
						||
          int cols = 80;
 | 
						||
  
 | 
						||
          // Get current window size
 | 
						||
!         if (isatty(STDOUT_FILENO)) {
 | 
						||
              struct winsize w;
 | 
						||
              w.ws_col = 0;
 | 
						||
              if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
 | 
						||
--- 301,307 ----
 | 
						||
          int cols = 80;
 | 
						||
  
 | 
						||
          // Get current window size
 | 
						||
!         if (isTTY) {
 | 
						||
              struct winsize w;
 | 
						||
              w.ws_col = 0;
 | 
						||
              if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
 | 
						||
***************
 | 
						||
*** 204,223 ****
 | 
						||
              }
 | 
						||
          }
 | 
						||
  
 | 
						||
!         // Erase below current position
 | 
						||
!         std::cout << "\e[J";
 | 
						||
  
 | 
						||
!         lines += printMetrics(cols, nStart, mining);
 | 
						||
          lines += printMessageBox(cols);
 | 
						||
          lines += printInitMessage();
 | 
						||
  
 | 
						||
!         // Explain how to exit
 | 
						||
!         std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;;
 | 
						||
  
 | 
						||
!         boost::this_thread::interruption_point();
 | 
						||
!         MilliSleep(1000);
 | 
						||
  
 | 
						||
!         // Return to the top of the updating section
 | 
						||
!         std::cout << "\e[" << lines << "A";
 | 
						||
      }
 | 
						||
  }
 | 
						||
--- 309,347 ----
 | 
						||
              }
 | 
						||
          }
 | 
						||
  
 | 
						||
!         if (isScreen) {
 | 
						||
!             // Erase below current position
 | 
						||
!             std::cout << "\e[J";
 | 
						||
!         }
 | 
						||
! 
 | 
						||
!         // Miner status
 | 
						||
!         bool mining = GetBoolArg("-gen", false);
 | 
						||
  
 | 
						||
!         if (loaded) {
 | 
						||
!             lines += printNetworkStats();
 | 
						||
!         }
 | 
						||
!         lines += printMiningStatus(mining);
 | 
						||
!         lines += printMetrics(cols, mining);
 | 
						||
          lines += printMessageBox(cols);
 | 
						||
          lines += printInitMessage();
 | 
						||
  
 | 
						||
!         if (isScreen) {
 | 
						||
!             // Explain how to exit
 | 
						||
!             std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;
 | 
						||
!         } else {
 | 
						||
!             // Print delineator
 | 
						||
!             std::cout << "----------------------------------------" << std::endl;
 | 
						||
!         }
 | 
						||
  
 | 
						||
!         int64_t nWaitEnd = GetTime() + nRefresh;
 | 
						||
!         while (GetTime() < nWaitEnd) {
 | 
						||
!             boost::this_thread::interruption_point();
 | 
						||
!             MilliSleep(200);
 | 
						||
!         }
 | 
						||
  
 | 
						||
!         if (isScreen) {
 | 
						||
!             // Return to the top of the updating section
 | 
						||
!             std::cout << "\e[" << lines << "A";
 | 
						||
!         }
 | 
						||
      }
 | 
						||
  }
 | 
						||
diff -crB ./src/metrics.h ../../komodo-jl777/src/metrics.h
 | 
						||
*** ./src/metrics.h	2017-01-03 10:40:50.255331392 +0000
 | 
						||
--- ../../komodo-jl777/src/metrics.h	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 2,12 ****
 | 
						||
  // Distributed under the MIT software license, see the accompanying
 | 
						||
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 | 
						||
  
 | 
						||
  #include <atomic>
 | 
						||
  #include <string>
 | 
						||
  
 | 
						||
  struct AtomicCounter {
 | 
						||
!     std::atomic<int> value;
 | 
						||
  
 | 
						||
      AtomicCounter() : value {0} { }
 | 
						||
  
 | 
						||
--- 2,14 ----
 | 
						||
  // Distributed under the MIT software license, see the accompanying
 | 
						||
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 | 
						||
  
 | 
						||
+ #include "uint256.h"
 | 
						||
+ 
 | 
						||
  #include <atomic>
 | 
						||
  #include <string>
 | 
						||
  
 | 
						||
  struct AtomicCounter {
 | 
						||
!     std::atomic<uint64_t> value;
 | 
						||
  
 | 
						||
      AtomicCounter() : value {0} { }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 26,32 ****
 | 
						||
  extern AtomicCounter transactionsValidated;
 | 
						||
  extern AtomicCounter ehSolverRuns;
 | 
						||
  extern AtomicCounter solutionTargetChecks;
 | 
						||
! extern AtomicCounter minedBlocks;
 | 
						||
  
 | 
						||
  void ConnectMetricsScreen();
 | 
						||
  void ThreadShowMetricsScreen();
 | 
						||
--- 28,38 ----
 | 
						||
  extern AtomicCounter transactionsValidated;
 | 
						||
  extern AtomicCounter ehSolverRuns;
 | 
						||
  extern AtomicCounter solutionTargetChecks;
 | 
						||
! 
 | 
						||
! void TrackMinedBlock(uint256 hash);
 | 
						||
! 
 | 
						||
! void MarkStartTime();
 | 
						||
! double GetLocalSolPS();
 | 
						||
  
 | 
						||
  void ConnectMetricsScreen();
 | 
						||
  void ThreadShowMetricsScreen();
 | 
						||
diff -crB ./src/miner.cpp ../../komodo-jl777/src/miner.cpp
 | 
						||
*** ./src/miner.cpp	2017-01-03 10:40:50.255331392 +0000
 | 
						||
--- ../../komodo-jl777/src/miner.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 99,105 ****
 | 
						||
  }
 | 
						||
  
 | 
						||
  #define ASSETCHAINS_MINHEIGHT 100
 | 
						||
! #define ROUNDROBIN_DELAY 58
 | 
						||
  extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE;
 | 
						||
  extern char ASSETCHAINS_SYMBOL[16];
 | 
						||
  extern std::string NOTARY_PUBKEY;
 | 
						||
--- 99,106 ----
 | 
						||
  }
 | 
						||
  
 | 
						||
  #define ASSETCHAINS_MINHEIGHT 100
 | 
						||
! #define KOMODO_ELECTION_GAP 2000
 | 
						||
! #define ROUNDROBIN_DELAY 55
 | 
						||
  extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE;
 | 
						||
  extern char ASSETCHAINS_SYMBOL[16];
 | 
						||
  extern std::string NOTARY_PUBKEY;
 | 
						||
***************
 | 
						||
*** 109,114 ****
 | 
						||
--- 110,116 ----
 | 
						||
  int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33]);
 | 
						||
  int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize);
 | 
						||
  uint64_t komodo_paxtotal();
 | 
						||
+ int32_t komodo_baseid(char *origbase);
 | 
						||
  int32_t komodo_is_issuer();
 | 
						||
  int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t tokomodo);
 | 
						||
  int32_t komodo_isrealtime(int32_t *kmdheightp);
 | 
						||
***************
 | 
						||
*** 121,137 ****
 | 
						||
      if(!pblocktemplate.get())
 | 
						||
          return NULL;
 | 
						||
      CBlock *pblock = &pblocktemplate->block; // pointer for convenience
 | 
						||
!     if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight > ASSETCHAINS_MINHEIGHT )
 | 
						||
      {
 | 
						||
          isrealtime = komodo_isrealtime(&kmdheight);
 | 
						||
!         while ( KOMODO_ON_DEMAND == 0 )
 | 
						||
          {
 | 
						||
              deposits = komodo_paxtotal();
 | 
						||
!             if ( KOMODO_INITDONE == 0 || (isrealtime= komodo_isrealtime(&kmdheight)) == 0 )
 | 
						||
              {
 | 
						||
                  //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f ht.%d\n",KOMODO_INITDONE,isrealtime,(double)deposits/COIN,kmdheight);
 | 
						||
              }
 | 
						||
!             else if ( deposits != 0 )
 | 
						||
              {
 | 
						||
                  fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),isrealtime,KOMODO_ON_DEMAND);
 | 
						||
                  break;
 | 
						||
--- 123,140 ----
 | 
						||
      if(!pblocktemplate.get())
 | 
						||
          return NULL;
 | 
						||
      CBlock *pblock = &pblocktemplate->block; // pointer for convenience
 | 
						||
!     if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight >= ASSETCHAINS_MINHEIGHT )
 | 
						||
      {
 | 
						||
          isrealtime = komodo_isrealtime(&kmdheight);
 | 
						||
!         deposits = komodo_paxtotal();
 | 
						||
!         while ( KOMODO_ON_DEMAND == 0 && deposits == 0 && (int32_t)mempool.GetTotalTxSize() == 0 )
 | 
						||
          {
 | 
						||
              deposits = komodo_paxtotal();
 | 
						||
!             if ( KOMODO_INITDONE == 0 || (komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 && (isrealtime= komodo_isrealtime(&kmdheight)) == 0) )
 | 
						||
              {
 | 
						||
                  //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f ht.%d\n",KOMODO_INITDONE,isrealtime,(double)deposits/COIN,kmdheight);
 | 
						||
              }
 | 
						||
!             else if ( deposits != 0 || (int32_t)mempool.GetTotalTxSize() > 0 )
 | 
						||
              {
 | 
						||
                  fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),isrealtime,KOMODO_ON_DEMAND);
 | 
						||
                  break;
 | 
						||
***************
 | 
						||
*** 242,247 ****
 | 
						||
--- 245,252 ----
 | 
						||
  
 | 
						||
                  dPriority += (double)nValueIn * nConf;
 | 
						||
              }
 | 
						||
+             nTotalIn += tx.GetJoinSplitValueIn();
 | 
						||
+ 
 | 
						||
              if (fMissingInputs) continue;
 | 
						||
  
 | 
						||
              // Priority is sum(valuein * age) / modified_txsize
 | 
						||
***************
 | 
						||
*** 419,425 ****
 | 
						||
          if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false))
 | 
						||
          {
 | 
						||
              fprintf(stderr,"testblockvalidity failed\n");
 | 
						||
!             //throw std::runtime_error("CreateNewBlock(): TestBlockValidity failed");
 | 
						||
          }
 | 
						||
      }
 | 
						||
  
 | 
						||
--- 424,430 ----
 | 
						||
          if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false))
 | 
						||
          {
 | 
						||
              fprintf(stderr,"testblockvalidity failed\n");
 | 
						||
!             throw std::runtime_error("CreateNewBlock(): TestBlockValidity failed");
 | 
						||
          }
 | 
						||
      }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 473,479 ****
 | 
						||
          script[34] = OP_CHECKSIG;
 | 
						||
          //scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
 | 
						||
      }
 | 
						||
!     if ( 0 && ASSETCHAINS_SYMBOL[0] == 0 )
 | 
						||
      {
 | 
						||
          for (i=0; i<65; i++)
 | 
						||
              fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i));
 | 
						||
--- 478,484 ----
 | 
						||
          script[34] = OP_CHECKSIG;
 | 
						||
          //scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
 | 
						||
      }
 | 
						||
!     if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
 | 
						||
      {
 | 
						||
          for (i=0; i<65; i++)
 | 
						||
              fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i));
 | 
						||
***************
 | 
						||
*** 509,515 ****
 | 
						||
      if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
 | 
						||
          return error("KomodoMiner: ProcessNewBlock, block not accepted");
 | 
						||
  
 | 
						||
!     minedBlocks.increment();
 | 
						||
  
 | 
						||
      return true;
 | 
						||
  }
 | 
						||
--- 514,520 ----
 | 
						||
      if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
 | 
						||
          return error("KomodoMiner: ProcessNewBlock, block not accepted");
 | 
						||
  
 | 
						||
!     TrackMinedBlock(pblock->GetHash());
 | 
						||
  
 | 
						||
      return true;
 | 
						||
  }
 | 
						||
***************
 | 
						||
*** 614,627 ****
 | 
						||
              arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
 | 
						||
              if ( ASSETCHAINS_SYMBOL[0] == 0 && komodo_is_special(pindexPrev->nHeight+1,NOTARY_PUBKEY33) > 0 )
 | 
						||
              {
 | 
						||
!                 hashTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS);
 | 
						||
!                 fprintf(stderr,"I am the chosen one for %s ht.%d\n",ASSETCHAINS_SYMBOL,pindexPrev->nHeight+1);
 | 
						||
              } else Mining_start = 0;
 | 
						||
              while (true)
 | 
						||
              {
 | 
						||
!                 if ( ASSETCHAINS_SYMBOL[0] != 0 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT )
 | 
						||
                  {
 | 
						||
!                     //fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL);
 | 
						||
                      sleep(10);
 | 
						||
                      break;
 | 
						||
                  }
 | 
						||
--- 619,635 ----
 | 
						||
              arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
 | 
						||
              if ( ASSETCHAINS_SYMBOL[0] == 0 && komodo_is_special(pindexPrev->nHeight+1,NOTARY_PUBKEY33) > 0 )
 | 
						||
              {
 | 
						||
!                 if ( (Mining_height % KOMODO_ELECTION_GAP) > 64 || (Mining_height % KOMODO_ELECTION_GAP) == 0 )
 | 
						||
!                 {
 | 
						||
!                     hashTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS);
 | 
						||
!                     fprintf(stderr,"I am the chosen one for %s ht.%d\n",ASSETCHAINS_SYMBOL,pindexPrev->nHeight+1);
 | 
						||
!                 } else Mining_start = 0;
 | 
						||
              } else Mining_start = 0;
 | 
						||
              while (true)
 | 
						||
              {
 | 
						||
!                 if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT )
 | 
						||
                  {
 | 
						||
!                     fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL);
 | 
						||
                      sleep(10);
 | 
						||
                      break;
 | 
						||
                  }
 | 
						||
***************
 | 
						||
*** 784,794 ****
 | 
						||
--- 792,804 ----
 | 
						||
      }
 | 
						||
      catch (const boost::thread_interrupted&)
 | 
						||
      {
 | 
						||
+         c.disconnect();
 | 
						||
          LogPrintf("KomodoMiner terminated\n");
 | 
						||
          throw;
 | 
						||
      }
 | 
						||
      catch (const std::runtime_error &e)
 | 
						||
      {
 | 
						||
+         c.disconnect();
 | 
						||
          LogPrintf("KomodoMiner runtime error: %s\n", e.what());
 | 
						||
          return;
 | 
						||
      }
 | 
						||
diff -crB ./src/pow.cpp ../../komodo-jl777/src/pow.cpp
 | 
						||
*** ./src/pow.cpp	2017-01-03 10:40:50.259331594 +0000
 | 
						||
--- ../../komodo-jl777/src/pow.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 113,119 ****
 | 
						||
  bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params)
 | 
						||
  {
 | 
						||
      extern int32_t KOMODO_REWIND;
 | 
						||
!     bool fNegative,fOverflow; int32_t i,nonz=0,special,special2,notaryid=-1,flag = 0;
 | 
						||
      arith_uint256 bnTarget;
 | 
						||
  
 | 
						||
      bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
 | 
						||
--- 113,119 ----
 | 
						||
  bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params)
 | 
						||
  {
 | 
						||
      extern int32_t KOMODO_REWIND;
 | 
						||
!     bool fNegative,fOverflow; int32_t i,nonz=0,special=0,special2=0,notaryid=-1,flag = 0;
 | 
						||
      arith_uint256 bnTarget;
 | 
						||
  
 | 
						||
      bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
 | 
						||
***************
 | 
						||
*** 130,144 ****
 | 
						||
          if ( nonz == 0 )
 | 
						||
              return(true); // will come back via different path with pubkey set
 | 
						||
          special2 = komodo_is_special(height,pubkey33);
 | 
						||
!         if ( notaryid >= 0 && ((height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) > 64) )
 | 
						||
          {
 | 
						||
-             //if ( special2 == -2 )
 | 
						||
-             //    printf("height.%d special2.%d special.%d\n",height,special2,special);
 | 
						||
              if ( (height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) == 0 || (height < 80000 && (special != 0 || special2 > 0)) || (height >= 80000 && special2 > 0) )
 | 
						||
              {
 | 
						||
                  bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
 | 
						||
                  flag = 1;
 | 
						||
              }
 | 
						||
          }
 | 
						||
      }
 | 
						||
      if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
 | 
						||
--- 130,153 ----
 | 
						||
          if ( nonz == 0 )
 | 
						||
              return(true); // will come back via different path with pubkey set
 | 
						||
          special2 = komodo_is_special(height,pubkey33);
 | 
						||
!         /*if ( notaryid >= 0 && ((height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) > 64) )
 | 
						||
          {
 | 
						||
              if ( (height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) == 0 || (height < 80000 && (special != 0 || special2 > 0)) || (height >= 80000 && special2 > 0) )
 | 
						||
              {
 | 
						||
                  bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
 | 
						||
                  flag = 1;
 | 
						||
              }
 | 
						||
+         }*/
 | 
						||
+         if ( notaryid >= 0 )
 | 
						||
+         {
 | 
						||
+             if ( height > 10000 && height < 80000 && (special != 0 || special2 > 0) )
 | 
						||
+                 flag = 1;
 | 
						||
+             else if ( height >= 80000 && height < 108000 && special2 > 0 )
 | 
						||
+                 flag = 1;
 | 
						||
+             else if ( height >= 108000 && special2 > 0 )
 | 
						||
+                 flag = ((height % KOMODO_ELECTION_GAP) > 64 || (height % KOMODO_ELECTION_GAP) == 0);
 | 
						||
+             if ( flag != 0 )
 | 
						||
+                 bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
 | 
						||
          }
 | 
						||
      }
 | 
						||
      if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
 | 
						||
***************
 | 
						||
*** 146,160 ****
 | 
						||
      // Check proof of work matches claimed amount
 | 
						||
      if ( UintToArith256(hash) > bnTarget )
 | 
						||
      {
 | 
						||
!         int32_t i;
 | 
						||
!         for (i=31; i>=0; i--)
 | 
						||
!             printf("%02x",((uint8_t *)&hash)[i]);
 | 
						||
!         printf(" hash vs ");
 | 
						||
!         for (i=31; i>=0; i--)
 | 
						||
!             printf("%02x",((uint8_t *)&bnTarget)[i]);
 | 
						||
!         printf(" ht.%d REWIND.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,KOMODO_REWIND,special,notaryid,height,(height % 35));
 | 
						||
!         if ( height <= KOMODO_REWIND )
 | 
						||
!             return error("CheckProofOfWork(): hash doesn't match nBits");
 | 
						||
      }
 | 
						||
      return true;
 | 
						||
  }
 | 
						||
--- 155,171 ----
 | 
						||
      // Check proof of work matches claimed amount
 | 
						||
      if ( UintToArith256(hash) > bnTarget )
 | 
						||
      {
 | 
						||
!         {
 | 
						||
!             int32_t i;
 | 
						||
!             for (i=31; i>=0; i--)
 | 
						||
!                 printf("%02x",((uint8_t *)&hash)[i]);
 | 
						||
!             printf(" hash vs ");
 | 
						||
!             for (i=31; i>=0; i--)
 | 
						||
!                 printf("%02x",((uint8_t *)&bnTarget)[i]);
 | 
						||
!             printf(" ht.%d REWIND.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,KOMODO_REWIND,special,notaryid,height,(height % 35));
 | 
						||
!             if ( height < 90000 || (height > 110000 && KOMODO_REWIND == 0) )
 | 
						||
!                 return error("CheckProofOfWork(): hash doesn't match nBits");
 | 
						||
!         }
 | 
						||
      }
 | 
						||
      return true;
 | 
						||
  }
 | 
						||
diff -crB ./src/primitives/block.h ../../komodo-jl777/src/primitives/block.h
 | 
						||
*** ./src/primitives/block.h	2017-01-03 10:40:50.259331594 +0000
 | 
						||
--- ../../komodo-jl777/src/primitives/block.h	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 200,205 ****
 | 
						||
--- 200,209 ----
 | 
						||
      {
 | 
						||
          return vHave.empty();
 | 
						||
      }
 | 
						||
+ 
 | 
						||
+     friend bool operator==(const CBlockLocator& a, const CBlockLocator& b) {
 | 
						||
+         return (a.vHave == b.vHave);
 | 
						||
+     }
 | 
						||
  };
 | 
						||
  
 | 
						||
  #endif // BITCOIN_PRIMITIVES_BLOCK_H
 | 
						||
diff -crB ./src/primitives/transaction.cpp ../../komodo-jl777/src/primitives/transaction.cpp
 | 
						||
*** ./src/primitives/transaction.cpp	2017-01-03 10:40:50.259331594 +0000
 | 
						||
--- ../../komodo-jl777/src/primitives/transaction.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 62,67 ****
 | 
						||
--- 62,70 ----
 | 
						||
      // Randomize the order of the inputs and outputs
 | 
						||
      inputMap = {0, 1};
 | 
						||
      outputMap = {0, 1};
 | 
						||
+ 
 | 
						||
+     assert(gen);
 | 
						||
+ 
 | 
						||
      MappedShuffle(inputs.begin(), inputMap.begin(), ZC_NUM_JS_INPUTS, gen);
 | 
						||
      MappedShuffle(outputs.begin(), outputMap.begin(), ZC_NUM_JS_OUTPUTS, gen);
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 72,81 ****
 | 
						||
--- 75,86 ----
 | 
						||
  
 | 
						||
  bool JSDescription::Verify(
 | 
						||
      ZCJoinSplit& params,
 | 
						||
+     libzcash::ProofVerifier& verifier,
 | 
						||
      const uint256& pubKeyHash
 | 
						||
  ) const {
 | 
						||
      return params.verify(
 | 
						||
          proof,
 | 
						||
+         verifier,
 | 
						||
          pubKeyHash,
 | 
						||
          randomSeed,
 | 
						||
          macs,
 | 
						||
diff -crB ./src/primitives/transaction.h ../../komodo-jl777/src/primitives/transaction.h
 | 
						||
*** ./src/primitives/transaction.h	2017-01-03 10:40:50.259331594 +0000
 | 
						||
--- ../../komodo-jl777/src/primitives/transaction.h	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 101,107 ****
 | 
						||
      );
 | 
						||
  
 | 
						||
      // Verifies that the JoinSplit proof is correct.
 | 
						||
!     bool Verify(ZCJoinSplit& params, const uint256& pubKeyHash) const;
 | 
						||
  
 | 
						||
      // Returns the calculated h_sig
 | 
						||
      uint256 h_sig(ZCJoinSplit& params, const uint256& pubKeyHash) const;
 | 
						||
--- 101,111 ----
 | 
						||
      );
 | 
						||
  
 | 
						||
      // Verifies that the JoinSplit proof is correct.
 | 
						||
!     bool Verify(
 | 
						||
!         ZCJoinSplit& params,
 | 
						||
!         libzcash::ProofVerifier& verifier,
 | 
						||
!         const uint256& pubKeyHash
 | 
						||
!     ) const;
 | 
						||
  
 | 
						||
      // Returns the calculated h_sig
 | 
						||
      uint256 h_sig(ZCJoinSplit& params, const uint256& pubKeyHash) const;
 | 
						||
diff -crB ./src/random.cpp ../../komodo-jl777/src/random.cpp
 | 
						||
*** ./src/random.cpp	2017-01-03 10:40:50.339335643 +0000
 | 
						||
--- ../../komodo-jl777/src/random.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 137,139 ****
 | 
						||
--- 137,144 ----
 | 
						||
          insecure_rand_Rw = tmp;
 | 
						||
      }
 | 
						||
  }
 | 
						||
+ 
 | 
						||
+ int GenIdentity(int n)
 | 
						||
+ {
 | 
						||
+     return n-1;
 | 
						||
+ }
 | 
						||
diff -crB ./src/random.h ../../komodo-jl777/src/random.h
 | 
						||
*** ./src/random.h	2017-01-03 10:40:50.339335643 +0000
 | 
						||
--- ../../komodo-jl777/src/random.h	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 26,31 ****
 | 
						||
--- 26,36 ----
 | 
						||
  uint256 GetRandHash();
 | 
						||
  
 | 
						||
  /**
 | 
						||
+  * Identity function for MappedShuffle, so that elements retain their original order.
 | 
						||
+  */
 | 
						||
+  int GenIdentity(int n);
 | 
						||
+ 
 | 
						||
+ /**
 | 
						||
   * Rearranges the elements in the range [first,first+len) randomly, assuming
 | 
						||
   * that gen is a uniform random number generator. Follows the same algorithm as
 | 
						||
   * std::shuffle in C++11 (a Durstenfeld shuffle).
 | 
						||
diff -crB ./src/rpcclient.cpp ../../komodo-jl777/src/rpcclient.cpp
 | 
						||
*** ./src/rpcclient.cpp	2017-01-03 10:40:50.343335845 +0000
 | 
						||
--- ../../komodo-jl777/src/rpcclient.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 103,108 ****
 | 
						||
--- 103,109 ----
 | 
						||
      { "z_gettotalbalance", 0},
 | 
						||
      { "z_sendmany", 1},
 | 
						||
      { "z_sendmany", 2},
 | 
						||
+     { "z_sendmany", 3},
 | 
						||
      { "z_getoperationstatus", 0},
 | 
						||
      { "z_getoperationresult", 0},
 | 
						||
      { "z_importkey", 1 },
 | 
						||
diff -crB ./src/rpcmining.cpp ../../komodo-jl777/src/rpcmining.cpp
 | 
						||
*** ./src/rpcmining.cpp	2017-01-03 10:40:50.343335845 +0000
 | 
						||
--- ../../komodo-jl777/src/rpcmining.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 37,43 ****
 | 
						||
   * or over the difficulty averaging window if 'lookup' is nonpositive.
 | 
						||
   * If 'height' is nonnegative, compute the estimate at the time when a given block was found.
 | 
						||
   */
 | 
						||
! Value GetNetworkHashPS(int lookup, int height) {
 | 
						||
      CBlockIndex *pb = chainActive.Tip();
 | 
						||
  
 | 
						||
      if (height >= 0 && height < chainActive.Height())
 | 
						||
--- 37,43 ----
 | 
						||
   * or over the difficulty averaging window if 'lookup' is nonpositive.
 | 
						||
   * If 'height' is nonnegative, compute the estimate at the time when a given block was found.
 | 
						||
   */
 | 
						||
! int64_t GetNetworkHashPS(int lookup, int height) {
 | 
						||
      CBlockIndex *pb = chainActive.Tip();
 | 
						||
  
 | 
						||
      if (height >= 0 && height < chainActive.Height())
 | 
						||
***************
 | 
						||
*** 74,92 ****
 | 
						||
      return (int64_t)(workDiff.getdouble() / timeDiff);
 | 
						||
  }
 | 
						||
  
 | 
						||
  Value getnetworkhashps(const Array& params, bool fHelp)
 | 
						||
  {
 | 
						||
      if (fHelp || params.size() > 2)
 | 
						||
          throw runtime_error(
 | 
						||
              "getnetworkhashps ( blocks height )\n"
 | 
						||
!             "\nReturns the estimated network hashes per second based on the last n blocks.\n"
 | 
						||
              "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
 | 
						||
              "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
 | 
						||
              "\nArguments:\n"
 | 
						||
              "1. blocks     (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
 | 
						||
              "2. height     (numeric, optional, default=-1) To estimate at the time of the given height.\n"
 | 
						||
              "\nResult:\n"
 | 
						||
!             "x             (numeric) Hashes per second estimated\n"
 | 
						||
              "\nExamples:\n"
 | 
						||
              + HelpExampleCli("getnetworkhashps", "")
 | 
						||
              + HelpExampleRpc("getnetworkhashps", "")
 | 
						||
--- 74,133 ----
 | 
						||
      return (int64_t)(workDiff.getdouble() / timeDiff);
 | 
						||
  }
 | 
						||
  
 | 
						||
+ Value getlocalsolps(const Array& params, bool fHelp)
 | 
						||
+ {
 | 
						||
+     if (fHelp)
 | 
						||
+         throw runtime_error(
 | 
						||
+             "getlocalsolps\n"
 | 
						||
+             "\nReturns the average local solutions per second since this node was started.\n"
 | 
						||
+             "This is the same information shown on the metrics screen (if enabled).\n"
 | 
						||
+             "\nResult:\n"
 | 
						||
+             "xxx.xxxxx     (numeric) Solutions per second average\n"
 | 
						||
+             "\nExamples:\n"
 | 
						||
+             + HelpExampleCli("getlocalsolps", "")
 | 
						||
+             + HelpExampleRpc("getlocalsolps", "")
 | 
						||
+        );
 | 
						||
+ 
 | 
						||
+     LOCK(cs_main);
 | 
						||
+     return GetLocalSolPS();
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ Value getnetworksolps(const Array& params, bool fHelp)
 | 
						||
+ {
 | 
						||
+     if (fHelp || params.size() > 2)
 | 
						||
+         throw runtime_error(
 | 
						||
+             "getnetworksolps ( blocks height )\n"
 | 
						||
+             "\nReturns the estimated network solutions per second based on the last n blocks.\n"
 | 
						||
+             "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
 | 
						||
+             "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
 | 
						||
+             "\nArguments:\n"
 | 
						||
+             "1. blocks     (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
 | 
						||
+             "2. height     (numeric, optional, default=-1) To estimate at the time of the given height.\n"
 | 
						||
+             "\nResult:\n"
 | 
						||
+             "x             (numeric) Solutions per second estimated\n"
 | 
						||
+             "\nExamples:\n"
 | 
						||
+             + HelpExampleCli("getnetworksolps", "")
 | 
						||
+             + HelpExampleRpc("getnetworksolps", "")
 | 
						||
+        );
 | 
						||
+ 
 | 
						||
+     LOCK(cs_main);
 | 
						||
+     return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  Value getnetworkhashps(const Array& params, bool fHelp)
 | 
						||
  {
 | 
						||
      if (fHelp || params.size() > 2)
 | 
						||
          throw runtime_error(
 | 
						||
              "getnetworkhashps ( blocks height )\n"
 | 
						||
!             "\nDEPRECATED - left for backwards-compatibility. Use getnetworksolps instead.\n"
 | 
						||
!             "\nReturns the estimated network solutions per second based on the last n blocks.\n"
 | 
						||
              "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
 | 
						||
              "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
 | 
						||
              "\nArguments:\n"
 | 
						||
              "1. blocks     (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
 | 
						||
              "2. height     (numeric, optional, default=-1) To estimate at the time of the given height.\n"
 | 
						||
              "\nResult:\n"
 | 
						||
!             "x             (numeric) Solutions per second estimated\n"
 | 
						||
              "\nExamples:\n"
 | 
						||
              + HelpExampleCli("getnetworkhashps", "")
 | 
						||
              + HelpExampleRpc("getnetworkhashps", "")
 | 
						||
***************
 | 
						||
*** 209,215 ****
 | 
						||
          CValidationState state;
 | 
						||
          if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
 | 
						||
              throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");
 | 
						||
-         minedBlocks.increment();
 | 
						||
          ++nHeight;
 | 
						||
          blockHashes.push_back(pblock->GetHash().GetHex());
 | 
						||
      }
 | 
						||
--- 250,255 ----
 | 
						||
***************
 | 
						||
*** 280,285 ****
 | 
						||
--- 320,327 ----
 | 
						||
              "  \"errors\": \"...\"          (string) Current errors\n"
 | 
						||
              "  \"generate\": true|false     (boolean) If the generation is on or off (see getgenerate or setgenerate calls)\n"
 | 
						||
              "  \"genproclimit\": n          (numeric) The processor limit for generation. -1 if no generation. (see getgenerate or setgenerate calls)\n"
 | 
						||
+             "  \"localsolps\": xxx.xxxxx    (numeric) The average local solution rate in Sol/s since this node was started\n"
 | 
						||
+             "  \"networksolps\": x          (numeric) The estimated network solution rate in Sol/s\n"
 | 
						||
              "  \"pooledtx\": n              (numeric) The size of the mem pool\n"
 | 
						||
              "  \"testnet\": true|false      (boolean) If using testnet or not\n"
 | 
						||
              "  \"chain\": \"xxxx\",         (string) current network name as defined in BIP70 (main, test, regtest)\n"
 | 
						||
***************
 | 
						||
*** 299,305 ****
 | 
						||
      obj.push_back(Pair("difficulty",       (double)GetNetworkDifficulty()));
 | 
						||
      obj.push_back(Pair("errors",           GetWarnings("statusbar")));
 | 
						||
      obj.push_back(Pair("genproclimit",     (int)GetArg("-genproclimit", -1)));
 | 
						||
!     obj.push_back(Pair("networkhashps",    getnetworkhashps(params, false)));
 | 
						||
      obj.push_back(Pair("pooledtx",         (uint64_t)mempool.size()));
 | 
						||
      obj.push_back(Pair("testnet",          Params().TestnetToBeDeprecatedFieldRPC()));
 | 
						||
      obj.push_back(Pair("chain",            Params().NetworkIDString()));
 | 
						||
--- 341,349 ----
 | 
						||
      obj.push_back(Pair("difficulty",       (double)GetNetworkDifficulty()));
 | 
						||
      obj.push_back(Pair("errors",           GetWarnings("statusbar")));
 | 
						||
      obj.push_back(Pair("genproclimit",     (int)GetArg("-genproclimit", -1)));
 | 
						||
!     obj.push_back(Pair("localsolps"  ,     getlocalsolps(params, false)));
 | 
						||
!     obj.push_back(Pair("networksolps",     getnetworksolps(params, false)));
 | 
						||
!     obj.push_back(Pair("networkhashps",    getnetworksolps(params, false)));
 | 
						||
      obj.push_back(Pair("pooledtx",         (uint64_t)mempool.size()));
 | 
						||
      obj.push_back(Pair("testnet",          Params().TestnetToBeDeprecatedFieldRPC()));
 | 
						||
      obj.push_back(Pair("chain",            Params().NetworkIDString()));
 | 
						||
***************
 | 
						||
*** 483,492 ****
 | 
						||
          throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
 | 
						||
  
 | 
						||
      if (vNodes.empty())
 | 
						||
!         throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
 | 
						||
  
 | 
						||
      if (IsInitialBlockDownload())
 | 
						||
!         throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");
 | 
						||
  
 | 
						||
      static unsigned int nTransactionsUpdatedLast;
 | 
						||
  
 | 
						||
--- 527,536 ----
 | 
						||
          throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
 | 
						||
  
 | 
						||
      if (vNodes.empty())
 | 
						||
!         throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Zcash is not connected!");
 | 
						||
  
 | 
						||
      if (IsInitialBlockDownload())
 | 
						||
!         throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Zcash is downloading blocks...");
 | 
						||
  
 | 
						||
      static unsigned int nTransactionsUpdatedLast;
 | 
						||
  
 | 
						||
diff -crB ./src/rpcmisc.cpp ../../komodo-jl777/src/rpcmisc.cpp
 | 
						||
*** ./src/rpcmisc.cpp	2017-01-03 10:40:50.343335845 +0000
 | 
						||
--- ../../komodo-jl777/src/rpcmisc.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 23,28 ****
 | 
						||
--- 23,30 ----
 | 
						||
  #include "json/json_spirit_utils.h"
 | 
						||
  #include "json/json_spirit_value.h"
 | 
						||
  
 | 
						||
+ #include "zcash/Address.hpp"
 | 
						||
+ 
 | 
						||
  using namespace json_spirit;
 | 
						||
  using namespace std;
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 236,241 ****
 | 
						||
--- 238,306 ----
 | 
						||
      return ret;
 | 
						||
  }
 | 
						||
  
 | 
						||
+ 
 | 
						||
+ Value z_validateaddress(const Array& params, bool fHelp)
 | 
						||
+ {
 | 
						||
+     if (fHelp || params.size() != 1)
 | 
						||
+         throw runtime_error(
 | 
						||
+             "z_validateaddress \"zaddr\"\n"
 | 
						||
+             "\nReturn information about the given z address.\n"
 | 
						||
+             "\nArguments:\n"
 | 
						||
+             "1. \"zaddr\"     (string, required) The z address to validate\n"
 | 
						||
+             "\nResult:\n"
 | 
						||
+             "{\n"
 | 
						||
+             "  \"isvalid\" : true|false,      (boolean) If the address is valid or not. If not, this is the only property returned.\n"
 | 
						||
+             "  \"address\" : \"zaddr\",         (string) The z address validated\n"
 | 
						||
+             "  \"ismine\" : true|false,       (boolean) If the address is yours or not\n"
 | 
						||
+             "  \"payingkey\" : \"hex\",         (string) The hex value of the paying key, a_pk\n"
 | 
						||
+             "  \"transmissionkey\" : \"hex\",   (string) The hex value of the transmission key, pk_enc\n"
 | 
						||
+ 
 | 
						||
+             "}\n"
 | 
						||
+             "\nExamples:\n"
 | 
						||
+             + HelpExampleCli("validateaddress", "\"zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL\"")
 | 
						||
+         );
 | 
						||
+ 
 | 
						||
+ 
 | 
						||
+ #ifdef ENABLE_WALLET
 | 
						||
+     LOCK2(cs_main, pwalletMain->cs_wallet);
 | 
						||
+ #else
 | 
						||
+     LOCK(cs_main);
 | 
						||
+ #endif
 | 
						||
+ 
 | 
						||
+     bool isValid = false;
 | 
						||
+     bool isMine = false;
 | 
						||
+     std::string payingKey, transmissionKey;
 | 
						||
+ 
 | 
						||
+     string strAddress = params[0].get_str();
 | 
						||
+     try {
 | 
						||
+         CZCPaymentAddress address(strAddress);
 | 
						||
+         libzcash::PaymentAddress addr = address.Get();
 | 
						||
+ 
 | 
						||
+ #ifdef ENABLE_WALLET
 | 
						||
+         isMine = pwalletMain->HaveSpendingKey(addr);
 | 
						||
+ #endif
 | 
						||
+         payingKey = addr.a_pk.GetHex();
 | 
						||
+         transmissionKey = addr.pk_enc.GetHex();
 | 
						||
+         isValid = true;
 | 
						||
+     } catch (std::runtime_error e) {
 | 
						||
+         // address is invalid, nop here as isValid is false.
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     Object ret;
 | 
						||
+     ret.push_back(Pair("isvalid", isValid));
 | 
						||
+     if (isValid)
 | 
						||
+     {
 | 
						||
+         ret.push_back(Pair("address", strAddress));
 | 
						||
+         ret.push_back(Pair("payingkey", payingKey));
 | 
						||
+         ret.push_back(Pair("transmissionkey", transmissionKey));
 | 
						||
+ #ifdef ENABLE_WALLET
 | 
						||
+         ret.push_back(Pair("ismine", isMine));
 | 
						||
+ #endif
 | 
						||
+     }
 | 
						||
+     return ret;
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ 
 | 
						||
  /**
 | 
						||
   * Used by addmultisigaddress / createmultisig:
 | 
						||
   */
 | 
						||
diff -crB ./src/rpcprotocol.cpp ../../komodo-jl777/src/rpcprotocol.cpp
 | 
						||
*** ./src/rpcprotocol.cpp	2017-01-03 10:40:50.343335845 +0000
 | 
						||
--- ../../komodo-jl777/src/rpcprotocol.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 33,39 ****
 | 
						||
  
 | 
						||
  /**
 | 
						||
   * HTTP protocol
 | 
						||
!  * 
 | 
						||
   * This ain't Apache.  We're just using HTTP header for the length field
 | 
						||
   * and to be compatible with other JSON-RPC implementations.
 | 
						||
   */
 | 
						||
--- 33,39 ----
 | 
						||
  
 | 
						||
  /**
 | 
						||
   * HTTP protocol
 | 
						||
!  *
 | 
						||
   * This ain't Apache.  We're just using HTTP header for the length field
 | 
						||
   * and to be compatible with other JSON-RPC implementations.
 | 
						||
   */
 | 
						||
***************
 | 
						||
*** 42,48 ****
 | 
						||
  {
 | 
						||
      ostringstream s;
 | 
						||
      s << "POST / HTTP/1.1\r\n"
 | 
						||
!       << "User-Agent: bitcoin-json-rpc/" << FormatFullVersion() << "\r\n"
 | 
						||
        << "Host: 127.0.0.1\r\n"
 | 
						||
        << "Content-Type: application/json\r\n"
 | 
						||
        << "Content-Length: " << strMsg.size() << "\r\n"
 | 
						||
--- 42,48 ----
 | 
						||
  {
 | 
						||
      ostringstream s;
 | 
						||
      s << "POST / HTTP/1.1\r\n"
 | 
						||
!       << "User-Agent: zcash-json-rpc/" << FormatFullVersion() << "\r\n"
 | 
						||
        << "Host: 127.0.0.1\r\n"
 | 
						||
        << "Content-Type: application/json\r\n"
 | 
						||
        << "Content-Length: " << strMsg.size() << "\r\n"
 | 
						||
***************
 | 
						||
*** 77,83 ****
 | 
						||
      if (nStatus == HTTP_UNAUTHORIZED)
 | 
						||
          return strprintf("HTTP/1.0 401 Authorization Required\r\n"
 | 
						||
              "Date: %s\r\n"
 | 
						||
!             "Server: bitcoin-json-rpc/%s\r\n"
 | 
						||
              "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
 | 
						||
              "Content-Type: text/html\r\n"
 | 
						||
              "Content-Length: 296\r\n"
 | 
						||
--- 77,83 ----
 | 
						||
      if (nStatus == HTTP_UNAUTHORIZED)
 | 
						||
          return strprintf("HTTP/1.0 401 Authorization Required\r\n"
 | 
						||
              "Date: %s\r\n"
 | 
						||
!             "Server: zcash-json-rpc/%s\r\n"
 | 
						||
              "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
 | 
						||
              "Content-Type: text/html\r\n"
 | 
						||
              "Content-Length: 296\r\n"
 | 
						||
***************
 | 
						||
*** 104,110 ****
 | 
						||
              "Connection: %s\r\n"
 | 
						||
              "Content-Length: %u\r\n"
 | 
						||
              "Content-Type: %s\r\n"
 | 
						||
!             "Server: bitcoin-json-rpc/%s\r\n"
 | 
						||
              "\r\n",
 | 
						||
          nStatus,
 | 
						||
          httpStatusDescription(nStatus),
 | 
						||
--- 104,110 ----
 | 
						||
              "Connection: %s\r\n"
 | 
						||
              "Content-Length: %u\r\n"
 | 
						||
              "Content-Type: %s\r\n"
 | 
						||
!             "Server: zcash-json-rpc/%s\r\n"
 | 
						||
              "\r\n",
 | 
						||
          nStatus,
 | 
						||
          httpStatusDescription(nStatus),
 | 
						||
***************
 | 
						||
*** 248,254 ****
 | 
						||
   * JSON-RPC protocol.  Bitcoin speaks version 1.0 for maximum compatibility,
 | 
						||
   * but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
 | 
						||
   * unspecified (HTTP errors and contents of 'error').
 | 
						||
!  * 
 | 
						||
   * 1.0 spec: http://json-rpc.org/wiki/specification
 | 
						||
   * 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html
 | 
						||
   * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
 | 
						||
--- 248,254 ----
 | 
						||
   * JSON-RPC protocol.  Bitcoin speaks version 1.0 for maximum compatibility,
 | 
						||
   * but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
 | 
						||
   * unspecified (HTTP errors and contents of 'error').
 | 
						||
!  *
 | 
						||
   * 1.0 spec: http://json-rpc.org/wiki/specification
 | 
						||
   * 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html
 | 
						||
   * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
 | 
						||
diff -crB ./src/rpcserver.cpp ../../komodo-jl777/src/rpcserver.cpp
 | 
						||
*** ./src/rpcserver.cpp	2017-01-03 10:40:50.343335845 +0000
 | 
						||
--- ../../komodo-jl777/src/rpcserver.cpp	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 309,314 ****
 | 
						||
--- 309,316 ----
 | 
						||
      /* Mining */
 | 
						||
      { "mining",             "getblocktemplate",       &getblocktemplate,       true  },
 | 
						||
      { "mining",             "getmininginfo",          &getmininginfo,          true  },
 | 
						||
+     { "mining",             "getlocalsolps",          &getlocalsolps,          true  },
 | 
						||
+     { "mining",             "getnetworksolps",        &getnetworksolps,        true  },
 | 
						||
      { "mining",             "getnetworkhashps",       &getnetworkhashps,       true  },
 | 
						||
      { "mining",             "prioritisetransaction",  &prioritisetransaction,  true  },
 | 
						||
      { "mining",             "submitblock",            &submitblock,            true  },
 | 
						||
***************
 | 
						||
*** 335,340 ****
 | 
						||
--- 337,343 ----
 | 
						||
      { "util",               "verifymessage",          &verifymessage,          true  },
 | 
						||
      { "util",               "estimatefee",            &estimatefee,            true  },
 | 
						||
      { "util",               "estimatepriority",       &estimatepriority,       true  },
 | 
						||
+     { "util",               "z_validateaddress",      &z_validateaddress,      true  }, /* uses wallet if enabled */
 | 
						||
  
 | 
						||
      /* Not shown in help */
 | 
						||
      { "hidden",             "invalidateblock",        &invalidateblock,        true  },
 | 
						||
***************
 | 
						||
*** 1034,1042 ****
 | 
						||
--- 1037,1051 ----
 | 
						||
          // Read HTTP message headers and body
 | 
						||
          ReadHTTPMessage(conn->stream(), mapHeaders, strRequest, nProto, MAX_SIZE);
 | 
						||
  
 | 
						||
+         // TODO #1856: Re-enable support for persistent connections.
 | 
						||
+         // We have disabled support for HTTP Keep-Alive until resolution of #1680, upstream rpc deadlock.
 | 
						||
+         // Close connection immediately.
 | 
						||
+         fRun = false;
 | 
						||
+         /*
 | 
						||
          // HTTP Keep-Alive is false; close connection immediately
 | 
						||
          if ((mapHeaders["connection"] == "close") || (!GetBoolArg("-rpckeepalive", true)))
 | 
						||
              fRun = false;
 | 
						||
+         */
 | 
						||
  
 | 
						||
          // Process via JSON-RPC API
 | 
						||
          if (strURI == "/") {
 | 
						||
diff -crB ./src/rpcserver.h ../../komodo-jl777/src/rpcserver.h
 | 
						||
*** ./src/rpcserver.h	2017-01-03 10:40:50.343335845 +0000
 | 
						||
--- ../../komodo-jl777/src/rpcserver.h	2017-01-03 09:49:08.864506767 +0000
 | 
						||
***************
 | 
						||
*** 169,174 ****
 | 
						||
--- 169,176 ----
 | 
						||
  extern json_spirit::Value getgenerate(const json_spirit::Array& params, bool fHelp); // in rpcmining.cpp
 | 
						||
  extern json_spirit::Value setgenerate(const json_spirit::Array& params, bool fHelp);
 | 
						||
  extern json_spirit::Value generate(const json_spirit::Array& params, bool fHelp);
 | 
						||
+ extern json_spirit::Value getlocalsolps(const json_spirit::Array& params, bool fHelp);
 | 
						||
+ extern json_spirit::Value getnetworksolps(const json_spirit::Array& params, bool fHelp);
 | 
						||
  extern json_spirit::Value getnetworkhashps(const json_spirit::Array& params, bool fHelp);
 | 
						||
  extern json_spirit::Value getmininginfo(const json_spirit::Array& params, bool fHelp);
 | 
						||
  extern json_spirit::Value prioritisetransaction(const json_spirit::Array& params, bool fHelp);
 | 
						||
***************
 | 
						||
*** 270,275 ****
 | 
						||
--- 272,278 ----
 | 
						||
  extern json_spirit::Value z_getoperationstatus(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
 | 
						||
  extern json_spirit::Value z_getoperationresult(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
 | 
						||
  extern json_spirit::Value z_listoperationids(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
 | 
						||
+ extern json_spirit::Value z_validateaddress(const json_spirit::Array& params, bool fHelp); // in rpcmisc.cpp
 | 
						||
  
 | 
						||
  
 | 
						||
  // in rest.cpp
 | 
						||
diff -crB ./src/test/coins_tests.cpp ../../komodo-jl777/src/test/coins_tests.cpp
 | 
						||
*** ./src/test/coins_tests.cpp	2017-01-03 10:40:50.375337465 +0000
 | 
						||
--- ../../komodo-jl777/src/test/coins_tests.cpp	2017-01-03 09:49:08.868506976 +0000
 | 
						||
***************
 | 
						||
*** 166,171 ****
 | 
						||
--- 166,414 ----
 | 
						||
  
 | 
						||
  BOOST_FIXTURE_TEST_SUITE(coins_tests, BasicTestingSetup)
 | 
						||
  
 | 
						||
+ BOOST_AUTO_TEST_CASE(nullifier_regression_test)
 | 
						||
+ {
 | 
						||
+     // Correct behavior:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert a nullifier into the base.
 | 
						||
+         uint256 nf = GetRandHash();
 | 
						||
+         cache1.SetNullifier(nf, true);
 | 
						||
+         cache1.Flush(); // Flush to base.
 | 
						||
+ 
 | 
						||
+         // Remove the nullifier from cache
 | 
						||
+         cache1.SetNullifier(nf, false);
 | 
						||
+ 
 | 
						||
+         // The nullifier now should be `false`.
 | 
						||
+         BOOST_CHECK(!cache1.GetNullifier(nf));
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Also correct behavior:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert a nullifier into the base.
 | 
						||
+         uint256 nf = GetRandHash();
 | 
						||
+         cache1.SetNullifier(nf, true);
 | 
						||
+         cache1.Flush(); // Flush to base.
 | 
						||
+ 
 | 
						||
+         // Remove the nullifier from cache
 | 
						||
+         cache1.SetNullifier(nf, false);
 | 
						||
+         cache1.Flush(); // Flush to base.
 | 
						||
+ 
 | 
						||
+         // The nullifier now should be `false`.
 | 
						||
+         BOOST_CHECK(!cache1.GetNullifier(nf));
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Works because we bring it from the parent cache:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert a nullifier into the base.
 | 
						||
+         uint256 nf = GetRandHash();
 | 
						||
+         cache1.SetNullifier(nf, true);
 | 
						||
+         cache1.Flush(); // Empties cache.
 | 
						||
+ 
 | 
						||
+         // Create cache on top.
 | 
						||
+         {
 | 
						||
+             // Remove the nullifier.
 | 
						||
+             CCoinsViewCacheTest cache2(&cache1);
 | 
						||
+             BOOST_CHECK(cache2.GetNullifier(nf));
 | 
						||
+             cache2.SetNullifier(nf, false);
 | 
						||
+             cache2.Flush(); // Empties cache, flushes to cache1.
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         // The nullifier now should be `false`.
 | 
						||
+         BOOST_CHECK(!cache1.GetNullifier(nf));
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Was broken:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert a nullifier into the base.
 | 
						||
+         uint256 nf = GetRandHash();
 | 
						||
+         cache1.SetNullifier(nf, true);
 | 
						||
+         cache1.Flush(); // Empties cache.
 | 
						||
+ 
 | 
						||
+         // Create cache on top.
 | 
						||
+         {
 | 
						||
+             // Remove the nullifier.
 | 
						||
+             CCoinsViewCacheTest cache2(&cache1);
 | 
						||
+             cache2.SetNullifier(nf, false);
 | 
						||
+             cache2.Flush(); // Empties cache, flushes to cache1.
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         // The nullifier now should be `false`.
 | 
						||
+         BOOST_CHECK(!cache1.GetNullifier(nf));
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ BOOST_AUTO_TEST_CASE(anchor_pop_regression_test)
 | 
						||
+ {
 | 
						||
+     // Correct behavior:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Create dummy anchor/commitment
 | 
						||
+         ZCIncrementalMerkleTree tree;
 | 
						||
+         uint256 cm = GetRandHash();
 | 
						||
+         tree.append(cm);
 | 
						||
+ 
 | 
						||
+         // Add the anchor
 | 
						||
+         cache1.PushAnchor(tree);
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         // Remove the anchor
 | 
						||
+         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         // Add the anchor back
 | 
						||
+         cache1.PushAnchor(tree);
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         // The base contains the anchor, of course!
 | 
						||
+         {
 | 
						||
+             ZCIncrementalMerkleTree checktree;
 | 
						||
+             BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
 | 
						||
+             BOOST_CHECK(checktree.root() == tree.root());
 | 
						||
+         }
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Previously incorrect behavior
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Create dummy anchor/commitment
 | 
						||
+         ZCIncrementalMerkleTree tree;
 | 
						||
+         uint256 cm = GetRandHash();
 | 
						||
+         tree.append(cm);
 | 
						||
+ 
 | 
						||
+         // Add the anchor and flush to disk
 | 
						||
+         cache1.PushAnchor(tree);
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         // Remove the anchor, but don't flush yet!
 | 
						||
+         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
 | 
						||
+ 
 | 
						||
+         {
 | 
						||
+             CCoinsViewCacheTest cache2(&cache1); // Build cache on top
 | 
						||
+             cache2.PushAnchor(tree); // Put the same anchor back!
 | 
						||
+             cache2.Flush(); // Flush to cache1
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         // cache2's flush kinda worked, i.e. cache1 thinks the
 | 
						||
+         // tree is there, but it didn't bring down the correct
 | 
						||
+         // treestate...
 | 
						||
+         {
 | 
						||
+             ZCIncrementalMerkleTree checktree;
 | 
						||
+             BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
 | 
						||
+             BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         // Flushing cache won't help either, just makes the inconsistency
 | 
						||
+         // permanent.
 | 
						||
+         cache1.Flush();
 | 
						||
+         {
 | 
						||
+             ZCIncrementalMerkleTree checktree;
 | 
						||
+             BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
 | 
						||
+             BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
 | 
						||
+         }
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ BOOST_AUTO_TEST_CASE(anchor_regression_test)
 | 
						||
+ {
 | 
						||
+     // Correct behavior:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert anchor into base.
 | 
						||
+         ZCIncrementalMerkleTree tree;
 | 
						||
+         uint256 cm = GetRandHash();
 | 
						||
+         tree.append(cm);
 | 
						||
+         cache1.PushAnchor(tree);
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
 | 
						||
+         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
 | 
						||
+         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Also correct behavior:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert anchor into base.
 | 
						||
+         ZCIncrementalMerkleTree tree;
 | 
						||
+         uint256 cm = GetRandHash();
 | 
						||
+         tree.append(cm);
 | 
						||
+         cache1.PushAnchor(tree);
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
 | 
						||
+         cache1.Flush();
 | 
						||
+         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
 | 
						||
+         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Works because we bring the anchor in from parent cache.
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert anchor into base.
 | 
						||
+         ZCIncrementalMerkleTree tree;
 | 
						||
+         uint256 cm = GetRandHash();
 | 
						||
+         tree.append(cm);
 | 
						||
+         cache1.PushAnchor(tree);
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         {
 | 
						||
+             // Pop anchor.
 | 
						||
+             CCoinsViewCacheTest cache2(&cache1);
 | 
						||
+             BOOST_CHECK(cache2.GetAnchorAt(tree.root(), tree));
 | 
						||
+             cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
 | 
						||
+             cache2.Flush();
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
 | 
						||
+         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Was broken:
 | 
						||
+     {
 | 
						||
+         CCoinsViewTest base;
 | 
						||
+         CCoinsViewCacheTest cache1(&base);
 | 
						||
+ 
 | 
						||
+         // Insert anchor into base.
 | 
						||
+         ZCIncrementalMerkleTree tree;
 | 
						||
+         uint256 cm = GetRandHash();
 | 
						||
+         tree.append(cm);
 | 
						||
+         cache1.PushAnchor(tree);
 | 
						||
+         cache1.Flush();
 | 
						||
+ 
 | 
						||
+         {
 | 
						||
+             // Pop anchor.
 | 
						||
+             CCoinsViewCacheTest cache2(&cache1);
 | 
						||
+             cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
 | 
						||
+             cache2.Flush();
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
+         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
 | 
						||
+         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  BOOST_AUTO_TEST_CASE(nullifiers_test)
 | 
						||
  {
 | 
						||
      CCoinsViewTest base;
 | 
						||
Only in ../../komodo-jl777/src/test/data: merkle_commitments.json
 | 
						||
diff -crB ./src/test/data/merkle_path.json ../../komodo-jl777/src/test/data/merkle_path.json
 | 
						||
*** ./src/test/data/merkle_path.json	2017-01-03 10:40:50.395338477 +0000
 | 
						||
--- ../../komodo-jl777/src/test/data/merkle_path.json	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 1,123 ****
 | 
						||
  [
 | 
						||
!     "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010001",
 | 
						||
! 	"04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010100"
 | 
						||
! 
 | 
						||
  ]
 | 
						||
--- 1,122 ----
 | 
						||
  [
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000100010000010101010000010001000001000001000100000001010101010001000001000100000001000001000100010100010101000100000001000000010001000100000001000001010000010001000001010101010101010100000100000101010000000101000100010100000100000101010001000100010101000000010001000001010000010001000101010101000001010101000001010101000001000100000101000101010000000000010001010000010101010000010000000100010000010101000000000001000001000001010001010101010001010001000101010001000000000101000000000100010100000000010000000000fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000100010000010101010000010001000001000001000100000001010101010001000001000100000001000001000100010100010101000100000001000000010001000100000001000001010000010001000001010101010101010100000100000101010000000101000100010100000100000101010001000100010101000000010001000001010000010001000101010101000001010101000001010101000001000100000101000101010000000000010001010000010101010000010000000100010000010101000000000001000001000001010001010101010001010001000101010001000000000101000000000100010100000000010000000000fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000101000100000101000000010101000100010101010001000101000000000000010100000000010001010100000000010001010101010100010101010101010101010001000001000000010100000101010100010001010000010000010001010001010101000101000101010000010000010100000100000001010101000100010000000101010000000100000000000000000101010101010100000100010100000101000001000101000101000101010000010100010101010000010101010101010000010100000101000001010001000101010101000101010001010101000101010001000000010100000100010001010000010001fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000101000100000101000000010101000100010101010001000101000000000000010100000000010001010100000000010001010101010100010101010101010101010001000001000000010100000101010100010001010000010000010001010001010101000101000101010000010000010100000100000001010101000100010000000101010000000100000000000000000101010101010100000100010100000101000001000101000101000101010000010100010101010000010101010101010000010100000101000001010001000101010101000101010001010101000101010001000000010100000100010001010000010001fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100010101000100000100000000010100010100010000010001010101010100010100010100000000010100000001010101010101000001000001010001010101010000010000000001010101010001000101000000000001010000000001010000010001000100010101000101000100000100010101010000000100000100000100010100000100000001000001000001000101000100000101000101000101000101010000000000000100000100000100000101010000010000000001000001000001000001010101000000010100000101000101010001000101010100000100000001000100010100000101000001010000000100000101010000000001fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100010101000100000100000000010100010100010000010001010101010100010100010100000000010100000001010101010101000001000001010001010101010000010000000001010101010001000101000000000001010000000001010000010001000100010101000101000100000100010101010000000100000100000100010100000100000001000001000001000101000100000101000101000101000101010000000000000100000100000100000101010000010000000001000001000001000001010101000000010100000101000101010001000101010100000100000001000100010100000101000001010000000100000101010000000001fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000001010000000000000001010000000001010101000100000001010100000100010000000000000001010100010100010001000100010000000101000001010001000001010000010001000100010000000101010100010101000101000001000000010001010101010100000001000101000000010100000100000000000000000000000100010101010001010100010000010000000000010100000000000001010000000100000101000001000101010100000101000000000000000000000101000101000100010001000000000100000001000000000000000001000100000001010001000100000101010100000101010101000100000100010100fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000001010000000000000001010000000001010101000100000001010100000100010000000000000001010100010100010001000100010000000101000001010001000001010000010001000100010000000101010100010101000101000001000000010001010101010100000001000101000000010100000100000000000000000000000100010101010001010100010000010000000000010100000000000001010000000100000101000001000101010100000101000000000000000000000101000101000100010001000000000100000001000000000000000001000100000001010001000100000101010100000101010101000100000100010100fd0001010001010101010000000101010101010001010001010000000000010100000000000001010101010000000100010100000001000100000000000100000100000000000101000001000000010101010001010000010101010000000101010101000101010100000001010000010001000101010000000101010101010101010101000101000000000101000101010001010101010101000101000100000101000001010100000001010001010100010101000001000001010000010000010101000101010101000001010100000101000101010001000101010100000100000100000100000000000000000101000100000000000100000100000001000001000401010001",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
 | 
						||
! 	"04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000100010101010001010101000100010000010001010001010100010100000101000000010101000001000001000100010100010000010001000000010001000001010000010101000100010000010100000101000001010100010100010100010100000101010100000000010100010101010001010000000000000000010001010001000101010100000101010101010001010100000100010000010001010100000100000100000101000100010000010100000001000100010000000101000000000001010001010101010101010001000101010100010000000001010101000101000001000001010101000000010001000000000101010001010101fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000100010101010001010101000100010000010001010001010100010100000101000000010101000001000001000100010100010000010001000000010001000001010000010101000100010000010100000101000001010100010100010100010100000101010100000000010100010101010001010000000000000000010001010001000101010100000101010101010001010100000100010000010001010100000100000100000101000100010000010100000001000100010000000101000000000001010001010101010101010001000101010100010000000001010101000101000001000001010101000000010001000000000101010001010101fd0001010001010101010000000101010101010001010001010000000000010100000000000001010101010000000100010100000001000100000000000100000100000000000101000001000000010101010001010000010101010000000101010101000101010100000001010000010001000101010000000101010101010101010101000101000000000101000101010001010101010101000101000100000101000001010100000001010001010100010101000001000001010000010000010101000101010101000001010100000101000101010001000101010100000100000100000100000000000000000101000100000000000100000100000001000001000401010001",
 | 
						||
! 	"04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000101010100010000010001010101010101000000010001010001000100010100010000000100010000000001010000010100010001010000010100000101000001010000010101000001000001000000000100010000010101010100010000010001000100000001010101010000010101010100010100010001000100010000010001000001000100010100010100000101000000000000000100000000010000000001000000010000000100000101000101000101000001000001010000010000000101010100010000010101010101000100000101010100000000010001000100010100010100000001000001000000010100000000000100010000010101fd0001010000000001000001010000010000000000010100010000010101000001010101010000010001010000010101000000010100010001010001010101000000000100000001010001010000000000010001010101000100010101000001010101000100000100000000000101010000010100010101000000010000010000010000000000000000010100000000010001000000010001010100010000010001010000000100000001010100000001010101000100010101010001010100010101000000010101010101010001000001010100000001010001010100010000000000000100010001010000010000000000000101000100010000000100000000000401010100"
 | 
						||
  ]
 | 
						||
diff -crB ./src/test/data/merkle_roots.json ../../komodo-jl777/src/test/data/merkle_roots.json
 | 
						||
*** ./src/test/data/merkle_roots.json	2017-01-03 10:40:50.395338477 +0000
 | 
						||
--- ../../komodo-jl777/src/test/data/merkle_roots.json	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 1,18 ****
 | 
						||
  [
 | 
						||
! 	"26ee6e3f8c28892382264d72789c9c65a8577549fe35d3d6df86e0f07cc80057",
 | 
						||
! 	"0e54a14ab674813f2a558b18df630ae095f2cb775d0bc37677073acb1f8f3443",
 | 
						||
! 	"d06e16c2e6ee0b28d8f07c76a17976fea549ce2dd1debae260dc3215d265fddb",
 | 
						||
! 	"52dc4b76365472537ff15cb18a71be54c91d207f5d62fb89bd74af9010ac0e01",
 | 
						||
! 	"8dd27a2340e34015cd9b00a2ddc011dcdab03d38a49497490d631f71ce9c495e",
 | 
						||
! 	"0cb8ae3ff2483ea7124237b62d0ac4388477b41e83d3811c6e0dd6fec0b365e6",
 | 
						||
! 	"a67c1f145456880502a3d020d538fecf0515bd285edd6e3fcae26eb53c1f56d3",
 | 
						||
! 	"7fb0adeb50e1084359414071486d89ead9c9a3700c64c9892f510f87af6ec27f",
 | 
						||
! 	"45cd6f71215eabb2c25206471e9293bed2bc924ce5bbc16a8f728ec1e310886f",
 | 
						||
! 	"01d1f338c2abee217962120611dafe0a0e9de76c18de77cbb1e3a6d3261e887c",
 | 
						||
! 	"2700b09aa19ce460d509fc3bccfbc80f8381d156a4a52a7f3d4e8b852b5c10ea",
 | 
						||
! 	"ac96cc858674f67d6c6119f933080cd69c10950409722468d2ac7b81e2cc2bba",
 | 
						||
! 	"f4930affd93232b6051fe3a5f744a357201bff4363312d1115762a595261f030",
 | 
						||
! 	"50b48f5226a69a62206f365ac5347c723b43faf9691c04b872225d5c08876eed",
 | 
						||
! 	"a867397884b157b1db4dd03dc2fd6c40c4650e70b61441d4325e0b18d5280fb6",
 | 
						||
! 	"52c8456d3538eed3b73778c596c1993ac6d6c337ae5e338391ce6cae58296dec"
 | 
						||
  ]
 | 
						||
--- 1,18 ----
 | 
						||
  [
 | 
						||
! 	"95bf71d8e803b8601c14b5949d0f92690181154ef9d82eb3e24852266823317a",
 | 
						||
! 	"73f18d3f9cd11010aa01d4f444039e566f14ef282109df9649b2eb75e7a53ed1",
 | 
						||
! 	"dcde8a273c9672bee1a894d7f7f4abb81078f52b498e095f2a87d0aec5addf25",
 | 
						||
! 	"4677d481ec6d1e97969afbc530958d1cbb4f1c047af6fdad4687cd10830e02bd",
 | 
						||
! 	"74cd9d82de30c4222a06d420b75522ae1273729c1d8419446adf1184df61dc69",
 | 
						||
! 	"2ff57f5468c6afdad30ec0fb6c2cb67289f12584e2c20c4e0065f66748697d77",
 | 
						||
! 	"27e4ce010670801911c5765a003b15f75cde31d7378bd36540f593c8a44b3011",
 | 
						||
! 	"62231ef2ec8c4da461072871ab7bc9de10253fcb40e164ddbad05b47e0b7fb69",
 | 
						||
! 	"733a4ce688fdf07efb9e9f5a4b2dafff87cfe198fbe1dff71e028ef4cdee1f1b",
 | 
						||
! 	"df39ed31924facdd69a93db07311d45fceac7a4987c091648044f37e6ecbb0d2",
 | 
						||
! 	"87795c069bdb55281c666b9cb872d13174334ce135c12823541e9536489a9107",
 | 
						||
! 	"438c80f532903b283230446514e400c329b29483db4fe9e279fdfc79e8f4347d",
 | 
						||
! 	"08afb2813eda17e94aba1ab28ec191d4af99283cd4f1c5a04c0c2bc221bc3119",
 | 
						||
! 	"a8b3ab3284f3288f7caa21bd2b69789a159ab4188b0908825b34723305c1228c",
 | 
						||
! 	"db9b289e620de7dca2ae8fdac96808752e32e7a2c6d97ce0755dcebaa03123ab",
 | 
						||
! 	"0bf622cb9f901b7532433ea2e7c1b7632f5935899b62dcf897a71551997dc8cc"
 | 
						||
  ]
 | 
						||
diff -crB ./src/test/data/merkle_serialization.json ../../komodo-jl777/src/test/data/merkle_serialization.json
 | 
						||
*** ./src/test/data/merkle_serialization.json	2017-01-03 10:40:50.399338679 +0000
 | 
						||
--- ../../komodo-jl777/src/test/data/merkle_serialization.json	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 1,18 ****
 | 
						||
  [
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443"
 | 
						||
! ]
 | 
						||
\ No newline at end of file
 | 
						||
--- 1,18 ----
 | 
						||
  [
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0000",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
 | 
						||
! 	"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
 | 
						||
! 	"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
 | 
						||
! 	"01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
 | 
						||
! 	"01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a200301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806"
 | 
						||
! ]
 | 
						||
diff -crB ./src/test/data/merkle_witness_serialization.json ../../komodo-jl777/src/test/data/merkle_witness_serialization.json
 | 
						||
*** ./src/test/data/merkle_witness_serialization.json	2017-01-03 10:40:50.399338679 +0000
 | 
						||
--- ../../komodo-jl777/src/test/data/merkle_witness_serialization.json	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 1,138 ****
 | 
						||
  [
 | 
						||
! 	"0000000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
 | 
						||
! 	"0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
 | 
						||
! 	"0000000555b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300038695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d02dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e35564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944301dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
 | 
						||
! 	"0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300"
 | 
						||
! ]
 | 
						||
\ No newline at end of file
 | 
						||
--- 1,138 ----
 | 
						||
  [
 | 
						||
! 	"0000000162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00",
 | 
						||
! 	"0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
 | 
						||
! 	"0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300000101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
 | 
						||
! 	"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae400",
 | 
						||
! 	"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
 | 
						||
! 	"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
 | 
						||
! 	"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d00",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81701018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba300",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
 | 
						||
! 	"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
 | 
						||
! 	"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
 | 
						||
! 	"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e90101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
 | 
						||
! 	"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
 | 
						||
! 	"0000000562fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000468eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430003a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180392498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861802112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0368c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f02050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0250c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80603d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
 | 
						||
! 	"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060204e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba3305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
 | 
						||
! 	"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
 | 
						||
! 	"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806021880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e92f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
 | 
						||
! 	"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806012f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
 | 
						||
! 	"01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a2000"
 | 
						||
! ]
 | 
						||
diff -crB ./src/test/rpc_wallet_tests.cpp ../../komodo-jl777/src/test/rpc_wallet_tests.cpp
 | 
						||
*** ./src/test/rpc_wallet_tests.cpp	2017-01-03 10:40:50.419339691 +0000
 | 
						||
--- ../../komodo-jl777/src/test/rpc_wallet_tests.cpp	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 295,307 ****
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
 | 
						||
  }
 | 
						||
  
 | 
						||
  /*
 | 
						||
   * This test covers RPC command z_exportwallet
 | 
						||
   */
 | 
						||
  BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
 | 
						||
  {
 | 
						||
      LOCK2(cs_main, pwalletMain->cs_wallet);
 | 
						||
!     
 | 
						||
      // wallet should be empty
 | 
						||
      std::set<libzcash::PaymentAddress> addrs;
 | 
						||
      pwalletMain->GetPaymentAddresses(addrs);
 | 
						||
--- 295,353 ----
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
 | 
						||
  }
 | 
						||
  
 | 
						||
+ /**
 | 
						||
+  * This test covers RPC command z_validateaddress
 | 
						||
+  */
 | 
						||
+ BOOST_AUTO_TEST_CASE(rpc_wallet_z_validateaddress)
 | 
						||
+ {
 | 
						||
+     SelectParams(CBaseChainParams::MAIN);
 | 
						||
+ 
 | 
						||
+     LOCK2(cs_main, pwalletMain->cs_wallet);
 | 
						||
+ 
 | 
						||
+     Value retValue;
 | 
						||
+ 
 | 
						||
+     // Check number of args
 | 
						||
+     BOOST_CHECK_THROW(CallRPC("z_validateaddress"), runtime_error);
 | 
						||
+     BOOST_CHECK_THROW(CallRPC("z_validateaddress toomany args"), runtime_error);
 | 
						||
+ 
 | 
						||
+     // Wallet should be empty
 | 
						||
+     std::set<libzcash::PaymentAddress> addrs;
 | 
						||
+     pwalletMain->GetPaymentAddresses(addrs);
 | 
						||
+     BOOST_CHECK(addrs.size()==0);
 | 
						||
+ 
 | 
						||
+     // This address is not valid, it belongs to another network
 | 
						||
+     BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress ztaaga95QAPyp1kSQ1hD2kguCpzyMHjxWZqaYDEkzbvo7uYQYAw2S8X4Kx98AvhhofMtQL8PAXKHuZsmhRcanavKRKmdCzk"));
 | 
						||
+     Object resultObj = retValue.get_obj();
 | 
						||
+     bool b = find_value(resultObj, "isvalid").get_bool();
 | 
						||
+     BOOST_CHECK_EQUAL(b, false);
 | 
						||
+ 
 | 
						||
+     // This address is valid, but the spending key is not in this wallet
 | 
						||
+     BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcfA19SDAKRYHLoRDoShcoz4nPohqWxuHcqg8WAxsiB2jFrrs6k7oSvst3UZvMYqpMNSRBkxBsnyjjngX5L55FxMzLKach8"));
 | 
						||
+     resultObj = retValue.get_obj();
 | 
						||
+     b = find_value(resultObj, "isvalid").get_bool();
 | 
						||
+     BOOST_CHECK_EQUAL(b, true);
 | 
						||
+     b = find_value(resultObj, "ismine").get_bool();
 | 
						||
+     BOOST_CHECK_EQUAL(b, false);
 | 
						||
+ 
 | 
						||
+     // Let's import a spending key to the wallet and validate its payment address
 | 
						||
+     BOOST_CHECK_NO_THROW(CallRPC("z_importkey SKxoWv77WGwFnUJitQKNEcD636bL4X5Gd6wWmgaA4Q9x8jZBPJXT"));
 | 
						||
+     BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL"));
 | 
						||
+     resultObj = retValue.get_obj();
 | 
						||
+     b = find_value(resultObj, "isvalid").get_bool();
 | 
						||
+     BOOST_CHECK_EQUAL(b, true);
 | 
						||
+     b = find_value(resultObj, "ismine").get_bool();
 | 
						||
+     BOOST_CHECK_EQUAL(b, true);
 | 
						||
+     BOOST_CHECK_EQUAL(find_value(resultObj, "payingkey").get_str(), "f5bb3c888ccc9831e3f6ba06e7528e26a312eec3acc1823be8918b6a3a5e20ad");
 | 
						||
+     BOOST_CHECK_EQUAL(find_value(resultObj, "transmissionkey").get_str(), "7a58c7132446564e6b810cf895c20537b3528357dc00150a8e201f491efa9c1a");
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  /*
 | 
						||
   * This test covers RPC command z_exportwallet
 | 
						||
   */
 | 
						||
  BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
 | 
						||
  {
 | 
						||
      LOCK2(cs_main, pwalletMain->cs_wallet);
 | 
						||
! 
 | 
						||
      // wallet should be empty
 | 
						||
      std::set<libzcash::PaymentAddress> addrs;
 | 
						||
      pwalletMain->GetPaymentAddresses(addrs);
 | 
						||
***************
 | 
						||
*** 774,780 ****
 | 
						||
  
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_sendmany"), runtime_error);
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_sendmany toofewargs"), runtime_error);
 | 
						||
!     BOOST_CHECK_THROW(CallRPC("z_sendmany too many args here"), runtime_error);
 | 
						||
  
 | 
						||
      // bad from address
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_sendmany "
 | 
						||
--- 820,826 ----
 | 
						||
  
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_sendmany"), runtime_error);
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_sendmany toofewargs"), runtime_error);
 | 
						||
!     BOOST_CHECK_THROW(CallRPC("z_sendmany just too many args here"), runtime_error);
 | 
						||
  
 | 
						||
      // bad from address
 | 
						||
      BOOST_CHECK_THROW(CallRPC("z_sendmany "
 | 
						||
***************
 | 
						||
*** 795,800 ****
 | 
						||
--- 841,867 ----
 | 
						||
              " {\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":12.0} ]"
 | 
						||
              ), runtime_error);
 | 
						||
  
 | 
						||
+     // invalid fee amount, cannot be negative
 | 
						||
+     BOOST_CHECK_THROW(CallRPC("z_sendmany "
 | 
						||
+             "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
 | 
						||
+             "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
 | 
						||
+             "1 -0.0001"
 | 
						||
+             ), runtime_error);
 | 
						||
+ 
 | 
						||
+     // invalid fee amount, bigger than MAX_MONEY
 | 
						||
+     BOOST_CHECK_THROW(CallRPC("z_sendmany "
 | 
						||
+             "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
 | 
						||
+             "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
 | 
						||
+             "1 21000001"
 | 
						||
+             ), runtime_error);
 | 
						||
+ 
 | 
						||
+     // fee amount is bigger than sum of outputs
 | 
						||
+     BOOST_CHECK_THROW(CallRPC("z_sendmany "
 | 
						||
+             "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
 | 
						||
+             "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
 | 
						||
+             "1 50.00000001"
 | 
						||
+             ), runtime_error);
 | 
						||
+ 
 | 
						||
      // memo bigger than allowed length of ZC_MEMO_SIZE
 | 
						||
      std::vector<char> v (2 * (ZC_MEMO_SIZE+1));     // x2 for hexadecimal string format
 | 
						||
      std::fill(v.begin(),v.end(), 'A');
 | 
						||
diff -crB ./src/test/transaction_tests.cpp ../../komodo-jl777/src/test/transaction_tests.cpp
 | 
						||
*** ./src/test/transaction_tests.cpp	2017-01-03 10:40:50.423339894 +0000
 | 
						||
--- ../../komodo-jl777/src/test/transaction_tests.cpp	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 341,349 ****
 | 
						||
          libzcash::JSOutput(addr, 50)
 | 
						||
      };
 | 
						||
  
 | 
						||
      {
 | 
						||
          JSDescription jsdesc(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
 | 
						||
!         BOOST_CHECK(jsdesc.Verify(*p, pubKeyHash));
 | 
						||
  
 | 
						||
          CDataStream ss(SER_DISK, CLIENT_VERSION);
 | 
						||
          ss << jsdesc;
 | 
						||
--- 341,351 ----
 | 
						||
          libzcash::JSOutput(addr, 50)
 | 
						||
      };
 | 
						||
  
 | 
						||
+     auto verifier = libzcash::ProofVerifier::Strict();
 | 
						||
+ 
 | 
						||
      {
 | 
						||
          JSDescription jsdesc(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
 | 
						||
!         BOOST_CHECK(jsdesc.Verify(*p, verifier, pubKeyHash));
 | 
						||
  
 | 
						||
          CDataStream ss(SER_DISK, CLIENT_VERSION);
 | 
						||
          ss << jsdesc;
 | 
						||
***************
 | 
						||
*** 352,358 ****
 | 
						||
          ss >> jsdesc_deserialized;
 | 
						||
  
 | 
						||
          BOOST_CHECK(jsdesc_deserialized == jsdesc);
 | 
						||
!         BOOST_CHECK(jsdesc_deserialized.Verify(*p, pubKeyHash));
 | 
						||
      }
 | 
						||
  
 | 
						||
      {
 | 
						||
--- 354,360 ----
 | 
						||
          ss >> jsdesc_deserialized;
 | 
						||
  
 | 
						||
          BOOST_CHECK(jsdesc_deserialized == jsdesc);
 | 
						||
!         BOOST_CHECK(jsdesc_deserialized.Verify(*p, verifier, pubKeyHash));
 | 
						||
      }
 | 
						||
  
 | 
						||
      {
 | 
						||
***************
 | 
						||
*** 365,371 ****
 | 
						||
          // Ensure that it won't verify if the root is changed.
 | 
						||
          auto test = JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
 | 
						||
          test.anchor = GetRandHash();
 | 
						||
!         BOOST_CHECK(!test.Verify(*p, pubKeyHash));
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 367,373 ----
 | 
						||
          // Ensure that it won't verify if the root is changed.
 | 
						||
          auto test = JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
 | 
						||
          test.anchor = GetRandHash();
 | 
						||
!         BOOST_CHECK(!test.Verify(*p, verifier, pubKeyHash));
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
diff -crB ./src/util.cpp ../../komodo-jl777/src/util.cpp
 | 
						||
*** ./src/util.cpp	2017-01-03 10:40:50.427340097 +0000
 | 
						||
--- ../../komodo-jl777/src/util.cpp	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 217,222 ****
 | 
						||
--- 217,223 ----
 | 
						||
  
 | 
						||
          // if not debugging everything and not debugging specific category, LogPrint does nothing.
 | 
						||
          if (setCategories.count(string("")) == 0 &&
 | 
						||
+             setCategories.count(string("1")) == 0 &&
 | 
						||
              setCategories.count(string(category)) == 0)
 | 
						||
              return false;
 | 
						||
      }
 | 
						||
***************
 | 
						||
*** 526,532 ****
 | 
						||
          path /= BaseParams().DataDir();
 | 
						||
  
 | 
						||
      fs::create_directories(path);
 | 
						||
! 
 | 
						||
      return path;
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 527,534 ----
 | 
						||
          path /= BaseParams().DataDir();
 | 
						||
  
 | 
						||
      fs::create_directories(path);
 | 
						||
!     //std::string assetpath = path + "/assets";
 | 
						||
!     //boost::filesystem::create_directory(assetpath);
 | 
						||
      return path;
 | 
						||
  }
 | 
						||
  
 | 
						||
Only in ../../komodo-jl777/src: utiltest.cpp
 | 
						||
Only in ../../komodo-jl777/src: utiltest.h
 | 
						||
diff -crB ./src/wallet/asyncrpcoperation_sendmany.cpp ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.cpp
 | 
						||
*** ./src/wallet/asyncrpcoperation_sendmany.cpp	2017-01-03 10:40:50.427340097 +0000
 | 
						||
--- ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.cpp	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 52,60 ****
 | 
						||
          std::string fromAddress,
 | 
						||
          std::vector<SendManyRecipient> tOutputs,
 | 
						||
          std::vector<SendManyRecipient> zOutputs,
 | 
						||
!         int minDepth) :
 | 
						||
!         fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth)
 | 
						||
  {
 | 
						||
      if (minDepth < 0) {
 | 
						||
          throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative");
 | 
						||
      }
 | 
						||
--- 52,63 ----
 | 
						||
          std::string fromAddress,
 | 
						||
          std::vector<SendManyRecipient> tOutputs,
 | 
						||
          std::vector<SendManyRecipient> zOutputs,
 | 
						||
!         int minDepth,
 | 
						||
!         CAmount fee) :
 | 
						||
!         fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth), fee_(fee)
 | 
						||
  {
 | 
						||
+     assert(fee_ > 0);
 | 
						||
+ 
 | 
						||
      if (minDepth < 0) {
 | 
						||
          throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative");
 | 
						||
      }
 | 
						||
***************
 | 
						||
*** 149,156 ****
 | 
						||
      bool isSingleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()==1);
 | 
						||
      bool isMultipleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()>=1);
 | 
						||
      bool isPureTaddrOnlyTx = (isfromtaddr_ && z_outputs_.size() == 0);
 | 
						||
!     CAmount minersFee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE;
 | 
						||
!     
 | 
						||
      // When spending coinbase utxos, you can only specify a single zaddr as the change must go somewhere
 | 
						||
      // and if there are multiple zaddrs, we don't know where to send it.
 | 
						||
      if (isfromtaddr_) {
 | 
						||
--- 152,159 ----
 | 
						||
      bool isSingleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()==1);
 | 
						||
      bool isMultipleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()>=1);
 | 
						||
      bool isPureTaddrOnlyTx = (isfromtaddr_ && z_outputs_.size() == 0);
 | 
						||
!     CAmount minersFee = fee_;
 | 
						||
! 
 | 
						||
      // When spending coinbase utxos, you can only specify a single zaddr as the change must go somewhere
 | 
						||
      // and if there are multiple zaddrs, we don't know where to send it.
 | 
						||
      if (isfromtaddr_) {
 | 
						||
***************
 | 
						||
*** 202,218 ****
 | 
						||
      assert(!isfromzaddr_ || t_inputs_total == 0);
 | 
						||
  
 | 
						||
      if (isfromtaddr_ && (t_inputs_total < targetAmount)) {
 | 
						||
!         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient transparent funds, have %ld, need %ld", t_inputs_total, targetAmount));
 | 
						||
      }
 | 
						||
      
 | 
						||
      if (isfromzaddr_ && (z_inputs_total < targetAmount)) {
 | 
						||
!         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient protected funds, have %ld, need %ld", z_inputs_total, targetAmount));
 | 
						||
      }
 | 
						||
  
 | 
						||
      // If from address is a taddr, select UTXOs to spend
 | 
						||
      CAmount selectedUTXOAmount = 0;
 | 
						||
      bool selectedUTXOCoinbase = false;
 | 
						||
      if (isfromtaddr_) {
 | 
						||
          std::vector<SendManyInputUTXO> selectedTInputs;
 | 
						||
          for (SendManyInputUTXO & t : t_inputs_) {
 | 
						||
              bool b = std::get<3>(t);
 | 
						||
--- 205,233 ----
 | 
						||
      assert(!isfromzaddr_ || t_inputs_total == 0);
 | 
						||
  
 | 
						||
      if (isfromtaddr_ && (t_inputs_total < targetAmount)) {
 | 
						||
!         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
 | 
						||
!             strprintf("Insufficient transparent funds, have %s, need %s",
 | 
						||
!             FormatMoney(t_inputs_total), FormatMoney(targetAmount)));
 | 
						||
      }
 | 
						||
      
 | 
						||
      if (isfromzaddr_ && (z_inputs_total < targetAmount)) {
 | 
						||
!         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
 | 
						||
!             strprintf("Insufficient protected funds, have %s, need %s",
 | 
						||
!             FormatMoney(z_inputs_total), FormatMoney(targetAmount)));
 | 
						||
      }
 | 
						||
  
 | 
						||
      // If from address is a taddr, select UTXOs to spend
 | 
						||
      CAmount selectedUTXOAmount = 0;
 | 
						||
      bool selectedUTXOCoinbase = false;
 | 
						||
      if (isfromtaddr_) {
 | 
						||
+         // Get dust threshold
 | 
						||
+         CKey secret;
 | 
						||
+         secret.MakeNewKey(true);
 | 
						||
+         CScript scriptPubKey = GetScriptForDestination(secret.GetPubKey().GetID());
 | 
						||
+         CTxOut out(CAmount(1), scriptPubKey);
 | 
						||
+         CAmount dustThreshold = out.GetDustThreshold(minRelayTxFee);
 | 
						||
+         CAmount dustChange = -1;
 | 
						||
+ 
 | 
						||
          std::vector<SendManyInputUTXO> selectedTInputs;
 | 
						||
          for (SendManyInputUTXO & t : t_inputs_) {
 | 
						||
              bool b = std::get<3>(t);
 | 
						||
***************
 | 
						||
*** 222,230 ****
 | 
						||
              selectedUTXOAmount += std::get<2>(t);
 | 
						||
              selectedTInputs.push_back(t);
 | 
						||
              if (selectedUTXOAmount >= targetAmount) {
 | 
						||
!                 break;
 | 
						||
              }
 | 
						||
          }
 | 
						||
          t_inputs_ = selectedTInputs;
 | 
						||
          t_inputs_total = selectedUTXOAmount;
 | 
						||
  
 | 
						||
--- 237,257 ----
 | 
						||
              selectedUTXOAmount += std::get<2>(t);
 | 
						||
              selectedTInputs.push_back(t);
 | 
						||
              if (selectedUTXOAmount >= targetAmount) {
 | 
						||
!                 // Select another utxo if there is change less than the dust threshold.
 | 
						||
!                 dustChange = selectedUTXOAmount - targetAmount;
 | 
						||
!                 if (dustChange == 0 || dustChange >= dustThreshold) {
 | 
						||
!                     break;
 | 
						||
!                 }
 | 
						||
              }
 | 
						||
          }
 | 
						||
+ 
 | 
						||
+         // If there is transparent change, is it valid or is it dust?
 | 
						||
+         if (dustChange < dustThreshold && dustChange != 0) {
 | 
						||
+             throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
 | 
						||
+                 strprintf("Insufficient transparent funds, have %s, need %s more to avoid creating invalid change output %s (dust threshold is %s)",
 | 
						||
+                 FormatMoney(t_inputs_total), FormatMoney(dustThreshold - dustChange), FormatMoney(dustChange), FormatMoney(dustThreshold)));
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
          t_inputs_ = selectedTInputs;
 | 
						||
          t_inputs_total = selectedUTXOAmount;
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 298,304 ****
 | 
						||
          zOutputsDeque.push_back(o);
 | 
						||
      }
 | 
						||
  
 | 
						||
!     
 | 
						||
      /**
 | 
						||
       * SCENARIO #2
 | 
						||
       * 
 | 
						||
--- 325,346 ----
 | 
						||
          zOutputsDeque.push_back(o);
 | 
						||
      }
 | 
						||
  
 | 
						||
!     // When spending notes, take a snapshot of note witnesses and anchors as the treestate will
 | 
						||
!     // change upon arrival of new blocks which contain joinsplit transactions.  This is likely
 | 
						||
!     // to happen as creating a chained joinsplit transaction can take longer than the block interval.
 | 
						||
!     if (z_inputs_.size() > 0) {
 | 
						||
!         LOCK2(cs_main, pwalletMain->cs_wallet);
 | 
						||
!         for (auto t : z_inputs_) {
 | 
						||
!             JSOutPoint jso = std::get<0>(t);
 | 
						||
!             std::vector<JSOutPoint> vOutPoints = { jso };
 | 
						||
!             uint256 inputAnchor;
 | 
						||
!             std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
 | 
						||
!             pwalletMain->GetNoteWitnesses(vOutPoints, vInputWitnesses, inputAnchor);
 | 
						||
!             jsopWitnessAnchorMap[ jso.ToString() ] = WitnessAnchorData{ vInputWitnesses[0], inputAnchor };
 | 
						||
!         }
 | 
						||
!     }
 | 
						||
! 
 | 
						||
! 
 | 
						||
      /**
 | 
						||
       * SCENARIO #2
 | 
						||
       * 
 | 
						||
***************
 | 
						||
*** 321,327 ****
 | 
						||
              if (selectedUTXOCoinbase) {
 | 
						||
                  assert(isSingleZaddrOutput);
 | 
						||
                  throw JSONRPCError(RPC_WALLET_ERROR, strprintf(
 | 
						||
!                     "Change %ld not allowed. When protecting coinbase funds, the wallet does not allow any change as there is currently no way to specify a change address in z_sendmany.", change));
 | 
						||
              } else {
 | 
						||
                  add_taddr_change_output_to_tx(change);
 | 
						||
                  LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n",
 | 
						||
--- 363,371 ----
 | 
						||
              if (selectedUTXOCoinbase) {
 | 
						||
                  assert(isSingleZaddrOutput);
 | 
						||
                  throw JSONRPCError(RPC_WALLET_ERROR, strprintf(
 | 
						||
!                     "Change %s not allowed. When protecting coinbase funds, the wallet does not "
 | 
						||
!                     "allow any change as there is currently no way to specify a change address "
 | 
						||
!                     "in z_sendmany.", FormatMoney(change)));
 | 
						||
              } else {
 | 
						||
                  add_taddr_change_output_to_tx(change);
 | 
						||
                  LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n",
 | 
						||
***************
 | 
						||
*** 496,510 ****
 | 
						||
                      throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor");
 | 
						||
                  }
 | 
						||
                  
 | 
						||
                  for (const uint256& commitment : prevJoinSplit.commitments) {
 | 
						||
                      tree.append(commitment);
 | 
						||
!                     previousCommitments.push_back(commitment);                   
 | 
						||
                  }
 | 
						||
!                 ZCIncrementalWitness changeWitness = tree.witness();
 | 
						||
!                 jsAnchor = changeWitness.root();
 | 
						||
!                 uint256 changeCommitment = prevJoinSplit.commitments[changeOutputIndex];
 | 
						||
!                 intermediates.insert(std::make_pair(tree.root(), tree));
 | 
						||
!                 witnesses.push_back(changeWitness);
 | 
						||
  
 | 
						||
                  // Decrypt the change note's ciphertext to retrieve some data we need
 | 
						||
                  ZCNoteDecryption decryptor(spendingkey_.viewing_key());
 | 
						||
--- 540,562 ----
 | 
						||
                      throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor");
 | 
						||
                  }
 | 
						||
                  
 | 
						||
+                 assert(changeOutputIndex != -1);
 | 
						||
+                 boost::optional<ZCIncrementalWitness> changeWitness;
 | 
						||
+                 int n = 0;
 | 
						||
                  for (const uint256& commitment : prevJoinSplit.commitments) {
 | 
						||
                      tree.append(commitment);
 | 
						||
!                     previousCommitments.push_back(commitment);
 | 
						||
!                     if (!changeWitness && changeOutputIndex == n++) {
 | 
						||
!                         changeWitness = tree.witness();
 | 
						||
!                     } else if (changeWitness) {
 | 
						||
!                         changeWitness.get().append(commitment);
 | 
						||
!                     }
 | 
						||
                  }
 | 
						||
!                 if (changeWitness) {
 | 
						||
!                         witnesses.push_back(changeWitness);
 | 
						||
!                 }
 | 
						||
!                 jsAnchor = tree.root();
 | 
						||
!                 intermediates.insert(std::make_pair(tree.root(), tree));    // chained js are interstitial (found in between block boundaries)
 | 
						||
  
 | 
						||
                  // Decrypt the change note's ciphertext to retrieve some data we need
 | 
						||
                  ZCNoteDecryption decryptor(spendingkey_.viewing_key());
 | 
						||
***************
 | 
						||
*** 538,543 ****
 | 
						||
--- 590,596 ----
 | 
						||
              //
 | 
						||
              std::vector<Note> vInputNotes;
 | 
						||
              std::vector<JSOutPoint> vOutPoints;
 | 
						||
+             std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
 | 
						||
              uint256 inputAnchor;
 | 
						||
              int numInputsNeeded = (jsChange>0) ? 1 : 0;
 | 
						||
              while (numInputsNeeded++ < ZC_NUM_JS_INPUTS && zInputsDeque.size() > 0) {
 | 
						||
***************
 | 
						||
*** 547,552 ****
 | 
						||
--- 600,613 ----
 | 
						||
                  CAmount noteFunds = std::get<2>(t);
 | 
						||
                  zInputsDeque.pop_front();
 | 
						||
  
 | 
						||
+                 WitnessAnchorData wad = jsopWitnessAnchorMap[ jso.ToString() ];
 | 
						||
+                 vInputWitnesses.push_back(wad.witness);
 | 
						||
+                 if (inputAnchor.IsNull()) {
 | 
						||
+                     inputAnchor = wad.anchor;
 | 
						||
+                 } else if (inputAnchor != wad.anchor) {
 | 
						||
+                     throw JSONRPCError(RPC_WALLET_ERROR, "Selected input notes do not share the same anchor");
 | 
						||
+                 }
 | 
						||
+ 
 | 
						||
                  vOutPoints.push_back(jso);
 | 
						||
                  vInputNotes.push_back(note);
 | 
						||
                  
 | 
						||
***************
 | 
						||
*** 563,574 ****
 | 
						||
                          
 | 
						||
              // Add history of previous commitments to witness 
 | 
						||
              if (vInputNotes.size() > 0) {
 | 
						||
!                 std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
 | 
						||
!                 {
 | 
						||
!                     LOCK(cs_main);
 | 
						||
!                     pwalletMain->GetNoteWitnesses(vOutPoints, vInputWitnesses, inputAnchor);
 | 
						||
!                 }
 | 
						||
!        
 | 
						||
                  if (vInputWitnesses.size()==0) {
 | 
						||
                      throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment");
 | 
						||
                  }
 | 
						||
--- 624,630 ----
 | 
						||
                          
 | 
						||
              // Add history of previous commitments to witness 
 | 
						||
              if (vInputNotes.size() > 0) {
 | 
						||
! 
 | 
						||
                  if (vInputWitnesses.size()==0) {
 | 
						||
                      throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment");
 | 
						||
                  }
 | 
						||
***************
 | 
						||
*** 760,765 ****
 | 
						||
--- 816,826 ----
 | 
						||
          t_inputs_.push_back(utxo);
 | 
						||
      }
 | 
						||
  
 | 
						||
+     // sort in ascending order, so smaller utxos appear first
 | 
						||
+     std::sort(t_inputs_.begin(), t_inputs_.end(), [](SendManyInputUTXO i, SendManyInputUTXO j) -> bool {
 | 
						||
+         return ( std::get<2>(i) < std::get<2>(j));
 | 
						||
+     });
 | 
						||
+ 
 | 
						||
      return t_inputs_.size() > 0;
 | 
						||
  }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 894,901 ****
 | 
						||
              info.vpub_new,
 | 
						||
              !this->testmode);
 | 
						||
  
 | 
						||
!     if (!(jsdesc.Verify(*pzcashParams, joinSplitPubKey_))) {
 | 
						||
!         throw std::runtime_error("error verifying joinsplit");
 | 
						||
      }
 | 
						||
  
 | 
						||
      mtx.vjoinsplit.push_back(jsdesc);
 | 
						||
--- 955,965 ----
 | 
						||
              info.vpub_new,
 | 
						||
              !this->testmode);
 | 
						||
  
 | 
						||
!     {
 | 
						||
!         auto verifier = libzcash::ProofVerifier::Strict();
 | 
						||
!         if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) {
 | 
						||
!             throw std::runtime_error("error verifying joinsplit");
 | 
						||
!         }
 | 
						||
      }
 | 
						||
  
 | 
						||
      mtx.vjoinsplit.push_back(jsdesc);
 | 
						||
diff -crB ./src/wallet/asyncrpcoperation_sendmany.h ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.h
 | 
						||
*** ./src/wallet/asyncrpcoperation_sendmany.h	2017-01-03 10:40:50.427340097 +0000
 | 
						||
--- ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.h	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 14,22 ****
 | 
						||
  #include "json/json_spirit_value.h"
 | 
						||
  #include "wallet.h"
 | 
						||
  
 | 
						||
  #include <tuple>
 | 
						||
  
 | 
						||
! // TODO: Compute fee based on a heuristic, e.g. (num tx output * dust threshold) + joinsplit bytes * ?
 | 
						||
  #define ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE   10000
 | 
						||
  
 | 
						||
  using namespace libzcash;
 | 
						||
--- 14,23 ----
 | 
						||
  #include "json/json_spirit_value.h"
 | 
						||
  #include "wallet.h"
 | 
						||
  
 | 
						||
+ #include <unordered_map>
 | 
						||
  #include <tuple>
 | 
						||
  
 | 
						||
! // Default transaction fee if caller does not specify one.
 | 
						||
  #define ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE   10000
 | 
						||
  
 | 
						||
  using namespace libzcash;
 | 
						||
***************
 | 
						||
*** 41,49 ****
 | 
						||
      CAmount vpub_new = 0;
 | 
						||
  };
 | 
						||
  
 | 
						||
  class AsyncRPCOperation_sendmany : public AsyncRPCOperation {
 | 
						||
  public:
 | 
						||
!     AsyncRPCOperation_sendmany(std::string fromAddress, std::vector<SendManyRecipient> tOutputs, std::vector<SendManyRecipient> zOutputs, int minDepth);
 | 
						||
      virtual ~AsyncRPCOperation_sendmany();
 | 
						||
      
 | 
						||
      // We don't want to be copied or moved around
 | 
						||
--- 42,56 ----
 | 
						||
      CAmount vpub_new = 0;
 | 
						||
  };
 | 
						||
  
 | 
						||
+ // A struct to help us track the witness and anchor for a given JSOutPoint
 | 
						||
+ struct WitnessAnchorData {
 | 
						||
+ 	boost::optional<ZCIncrementalWitness> witness;
 | 
						||
+ 	uint256 anchor;
 | 
						||
+ };
 | 
						||
+ 
 | 
						||
  class AsyncRPCOperation_sendmany : public AsyncRPCOperation {
 | 
						||
  public:
 | 
						||
!     AsyncRPCOperation_sendmany(std::string fromAddress, std::vector<SendManyRecipient> tOutputs, std::vector<SendManyRecipient> zOutputs, int minDepth, CAmount fee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE);
 | 
						||
      virtual ~AsyncRPCOperation_sendmany();
 | 
						||
      
 | 
						||
      // We don't want to be copied or moved around
 | 
						||
***************
 | 
						||
*** 59,64 ****
 | 
						||
--- 66,72 ----
 | 
						||
  private:
 | 
						||
      friend class TEST_FRIEND_AsyncRPCOperation_sendmany;    // class for unit testing
 | 
						||
  
 | 
						||
+     CAmount fee_;
 | 
						||
      int mindepth_;
 | 
						||
      std::string fromaddress_;
 | 
						||
      bool isfromtaddr_;
 | 
						||
***************
 | 
						||
*** 70,76 ****
 | 
						||
      uint256 joinSplitPubKey_;
 | 
						||
      unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES];
 | 
						||
  
 | 
						||
!         
 | 
						||
      std::vector<SendManyRecipient> t_outputs_;
 | 
						||
      std::vector<SendManyRecipient> z_outputs_;
 | 
						||
      std::vector<SendManyInputUTXO> t_inputs_;
 | 
						||
--- 78,86 ----
 | 
						||
      uint256 joinSplitPubKey_;
 | 
						||
      unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES];
 | 
						||
  
 | 
						||
!     // The key is the result string from calling JSOutPoint::ToString()
 | 
						||
!     std::unordered_map<std::string, WitnessAnchorData> jsopWitnessAnchorMap;
 | 
						||
! 
 | 
						||
      std::vector<SendManyRecipient> t_outputs_;
 | 
						||
      std::vector<SendManyRecipient> z_outputs_;
 | 
						||
      std::vector<SendManyInputUTXO> t_inputs_;
 | 
						||
diff -crB ./src/wallet/gtest/test_wallet.cpp ../../komodo-jl777/src/wallet/gtest/test_wallet.cpp
 | 
						||
*** ./src/wallet/gtest/test_wallet.cpp	2017-01-03 10:40:50.431340299 +0000
 | 
						||
--- ../../komodo-jl777/src/wallet/gtest/test_wallet.cpp	2017-01-03 09:49:08.872507185 +0000
 | 
						||
***************
 | 
						||
*** 5,11 ****
 | 
						||
--- 5,13 ----
 | 
						||
  #include "base58.h"
 | 
						||
  #include "chainparams.h"
 | 
						||
  #include "main.h"
 | 
						||
+ #include "primitives/block.h"
 | 
						||
  #include "random.h"
 | 
						||
+ #include "utiltest.h"
 | 
						||
  #include "wallet/wallet.h"
 | 
						||
  #include "zcash/JoinSplit.hpp"
 | 
						||
  #include "zcash/Note.hpp"
 | 
						||
***************
 | 
						||
*** 29,37 ****
 | 
						||
  
 | 
						||
      MOCK_METHOD2(WriteTx, bool(uint256 hash, const CWalletTx& wtx));
 | 
						||
      MOCK_METHOD1(WriteWitnessCacheSize, bool(int64_t nWitnessCacheSize));
 | 
						||
  };
 | 
						||
  
 | 
						||
! template void CWallet::WriteWitnessCache<MockWalletDB>(MockWalletDB& walletdb);
 | 
						||
  
 | 
						||
  class TestWallet : public CWallet {
 | 
						||
  public:
 | 
						||
--- 31,41 ----
 | 
						||
  
 | 
						||
      MOCK_METHOD2(WriteTx, bool(uint256 hash, const CWalletTx& wtx));
 | 
						||
      MOCK_METHOD1(WriteWitnessCacheSize, bool(int64_t nWitnessCacheSize));
 | 
						||
+     MOCK_METHOD1(WriteBestBlock, bool(const CBlockLocator& loc));
 | 
						||
  };
 | 
						||
  
 | 
						||
! template void CWallet::SetBestChainINTERNAL<MockWalletDB>(
 | 
						||
!         MockWalletDB& walletdb, const CBlockLocator& loc);
 | 
						||
  
 | 
						||
  class TestWallet : public CWallet {
 | 
						||
  public:
 | 
						||
***************
 | 
						||
*** 50,60 ****
 | 
						||
                                  ZCIncrementalMerkleTree tree) {
 | 
						||
          CWallet::IncrementNoteWitnesses(pindex, pblock, tree);
 | 
						||
      }
 | 
						||
!     void DecrementNoteWitnesses() {
 | 
						||
!         CWallet::DecrementNoteWitnesses();
 | 
						||
      }
 | 
						||
!     void WriteWitnessCache(MockWalletDB& walletdb) {
 | 
						||
!         CWallet::WriteWitnessCache(walletdb);
 | 
						||
      }
 | 
						||
      bool UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) {
 | 
						||
          return CWallet::UpdatedNoteData(wtxIn, wtx);
 | 
						||
--- 54,64 ----
 | 
						||
                                  ZCIncrementalMerkleTree tree) {
 | 
						||
          CWallet::IncrementNoteWitnesses(pindex, pblock, tree);
 | 
						||
      }
 | 
						||
!     void DecrementNoteWitnesses(const CBlockIndex* pindex) {
 | 
						||
!         CWallet::DecrementNoteWitnesses(pindex);
 | 
						||
      }
 | 
						||
!     void SetBestChain(MockWalletDB& walletdb, const CBlockLocator& loc) {
 | 
						||
!         CWallet::SetBestChainINTERNAL(walletdb, loc);
 | 
						||
      }
 | 
						||
      bool UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) {
 | 
						||
          return CWallet::UpdatedNoteData(wtxIn, wtx);
 | 
						||
***************
 | 
						||
*** 65,183 ****
 | 
						||
  };
 | 
						||
  
 | 
						||
  CWalletTx GetValidReceive(const libzcash::SpendingKey& sk, CAmount value, bool randomInputs) {
 | 
						||
!     CMutableTransaction mtx;
 | 
						||
!     mtx.nVersion = 2; // Enable JoinSplits
 | 
						||
!     mtx.vin.resize(2);
 | 
						||
!     if (randomInputs) {
 | 
						||
!         mtx.vin[0].prevout.hash = GetRandHash();
 | 
						||
!         mtx.vin[1].prevout.hash = GetRandHash();
 | 
						||
!     } else {
 | 
						||
!         mtx.vin[0].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000001");
 | 
						||
!         mtx.vin[1].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000002");
 | 
						||
!     }
 | 
						||
!     mtx.vin[0].prevout.n = 0;
 | 
						||
!     mtx.vin[1].prevout.n = 0;
 | 
						||
! 
 | 
						||
!     // Generate an ephemeral keypair.
 | 
						||
!     uint256 joinSplitPubKey;
 | 
						||
!     unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES];
 | 
						||
!     crypto_sign_keypair(joinSplitPubKey.begin(), joinSplitPrivKey);
 | 
						||
!     mtx.joinSplitPubKey = joinSplitPubKey;
 | 
						||
! 
 | 
						||
!     boost::array<libzcash::JSInput, 2> inputs = {
 | 
						||
!         libzcash::JSInput(), // dummy input
 | 
						||
!         libzcash::JSInput() // dummy input
 | 
						||
!     };
 | 
						||
! 
 | 
						||
!     boost::array<libzcash::JSOutput, 2> outputs = {
 | 
						||
!         libzcash::JSOutput(sk.address(), value),
 | 
						||
!         libzcash::JSOutput(sk.address(), value)
 | 
						||
!     };
 | 
						||
! 
 | 
						||
!     boost::array<libzcash::Note, 2> output_notes;
 | 
						||
! 
 | 
						||
!     // Prepare JoinSplits
 | 
						||
!     uint256 rt;
 | 
						||
!     JSDescription jsdesc {*params, mtx.joinSplitPubKey, rt,
 | 
						||
!                           inputs, outputs, value, 0, false};
 | 
						||
!     mtx.vjoinsplit.push_back(jsdesc);
 | 
						||
! 
 | 
						||
!     // Empty output script.
 | 
						||
!     CScript scriptCode;
 | 
						||
!     CTransaction signTx(mtx);
 | 
						||
!     uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL);
 | 
						||
! 
 | 
						||
!     // Add the signature
 | 
						||
!     assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL,
 | 
						||
!                          dataToBeSigned.begin(), 32,
 | 
						||
!                          joinSplitPrivKey
 | 
						||
!                         ) == 0);
 | 
						||
! 
 | 
						||
!     CTransaction tx {mtx};
 | 
						||
!     CWalletTx wtx {NULL, tx};
 | 
						||
!     return wtx;
 | 
						||
  }
 | 
						||
  
 | 
						||
  libzcash::Note GetNote(const libzcash::SpendingKey& sk,
 | 
						||
                         const CTransaction& tx, size_t js, size_t n) {
 | 
						||
!     ZCNoteDecryption decryptor {sk.viewing_key()};
 | 
						||
!     auto hSig = tx.vjoinsplit[js].h_sig(*params, tx.joinSplitPubKey);
 | 
						||
!     auto note_pt = libzcash::NotePlaintext::decrypt(
 | 
						||
!         decryptor,
 | 
						||
!         tx.vjoinsplit[js].ciphertexts[n],
 | 
						||
!         tx.vjoinsplit[js].ephemeralKey,
 | 
						||
!         hSig,
 | 
						||
!         (unsigned char) n);
 | 
						||
!     return note_pt.note(sk.address());
 | 
						||
  }
 | 
						||
  
 | 
						||
  CWalletTx GetValidSpend(const libzcash::SpendingKey& sk,
 | 
						||
                          const libzcash::Note& note, CAmount value) {
 | 
						||
!     CMutableTransaction mtx;
 | 
						||
!     mtx.vout.resize(2);
 | 
						||
!     mtx.vout[0].nValue = value;
 | 
						||
!     mtx.vout[1].nValue = 0;
 | 
						||
! 
 | 
						||
!     // Generate an ephemeral keypair.
 | 
						||
!     uint256 joinSplitPubKey;
 | 
						||
!     unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES];
 | 
						||
!     crypto_sign_keypair(joinSplitPubKey.begin(), joinSplitPrivKey);
 | 
						||
!     mtx.joinSplitPubKey = joinSplitPubKey;
 | 
						||
! 
 | 
						||
!     // Fake tree for the unused witness
 | 
						||
!     ZCIncrementalMerkleTree tree;
 | 
						||
! 
 | 
						||
!     boost::array<libzcash::JSInput, 2> inputs = {
 | 
						||
!         libzcash::JSInput(tree.witness(), note, sk),
 | 
						||
!         libzcash::JSInput() // dummy input
 | 
						||
!     };
 | 
						||
! 
 | 
						||
!     boost::array<libzcash::JSOutput, 2> outputs = {
 | 
						||
!         libzcash::JSOutput(), // dummy output
 | 
						||
!         libzcash::JSOutput() // dummy output
 | 
						||
!     };
 | 
						||
! 
 | 
						||
!     boost::array<libzcash::Note, 2> output_notes;
 | 
						||
! 
 | 
						||
!     // Prepare JoinSplits
 | 
						||
!     uint256 rt;
 | 
						||
!     JSDescription jsdesc {*params, mtx.joinSplitPubKey, rt,
 | 
						||
!                           inputs, outputs, 0, value, false};
 | 
						||
!     mtx.vjoinsplit.push_back(jsdesc);
 | 
						||
! 
 | 
						||
!     // Empty output script.
 | 
						||
!     CScript scriptCode;
 | 
						||
!     CTransaction signTx(mtx);
 | 
						||
!     uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL);
 | 
						||
! 
 | 
						||
!     // Add the signature
 | 
						||
!     assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL,
 | 
						||
!                          dataToBeSigned.begin(), 32,
 | 
						||
!                          joinSplitPrivKey
 | 
						||
!                         ) == 0);
 | 
						||
!     CTransaction tx {mtx};
 | 
						||
!     CWalletTx wtx {NULL, tx};
 | 
						||
!     return wtx;
 | 
						||
  }
 | 
						||
  
 | 
						||
  TEST(wallet_tests, setup_datadir_location_run_as_first_test) {
 | 
						||
--- 69,85 ----
 | 
						||
  };
 | 
						||
  
 | 
						||
  CWalletTx GetValidReceive(const libzcash::SpendingKey& sk, CAmount value, bool randomInputs) {
 | 
						||
!     return GetValidReceive(*params, sk, value, randomInputs);
 | 
						||
  }
 | 
						||
  
 | 
						||
  libzcash::Note GetNote(const libzcash::SpendingKey& sk,
 | 
						||
                         const CTransaction& tx, size_t js, size_t n) {
 | 
						||
!     return GetNote(*params, sk, tx, js, n);
 | 
						||
  }
 | 
						||
  
 | 
						||
  CWalletTx GetValidSpend(const libzcash::SpendingKey& sk,
 | 
						||
                          const libzcash::Note& note, CAmount value) {
 | 
						||
!     return GetValidSpend(*params, sk, note, value);
 | 
						||
  }
 | 
						||
  
 | 
						||
  TEST(wallet_tests, setup_datadir_location_run_as_first_test) {
 | 
						||
***************
 | 
						||
*** 656,662 ****
 | 
						||
      EXPECT_TRUE((bool) witnesses[1]);
 | 
						||
  
 | 
						||
      // Until #1302 is implemented, this should triggger an assertion
 | 
						||
!     EXPECT_DEATH(wallet.DecrementNoteWitnesses(),
 | 
						||
                   "Assertion `nWitnessCacheSize > 0' failed.");
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 558,564 ----
 | 
						||
      EXPECT_TRUE((bool) witnesses[1]);
 | 
						||
  
 | 
						||
      // Until #1302 is implemented, this should triggger an assertion
 | 
						||
!     EXPECT_DEATH(wallet.DecrementNoteWitnesses(&index),
 | 
						||
                   "Assertion `nWitnessCacheSize > 0' failed.");
 | 
						||
  }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 729,735 ****
 | 
						||
  
 | 
						||
          // Decrementing should give us the previous anchor
 | 
						||
          uint256 anchor3;
 | 
						||
!         wallet.DecrementNoteWitnesses();
 | 
						||
          witnesses.clear();
 | 
						||
          wallet.GetNoteWitnesses(notes, witnesses, anchor3);
 | 
						||
          EXPECT_FALSE((bool) witnesses[0]);
 | 
						||
--- 631,637 ----
 | 
						||
  
 | 
						||
          // Decrementing should give us the previous anchor
 | 
						||
          uint256 anchor3;
 | 
						||
!         wallet.DecrementNoteWitnesses(&index2);
 | 
						||
          witnesses.clear();
 | 
						||
          wallet.GetNoteWitnesses(notes, witnesses, anchor3);
 | 
						||
          EXPECT_FALSE((bool) witnesses[0]);
 | 
						||
***************
 | 
						||
*** 754,759 ****
 | 
						||
--- 656,871 ----
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
+ TEST(wallet_tests, CachedWitnessesDecrementFirst) {
 | 
						||
+     TestWallet wallet;
 | 
						||
+     uint256 anchor2;
 | 
						||
+     CBlock block2;
 | 
						||
+     CBlockIndex index2(block2);
 | 
						||
+     ZCIncrementalMerkleTree tree;
 | 
						||
+ 
 | 
						||
+     auto sk = libzcash::SpendingKey::random();
 | 
						||
+     wallet.AddSpendingKey(sk);
 | 
						||
+ 
 | 
						||
+     {
 | 
						||
+         // First transaction (case tested in _empty_chain)
 | 
						||
+         auto wtx = GetValidReceive(sk, 10, true);
 | 
						||
+         auto note = GetNote(sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+ 
 | 
						||
+         // First block (case tested in _empty_chain)
 | 
						||
+         CBlock block1;
 | 
						||
+         block1.vtx.push_back(wtx);
 | 
						||
+         CBlockIndex index1(block1);
 | 
						||
+         index1.nHeight = 1;
 | 
						||
+         wallet.IncrementNoteWitnesses(&index1, &block1, tree);
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     {
 | 
						||
+         // Second transaction (case tested in _chain_tip)
 | 
						||
+         auto wtx = GetValidReceive(sk, 50, true);
 | 
						||
+         auto note = GetNote(sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+ 
 | 
						||
+         std::vector<JSOutPoint> notes {jsoutpt};
 | 
						||
+         std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
 | 
						||
+ 
 | 
						||
+         // Second block (case tested in _chain_tip)
 | 
						||
+         block2.vtx.push_back(wtx);
 | 
						||
+         index2.nHeight = 2;
 | 
						||
+         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
 | 
						||
+         // Called to fetch anchor
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor2);
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     {
 | 
						||
+         // Third transaction - never mined
 | 
						||
+         auto wtx = GetValidReceive(sk, 20, true);
 | 
						||
+         auto note = GetNote(sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+ 
 | 
						||
+         std::vector<JSOutPoint> notes {jsoutpt};
 | 
						||
+         std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
 | 
						||
+         uint256 anchor3;
 | 
						||
+ 
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor3);
 | 
						||
+         EXPECT_FALSE((bool) witnesses[0]);
 | 
						||
+ 
 | 
						||
+         // Decrementing (before the transaction has ever seen an increment)
 | 
						||
+         // should give us the previous anchor
 | 
						||
+         uint256 anchor4;
 | 
						||
+         wallet.DecrementNoteWitnesses(&index2);
 | 
						||
+         witnesses.clear();
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor4);
 | 
						||
+         EXPECT_FALSE((bool) witnesses[0]);
 | 
						||
+         // Should not equal second anchor because none of these notes had witnesses
 | 
						||
+         EXPECT_NE(anchor2, anchor4);
 | 
						||
+ 
 | 
						||
+         // Re-incrementing with the same block should give the same result
 | 
						||
+         uint256 anchor5;
 | 
						||
+         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
 | 
						||
+         witnesses.clear();
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor5);
 | 
						||
+         EXPECT_FALSE((bool) witnesses[0]);
 | 
						||
+         EXPECT_EQ(anchor3, anchor5);
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ TEST(wallet_tests, CachedWitnessesCleanIndex) {
 | 
						||
+     TestWallet wallet;
 | 
						||
+     CBlock block1;
 | 
						||
+     CBlock block2;
 | 
						||
+     CBlock block3;
 | 
						||
+     CBlockIndex index1(block1);
 | 
						||
+     CBlockIndex index2(block2);
 | 
						||
+     CBlockIndex index3(block3);
 | 
						||
+     ZCIncrementalMerkleTree tree;
 | 
						||
+ 
 | 
						||
+     auto sk = libzcash::SpendingKey::random();
 | 
						||
+     wallet.AddSpendingKey(sk);
 | 
						||
+ 
 | 
						||
+     {
 | 
						||
+         // First transaction (case tested in _empty_chain)
 | 
						||
+         auto wtx = GetValidReceive(sk, 10, true);
 | 
						||
+         auto note = GetNote(sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+ 
 | 
						||
+         // First block (case tested in _empty_chain)
 | 
						||
+         block1.vtx.push_back(wtx);
 | 
						||
+         index1.nHeight = 1;
 | 
						||
+         wallet.IncrementNoteWitnesses(&index1, &block1, tree);
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     {
 | 
						||
+         // Second transaction (case tested in _chain_tip)
 | 
						||
+         auto wtx = GetValidReceive(sk, 50, true);
 | 
						||
+         auto note = GetNote(sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+ 
 | 
						||
+         // Second block (case tested in _chain_tip)
 | 
						||
+         block2.vtx.push_back(wtx);
 | 
						||
+         index2.nHeight = 2;
 | 
						||
+         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     {
 | 
						||
+         // Third transaction
 | 
						||
+         auto wtx = GetValidReceive(sk, 20, true);
 | 
						||
+         auto note = GetNote(sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+ 
 | 
						||
+         std::vector<JSOutPoint> notes {jsoutpt};
 | 
						||
+         std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
 | 
						||
+         uint256 anchor3;
 | 
						||
+ 
 | 
						||
+         // Third block
 | 
						||
+         block3.vtx.push_back(wtx);
 | 
						||
+         index3.nHeight = 3;
 | 
						||
+         wallet.IncrementNoteWitnesses(&index3, &block3, tree);
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor3);
 | 
						||
+ 
 | 
						||
+         // Now pretend we are reindexing: the chain is cleared, and each block is
 | 
						||
+         // used to increment witnesses again.
 | 
						||
+         wallet.IncrementNoteWitnesses(&index1, &block1, tree);
 | 
						||
+         uint256 anchor3a;
 | 
						||
+         witnesses.clear();
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor3a);
 | 
						||
+         EXPECT_TRUE((bool) witnesses[0]);
 | 
						||
+         // Should equal third anchor because witness cache unaffected
 | 
						||
+         EXPECT_EQ(anchor3, anchor3a);
 | 
						||
+ 
 | 
						||
+         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
 | 
						||
+         uint256 anchor3b;
 | 
						||
+         witnesses.clear();
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor3b);
 | 
						||
+         EXPECT_TRUE((bool) witnesses[0]);
 | 
						||
+         EXPECT_EQ(anchor3, anchor3b);
 | 
						||
+ 
 | 
						||
+         // Pretend a reorg happened that was recorded in the block files
 | 
						||
+         wallet.DecrementNoteWitnesses(&index2);
 | 
						||
+         uint256 anchor3c;
 | 
						||
+         witnesses.clear();
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor3c);
 | 
						||
+         EXPECT_TRUE((bool) witnesses[0]);
 | 
						||
+         EXPECT_EQ(anchor3, anchor3c);
 | 
						||
+ 
 | 
						||
+         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
 | 
						||
+         uint256 anchor3d;
 | 
						||
+         witnesses.clear();
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor3d);
 | 
						||
+         EXPECT_TRUE((bool) witnesses[0]);
 | 
						||
+         EXPECT_EQ(anchor3, anchor3d);
 | 
						||
+ 
 | 
						||
+         wallet.IncrementNoteWitnesses(&index3, &block3, tree);
 | 
						||
+         uint256 anchor3e;
 | 
						||
+         witnesses.clear();
 | 
						||
+         wallet.GetNoteWitnesses(notes, witnesses, anchor3e);
 | 
						||
+         EXPECT_TRUE((bool) witnesses[0]);
 | 
						||
+         EXPECT_EQ(anchor3, anchor3e);
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  TEST(wallet_tests, ClearNoteWitnessCache) {
 | 
						||
      TestWallet wallet;
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 761,766 ****
 | 
						||
--- 873,879 ----
 | 
						||
      wallet.AddSpendingKey(sk);
 | 
						||
  
 | 
						||
      auto wtx = GetValidReceive(sk, 10, true);
 | 
						||
+     auto hash = wtx.GetHash();
 | 
						||
      auto note = GetNote(sk, wtx, 0, 0);
 | 
						||
      auto nullifier = note.nullifier(sk);
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 774,779 ****
 | 
						||
--- 887,894 ----
 | 
						||
      // Pretend we mined the tx by adding a fake witness
 | 
						||
      ZCIncrementalMerkleTree tree;
 | 
						||
      wtx.mapNoteData[jsoutpt].witnesses.push_front(tree.witness());
 | 
						||
+     wtx.mapNoteData[jsoutpt].witnessHeight = 1;
 | 
						||
+     wallet.nWitnessCacheSize = 1;
 | 
						||
  
 | 
						||
      wallet.AddToWallet(wtx, true, NULL);
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 785,790 ****
 | 
						||
--- 900,907 ----
 | 
						||
      wallet.GetNoteWitnesses(notes, witnesses, anchor2);
 | 
						||
      EXPECT_TRUE((bool) witnesses[0]);
 | 
						||
      EXPECT_FALSE((bool) witnesses[1]);
 | 
						||
+     EXPECT_EQ(1, wallet.mapWallet[hash].mapNoteData[jsoutpt].witnessHeight);
 | 
						||
+     EXPECT_EQ(1, wallet.nWitnessCacheSize);
 | 
						||
  
 | 
						||
      // After clearing, we should not have a witness for either note
 | 
						||
      wallet.ClearNoteWitnessCache();
 | 
						||
***************
 | 
						||
*** 792,802 ****
 | 
						||
--- 909,922 ----
 | 
						||
      wallet.GetNoteWitnesses(notes, witnesses, anchor2);
 | 
						||
      EXPECT_FALSE((bool) witnesses[0]);
 | 
						||
      EXPECT_FALSE((bool) witnesses[1]);
 | 
						||
+     EXPECT_EQ(-1, wallet.mapWallet[hash].mapNoteData[jsoutpt].witnessHeight);
 | 
						||
+     EXPECT_EQ(0, wallet.nWitnessCacheSize);
 | 
						||
  }
 | 
						||
  
 | 
						||
  TEST(wallet_tests, WriteWitnessCache) {
 | 
						||
      TestWallet wallet;
 | 
						||
      MockWalletDB walletdb;
 | 
						||
+     CBlockLocator loc;
 | 
						||
  
 | 
						||
      auto sk = libzcash::SpendingKey::random();
 | 
						||
      wallet.AddSpendingKey(sk);
 | 
						||
***************
 | 
						||
*** 807,813 ****
 | 
						||
      // TxnBegin fails
 | 
						||
      EXPECT_CALL(walletdb, TxnBegin())
 | 
						||
          .WillOnce(Return(false));
 | 
						||
!     wallet.WriteWitnessCache(walletdb);
 | 
						||
      EXPECT_CALL(walletdb, TxnBegin())
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
--- 927,933 ----
 | 
						||
      // TxnBegin fails
 | 
						||
      EXPECT_CALL(walletdb, TxnBegin())
 | 
						||
          .WillOnce(Return(false));
 | 
						||
!     wallet.SetBestChain(walletdb, loc);
 | 
						||
      EXPECT_CALL(walletdb, TxnBegin())
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 816,829 ****
 | 
						||
          .WillOnce(Return(false));
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.WriteWitnessCache(walletdb);
 | 
						||
  
 | 
						||
      // WriteTx throws
 | 
						||
      EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
 | 
						||
          .WillOnce(ThrowLogicError());
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.WriteWitnessCache(walletdb);
 | 
						||
      EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
--- 936,949 ----
 | 
						||
          .WillOnce(Return(false));
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.SetBestChain(walletdb, loc);
 | 
						||
  
 | 
						||
      // WriteTx throws
 | 
						||
      EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
 | 
						||
          .WillOnce(ThrowLogicError());
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.SetBestChain(walletdb, loc);
 | 
						||
      EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 832,857 ****
 | 
						||
          .WillOnce(Return(false));
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.WriteWitnessCache(walletdb);
 | 
						||
  
 | 
						||
      // WriteWitnessCacheSize throws
 | 
						||
      EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
 | 
						||
          .WillOnce(ThrowLogicError());
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.WriteWitnessCache(walletdb);
 | 
						||
      EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
      // TxCommit fails
 | 
						||
      EXPECT_CALL(walletdb, TxnCommit())
 | 
						||
          .WillOnce(Return(false));
 | 
						||
!     wallet.WriteWitnessCache(walletdb);
 | 
						||
      EXPECT_CALL(walletdb, TxnCommit())
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
      // Everything succeeds
 | 
						||
!     wallet.WriteWitnessCache(walletdb);
 | 
						||
  }
 | 
						||
  
 | 
						||
  TEST(wallet_tests, UpdateNullifierNoteMap) {
 | 
						||
--- 952,993 ----
 | 
						||
          .WillOnce(Return(false));
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.SetBestChain(walletdb, loc);
 | 
						||
  
 | 
						||
      // WriteWitnessCacheSize throws
 | 
						||
      EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
 | 
						||
          .WillOnce(ThrowLogicError());
 | 
						||
      EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
          .Times(1);
 | 
						||
!     wallet.SetBestChain(walletdb, loc);
 | 
						||
      EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
+     // WriteBestBlock fails
 | 
						||
+     EXPECT_CALL(walletdb, WriteBestBlock(loc))
 | 
						||
+         .WillOnce(Return(false));
 | 
						||
+     EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
+         .Times(1);
 | 
						||
+     wallet.SetBestChain(walletdb, loc);
 | 
						||
+ 
 | 
						||
+     // WriteBestBlock throws
 | 
						||
+     EXPECT_CALL(walletdb, WriteBestBlock(loc))
 | 
						||
+         .WillOnce(ThrowLogicError());
 | 
						||
+     EXPECT_CALL(walletdb, TxnAbort())
 | 
						||
+         .Times(1);
 | 
						||
+     wallet.SetBestChain(walletdb, loc);
 | 
						||
+     EXPECT_CALL(walletdb, WriteBestBlock(loc))
 | 
						||
+         .WillRepeatedly(Return(true));
 | 
						||
+ 
 | 
						||
      // TxCommit fails
 | 
						||
      EXPECT_CALL(walletdb, TxnCommit())
 | 
						||
          .WillOnce(Return(false));
 | 
						||
!     wallet.SetBestChain(walletdb, loc);
 | 
						||
      EXPECT_CALL(walletdb, TxnCommit())
 | 
						||
          .WillRepeatedly(Return(true));
 | 
						||
  
 | 
						||
      // Everything succeeds
 | 
						||
!     wallet.SetBestChain(walletdb, loc);
 | 
						||
  }
 | 
						||
  
 | 
						||
  TEST(wallet_tests, UpdateNullifierNoteMap) {
 | 
						||
***************
 | 
						||
*** 913,918 ****
 | 
						||
--- 1049,1055 ----
 | 
						||
      // Pretend we mined the tx by adding a fake witness
 | 
						||
      ZCIncrementalMerkleTree tree;
 | 
						||
      wtx.mapNoteData[jsoutpt].witnesses.push_front(tree.witness());
 | 
						||
+     wtx.mapNoteData[jsoutpt].witnessHeight = 100;
 | 
						||
  
 | 
						||
      // Now pretend we added the key for the second note, and
 | 
						||
      // the tx was "added" to the wallet again to update it.
 | 
						||
***************
 | 
						||
*** 925,935 ****
 | 
						||
--- 1062,1074 ----
 | 
						||
      // The txs should initially be different
 | 
						||
      EXPECT_NE(wtx.mapNoteData, wtx2.mapNoteData);
 | 
						||
      EXPECT_EQ(1, wtx.mapNoteData[jsoutpt].witnesses.size());
 | 
						||
+     EXPECT_EQ(100, wtx.mapNoteData[jsoutpt].witnessHeight);
 | 
						||
  
 | 
						||
      // After updating, they should be the same
 | 
						||
      EXPECT_TRUE(wallet.UpdatedNoteData(wtx2, wtx));
 | 
						||
      EXPECT_EQ(wtx.mapNoteData, wtx2.mapNoteData);
 | 
						||
      EXPECT_EQ(1, wtx.mapNoteData[jsoutpt].witnesses.size());
 | 
						||
+     EXPECT_EQ(100, wtx.mapNoteData[jsoutpt].witnessHeight);
 | 
						||
      // TODO: The new note should get witnessed (but maybe not here) (#1350)
 | 
						||
  }
 | 
						||
  
 | 
						||
diff -crB ./src/wallet/rpcwallet.cpp ../../komodo-jl777/src/wallet/rpcwallet.cpp
 | 
						||
*** ./src/wallet/rpcwallet.cpp	2017-01-03 10:40:50.431340299 +0000
 | 
						||
--- ../../komodo-jl777/src/wallet/rpcwallet.cpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 2622,2627 ****
 | 
						||
--- 2622,2633 ----
 | 
						||
              sample_times.push_back(benchmark_verify_equihash());
 | 
						||
          } else if (benchmarktype == "validatelargetx") {
 | 
						||
              sample_times.push_back(benchmark_large_tx());
 | 
						||
+         } else if (benchmarktype == "trydecryptnotes") {
 | 
						||
+             int nAddrs = params[2].get_int();
 | 
						||
+             sample_times.push_back(benchmark_try_decrypt_notes(nAddrs));
 | 
						||
+         } else if (benchmarktype == "incnotewitnesses") {
 | 
						||
+             int nTxs = params[2].get_int();
 | 
						||
+             sample_times.push_back(benchmark_increment_note_witnesses(nTxs));
 | 
						||
          } else {
 | 
						||
              throw JSONRPCError(RPC_TYPE_ERROR, "Invalid benchmarktype");
 | 
						||
          }
 | 
						||
***************
 | 
						||
*** 2849,2855 ****
 | 
						||
                           vpub_old,
 | 
						||
                           vpub_new);
 | 
						||
  
 | 
						||
!     assert(jsdesc.Verify(*pzcashParams, joinSplitPubKey));
 | 
						||
  
 | 
						||
      mtx.vjoinsplit.push_back(jsdesc);
 | 
						||
  
 | 
						||
--- 2855,2864 ----
 | 
						||
                           vpub_old,
 | 
						||
                           vpub_new);
 | 
						||
  
 | 
						||
!     {
 | 
						||
!         auto verifier = libzcash::ProofVerifier::Strict();
 | 
						||
!         assert(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey));
 | 
						||
!     }
 | 
						||
  
 | 
						||
      mtx.vjoinsplit.push_back(jsdesc);
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 3310,3326 ****
 | 
						||
      return ret;
 | 
						||
  }
 | 
						||
  
 | 
						||
  Value z_sendmany(const Array& params, bool fHelp)
 | 
						||
  {
 | 
						||
      if (!EnsureWalletIsAvailable(fHelp))
 | 
						||
          return Value::null;
 | 
						||
  
 | 
						||
!     if (fHelp || params.size() < 2 || params.size() > 3)
 | 
						||
          throw runtime_error(
 | 
						||
!             "z_sendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf )\n"
 | 
						||
              "\nSend multiple times. Amounts are double-precision floating point numbers."
 | 
						||
              "\nChange from a taddr flows to a new taddr address, while change from zaddr returns to itself."
 | 
						||
!             "\nWhen sending coinbase UTXOs to a zaddr, change is not alllowed. The entire value of the UTXO(s) must be consumed."
 | 
						||
              + HelpRequiringPassphrase() + "\n"
 | 
						||
              "\nArguments:\n"
 | 
						||
              "1. \"fromaddress\"         (string, required) The taddr or zaddr to send the funds from.\n"
 | 
						||
--- 3319,3347 ----
 | 
						||
      return ret;
 | 
						||
  }
 | 
						||
  
 | 
						||
+ 
 | 
						||
+ // Here we define the maximum number of zaddr outputs that can be included in a transaction.
 | 
						||
+ // If input notes are small, we might actually require more than one joinsplit per zaddr output.
 | 
						||
+ // For now though, we assume we use one joinsplit per zaddr output (and the second output note is change).
 | 
						||
+ // We reduce the result by 1 to ensure there is room for non-joinsplit CTransaction data.
 | 
						||
+ #define Z_SENDMANY_MAX_ZADDR_OUTPUTS    ((MAX_TX_SIZE / JSDescription().GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION)) - 1)
 | 
						||
+ 
 | 
						||
+ // transaction.h comment: spending taddr output requires CTxIn >= 148 bytes and typical taddr txout is 34 bytes
 | 
						||
+ #define CTXIN_SPEND_DUST_SIZE   148
 | 
						||
+ #define CTXOUT_REGULAR_SIZE     34
 | 
						||
+ 
 | 
						||
  Value z_sendmany(const Array& params, bool fHelp)
 | 
						||
  {
 | 
						||
      if (!EnsureWalletIsAvailable(fHelp))
 | 
						||
          return Value::null;
 | 
						||
  
 | 
						||
!     if (fHelp || params.size() < 2 || params.size() > 4)
 | 
						||
          throw runtime_error(
 | 
						||
!             "z_sendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n"
 | 
						||
              "\nSend multiple times. Amounts are double-precision floating point numbers."
 | 
						||
              "\nChange from a taddr flows to a new taddr address, while change from zaddr returns to itself."
 | 
						||
!             "\nWhen sending coinbase UTXOs to a zaddr, change is not allowed. The entire value of the UTXO(s) must be consumed."
 | 
						||
!             + strprintf("\nCurrently, the maximum number of zaddr outputs is %d due to transaction size limits.\n", Z_SENDMANY_MAX_ZADDR_OUTPUTS)
 | 
						||
              + HelpRequiringPassphrase() + "\n"
 | 
						||
              "\nArguments:\n"
 | 
						||
              "1. \"fromaddress\"         (string, required) The taddr or zaddr to send the funds from.\n"
 | 
						||
***************
 | 
						||
*** 3331,3336 ****
 | 
						||
--- 3352,3359 ----
 | 
						||
              "      \"memo\":memo        (string, optional) If the address is a zaddr, raw data represented in hexadecimal string format\n"
 | 
						||
              "    }, ... ]\n"
 | 
						||
              "3. minconf               (numeric, optional, default=1) Only use funds confirmed at least this many times.\n"
 | 
						||
+             "4. fee                   (numeric, optional, default="
 | 
						||
+             + strprintf("%s", FormatMoney(ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n"
 | 
						||
              "\nResult:\n"
 | 
						||
              "\"operationid\"          (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n"
 | 
						||
          );
 | 
						||
***************
 | 
						||
*** 3371,3376 ****
 | 
						||
--- 3394,3400 ----
 | 
						||
      // Recipients
 | 
						||
      std::vector<SendManyRecipient> taddrRecipients;
 | 
						||
      std::vector<SendManyRecipient> zaddrRecipients;
 | 
						||
+     CAmount nTotalOut = 0;
 | 
						||
  
 | 
						||
      BOOST_FOREACH(Value& output, outputs)
 | 
						||
      {
 | 
						||
***************
 | 
						||
*** 3426,3431 ****
 | 
						||
--- 3450,3481 ----
 | 
						||
          } else {
 | 
						||
              taddrRecipients.push_back( SendManyRecipient(address, nAmount, memo) );
 | 
						||
          }
 | 
						||
+ 
 | 
						||
+         nTotalOut += nAmount;
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // Check the number of zaddr outputs does not exceed the limit.
 | 
						||
+     if (zaddrRecipients.size() > Z_SENDMANY_MAX_ZADDR_OUTPUTS)  {
 | 
						||
+         throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, too many zaddr outputs");
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     // As a sanity check, estimate and verify that the size of the transaction will be valid.
 | 
						||
+     // Depending on the input notes, the actual tx size may turn out to be larger and perhaps invalid.
 | 
						||
+     size_t txsize = 0;
 | 
						||
+     CMutableTransaction mtx;
 | 
						||
+     mtx.nVersion = 2;
 | 
						||
+     for (int i = 0; i < zaddrRecipients.size(); i++) {
 | 
						||
+         mtx.vjoinsplit.push_back(JSDescription());
 | 
						||
+     }
 | 
						||
+     CTransaction tx(mtx);
 | 
						||
+     txsize += tx.GetSerializeSize(SER_NETWORK, tx.nVersion);
 | 
						||
+     if (fromTaddr) {
 | 
						||
+         txsize += CTXIN_SPEND_DUST_SIZE;
 | 
						||
+         txsize += CTXOUT_REGULAR_SIZE;      // There will probably be taddr change
 | 
						||
+     }
 | 
						||
+     txsize += CTXOUT_REGULAR_SIZE * taddrRecipients.size();
 | 
						||
+     if (txsize > MAX_TX_SIZE) {
 | 
						||
+         throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Too many outputs, size of raw transaction would be larger than limit of %d bytes", MAX_TX_SIZE ));
 | 
						||
      }
 | 
						||
  
 | 
						||
      // Minimum confirmations
 | 
						||
***************
 | 
						||
*** 3437,3445 ****
 | 
						||
          throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
 | 
						||
      }
 | 
						||
  
 | 
						||
      // Create operation and add to global queue
 | 
						||
      std::shared_ptr<AsyncRPCQueue> q = getAsyncRPCQueue();
 | 
						||
!     std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany(fromaddress, taddrRecipients, zaddrRecipients, nMinDepth) );
 | 
						||
      q->addOperation(operation);
 | 
						||
      AsyncRPCOperationId operationId = operation->getId();
 | 
						||
      return operationId;
 | 
						||
--- 3487,3505 ----
 | 
						||
          throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
 | 
						||
      }
 | 
						||
  
 | 
						||
+     // Fee in Zatoshis, not currency format)
 | 
						||
+     CAmount nFee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE;
 | 
						||
+     if (params.size() > 3) {
 | 
						||
+         nFee = AmountFromValue( params[3] );
 | 
						||
+         // Check that the user specified fee is sane.
 | 
						||
+         if (nFee > nTotalOut) {
 | 
						||
+             throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the sum of outputs %s", FormatMoney(nFee), FormatMoney(nTotalOut)));
 | 
						||
+         }
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
      // Create operation and add to global queue
 | 
						||
      std::shared_ptr<AsyncRPCQueue> q = getAsyncRPCQueue();
 | 
						||
!     std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany(fromaddress, taddrRecipients, zaddrRecipients, nMinDepth, nFee) );
 | 
						||
      q->addOperation(operation);
 | 
						||
      AsyncRPCOperationId operationId = operation->getId();
 | 
						||
      return operationId;
 | 
						||
diff -crB ./src/wallet/wallet.cpp ../../komodo-jl777/src/wallet/wallet.cpp
 | 
						||
*** ./src/wallet/wallet.cpp	2017-01-03 10:40:50.431340299 +0000
 | 
						||
--- ../../komodo-jl777/src/wallet/wallet.cpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 373,386 ****
 | 
						||
      if (added) {
 | 
						||
          IncrementNoteWitnesses(pindex, pblock, tree);
 | 
						||
      } else {
 | 
						||
!         DecrementNoteWitnesses();
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
  void CWallet::SetBestChain(const CBlockLocator& loc)
 | 
						||
  {
 | 
						||
      CWalletDB walletdb(strWalletFile);
 | 
						||
!     walletdb.WriteBestBlock(loc);
 | 
						||
  }
 | 
						||
  
 | 
						||
  bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit)
 | 
						||
--- 373,386 ----
 | 
						||
      if (added) {
 | 
						||
          IncrementNoteWitnesses(pindex, pblock, tree);
 | 
						||
      } else {
 | 
						||
!         DecrementNoteWitnesses(pindex);
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
  void CWallet::SetBestChain(const CBlockLocator& loc)
 | 
						||
  {
 | 
						||
      CWalletDB walletdb(strWalletFile);
 | 
						||
!     SetBestChainINTERNAL(walletdb, loc);
 | 
						||
  }
 | 
						||
  
 | 
						||
  bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit)
 | 
						||
***************
 | 
						||
*** 630,637 ****
 | 
						||
--- 630,639 ----
 | 
						||
      for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
 | 
						||
          for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) {
 | 
						||
              item.second.witnesses.clear();
 | 
						||
+             item.second.witnessHeight = -1;
 | 
						||
          }
 | 
						||
      }
 | 
						||
+     nWitnessCacheSize = 0;
 | 
						||
  }
 | 
						||
  
 | 
						||
  void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex,
 | 
						||
***************
 | 
						||
*** 648,654 ****
 | 
						||
                  // Only increment witnesses that are behind the current height
 | 
						||
                  if (nd->witnessHeight < pindex->nHeight) {
 | 
						||
                      // Witnesses being incremented should always be either -1
 | 
						||
!                     // (never incremented) or one below pindex
 | 
						||
                      assert((nd->witnessHeight == -1) ||
 | 
						||
                             (nd->witnessHeight == pindex->nHeight - 1));
 | 
						||
                      // Copy the witness for the previous block if we have one
 | 
						||
--- 650,656 ----
 | 
						||
                  // Only increment witnesses that are behind the current height
 | 
						||
                  if (nd->witnessHeight < pindex->nHeight) {
 | 
						||
                      // Witnesses being incremented should always be either -1
 | 
						||
!                     // (never incremented or decremented) or one below pindex
 | 
						||
                      assert((nd->witnessHeight == -1) ||
 | 
						||
                             (nd->witnessHeight == pindex->nHeight - 1));
 | 
						||
                      // Copy the witness for the previous block if we have one
 | 
						||
***************
 | 
						||
*** 739,752 ****
 | 
						||
              }
 | 
						||
          }
 | 
						||
  
 | 
						||
!         if (fFileBacked) {
 | 
						||
!             CWalletDB walletdb(strWalletFile);
 | 
						||
!             WriteWitnessCache(walletdb);
 | 
						||
!         }
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
! void CWallet::DecrementNoteWitnesses()
 | 
						||
  {
 | 
						||
      extern int32_t KOMODO_REWIND;
 | 
						||
      {
 | 
						||
--- 741,753 ----
 | 
						||
              }
 | 
						||
          }
 | 
						||
  
 | 
						||
!         // For performance reasons, we write out the witness cache in
 | 
						||
!         // CWallet::SetBestChain() (which also ensures that overall consistency
 | 
						||
!         // of the wallet.dat is maintained).
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
! void CWallet::DecrementNoteWitnesses(const CBlockIndex* pindex)
 | 
						||
  {
 | 
						||
      extern int32_t KOMODO_REWIND;
 | 
						||
      {
 | 
						||
***************
 | 
						||
*** 756,765 ****
 | 
						||
                  CNoteData* nd = &(item.second);
 | 
						||
                  // Check the validity of the cache
 | 
						||
                  assert(nWitnessCacheSize >= nd->witnesses.size());
 | 
						||
!                 if (nd->witnesses.size() > 0) {
 | 
						||
!                     nd->witnesses.pop_front();
 | 
						||
                  }
 | 
						||
-                 nd->witnessHeight -= 1;
 | 
						||
              }
 | 
						||
          }
 | 
						||
          nWitnessCacheSize -= 1;
 | 
						||
--- 757,775 ----
 | 
						||
                  CNoteData* nd = &(item.second);
 | 
						||
                  // Check the validity of the cache
 | 
						||
                  assert(nWitnessCacheSize >= nd->witnesses.size());
 | 
						||
!                 // Only increment witnesses that are not above the current height
 | 
						||
!                 if (nd->witnessHeight <= pindex->nHeight) {
 | 
						||
!                     // Witnesses being decremented should always be either -1
 | 
						||
!                     // (never incremented or decremented) or equal to pindex
 | 
						||
!                     assert((nd->witnessHeight == -1) ||
 | 
						||
!                            (nd->witnessHeight == pindex->nHeight));
 | 
						||
!                     if (nd->witnesses.size() > 0) {
 | 
						||
!                         nd->witnesses.pop_front();
 | 
						||
!                     }
 | 
						||
!                     // pindex is the block being removed, so the new witness cache
 | 
						||
!                     // height is one below it.
 | 
						||
!                     nd->witnessHeight = pindex->nHeight - 1;
 | 
						||
                  }
 | 
						||
              }
 | 
						||
          }
 | 
						||
          nWitnessCacheSize -= 1;
 | 
						||
***************
 | 
						||
*** 770,776 ****
 | 
						||
                  assert(nWitnessCacheSize >= nd->witnesses.size());
 | 
						||
              }
 | 
						||
          }
 | 
						||
-         // TODO: If nWitnessCache is zero, we need to regenerate the caches (#1302)
 | 
						||
          if ( nWitnessCacheSize <= 0 )
 | 
						||
          {
 | 
						||
              extern char ASSETCHAINS_SYMBOL[16];
 | 
						||
--- 780,785 ----
 | 
						||
***************
 | 
						||
*** 778,787 ****
 | 
						||
          }
 | 
						||
          if ( KOMODO_REWIND == 0 )
 | 
						||
              assert(nWitnessCacheSize > 0);
 | 
						||
!         if (fFileBacked) {
 | 
						||
!             CWalletDB walletdb(strWalletFile);
 | 
						||
!             WriteWitnessCache(walletdb);
 | 
						||
!         }
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 787,799 ----
 | 
						||
          }
 | 
						||
          if ( KOMODO_REWIND == 0 )
 | 
						||
              assert(nWitnessCacheSize > 0);
 | 
						||
!         //if (fFileBacked) {
 | 
						||
!         //    CWalletDB walletdb(strWalletFile);
 | 
						||
!         //    WriteWitnessCache(walletdb);
 | 
						||
!         //}
 | 
						||
!         // For performance reasons, we write out the witness cache in
 | 
						||
!         // CWallet::SetBestChain() (which also ensures that overall consistency
 | 
						||
!         // of the wallet.dat is maintained).
 | 
						||
      }
 | 
						||
  }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 1109,1114 ****
 | 
						||
--- 1121,1127 ----
 | 
						||
              tmp.at(nd.first).witnesses.assign(
 | 
						||
                  nd.second.witnesses.cbegin(), nd.second.witnesses.cend());
 | 
						||
          }
 | 
						||
+         tmp.at(nd.first).witnessHeight = nd.second.witnessHeight;
 | 
						||
      }
 | 
						||
      // Now copy over the updated note data
 | 
						||
      wtx.mapNoteData = tmp;
 | 
						||
diff -crB ./src/wallet/wallet.h ../../komodo-jl777/src/wallet/wallet.h
 | 
						||
*** ./src/wallet/wallet.h	2017-01-03 10:40:50.431340299 +0000
 | 
						||
--- ../../komodo-jl777/src/wallet/wallet.h	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 225,231 ****
 | 
						||
       */
 | 
						||
      std::list<ZCIncrementalWitness> witnesses;
 | 
						||
  
 | 
						||
!     /** Block height corresponding to the most current witness. */
 | 
						||
      int witnessHeight;
 | 
						||
  
 | 
						||
      CNoteData() : address(), nullifier(), witnessHeight {-1} { }
 | 
						||
--- 225,239 ----
 | 
						||
       */
 | 
						||
      std::list<ZCIncrementalWitness> witnesses;
 | 
						||
  
 | 
						||
!     /**
 | 
						||
!      * Block height corresponding to the most current witness.
 | 
						||
!      *
 | 
						||
!      * When we first create a CNoteData in CWallet::FindMyNotes, this is set to
 | 
						||
!      * -1 as a placeholder. The next time CWallet::ChainTip is called, we can
 | 
						||
!      * determine what height the witness cache for this note is valid for (even
 | 
						||
!      * if no witnesses were cached), and so can set the correct value in
 | 
						||
!      * CWallet::IncrementNoteWitnesses and CWallet::DecrementNoteWitnesses.
 | 
						||
!      */
 | 
						||
      int witnessHeight;
 | 
						||
  
 | 
						||
      CNoteData() : address(), nullifier(), witnessHeight {-1} { }
 | 
						||
***************
 | 
						||
*** 620,660 ****
 | 
						||
      void ClearNoteWitnessCache();
 | 
						||
  
 | 
						||
  protected:
 | 
						||
      void IncrementNoteWitnesses(const CBlockIndex* pindex,
 | 
						||
                                  const CBlock* pblock,
 | 
						||
                                  ZCIncrementalMerkleTree& tree);
 | 
						||
!     void DecrementNoteWitnesses();
 | 
						||
  
 | 
						||
      template <typename WalletDB>
 | 
						||
!     void WriteWitnessCache(WalletDB& walletdb) {
 | 
						||
          if (!walletdb.TxnBegin()) {
 | 
						||
              // This needs to be done atomically, so don't do it at all
 | 
						||
!             LogPrintf("WriteWitnessCache(): Couldn't start atomic write\n");
 | 
						||
              return;
 | 
						||
          }
 | 
						||
          try {
 | 
						||
              for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
 | 
						||
                  if (!walletdb.WriteTx(wtxItem.first, wtxItem.second)) {
 | 
						||
!                     LogPrintf("WriteWitnessCache(): Failed to write CWalletTx, aborting atomic write\n");
 | 
						||
                      walletdb.TxnAbort();
 | 
						||
                      return;
 | 
						||
                  }
 | 
						||
              }
 | 
						||
              if (!walletdb.WriteWitnessCacheSize(nWitnessCacheSize)) {
 | 
						||
!                 LogPrintf("WriteWitnessCache(): Failed to write nWitnessCacheSize, aborting atomic write\n");
 | 
						||
                  walletdb.TxnAbort();
 | 
						||
                  return;
 | 
						||
              }
 | 
						||
          } catch (const std::exception &exc) {
 | 
						||
              // Unexpected failure
 | 
						||
!             LogPrintf("WriteWitnessCache(): Unexpected error during atomic write:\n");
 | 
						||
              LogPrintf("%s\n", exc.what());
 | 
						||
              walletdb.TxnAbort();
 | 
						||
              return;
 | 
						||
          }
 | 
						||
          if (!walletdb.TxnCommit()) {
 | 
						||
              // Couldn't commit all to db, but in-memory state is fine
 | 
						||
!             LogPrintf("WriteWitnessCache(): Couldn't commit atomic write\n");
 | 
						||
              return;
 | 
						||
          }
 | 
						||
      }
 | 
						||
--- 628,679 ----
 | 
						||
      void ClearNoteWitnessCache();
 | 
						||
  
 | 
						||
  protected:
 | 
						||
+     /**
 | 
						||
+      * pindex is the new tip being connected.
 | 
						||
+      */
 | 
						||
      void IncrementNoteWitnesses(const CBlockIndex* pindex,
 | 
						||
                                  const CBlock* pblock,
 | 
						||
                                  ZCIncrementalMerkleTree& tree);
 | 
						||
!     /**
 | 
						||
!      * pindex is the old tip being disconnected.
 | 
						||
!      */
 | 
						||
!     void DecrementNoteWitnesses(const CBlockIndex* pindex);
 | 
						||
  
 | 
						||
      template <typename WalletDB>
 | 
						||
!     void SetBestChainINTERNAL(WalletDB& walletdb, const CBlockLocator& loc) {
 | 
						||
          if (!walletdb.TxnBegin()) {
 | 
						||
              // This needs to be done atomically, so don't do it at all
 | 
						||
!             LogPrintf("SetBestChain(): Couldn't start atomic write\n");
 | 
						||
              return;
 | 
						||
          }
 | 
						||
          try {
 | 
						||
              for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
 | 
						||
                  if (!walletdb.WriteTx(wtxItem.first, wtxItem.second)) {
 | 
						||
!                     LogPrintf("SetBestChain(): Failed to write CWalletTx, aborting atomic write\n");
 | 
						||
                      walletdb.TxnAbort();
 | 
						||
                      return;
 | 
						||
                  }
 | 
						||
              }
 | 
						||
              if (!walletdb.WriteWitnessCacheSize(nWitnessCacheSize)) {
 | 
						||
!                 LogPrintf("SetBestChain(): Failed to write nWitnessCacheSize, aborting atomic write\n");
 | 
						||
!                 walletdb.TxnAbort();
 | 
						||
!                 return;
 | 
						||
!             }
 | 
						||
!             if (!walletdb.WriteBestBlock(loc)) {
 | 
						||
!                 LogPrintf("SetBestChain(): Failed to write best block, aborting atomic write\n");
 | 
						||
                  walletdb.TxnAbort();
 | 
						||
                  return;
 | 
						||
              }
 | 
						||
          } catch (const std::exception &exc) {
 | 
						||
              // Unexpected failure
 | 
						||
!             LogPrintf("SetBestChain(): Unexpected error during atomic write:\n");
 | 
						||
              LogPrintf("%s\n", exc.what());
 | 
						||
              walletdb.TxnAbort();
 | 
						||
              return;
 | 
						||
          }
 | 
						||
          if (!walletdb.TxnCommit()) {
 | 
						||
              // Couldn't commit all to db, but in-memory state is fine
 | 
						||
!             LogPrintf("SetBestChain(): Couldn't commit atomic write\n");
 | 
						||
              return;
 | 
						||
          }
 | 
						||
      }
 | 
						||
***************
 | 
						||
*** 944,949 ****
 | 
						||
--- 963,969 ----
 | 
						||
      CAmount GetCredit(const CTransaction& tx, const isminefilter& filter) const;
 | 
						||
      CAmount GetChange(const CTransaction& tx) const;
 | 
						||
      void ChainTip(const CBlockIndex *pindex, const CBlock *pblock, ZCIncrementalMerkleTree tree, bool added);
 | 
						||
+     /** Saves witness caches and best block locator to disk. */
 | 
						||
      void SetBestChain(const CBlockLocator& loc);
 | 
						||
  
 | 
						||
      DBErrors LoadWallet(bool& fFirstRunRet);
 | 
						||
diff -crB ./src/zcash/GenerateParams.cpp ../../komodo-jl777/src/zcash/GenerateParams.cpp
 | 
						||
*** ./src/zcash/GenerateParams.cpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcash/GenerateParams.cpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 9,26 ****
 | 
						||
          return 1;
 | 
						||
      }
 | 
						||
  
 | 
						||
!     if(argc != 3) {
 | 
						||
!         std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName" << std::endl;
 | 
						||
          return 1;
 | 
						||
      }
 | 
						||
  
 | 
						||
      std::string pkFile = argv[1];
 | 
						||
      std::string vkFile = argv[2];
 | 
						||
  
 | 
						||
      auto p = ZCJoinSplit::Generate();
 | 
						||
  
 | 
						||
      p->saveProvingKey(pkFile);
 | 
						||
      p->saveVerifyingKey(vkFile);
 | 
						||
  
 | 
						||
      delete p;
 | 
						||
  
 | 
						||
--- 9,28 ----
 | 
						||
          return 1;
 | 
						||
      }
 | 
						||
  
 | 
						||
!     if(argc != 4) {
 | 
						||
!         std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName r1csFileName" << std::endl;
 | 
						||
          return 1;
 | 
						||
      }
 | 
						||
  
 | 
						||
      std::string pkFile = argv[1];
 | 
						||
      std::string vkFile = argv[2];
 | 
						||
+     std::string r1csFile = argv[3];
 | 
						||
  
 | 
						||
      auto p = ZCJoinSplit::Generate();
 | 
						||
  
 | 
						||
      p->saveProvingKey(pkFile);
 | 
						||
      p->saveVerifyingKey(vkFile);
 | 
						||
+     p->saveR1CS(r1csFile);
 | 
						||
  
 | 
						||
      delete p;
 | 
						||
  
 | 
						||
diff -crB ./src/zcash/IncrementalMerkleTree.cpp ../../komodo-jl777/src/zcash/IncrementalMerkleTree.cpp
 | 
						||
*** ./src/zcash/IncrementalMerkleTree.cpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcash/IncrementalMerkleTree.cpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 71,76 ****
 | 
						||
--- 71,87 ----
 | 
						||
  }
 | 
						||
  
 | 
						||
  template<size_t Depth, typename Hash>
 | 
						||
+ Hash IncrementalMerkleTree<Depth, Hash>::last() const {
 | 
						||
+     if (right) {
 | 
						||
+         return *right;
 | 
						||
+     } else if (left) {
 | 
						||
+         return *left;
 | 
						||
+     } else {
 | 
						||
+         throw std::runtime_error("tree has no cursor");
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ template<size_t Depth, typename Hash>
 | 
						||
  void IncrementalMerkleTree<Depth, Hash>::append(Hash obj) {
 | 
						||
      if (is_complete(Depth)) {
 | 
						||
          throw std::runtime_error("tree is full");
 | 
						||
diff -crB ./src/zcash/IncrementalMerkleTree.hpp ../../komodo-jl777/src/zcash/IncrementalMerkleTree.hpp
 | 
						||
*** ./src/zcash/IncrementalMerkleTree.hpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcash/IncrementalMerkleTree.hpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 79,84 ****
 | 
						||
--- 79,85 ----
 | 
						||
      Hash root() const {
 | 
						||
          return root(Depth, std::deque<Hash>());
 | 
						||
      }
 | 
						||
+     Hash last() const;
 | 
						||
  
 | 
						||
      IncrementalWitness<Depth, Hash> witness() const {
 | 
						||
          return IncrementalWitness<Depth, Hash>(*this);
 | 
						||
***************
 | 
						||
*** 138,143 ****
 | 
						||
--- 139,150 ----
 | 
						||
          return tree.path(partial_path());
 | 
						||
      }
 | 
						||
  
 | 
						||
+     // Return the element being witnessed (should be a note
 | 
						||
+     // commitment!)
 | 
						||
+     Hash element() const {
 | 
						||
+         return tree.last();
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
      Hash root() const {
 | 
						||
          return tree.root(Depth, partial_path());
 | 
						||
      }
 | 
						||
diff -crB ./src/zcash/JoinSplit.cpp ../../komodo-jl777/src/zcash/JoinSplit.cpp
 | 
						||
*** ./src/zcash/JoinSplit.cpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcash/JoinSplit.cpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 16,21 ****
 | 
						||
--- 16,22 ----
 | 
						||
  #include "libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp"
 | 
						||
  
 | 
						||
  #include "sync.h"
 | 
						||
+ #include "amount.h"
 | 
						||
  
 | 
						||
  using namespace libsnark;
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 24,30 ****
 | 
						||
  #include "zcash/circuit/gadget.tcc"
 | 
						||
  
 | 
						||
  CCriticalSection cs_ParamsIO;
 | 
						||
! CCriticalSection cs_InitializeParams;
 | 
						||
  
 | 
						||
  template<typename T>
 | 
						||
  void saveToFile(std::string path, T& obj) {
 | 
						||
--- 25,31 ----
 | 
						||
  #include "zcash/circuit/gadget.tcc"
 | 
						||
  
 | 
						||
  CCriticalSection cs_ParamsIO;
 | 
						||
! CCriticalSection cs_LoadKeys;
 | 
						||
  
 | 
						||
  template<typename T>
 | 
						||
  void saveToFile(std::string path, T& obj) {
 | 
						||
***************
 | 
						||
*** 70,91 ****
 | 
						||
  
 | 
						||
      boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk;
 | 
						||
      boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk;
 | 
						||
      boost::optional<std::string> pkPath;
 | 
						||
  
 | 
						||
      JoinSplitCircuit() {}
 | 
						||
      ~JoinSplitCircuit() {}
 | 
						||
  
 | 
						||
-     static void initialize() {
 | 
						||
-         LOCK(cs_InitializeParams);
 | 
						||
- 
 | 
						||
-         ppzksnark_ppT::init_public_params();
 | 
						||
-     }
 | 
						||
- 
 | 
						||
      void setProvingKeyPath(std::string path) {
 | 
						||
          pkPath = path;
 | 
						||
      }
 | 
						||
  
 | 
						||
      void loadProvingKey() {
 | 
						||
          if (!pk) {
 | 
						||
              if (!pkPath) {
 | 
						||
                  throw std::runtime_error("proving key path unknown");
 | 
						||
--- 71,89 ----
 | 
						||
  
 | 
						||
      boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk;
 | 
						||
      boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk;
 | 
						||
+     boost::optional<r1cs_ppzksnark_processed_verification_key<ppzksnark_ppT>> vk_precomp;
 | 
						||
      boost::optional<std::string> pkPath;
 | 
						||
  
 | 
						||
      JoinSplitCircuit() {}
 | 
						||
      ~JoinSplitCircuit() {}
 | 
						||
  
 | 
						||
      void setProvingKeyPath(std::string path) {
 | 
						||
          pkPath = path;
 | 
						||
      }
 | 
						||
  
 | 
						||
      void loadProvingKey() {
 | 
						||
+         LOCK(cs_LoadKeys);
 | 
						||
+ 
 | 
						||
          if (!pk) {
 | 
						||
              if (!pkPath) {
 | 
						||
                  throw std::runtime_error("proving key path unknown");
 | 
						||
***************
 | 
						||
*** 102,108 ****
 | 
						||
--- 100,113 ----
 | 
						||
          }
 | 
						||
      }
 | 
						||
      void loadVerifyingKey(std::string path) {
 | 
						||
+         LOCK(cs_LoadKeys);
 | 
						||
+ 
 | 
						||
          loadFromFile(path, vk);
 | 
						||
+ 
 | 
						||
+         processVerifyingKey();
 | 
						||
+     }
 | 
						||
+     void processVerifyingKey() {
 | 
						||
+         vk_precomp = r1cs_ppzksnark_verifier_process_vk(*vk);
 | 
						||
      }
 | 
						||
      void saveVerifyingKey(std::string path) {
 | 
						||
          if (vk) {
 | 
						||
***************
 | 
						||
*** 111,132 ****
 | 
						||
              throw std::runtime_error("cannot save verifying key; key doesn't exist");
 | 
						||
          }
 | 
						||
      }
 | 
						||
  
 | 
						||
!     void generate() {
 | 
						||
          protoboard<FieldT> pb;
 | 
						||
  
 | 
						||
          joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
 | 
						||
          g.generate_r1cs_constraints();
 | 
						||
  
 | 
						||
!         const r1cs_constraint_system<FieldT> constraint_system = pb.get_constraint_system();
 | 
						||
          r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system);
 | 
						||
  
 | 
						||
          pk = keypair.pk;
 | 
						||
          vk = keypair.vk;
 | 
						||
      }
 | 
						||
  
 | 
						||
      bool verify(
 | 
						||
          const ZCProof& proof,
 | 
						||
          const uint256& pubKeyHash,
 | 
						||
          const uint256& randomSeed,
 | 
						||
          const boost::array<uint256, NumInputs>& macs,
 | 
						||
--- 116,150 ----
 | 
						||
              throw std::runtime_error("cannot save verifying key; key doesn't exist");
 | 
						||
          }
 | 
						||
      }
 | 
						||
+     void saveR1CS(std::string path) {
 | 
						||
+         auto r1cs = generate_r1cs();
 | 
						||
  
 | 
						||
!         saveToFile(path, r1cs);
 | 
						||
!     }
 | 
						||
! 
 | 
						||
!     r1cs_constraint_system<FieldT> generate_r1cs() {
 | 
						||
          protoboard<FieldT> pb;
 | 
						||
  
 | 
						||
          joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
 | 
						||
          g.generate_r1cs_constraints();
 | 
						||
  
 | 
						||
!         return pb.get_constraint_system();
 | 
						||
!     }
 | 
						||
! 
 | 
						||
!     void generate() {
 | 
						||
!         LOCK(cs_LoadKeys);
 | 
						||
! 
 | 
						||
!         const r1cs_constraint_system<FieldT> constraint_system = generate_r1cs();
 | 
						||
          r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system);
 | 
						||
  
 | 
						||
          pk = keypair.pk;
 | 
						||
          vk = keypair.vk;
 | 
						||
+         processVerifyingKey();
 | 
						||
      }
 | 
						||
  
 | 
						||
      bool verify(
 | 
						||
          const ZCProof& proof,
 | 
						||
+         ProofVerifier& verifier,
 | 
						||
          const uint256& pubKeyHash,
 | 
						||
          const uint256& randomSeed,
 | 
						||
          const boost::array<uint256, NumInputs>& macs,
 | 
						||
***************
 | 
						||
*** 136,142 ****
 | 
						||
          uint64_t vpub_new,
 | 
						||
          const uint256& rt
 | 
						||
      ) {
 | 
						||
!         if (!vk) {
 | 
						||
              throw std::runtime_error("JoinSplit verifying key not loaded");
 | 
						||
          }
 | 
						||
  
 | 
						||
--- 154,160 ----
 | 
						||
          uint64_t vpub_new,
 | 
						||
          const uint256& rt
 | 
						||
      ) {
 | 
						||
!         if (!vk || !vk_precomp) {
 | 
						||
              throw std::runtime_error("JoinSplit verifying key not loaded");
 | 
						||
          }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 155,161 ****
 | 
						||
                  vpub_new
 | 
						||
              );
 | 
						||
  
 | 
						||
!             return r1cs_ppzksnark_verifier_strong_IC<ppzksnark_ppT>(*vk, witness, r1cs_proof);
 | 
						||
          } catch (...) {
 | 
						||
              return false;
 | 
						||
          }
 | 
						||
--- 173,184 ----
 | 
						||
                  vpub_new
 | 
						||
              );
 | 
						||
  
 | 
						||
!             return verifier.check(
 | 
						||
!                 *vk,
 | 
						||
!                 *vk_precomp,
 | 
						||
!                 witness,
 | 
						||
!                 r1cs_proof
 | 
						||
!             );
 | 
						||
          } catch (...) {
 | 
						||
              return false;
 | 
						||
          }
 | 
						||
***************
 | 
						||
*** 181,188 ****
 | 
						||
              throw std::runtime_error("JoinSplit proving key not loaded");
 | 
						||
          }
 | 
						||
  
 | 
						||
!         // Compute nullifiers of inputs
 | 
						||
          for (size_t i = 0; i < NumInputs; i++) {
 | 
						||
              out_nullifiers[i] = inputs[i].nullifier();
 | 
						||
          }
 | 
						||
  
 | 
						||
--- 204,254 ----
 | 
						||
              throw std::runtime_error("JoinSplit proving key not loaded");
 | 
						||
          }
 | 
						||
  
 | 
						||
!         if (vpub_old > MAX_MONEY) {
 | 
						||
!             throw std::invalid_argument("nonsensical vpub_old value");
 | 
						||
!         }
 | 
						||
! 
 | 
						||
!         if (vpub_new > MAX_MONEY) {
 | 
						||
!             throw std::invalid_argument("nonsensical vpub_new value");
 | 
						||
!         }
 | 
						||
! 
 | 
						||
!         uint64_t lhs_value = vpub_old;
 | 
						||
!         uint64_t rhs_value = vpub_new;
 | 
						||
! 
 | 
						||
          for (size_t i = 0; i < NumInputs; i++) {
 | 
						||
+             // Sanity checks of input
 | 
						||
+             {
 | 
						||
+                 // If note has nonzero value
 | 
						||
+                 if (inputs[i].note.value != 0) {
 | 
						||
+                     // The witness root must equal the input root.
 | 
						||
+                     if (inputs[i].witness.root() != rt) {
 | 
						||
+                         throw std::invalid_argument("joinsplit not anchored to the correct root");
 | 
						||
+                     }
 | 
						||
+ 
 | 
						||
+                     // The tree must witness the correct element
 | 
						||
+                     if (inputs[i].note.cm() != inputs[i].witness.element()) {
 | 
						||
+                         throw std::invalid_argument("witness of wrong element for joinsplit input");
 | 
						||
+                     }
 | 
						||
+                 }
 | 
						||
+ 
 | 
						||
+                 // Ensure we have the key to this note.
 | 
						||
+                 if (inputs[i].note.a_pk != inputs[i].key.address().a_pk) {
 | 
						||
+                     throw std::invalid_argument("input note not authorized to spend with given key");
 | 
						||
+                 }
 | 
						||
+ 
 | 
						||
+                 // Balance must be sensical
 | 
						||
+                 if (inputs[i].note.value > MAX_MONEY) {
 | 
						||
+                     throw std::invalid_argument("nonsensical input note value");
 | 
						||
+                 }
 | 
						||
+ 
 | 
						||
+                 lhs_value += inputs[i].note.value;
 | 
						||
+ 
 | 
						||
+                 if (lhs_value > MAX_MONEY) {
 | 
						||
+                     throw std::invalid_argument("nonsensical left hand size of joinsplit balance");
 | 
						||
+                 }
 | 
						||
+             }
 | 
						||
+ 
 | 
						||
+             // Compute nullifier of input
 | 
						||
              out_nullifiers[i] = inputs[i].nullifier();
 | 
						||
          }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 197,208 ****
 | 
						||
--- 263,291 ----
 | 
						||
  
 | 
						||
          // Compute notes for outputs
 | 
						||
          for (size_t i = 0; i < NumOutputs; i++) {
 | 
						||
+             // Sanity checks of output
 | 
						||
+             {
 | 
						||
+                 if (outputs[i].value > MAX_MONEY) {
 | 
						||
+                     throw std::invalid_argument("nonsensical output value");
 | 
						||
+                 }
 | 
						||
+ 
 | 
						||
+                 rhs_value += outputs[i].value;
 | 
						||
+ 
 | 
						||
+                 if (rhs_value > MAX_MONEY) {
 | 
						||
+                     throw std::invalid_argument("nonsensical right hand side of joinsplit balance");
 | 
						||
+                 }
 | 
						||
+             }
 | 
						||
+ 
 | 
						||
              // Sample r
 | 
						||
              uint256 r = random_uint256();
 | 
						||
  
 | 
						||
              out_notes[i] = outputs[i].note(phi, r, i, h_sig);
 | 
						||
          }
 | 
						||
  
 | 
						||
+         if (lhs_value != rhs_value) {
 | 
						||
+             throw std::invalid_argument("invalid joinsplit balance");
 | 
						||
+         }
 | 
						||
+ 
 | 
						||
          // Compute the output commitments
 | 
						||
          for (size_t i = 0; i < NumOutputs; i++) {
 | 
						||
              out_commitments[i] = out_notes[i].cm();
 | 
						||
***************
 | 
						||
*** 249,257 ****
 | 
						||
              );
 | 
						||
          }
 | 
						||
  
 | 
						||
!         if (!pb.is_satisfied()) {
 | 
						||
!             throw std::invalid_argument("Constraint system not satisfied by inputs");
 | 
						||
!         }
 | 
						||
  
 | 
						||
          // TODO: These are copies, which is not strictly necessary.
 | 
						||
          std::vector<FieldT> primary_input = pb.primary_input();
 | 
						||
--- 331,339 ----
 | 
						||
              );
 | 
						||
          }
 | 
						||
  
 | 
						||
!         // The constraint system must be satisfied or there is an unimplemented
 | 
						||
!         // or incorrect sanity check above. Or the constraint system is broken!
 | 
						||
!         assert(pb.is_satisfied());
 | 
						||
  
 | 
						||
          // TODO: These are copies, which is not strictly necessary.
 | 
						||
          std::vector<FieldT> primary_input = pb.primary_input();
 | 
						||
***************
 | 
						||
*** 275,281 ****
 | 
						||
  template<size_t NumInputs, size_t NumOutputs>
 | 
						||
  JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
 | 
						||
  {
 | 
						||
!     JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
 | 
						||
      auto js = new JoinSplitCircuit<NumInputs, NumOutputs>();
 | 
						||
      js->generate();
 | 
						||
  
 | 
						||
--- 357,363 ----
 | 
						||
  template<size_t NumInputs, size_t NumOutputs>
 | 
						||
  JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
 | 
						||
  {
 | 
						||
!     initialize_curve_params();
 | 
						||
      auto js = new JoinSplitCircuit<NumInputs, NumOutputs>();
 | 
						||
      js->generate();
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 285,291 ****
 | 
						||
  template<size_t NumInputs, size_t NumOutputs>
 | 
						||
  JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Unopened()
 | 
						||
  {
 | 
						||
!     JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
 | 
						||
      return new JoinSplitCircuit<NumInputs, NumOutputs>();
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 367,373 ----
 | 
						||
  template<size_t NumInputs, size_t NumOutputs>
 | 
						||
  JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Unopened()
 | 
						||
  {
 | 
						||
!     initialize_curve_params();
 | 
						||
      return new JoinSplitCircuit<NumInputs, NumOutputs>();
 | 
						||
  }
 | 
						||
  
 | 
						||
diff -crB ./src/zcash/JoinSplit.hpp ../../komodo-jl777/src/zcash/JoinSplit.hpp
 | 
						||
*** ./src/zcash/JoinSplit.hpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcash/JoinSplit.hpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 62,67 ****
 | 
						||
--- 62,68 ----
 | 
						||
      virtual void saveProvingKey(std::string path) = 0;
 | 
						||
      virtual void loadVerifyingKey(std::string path) = 0;
 | 
						||
      virtual void saveVerifyingKey(std::string path) = 0;
 | 
						||
+     virtual void saveR1CS(std::string path) = 0;
 | 
						||
  
 | 
						||
      virtual ZCProof prove(
 | 
						||
          const boost::array<JSInput, NumInputs>& inputs,
 | 
						||
***************
 | 
						||
*** 82,87 ****
 | 
						||
--- 83,89 ----
 | 
						||
  
 | 
						||
      virtual bool verify(
 | 
						||
          const ZCProof& proof,
 | 
						||
+         ProofVerifier& verifier,
 | 
						||
          const uint256& pubKeyHash,
 | 
						||
          const uint256& randomSeed,
 | 
						||
          const boost::array<uint256, NumInputs>& hmacs,
 | 
						||
diff -crB ./src/zcash/Proof.cpp ../../komodo-jl777/src/zcash/Proof.cpp
 | 
						||
*** ./src/zcash/Proof.cpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcash/Proof.cpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 1,6 ****
 | 
						||
--- 1,7 ----
 | 
						||
  #include "Proof.hpp"
 | 
						||
  
 | 
						||
  #include <boost/static_assert.hpp>
 | 
						||
+ #include <mutex>
 | 
						||
  
 | 
						||
  #include "crypto/common.h"
 | 
						||
  #include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp"
 | 
						||
***************
 | 
						||
*** 211,214 ****
 | 
						||
--- 212,247 ----
 | 
						||
      return p;
 | 
						||
  }
 | 
						||
  
 | 
						||
+ std::once_flag init_public_params_once_flag;
 | 
						||
+ 
 | 
						||
+ void initialize_curve_params()
 | 
						||
+ {
 | 
						||
+     std::call_once (init_public_params_once_flag, curve_pp::init_public_params);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ ProofVerifier ProofVerifier::Strict() {
 | 
						||
+     initialize_curve_params();
 | 
						||
+     return ProofVerifier(true);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ ProofVerifier ProofVerifier::Disabled() {
 | 
						||
+     initialize_curve_params();
 | 
						||
+     return ProofVerifier(false);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ template<>
 | 
						||
+ bool ProofVerifier::check(
 | 
						||
+     const r1cs_ppzksnark_verification_key<curve_pp>& vk,
 | 
						||
+     const r1cs_ppzksnark_processed_verification_key<curve_pp>& pvk,
 | 
						||
+     const r1cs_primary_input<curve_Fr>& primary_input,
 | 
						||
+     const r1cs_ppzksnark_proof<curve_pp>& proof
 | 
						||
+ )
 | 
						||
+ {
 | 
						||
+     if (perform_verification) {
 | 
						||
+         return r1cs_ppzksnark_online_verifier_strong_IC<curve_pp>(pvk, primary_input, proof);
 | 
						||
+     } else {
 | 
						||
+         return true;
 | 
						||
+     }
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
  }
 | 
						||
diff -crB ./src/zcash/Proof.hpp ../../komodo-jl777/src/zcash/Proof.hpp
 | 
						||
*** ./src/zcash/Proof.hpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcash/Proof.hpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 235,240 ****
 | 
						||
--- 235,276 ----
 | 
						||
      }
 | 
						||
  };
 | 
						||
  
 | 
						||
+ void initialize_curve_params();
 | 
						||
+ 
 | 
						||
+ class ProofVerifier {
 | 
						||
+ private:
 | 
						||
+     bool perform_verification;
 | 
						||
+ 
 | 
						||
+     ProofVerifier(bool perform_verification) : perform_verification(perform_verification) { }
 | 
						||
+ 
 | 
						||
+ public:
 | 
						||
+     // ProofVerifier should never be copied
 | 
						||
+     ProofVerifier(const ProofVerifier&) = delete;
 | 
						||
+     ProofVerifier& operator=(const ProofVerifier&) = delete;
 | 
						||
+     ProofVerifier(ProofVerifier&&);
 | 
						||
+     ProofVerifier& operator=(ProofVerifier&&);
 | 
						||
+ 
 | 
						||
+     // Creates a verification context that strictly verifies
 | 
						||
+     // all proofs using libsnark's API.
 | 
						||
+     static ProofVerifier Strict();
 | 
						||
+ 
 | 
						||
+     // Creates a verification context that performs no
 | 
						||
+     // verification, used when avoiding duplicate effort
 | 
						||
+     // such as during reindexing.
 | 
						||
+     static ProofVerifier Disabled();
 | 
						||
+ 
 | 
						||
+     template <typename VerificationKey,
 | 
						||
+               typename ProcessedVerificationKey,
 | 
						||
+               typename PrimaryInput,
 | 
						||
+               typename Proof
 | 
						||
+               >
 | 
						||
+     bool check(
 | 
						||
+         const VerificationKey& vk,
 | 
						||
+         const ProcessedVerificationKey& pvk,
 | 
						||
+         const PrimaryInput& pi,
 | 
						||
+         const Proof& p
 | 
						||
+     );
 | 
						||
+ };
 | 
						||
  
 | 
						||
  }
 | 
						||
  
 | 
						||
diff -crB ./src/zcbenchmarks.cpp ../../komodo-jl777/src/zcbenchmarks.cpp
 | 
						||
*** ./src/zcbenchmarks.cpp	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcbenchmarks.cpp	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 17,22 ****
 | 
						||
--- 17,23 ----
 | 
						||
  #include "script/sign.h"
 | 
						||
  #include "sodium.h"
 | 
						||
  #include "streams.h"
 | 
						||
+ #include "utiltest.h"
 | 
						||
  #include "wallet/wallet.h"
 | 
						||
  
 | 
						||
  #include "zcbenchmarks.h"
 | 
						||
***************
 | 
						||
*** 89,95 ****
 | 
						||
                           0);
 | 
						||
      double ret = timer_stop(tv_start);
 | 
						||
  
 | 
						||
!     assert(jsdesc.Verify(*pzcashParams, pubKeyHash));
 | 
						||
      return ret;
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 90,97 ----
 | 
						||
                           0);
 | 
						||
      double ret = timer_stop(tv_start);
 | 
						||
  
 | 
						||
!     auto verifier = libzcash::ProofVerifier::Strict();
 | 
						||
!     assert(jsdesc.Verify(*pzcashParams, verifier, pubKeyHash));
 | 
						||
      return ret;
 | 
						||
  }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 98,104 ****
 | 
						||
      struct timeval tv_start;
 | 
						||
      timer_start(tv_start);
 | 
						||
      uint256 pubKeyHash;
 | 
						||
!     joinsplit.Verify(*pzcashParams, pubKeyHash);
 | 
						||
      return timer_stop(tv_start);
 | 
						||
  }
 | 
						||
  
 | 
						||
--- 100,107 ----
 | 
						||
      struct timeval tv_start;
 | 
						||
      timer_start(tv_start);
 | 
						||
      uint256 pubKeyHash;
 | 
						||
!     auto verifier = libzcash::ProofVerifier::Strict();
 | 
						||
!     joinsplit.Verify(*pzcashParams, verifier, pubKeyHash);
 | 
						||
      return timer_stop(tv_start);
 | 
						||
  }
 | 
						||
  
 | 
						||
***************
 | 
						||
*** 223,225 ****
 | 
						||
--- 226,301 ----
 | 
						||
      return timer_stop(tv_start);
 | 
						||
  }
 | 
						||
  
 | 
						||
+ double benchmark_try_decrypt_notes(size_t nAddrs)
 | 
						||
+ {
 | 
						||
+     CWallet wallet;
 | 
						||
+     for (int i = 0; i < nAddrs; i++) {
 | 
						||
+         auto sk = libzcash::SpendingKey::random();
 | 
						||
+         wallet.AddSpendingKey(sk);
 | 
						||
+     }
 | 
						||
+ 
 | 
						||
+     auto sk = libzcash::SpendingKey::random();
 | 
						||
+     auto tx = GetValidReceive(*pzcashParams, sk, 10, true);
 | 
						||
+ 
 | 
						||
+     struct timeval tv_start;
 | 
						||
+     timer_start(tv_start);
 | 
						||
+     auto nd = wallet.FindMyNotes(tx);
 | 
						||
+     return timer_stop(tv_start);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
+ double benchmark_increment_note_witnesses(size_t nTxs)
 | 
						||
+ {
 | 
						||
+     CWallet wallet;
 | 
						||
+     ZCIncrementalMerkleTree tree;
 | 
						||
+ 
 | 
						||
+     auto sk = libzcash::SpendingKey::random();
 | 
						||
+     wallet.AddSpendingKey(sk);
 | 
						||
+ 
 | 
						||
+     // First block
 | 
						||
+     CBlock block1;
 | 
						||
+     for (int i = 0; i < nTxs; i++) {
 | 
						||
+         auto wtx = GetValidReceive(*pzcashParams, sk, 10, true);
 | 
						||
+         auto note = GetNote(*pzcashParams, sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+ 
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+         block1.vtx.push_back(wtx);
 | 
						||
+     }
 | 
						||
+     CBlockIndex index1(block1);
 | 
						||
+     index1.nHeight = 1;
 | 
						||
+ 
 | 
						||
+     // Increment to get transactions witnessed
 | 
						||
+     wallet.ChainTip(&index1, &block1, tree, true);
 | 
						||
+ 
 | 
						||
+     // Second block
 | 
						||
+     CBlock block2;
 | 
						||
+     block2.hashPrevBlock = block1.GetHash();
 | 
						||
+     {
 | 
						||
+         auto wtx = GetValidReceive(*pzcashParams, sk, 10, true);
 | 
						||
+         auto note = GetNote(*pzcashParams, sk, wtx, 0, 1);
 | 
						||
+         auto nullifier = note.nullifier(sk);
 | 
						||
+ 
 | 
						||
+         mapNoteData_t noteData;
 | 
						||
+         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
 | 
						||
+         CNoteData nd {sk.address(), nullifier};
 | 
						||
+         noteData[jsoutpt] = nd;
 | 
						||
+ 
 | 
						||
+         wtx.SetNoteData(noteData);
 | 
						||
+         wallet.AddToWallet(wtx, true, NULL);
 | 
						||
+         block2.vtx.push_back(wtx);
 | 
						||
+     }
 | 
						||
+     CBlockIndex index2(block2);
 | 
						||
+     index2.nHeight = 2;
 | 
						||
+ 
 | 
						||
+     struct timeval tv_start;
 | 
						||
+     timer_start(tv_start);
 | 
						||
+     wallet.ChainTip(&index2, &block2, tree, true);
 | 
						||
+     return timer_stop(tv_start);
 | 
						||
+ }
 | 
						||
+ 
 | 
						||
diff -crB ./src/zcbenchmarks.h ../../komodo-jl777/src/zcbenchmarks.h
 | 
						||
*** ./src/zcbenchmarks.h	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/src/zcbenchmarks.h	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 12,16 ****
 | 
						||
--- 12,18 ----
 | 
						||
  extern double benchmark_verify_joinsplit(const JSDescription &joinsplit);
 | 
						||
  extern double benchmark_verify_equihash();
 | 
						||
  extern double benchmark_large_tx();
 | 
						||
+ extern double benchmark_try_decrypt_notes(size_t nAddrs);
 | 
						||
+ extern double benchmark_increment_note_witnesses(size_t nTxs);
 | 
						||
  
 | 
						||
  #endif
 | 
						||
diff -crB ./zcutil/build-debian-package.sh ../../komodo-jl777/zcutil/build-debian-package.sh
 | 
						||
*** ./zcutil/build-debian-package.sh	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/zcutil/build-debian-package.sh	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 23,32 ****
 | 
						||
      rm -R $BUILD_DIR
 | 
						||
  fi
 | 
						||
  
 | 
						||
  DEB_BIN=$BUILD_DIR/usr/bin
 | 
						||
  DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME
 | 
						||
  DEB_MAN=$BUILD_DIR/usr/share/man/man1
 | 
						||
! mkdir -p $BUILD_DIR/DEBIAN $DEB_BIN $DEB_DOC $DEB_MAN
 | 
						||
  chmod 0755 -R $BUILD_DIR/*
 | 
						||
  
 | 
						||
  # Copy control file
 | 
						||
--- 23,33 ----
 | 
						||
      rm -R $BUILD_DIR
 | 
						||
  fi
 | 
						||
  
 | 
						||
+ DEB_CMP=$BUILD_DIR/etc/bash_completion.d
 | 
						||
  DEB_BIN=$BUILD_DIR/usr/bin
 | 
						||
  DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME
 | 
						||
  DEB_MAN=$BUILD_DIR/usr/share/man/man1
 | 
						||
! mkdir -p $BUILD_DIR/DEBIAN $DEB_CMP $DEB_BIN $DEB_DOC $DEB_MAN
 | 
						||
  chmod 0755 -R $BUILD_DIR/*
 | 
						||
  
 | 
						||
  # Copy control file
 | 
						||
***************
 | 
						||
*** 48,53 ****
 | 
						||
--- 49,57 ----
 | 
						||
  # Copy manpages
 | 
						||
  cp $SRC_DEB/manpages/zcashd.1 $DEB_MAN
 | 
						||
  cp $SRC_DEB/manpages/zcash-cli.1 $DEB_MAN
 | 
						||
+ # Copy bash completion files
 | 
						||
+ cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/zcashd
 | 
						||
+ cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/zcash-cli
 | 
						||
  # Gzip files
 | 
						||
  gzip --best -n $DEB_DOC/changelog
 | 
						||
  gzip --best -n $DEB_DOC/changelog.Debian
 | 
						||
diff -crB ./zcutil/build.sh ../../komodo-jl777/zcutil/build.sh
 | 
						||
*** ./zcutil/build.sh	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/zcutil/build.sh	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 1,7 ****
 | 
						||
! #!/bin/bash
 | 
						||
  
 | 
						||
  set -eu -o pipefail
 | 
						||
  
 | 
						||
  if [ "x$*" = 'x--help' ]
 | 
						||
  then
 | 
						||
      cat <<EOF
 | 
						||
--- 1,30 ----
 | 
						||
! #!/usr/bin/env bash
 | 
						||
  
 | 
						||
  set -eu -o pipefail
 | 
						||
  
 | 
						||
+ # Allow user overrides to $MAKE. Typical usage for users who need it:
 | 
						||
+ #   MAKE=gmake ./zcutil/build.sh -j$(nproc)
 | 
						||
+ if [[ -z "${MAKE-}" ]]; then
 | 
						||
+     MAKE=make
 | 
						||
+ fi
 | 
						||
+ 
 | 
						||
+ # Allow overrides to $BUILD and $HOST for porters. Most users will not need it.
 | 
						||
+ #   BUILD=i686-pc-linux-gnu ./zcutil/build.sh
 | 
						||
+ if [[ -z "${BUILD-}" ]]; then
 | 
						||
+     BUILD=x86_64-unknown-linux-gnu
 | 
						||
+ fi
 | 
						||
+ if [[ -z "${HOST-}" ]]; then
 | 
						||
+     HOST=x86_64-unknown-linux-gnu
 | 
						||
+ fi
 | 
						||
+ 
 | 
						||
+ # Allow override to $CC and $CXX for porters. Most users will not need it.
 | 
						||
+ if [[ -z "${CC-}" ]]; then
 | 
						||
+     CC=gcc
 | 
						||
+ fi
 | 
						||
+ if [[ -z "${CXX-}" ]]; then
 | 
						||
+     CXX=g++
 | 
						||
+ fi
 | 
						||
+ 
 | 
						||
  if [ "x$*" = 'x--help' ]
 | 
						||
  then
 | 
						||
      cat <<EOF
 | 
						||
***************
 | 
						||
*** 10,20 ****
 | 
						||
  $0 --help
 | 
						||
    Show this help message and exit.
 | 
						||
  
 | 
						||
! $0 [ --enable-lcov ] [ MAKEARGS... ]
 | 
						||
    Build Zcash and most of its transitive dependencies from
 | 
						||
!   source. MAKEARGS are applied to both dependencies and Zcash itself. If
 | 
						||
!   --enable-lcov is passed, Zcash is configured to add coverage
 | 
						||
    instrumentation, thus enabling "make cov" to work.
 | 
						||
  EOF
 | 
						||
      exit 0
 | 
						||
  fi
 | 
						||
--- 33,45 ----
 | 
						||
  $0 --help
 | 
						||
    Show this help message and exit.
 | 
						||
  
 | 
						||
! $0 [ --enable-lcov || --disable-tests ] [ MAKEARGS... ]
 | 
						||
    Build Zcash and most of its transitive dependencies from
 | 
						||
!   source. MAKEARGS are applied to both dependencies and Zcash itself.
 | 
						||
! 
 | 
						||
!   If --enable-lcov is passed, Zcash is configured to add coverage
 | 
						||
    instrumentation, thus enabling "make cov" to work.
 | 
						||
+   If --disable-tests is passed instead, the Zcash tests are not built.
 | 
						||
  EOF
 | 
						||
      exit 0
 | 
						||
  fi
 | 
						||
***************
 | 
						||
*** 25,41 ****
 | 
						||
  # If --enable-lcov is the first argument, enable lcov coverage support:
 | 
						||
  LCOV_ARG=''
 | 
						||
  HARDENING_ARG='--enable-hardening'
 | 
						||
  if [ "x${1:-}" = 'x--enable-lcov' ]
 | 
						||
  then
 | 
						||
      LCOV_ARG='--enable-lcov'
 | 
						||
      HARDENING_ARG='--disable-hardening'
 | 
						||
      shift
 | 
						||
  fi
 | 
						||
  
 | 
						||
! # BUG: parameterize the platform/host directory:
 | 
						||
! PREFIX="$(pwd)/depends/x86_64-unknown-linux-gnu/"
 | 
						||
  
 | 
						||
! HOST=x86_64-unknown-linux-gnu BUILD=x86_64-unknown-linux-gnu make "$@" -C ./depends/ V=1 NO_QT=1
 | 
						||
  ./autogen.sh
 | 
						||
! ./configure --prefix="${PREFIX}" --host=x86_64-unknown-linux-gnu --build=x86_64-unknown-linux-gnu --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g'
 | 
						||
! make "$@" V=1
 | 
						||
--- 50,70 ----
 | 
						||
  # If --enable-lcov is the first argument, enable lcov coverage support:
 | 
						||
  LCOV_ARG=''
 | 
						||
  HARDENING_ARG='--enable-hardening'
 | 
						||
+ TEST_ARG=''
 | 
						||
  if [ "x${1:-}" = 'x--enable-lcov' ]
 | 
						||
  then
 | 
						||
      LCOV_ARG='--enable-lcov'
 | 
						||
      HARDENING_ARG='--disable-hardening'
 | 
						||
      shift
 | 
						||
+ elif [ "x${1:-}" = 'x--disable-tests' ]
 | 
						||
+ then
 | 
						||
+     TEST_ARG='--enable-tests=no'
 | 
						||
+     shift
 | 
						||
  fi
 | 
						||
  
 | 
						||
! PREFIX="$(pwd)/depends/$BUILD/"
 | 
						||
  
 | 
						||
! HOST="$HOST" BUILD="$BUILD" "$MAKE" "$@" -C ./depends/ V=1 NO_QT=1
 | 
						||
  ./autogen.sh
 | 
						||
! CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g'
 | 
						||
! "$MAKE" "$@" V=1
 | 
						||
diff -crB ./zcutil/docker-entrypoint.sh ../../komodo-jl777/zcutil/docker-entrypoint.sh
 | 
						||
*** ./zcutil/docker-entrypoint.sh	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/zcutil/docker-entrypoint.sh	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 14,25 ****
 | 
						||
  txindex=1
 | 
						||
  bind=${listenip:-127.0.0.1}
 | 
						||
  rpcbind=${listenip:-127.0.0.1}
 | 
						||
- addnode=5.9.102.210
 | 
						||
- addnode=78.47.196.146
 | 
						||
- addnode=178.63.69.164
 | 
						||
- addnode=88.198.65.74
 | 
						||
- addnode=5.9.122.241
 | 
						||
- addnode=144.76.94.38
 | 
						||
  EOF
 | 
						||
  
 | 
						||
      cat $HOME/.komodo/komodo.conf
 | 
						||
--- 14,19 ----
 | 
						||
***************
 | 
						||
*** 27,35 ****
 | 
						||
  
 | 
						||
  echo "...Checking fetch-params"
 | 
						||
  $HOME/zcutil/fetch-params.sh
 | 
						||
- 
 | 
						||
  echo "Initialization completed successfully"
 | 
						||
  echo
 | 
						||
  if [ $# -gt 0 ]; then
 | 
						||
  
 | 
						||
      args=("$@")
 | 
						||
--- 21,30 ----
 | 
						||
  
 | 
						||
  echo "...Checking fetch-params"
 | 
						||
  $HOME/zcutil/fetch-params.sh
 | 
						||
  echo "Initialization completed successfully"
 | 
						||
  echo
 | 
						||
+ 
 | 
						||
+ # ToDo: Needs some rework. I was sick
 | 
						||
  if [ $# -gt 0 ]; then
 | 
						||
  
 | 
						||
      args=("$@")
 | 
						||
diff -crB ./zcutil/docker-komodo-cli.sh ../../komodo-jl777/zcutil/docker-komodo-cli.sh
 | 
						||
*** ./zcutil/docker-komodo-cli.sh	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/zcutil/docker-komodo-cli.sh	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 1,11 ****
 | 
						||
  #!/bin/bash
 | 
						||
- if [  -z ${assetchain+x} ]; then
 | 
						||
  
 | 
						||
!     /komodo/src/komodo-cli $1 $2 $3 $4
 | 
						||
  
 | 
						||
! else
 | 
						||
! 
 | 
						||
!     /komodo/src/komodo-cli -ac_name=$assetchain $1 $2 $3 $4
 | 
						||
! 
 | 
						||
! fi
 | 
						||
  
 | 
						||
--- 1,6 ----
 | 
						||
  #!/bin/bash
 | 
						||
  
 | 
						||
! # ToDo: check for docker arg ac_name
 | 
						||
  
 | 
						||
! /komodo/src/komodo-cli $1 $2 $3 $4
 | 
						||
  
 | 
						||
diff -crB ./zcutil/fetch-params.sh ../../komodo-jl777/zcutil/fetch-params.sh
 | 
						||
*** ./zcutil/fetch-params.sh	2017-01-03 10:40:50.435340501 +0000
 | 
						||
--- ../../komodo-jl777/zcutil/fetch-params.sh	2017-01-03 09:49:08.876507395 +0000
 | 
						||
***************
 | 
						||
*** 67,72 ****
 | 
						||
--- 67,76 ----
 | 
						||
      cat <<EOF
 | 
						||
  Zcash - fetch-params.sh
 | 
						||
  
 | 
						||
+ This script will fetch the Zcash zkSNARK parameters and verify their
 | 
						||
+ integrity with sha256sum.
 | 
						||
+ 
 | 
						||
+ If they already exist locally, it will exit now and do nothing else.
 | 
						||
  EOF
 | 
						||
  
 | 
						||
      # Now create PARAMS_DIR and insert a README if necessary:
 | 
						||
***************
 | 
						||
*** 84,92 ****
 | 
						||
          # This may be the first time the user's run this script, so give
 | 
						||
          # them some info, especially about bandwidth usage:
 | 
						||
          cat <<EOF
 | 
						||
- This script will fetch the Zcash zkSNARK parameters and verify their
 | 
						||
- integrity with sha256sum.
 | 
						||
- 
 | 
						||
  The parameters are currently just under 911MB in size, so plan accordingly
 | 
						||
  for your bandwidth constraints. If the files are already present and
 | 
						||
  have the correct sha256sum, no networking is used.
 | 
						||
--- 88,93 ----
 | 
						||
***************
 | 
						||
*** 104,107 ****
 | 
						||
--- 105,109 ----
 | 
						||
  }
 | 
						||
  
 | 
						||
  main
 | 
						||
+ rm -f /tmp/fetch_params.lock
 | 
						||
  exit 0
 | 
						||
Only in ../../komodo-jl777/zcutil: release-notes.py
 |