From 9b3fb7a6848a1dcafd0ce4d733b532f954d513ac Mon Sep 17 00:00:00 2001 From: Gerald Bauer Date: Sat, 6 Feb 2021 17:40:38 +0100 Subject: [PATCH] up --- attic/bitshilling/.gitignore | 70 +++++++ attic/bitshilling/HISTORY.md | 3 + attic/bitshilling/LICENSE.md | 116 ++++++++++++ attic/bitshilling/Manifest.txt | 25 +++ attic/bitshilling/README.md | 117 ++++++++++++ attic/bitshilling/Rakefile | 34 ++++ attic/bitshilling/attic/ledger.rb | 34 ++++ attic/bitshilling/bin/shilling | 17 ++ attic/bitshilling/config.ru | 11 ++ attic/bitshilling/lib/shilling.rb | 119 ++++++++++++ attic/bitshilling/lib/shilling/bank.rb | 109 +++++++++++ attic/bitshilling/lib/shilling/block.rb | 39 ++++ attic/bitshilling/lib/shilling/blockchain.rb | 47 +++++ attic/bitshilling/lib/shilling/cache.rb | 22 +++ attic/bitshilling/lib/shilling/node.rb | 82 +++++++++ attic/bitshilling/lib/shilling/pool.rb | 42 +++++ attic/bitshilling/lib/shilling/service.rb | 113 ++++++++++++ attic/bitshilling/lib/shilling/tool.rb | 66 +++++++ attic/bitshilling/lib/shilling/transaction.rb | 30 +++ attic/bitshilling/lib/shilling/version.rb | 11 ++ .../lib/shilling/views/_blockchain.erb | 37 ++++ .../lib/shilling/views/_ledger.erb | 15 ++ .../bitshilling/lib/shilling/views/_peers.erb | 24 +++ .../shilling/views/_pending_transactions.erb | 23 +++ .../lib/shilling/views/_wallet.erb | 16 ++ .../bitshilling/lib/shilling/views/index.erb | 30 +++ .../bitshilling/lib/shilling/views/style.scss | 172 ++++++++++++++++++ attic/bitshilling/lib/shilling/wallet.rb | 15 ++ attic/bitshilling/shilling.png | Bin 0 -> 64978 bytes 29 files changed, 1439 insertions(+) create mode 100644 attic/bitshilling/.gitignore create mode 100644 attic/bitshilling/HISTORY.md create mode 100644 attic/bitshilling/LICENSE.md create mode 100644 attic/bitshilling/Manifest.txt create mode 100644 attic/bitshilling/README.md create mode 100644 attic/bitshilling/Rakefile create mode 100644 attic/bitshilling/attic/ledger.rb create mode 100644 attic/bitshilling/bin/shilling create mode 100644 attic/bitshilling/config.ru create mode 100644 attic/bitshilling/lib/shilling.rb create mode 100644 attic/bitshilling/lib/shilling/bank.rb create mode 100644 attic/bitshilling/lib/shilling/block.rb create mode 100644 attic/bitshilling/lib/shilling/blockchain.rb create mode 100644 attic/bitshilling/lib/shilling/cache.rb create mode 100644 attic/bitshilling/lib/shilling/node.rb create mode 100644 attic/bitshilling/lib/shilling/pool.rb create mode 100644 attic/bitshilling/lib/shilling/service.rb create mode 100644 attic/bitshilling/lib/shilling/tool.rb create mode 100644 attic/bitshilling/lib/shilling/transaction.rb create mode 100644 attic/bitshilling/lib/shilling/version.rb create mode 100644 attic/bitshilling/lib/shilling/views/_blockchain.erb create mode 100644 attic/bitshilling/lib/shilling/views/_ledger.erb create mode 100644 attic/bitshilling/lib/shilling/views/_peers.erb create mode 100644 attic/bitshilling/lib/shilling/views/_pending_transactions.erb create mode 100644 attic/bitshilling/lib/shilling/views/_wallet.erb create mode 100644 attic/bitshilling/lib/shilling/views/index.erb create mode 100644 attic/bitshilling/lib/shilling/views/style.scss create mode 100644 attic/bitshilling/lib/shilling/wallet.rb create mode 100644 attic/bitshilling/shilling.png diff --git a/attic/bitshilling/.gitignore b/attic/bitshilling/.gitignore new file mode 100644 index 0000000..91ce1dc --- /dev/null +++ b/attic/bitshilling/.gitignore @@ -0,0 +1,70 @@ +########### +# cached / saved state / data + +data.json +data.*.json + + + +########## +# ignore Gemfile.lock for now + +Gemfile.lock + + +#### +# ignore sass cache +.sass-cache + + + +*.gem +*.rbc +/.config +/coverage/ +/InstalledFiles +/pkg/ +/spec/reports/ +/spec/examples.txt +/test/tmp/ +/test/version_tmp/ +/tmp/ + +# Used by dotenv library to load environment variables. +# .env + +## Specific to RubyMotion: +.dat* +.repl_history +build/ +*.bridgesupport +build-iPhoneOS/ +build-iPhoneSimulator/ + +## Specific to RubyMotion (use of CocoaPods): +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# vendor/Pods/ + +## Documentation cache and generated files: +/.yardoc/ +/_yardoc/ +/doc/ +/rdoc/ + +## Environment normalization: +/.bundle/ +/vendor/bundle +/lib/bundler/man/ + +# for a library or gem, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# Gemfile.lock +# .ruby-version +# .ruby-gemset + +# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: +.rvmrc diff --git a/attic/bitshilling/HISTORY.md b/attic/bitshilling/HISTORY.md new file mode 100644 index 0000000..bf34691 --- /dev/null +++ b/attic/bitshilling/HISTORY.md @@ -0,0 +1,3 @@ +### 0.1.0 / 2017-12-26 + +* Everything is new. First release. diff --git a/attic/bitshilling/LICENSE.md b/attic/bitshilling/LICENSE.md new file mode 100644 index 0000000..670154e --- /dev/null +++ b/attic/bitshilling/LICENSE.md @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + diff --git a/attic/bitshilling/Manifest.txt b/attic/bitshilling/Manifest.txt new file mode 100644 index 0000000..9d6a446 --- /dev/null +++ b/attic/bitshilling/Manifest.txt @@ -0,0 +1,25 @@ +HISTORY.md +LICENSE.md +Manifest.txt +README.md +Rakefile +bin/shilling +lib/shilling.rb +lib/shilling/bank.rb +lib/shilling/block.rb +lib/shilling/blockchain.rb +lib/shilling/cache.rb +lib/shilling/node.rb +lib/shilling/pool.rb +lib/shilling/service.rb +lib/shilling/tool.rb +lib/shilling/transaction.rb +lib/shilling/version.rb +lib/shilling/views/_blockchain.erb +lib/shilling/views/_ledger.erb +lib/shilling/views/_peers.erb +lib/shilling/views/_pending_transactions.erb +lib/shilling/views/_wallet.erb +lib/shilling/views/index.erb +lib/shilling/views/style.scss +lib/shilling/wallet.rb diff --git a/attic/bitshilling/README.md b/attic/bitshilling/README.md new file mode 100644 index 0000000..aae2de7 --- /dev/null +++ b/attic/bitshilling/README.md @@ -0,0 +1,117 @@ +# shilling (or schilling) command line tool (and core library) + +shilling (or schilling) on the blockchain! rock-solid alpine dollar from austria; +print (mine) your own shillings; run your own federated shilling central bank nodes +w/ public distributed (hyper) ledger book on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time with cryptos + + + +* home :: [github.com/bitshilling/bitshilling.tools](https://github.com/bitshilling/bitshilling.tools) +* bugs :: [github.com/bitshilling/bitshilling.tools/issues](https://github.com/bitshilling/bitshilling.tools/issues) +* gem :: [rubygems.org/gems/shilling](https://rubygems.org/gems/shilling) +* rdoc :: [rubydoc.info/gems/shilling](http://rubydoc.info/gems/shilling) + + + +## Command Line + +Use the `shilling` command line tool. Try: + +``` +$ shilling -h +``` + +resulting in: + +``` +Usage: shilling [options] + + Wallet options: + -n, --name=NAME Address name (default: Theresa) + + Server (node) options: + -o, --host HOST listen on HOST (default: 0.0.0.0) + -p, --port PORT use PORT (default: 4567) + -h, --help Prints this help +``` + +To start a new (network) node using the default wallet +address (that is, Theresa) and the default server host and port settings +use: + +``` +$ shilling +``` + +Stand back ten feets :-) while starting up the machinery. +Ready to print (mine) shillings on the blockchain? +In your browser open up the page e.g. `http://localhost:4567`. Voila! + +![](shilling.png) + + + +Note: You can start a second node on your computer - +make sure to use a different port (use the `-p/--port` option) +and (recommended) +a different wallet address (use the `-n/--name` option). +Example: + +``` +$ shilling -p 5678 -n Franz +``` + +Happy mining! + + + +## Local Development Setup + +For local development - clone or download (and unzip) the shilling.tools code repo. +Next install all dependencies using bundler with a Gemfile e.g.: + +``` ruby +# Gemfile + +source "https://rubygems.org" + +gem 'sinatra' +gem 'sass' +gem 'blockchain-lite' +gem 'ledger-lite' +``` + +run + +``` +$ bundle ## will use the Gemfile (see above) +``` + +and now you're ready to run your own shilling server node. Use the [`config.ru`](config.ru) script for rack: + +``` ruby +# config.ru + +$LOAD_PATH << './lib' + +require 'shilling' + +run Shilling::Service +``` + +and startup the money printing machine using rackup - the rack command line tool: + +``` +$ rackup ## will use the config.ru - rackup configuration script (see above). +``` + +In your browser open up the page e.g. `http://localhost:9292`. Voila! Happy mining! + + + +## License + +![](https://publicdomainworks.github.io/buttons/zero88x31.png) + +The `shilling` scripts are dedicated to the public domain. +Use it as you please with no restrictions whatsoever. diff --git a/attic/bitshilling/Rakefile b/attic/bitshilling/Rakefile new file mode 100644 index 0000000..5136dc7 --- /dev/null +++ b/attic/bitshilling/Rakefile @@ -0,0 +1,34 @@ +require 'hoe' +require './lib/shilling/version.rb' + +Hoe.spec 'shilling' do + + self.version = Shilling::VERSION + + self.summary = 'shilling (or schilling) on the blockchain! rock-solid alpine dollar from austria; print (mine) your own shillings; run your own federated shilling central bank nodes w/ public distributed (hyper) ledger book on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time with cryptos' + self.description = summary + + self.urls = ['https://github.com/bitshilling/bitshilling.tools'] + + self.author = 'Gerald Bauer' + self.email = 'ruby-talk@ruby-lang.org' + + # switch extension to .markdown for gihub formatting + self.readme_file = 'README.md' + self.history_file = 'History.md' + + self.extra_deps = [ + ['sinatra', '>=2.0'], + ['sass'], ## used for css style preprocessing (scss) + ['blockchain-lite', '>=1.4.0'], + ['ledger-lite', '>=1.1.1' ] + ] + + + self.licenses = ['Public Domain'] + + self.spec_extras = { + required_ruby_version: '>= 2.3' + } + +end diff --git a/attic/bitshilling/attic/ledger.rb b/attic/bitshilling/attic/ledger.rb new file mode 100644 index 0000000..1975e3a --- /dev/null +++ b/attic/bitshilling/attic/ledger.rb @@ -0,0 +1,34 @@ +### +## old "custom" ledger +## delete - use ledger-lite library + + +class Ledger + attr_reader :wallets ## use addresses - why? why not? for now single address wallet (wallet==address) + + def initialize( chain=[] ) + @wallets = {} + chain.each do |block| + apply_transactions( block.transactions ) + end + end + + def sufficient_funds?( wallet, amount ) + return true if Shilling.config.coinbase?( wallet ) + @wallets.has_key?( wallet ) && @wallets[wallet] - amount >= 0 + end + + +private + + def apply_transactions( transactions ) + transactions.each do |tx| + if sufficient_funds?(tx.from, tx.amount) + @wallets[tx.from] -= tx.amount unless Shilling.config.coinbase?( tx.from ) + @wallets[tx.to] ||= 0 + @wallets[tx.to] += tx.amount + end + end + end + +end ## class Ledger diff --git a/attic/bitshilling/bin/shilling b/attic/bitshilling/bin/shilling new file mode 100644 index 0000000..064793d --- /dev/null +++ b/attic/bitshilling/bin/shilling @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +################### +# == DEV TIPS: +# +# For local testing run like: +# +# ruby -Ilib bin/shilling +# +# Set the executable bit in Linux. Example: +# +# % chmod a+x bin/shilling +# + +require 'shilling' + +Shilling.main diff --git a/attic/bitshilling/config.ru b/attic/bitshilling/config.ru new file mode 100644 index 0000000..c34d57b --- /dev/null +++ b/attic/bitshilling/config.ru @@ -0,0 +1,11 @@ +### note: for local testing - add to load path ./lib +## to test / run use: +## $ rackup + + +$LOAD_PATH << './lib' + +require 'shilling' + + +run Shilling::Service diff --git a/attic/bitshilling/lib/shilling.rb b/attic/bitshilling/lib/shilling.rb new file mode 100644 index 0000000..bf7bdf5 --- /dev/null +++ b/attic/bitshilling/lib/shilling.rb @@ -0,0 +1,119 @@ +# encoding: utf-8 + +# stdlibs +require 'json' +require 'digest' +require 'net/http' +require 'set' +require 'pp' +require 'optparse' ## note: used for command line tool (see Tool in tool.rb) + + +### 3rd party gems +require 'sinatra/base' # note: use "modular" sinatra app / service + + +require 'blockchain-lite/base' + +### +# add convenience top-level shortcut / alias +# "standard" default block for now block with proof of work +Block = BlockchainLite::ProofOfWork::Block + + +require 'ledger-lite/base' + +### +# add convenience top-level shortcut / alias +Ledger = LedgerLite::Ledger + + + +### our own code +require 'shilling/version' ## let version always go first +require 'shilling/block' +require 'shilling/cache' +require 'shilling/transaction' +require 'shilling/blockchain' +require 'shilling/pool' +require 'shilling/bank' +require 'shilling/wallet' + +require 'shilling/node' +require 'shilling/service' + +require 'shilling/tool' ## add (optional) command line tool + + + + + +module Shilling + + + class Configuration + ## user/node settings + attr_accessor :address ## single wallet address (for now "clear" name e.g.Sepp, Franz, etc.) + + WALLET_ADDRESSES = %w[Theresa Franz Antonia Maximilan Maria Ferdinand Elisabeth Adam Eva] + + ## system/blockchain settings + attr_accessor :coinbase + attr_accessor :mining_reward + + ## note: add a (†) coinbase marker + ## fix: "sync" with ledger-lite config!!!! + COINBASE = ['Coinbase†'] +=begin + COINBASE = ['Großglockner†', 'Wildspitze†', 'Großvenediger†', + 'Hochfeiler†', 'Zuckerhütl†', 'Hochalmspitze†', + 'Gr. Muntanitz†', 'Hoher Riffler†', + 'Parseierspitze†', 'Hoher Dachstein†' + ] +=end + + + def initialize + ## try default setup via ENV variables + ## pick "random" address if nil (none passed in) + @address = ENV[ 'SHILLING_NAME'] || rand_address() + + @coinbase = COINBASE ## use a different name - why? why not? + ## note: for now is an array (multiple coinbases) + @mining_reward = 43 ## use country code for austria (43) + end + + def rand_address() WALLET_ADDRESSES[rand( WALLET_ADDRESSES.size )]; end + def rand_coinbase() @coinbase[rand( @coinbase.size )]; end + + def coinbase?( address ) ## check/todo: use wallet - why? why not? (for now wallet==address) + @coinbase.include?( address ) + end + + end # class Configuration + + + ## lets you use + ## Shilling.configure do |config| + ## config.address = 'Sepp' + ## end + + def self.configure + yield( config ) + end + + def self.config + @config ||= Configuration.new + end + + + ## add command line binary (tool) e.g. $ try shilling -h + def self.main + Tool.new.run(ARGV) + end + +end # module Shilling + + +# say hello +puts Shilling::Service.banner diff --git a/attic/bitshilling/lib/shilling/bank.rb b/attic/bitshilling/lib/shilling/bank.rb new file mode 100644 index 0000000..4207ba8 --- /dev/null +++ b/attic/bitshilling/lib/shilling/bank.rb @@ -0,0 +1,109 @@ + + +class Bank + attr_reader :pending, :chain, :ledger + + + def initialize( address ) + @address = address + + ## note: add address name for now to cache + ## allows to start more nodes in same folder / directory + @cache = Cache.new( "data.#{address.downcase}.json" ) + h = @cache.read + if h + ## restore blockchain + @chain = Blockchain.from_json( h['chain'] ) + ## restore pending (unconfirmed) transactions pool too + @pending = Pool.from_json( h['transactions'] ) + else + @chain = Blockchain.new + @chain << [Tx.new( Shilling.config.rand_coinbase, + @address, + Shilling.config.mining_reward )] # genesis (big bang!) starter block + @pending = Pool.new + end + + ## update ledger (balances) with confirmed transactions + @ledger = Ledger.new( @chain ) + end + + + + def mine_block! + add_transaction( Tx.new( Shilling.config.rand_coinbase, + @address, + Shilling.config.mining_reward )) + + ## add mined (w/ computed/calculated hash) block + @chain << @pending.transactions + @pending = Pool.new ## clear out/ empty pool (just create a new one for now) + + ## update ledger (balances) with new confirmed transactions + @ledger = Ledger.new( @chain ) + + @cache.write as_json + end + + + def sufficient_funds?( wallet, amount ) + ## (convenience) delegate for ledger + ## todo/check: use address instead of wallet - why? why not? + ## for now single address wallet (that is, wallet==address) + @ledger.sufficient?( wallet, amount ) + end + + + def add_transaction( tx ) + if tx.valid? && transaction_is_new?( tx ) + @pending << tx + @cache.write as_json + return true + else + return false + end + end + + + ## + # check - how to name incoming chain - chain_new, chain_candidate - why? why not? + # what's an intuitive name - what's gets used most often??? + + def resolve!( chain_new ) + # TODO this does not protect against invalid block shapes (bogus COINBASE transactions for example) + + if !chain_new.empty? && chain_new.last.valid? && chain_new.size > @chain.size + @chain = chain_new + ## update ledger (balances) with new confirmed transactions + @ledger = Ledger.new( @chain ) + + ## document - keep only pending transaction not yet (confirmed) in (new) blockchain ???? + @pending.update!( @chain.transactions ) + @cache.write as_json + return true + else + return false + end + end + + + + def as_json + { chain: @chain.as_json, + transactions: @pending.as_json + } + end + + + +private + + def transaction_is_new?( tx_new ) + ## check if tx exists already in blockchain or pending tx pool + + ## todo: use chain.include? to check for include + ## avoid loop and create new array for check!!! + (@chain.transactions + @pending.transactions).none? { |tx| tx_new.id == tx.id } + end + +end ## class Bank diff --git a/attic/bitshilling/lib/shilling/block.rb b/attic/bitshilling/lib/shilling/block.rb new file mode 100644 index 0000000..46ab0e9 --- /dev/null +++ b/attic/bitshilling/lib/shilling/block.rb @@ -0,0 +1,39 @@ + +###### +## add more methods + + +class Block + +def to_h + { index: @index, + timestamp: @timestamp, + nonce: @nonce, + transactions: @transactions.map { |tx| tx.to_h }, + transactions_hash: @transactions_hash, + previous_hash: @previous_hash, + hash: @hash } +end + +def self.from_h( h ) + transactions = h['transactions'].map { |h_tx| Tx.from_h( h_tx ) } + + ## todo: use hash and transactions_hash to check integrity of block - why? why not? + + ## parse iso8601 format e.g 2017-10-05T22:26:12-04:00 + timestamp = Time.parse( h['timestamp'] ) + + self.new( h['index'], + transactions, + h['previous_hash'], + timestamp: timestamp, + nonce: h['nonce'].to_i ) +end + + +def valid? + true ## for now always valid +end + + +end # class Block diff --git a/attic/bitshilling/lib/shilling/blockchain.rb b/attic/bitshilling/lib/shilling/blockchain.rb new file mode 100644 index 0000000..a040e64 --- /dev/null +++ b/attic/bitshilling/lib/shilling/blockchain.rb @@ -0,0 +1,47 @@ + + + +class Blockchain + extend Forwardable + def_delegators :@chain, :[], :size, :each, :empty?, :any?, :last + + + def initialize( chain=[] ) + @chain = chain + end + + def <<( txs ) + ## todo: check if is block or array + ## if array (of transactions) - auto-add (build) block + ## allow block - why? why not? + ## for now just use transactions (keep it simple :-) + + if @chain.size == 0 + block = Block.first( txs ) + else + block = Block.next( @chain.last, txs ) + end + @chain << block + end + + + + def as_json + @chain.map { |block| block.to_h } + end + + def transactions + ## "accumulate" get all transactions from all blocks "reduced" into a single array + @chain.reduce( [] ) { |acc, block| acc + block.transactions } + end + + + + def self.from_json( data ) + ## note: assumes data is an array of block records/objects in json + chain = data.map { |h| Block.from_h( h ) } + self.new( chain ) + end + + +end # class Blockchain diff --git a/attic/bitshilling/lib/shilling/cache.rb b/attic/bitshilling/lib/shilling/cache.rb new file mode 100644 index 0000000..b7f520f --- /dev/null +++ b/attic/bitshilling/lib/shilling/cache.rb @@ -0,0 +1,22 @@ + + +class Cache + def initialize( name ) + @name = name + end + + def write( data ) + File.open( @name, 'w:utf-8' ) do |f| + f.write JSON.pretty_generate( data ) + end + end + + def read + if File.exists?( @name ) + data = File.open( @name, 'r:bom|utf-8' ).read + JSON.parse( data ) + else + nil + end + end +end ## class Cache diff --git a/attic/bitshilling/lib/shilling/node.rb b/attic/bitshilling/lib/shilling/node.rb new file mode 100644 index 0000000..cec219d --- /dev/null +++ b/attic/bitshilling/lib/shilling/node.rb @@ -0,0 +1,82 @@ + + +class Node + attr_reader :id, :peers, :wallet, :bank + + def initialize( address: ) + @id = SecureRandom.uuid + @peers = [] + @wallet = Wallet.new( address ) + @bank = Bank.new @wallet.address + end + + + + def on_add_peer( host, port ) + @peers << [host, port] + @peers.uniq! + # TODO/FIX: no need to send to every peer, just the new one + send_chain_to_peers + @bank.pending.each { |tx| send_transaction_to_peers( tx ) } + end + + def on_delete_peer( index ) + @peers.delete_at( index ) + end + + + def on_add_transaction( from, to, amount, id ) + ## note: for now must always pass in id - why? why not? possible tx without id??? + tx = Tx.new( from, to, amount, id ) + if @bank.sufficient_funds?( tx.from, tx.amount ) && @bank.add_transaction( tx ) + send_transaction_to_peers( tx ) + return true + else + return false + end + end + + def on_send( to, amount ) + tx = @wallet.generate_transaction( to, amount ) + if @bank.sufficient_funds?( tx.from, tx.amount ) && @bank.add_transaction( tx ) + send_transaction_to_peers( tx ) + return true + else + return false + end + end + + + def on_mine! + @bank.mine_block! + send_chain_to_peers + end + + def on_resolve( data ) + chain_new = Blockchain.from_json( data ) + if @bank.resolve!( chain_new ) + send_chain_to_peers + return true + else + return false + end + end + + + +private + + def send_chain_to_peers + data = JSON.pretty_generate( @bank.as_json ) ## payload in json + @peers.each do |(host, port)| + Net::HTTP.post(URI::HTTP.build(host: host, port: port, path: '/resolve'), data ) + end + end + + def send_transaction_to_peers( tx ) + @peers.each do |(host, port)| + Net::HTTP.post_form(URI::HTTP.build(host: host, port: port, path: '/transactions'), tx.to_h ) + end + end + +end ## class Node diff --git a/attic/bitshilling/lib/shilling/pool.rb b/attic/bitshilling/lib/shilling/pool.rb new file mode 100644 index 0000000..d9002b1 --- /dev/null +++ b/attic/bitshilling/lib/shilling/pool.rb @@ -0,0 +1,42 @@ +#################################### +# pending (unconfirmed) transactions (mem) pool + +class Pool + extend Forwardable + def_delegators :@transactions, :[], :size, :each, :empty?, :any? + + + def initialize( transactions=[] ) + @transactions = transactions + end + + def transactions() @transactions; end + + def <<( tx ) + @transactions << tx + end + + + def update!( txns_confirmed ) + ## find a better name? + ## remove confirmed transactions from pool + + ## document - keep only pending transaction not yet (confirmed) in blockchain ???? + @transactions = @transactions.select do |tx_unconfirmed| + txns_confirmed.none? { |tx_confirmed| tx_confirmed.id == tx_unconfirmed.id } + end + end + + + + def as_json + @transactions.map { |tx| tx.to_h } + end + + def self.from_json( data ) + ## note: assumes data is an array of block records/objects in json + transactions = data.map { |h| Tx.from_h( h ) } + self.new( transactions ) + end + +end # class Pool diff --git a/attic/bitshilling/lib/shilling/service.rb b/attic/bitshilling/lib/shilling/service.rb new file mode 100644 index 0000000..fc74db1 --- /dev/null +++ b/attic/bitshilling/lib/shilling/service.rb @@ -0,0 +1,113 @@ +# encoding: utf-8 + +module Shilling + + class Service < Sinatra::Base + + def self.banner + "shilling/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] on Sinatra/#{Sinatra::VERSION} (#{ENV['RACK_ENV']})" + end + + + PUBLIC_FOLDER = "#{Shilling.root}/lib/shilling/public" + VIEWS_FOLDER = "#{Shilling.root}/lib/shilling/views" + + set :public_folder, PUBLIC_FOLDER # set up the static dir (with images/js/css inside) + set :views, VIEWS_FOLDER # set up the views dir + + set :static, true # set up static file routing -- check - still needed? + + + set connections: [] + + + + get '/style.css' do + scss :style ## note: converts (pre-processes) style.scss to style.css + end + + + get '/' do + @node = node ## todo: pass along node as hash varialbe / assigns to erb + erb :index + end + + + post '/send' do + node.on_send( params[:to], params[:amount].to_i ) + settings.connections.each { |out| out << "data: added transaction\n\n" } + redirect '/' + end + + + post '/transactions' do + if node.on_add_transaction( + params[:from], + params[:to], + params[:amount].to_i, + params[:id] + ) + settings.connections.each { |out| out << "data: added transaction\n\n" } + end + redirect '/' + end + + post '/mine' do + node.on_mine! + redirect '/' + end + + post '/peers' do + node.on_add_peer( params[:host], params[:port].to_i ) + redirect '/' + end + + post '/peers/:index/delete' do + node.on_delete_peer( params[:index].to_i ) + redirect '/' + end + + + + post '/resolve' do + data = JSON.parse(request.body.read) + if data['chain'] && node.on_resolve( data['chain'] ) + status 202 ### 202 Accepted; see httpstatuses.com/202 + settings.connections.each { |out| out << "data: resolved\n\n" } + else + status 200 ### 200 OK + end + end + + + get '/events', provides: 'text/event-stream' do + stream :keep_open do |out| + settings.connections << out + out.callback { settings.connections.delete(out) } + end + end + +private + +######### +## return network node (built and configured on first use) +## fix: do NOT use @@ - use a class level method or something +def node + if defined?( @@node ) + @@node + else + puts "[debug] shilling - build (network) node (address: #{Shilling.config.address})" + @@node = Node.new( address: Shilling.config.address ) + @@node + end + #### + ## check why this is a syntax error: + ## @node ||= do + ## puts "[debug] shilling - build (network) node (address: #{Shilling.config.address})" + ## @node = Node.new( address: Shilling.config.address ) + ## end +end + + end # class Service + +end # module Shilling diff --git a/attic/bitshilling/lib/shilling/tool.rb b/attic/bitshilling/lib/shilling/tool.rb new file mode 100644 index 0000000..6896304 --- /dev/null +++ b/attic/bitshilling/lib/shilling/tool.rb @@ -0,0 +1,66 @@ +# encoding: utf-8 + + +module Shilling + +class Tool + +def run( args ) + opts = {} + + parser = OptionParser.new do |cmd| + cmd.banner = "Usage: shilling [options]" + + cmd.separator "" + cmd.separator " Wallet options:" + + cmd.on("-n", "--name=NAME", "Address name (default: Theresa)") do |name| + ## use -a or --adr or --address as option flag - why? why not? + ## note: default now picks a random address from WALLET_ADDRESSES + opts[:address] = name + end + + + cmd.separator "" + cmd.separator " Server (node) options:" + + cmd.on("-o", "--host HOST", "listen on HOST (default: 0.0.0.0)") do |host| + opts[:Host] = host ## note: rack server handler expects :Host + end + + cmd.on("-p", "--port PORT", "use PORT (default: 4567)") do |port| + opts[:Port] = port ## note: rack server handler expects :Post + end + + cmd.on("-h", "--help", "Prints this help") do + puts cmd + exit + end + end + + parser.parse!( args ) + pp opts + + + ################### + ## startup server (via rack interface/handler) + + app_class = Service ## use app = Service.new -- why? why not? + host = opts[:Host] || '0.0.0.0' + port = opts[:Port] || '4567' + + Shilling.configure do |config| + config.address = opts[:address] || 'Theresa' + end + + Rack::Handler::WEBrick.run( app_class, Host: host, Port: port ) do |server| + ## todo: add traps here - why, why not?? + end + + +end ## method run + + +end ## class Tool + +end ## module Shilling diff --git a/attic/bitshilling/lib/shilling/transaction.rb b/attic/bitshilling/lib/shilling/transaction.rb new file mode 100644 index 0000000..77ab849 --- /dev/null +++ b/attic/bitshilling/lib/shilling/transaction.rb @@ -0,0 +1,30 @@ + + +class Transaction + + attr_reader :from, :to, :amount, :id + + def initialize( from, to, amount, id=SecureRandom.uuid ) + @from = from + @to = to + @amount = amount + @id = id + end + + def self.from_h( hash ) + self.new *hash.values_at( 'from', 'to', 'amount', 'id' ) + end + + def to_h + { from: @from, to: @to, amount: @amount, id: @id } + end + + + def valid? + ## check signature in the future; for now always true + true + end + +end # class Transaction + +Tx = Transaction ## add Tx shortcut / alias diff --git a/attic/bitshilling/lib/shilling/version.rb b/attic/bitshilling/lib/shilling/version.rb new file mode 100644 index 0000000..60369bf --- /dev/null +++ b/attic/bitshilling/lib/shilling/version.rb @@ -0,0 +1,11 @@ +# encoding: utf-8 + +module Shilling + + VERSION = '0.2.0' + + def self.root + "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}" + end + +end # module Shilling diff --git a/attic/bitshilling/lib/shilling/views/_blockchain.erb b/attic/bitshilling/lib/shilling/views/_blockchain.erb new file mode 100644 index 0000000..ba39805 --- /dev/null +++ b/attic/bitshilling/lib/shilling/views/_blockchain.erb @@ -0,0 +1,37 @@ +
+

+ Blockchain
+ <%= @node.bank.chain.size %> blocks +

+
+ +
+ +
+ <% @node.bank.chain.last(10).reverse.each do |block| %> +
+
+ <%= block.index %> — <%= block.timestamp %>
+
+ + <% block.transactions.each do |tx| %> + + + + + + <% end %> +
+ <%= tx.id[0..2] %> + + $<%= tx.amount %> + + <%= tx.from[0..15] %> → <%= tx.to[0..15] %> +
+
+ <% end %> +
+

+ †: Miner Transaction - New Shillings on the Market! +

+
diff --git a/attic/bitshilling/lib/shilling/views/_ledger.erb b/attic/bitshilling/lib/shilling/views/_ledger.erb new file mode 100644 index 0000000..35b4b09 --- /dev/null +++ b/attic/bitshilling/lib/shilling/views/_ledger.erb @@ -0,0 +1,15 @@ +
+

Ledger

+ + + + + + <% @node.bank.ledger.each do |address, amount| %> + + + + + <% end %> +
AddressBalance
<%= address[0..15] %>$<%= amount %>
+
diff --git a/attic/bitshilling/lib/shilling/views/_peers.erb b/attic/bitshilling/lib/shilling/views/_peers.erb new file mode 100644 index 0000000..0c1a972 --- /dev/null +++ b/attic/bitshilling/lib/shilling/views/_peers.erb @@ -0,0 +1,24 @@ +
+

Peers

+ <% if @node.peers.any? %> +
    + <% @node.peers.each_with_index do |(host, port), i| %> +
  • + http://<%= host %>:<%= port %> +
    + +
    +
  • + <% end %> +
+ <% else %> + No peers + <% end %> +
+ + + + + +
+
diff --git a/attic/bitshilling/lib/shilling/views/_pending_transactions.erb b/attic/bitshilling/lib/shilling/views/_pending_transactions.erb new file mode 100644 index 0000000..7cdef8d --- /dev/null +++ b/attic/bitshilling/lib/shilling/views/_pending_transactions.erb @@ -0,0 +1,23 @@ +
+

Pending Transactions

+ <% if @node.bank.pending.any? %> + + + + + + + + <% @node.bank.pending.each do |tx| %> + + + + + + + <% end %> +
FromTo$Id
<%= tx.from[0..15] %><%= tx.to[0..15] %><%= tx.amount %><%= tx.id[0..2] %>
+ <% else %> + No pending transactions + <% end %> +
diff --git a/attic/bitshilling/lib/shilling/views/_wallet.erb b/attic/bitshilling/lib/shilling/views/_wallet.erb new file mode 100644 index 0000000..74d383f --- /dev/null +++ b/attic/bitshilling/lib/shilling/views/_wallet.erb @@ -0,0 +1,16 @@ + +
+
+

Address

+
<%= @node.wallet.address %>
+

Balance

+
$<%= @node.bank.ledger[@node.wallet.address] || 0 %>
+
+
+ + + + +
+
+
diff --git a/attic/bitshilling/lib/shilling/views/index.erb b/attic/bitshilling/lib/shilling/views/index.erb new file mode 100644 index 0000000..720fbba --- /dev/null +++ b/attic/bitshilling/lib/shilling/views/index.erb @@ -0,0 +1,30 @@ + + + + Shilling Central Bank Node - Rock-Solid Alpine Dollar From Austria + + + + +

Shilling Central Bank Node

+ +
+
+ <%= erb :'_wallet' %> + <%= erb :'_pending_transactions' %> + <%= erb :'_peers' %> + <%= erb :'_ledger' %> +
+ +
+ <%= erb :'_blockchain' %> +
+
+ + + + + diff --git a/attic/bitshilling/lib/shilling/views/style.scss b/attic/bitshilling/lib/shilling/views/style.scss new file mode 100644 index 0000000..e75723b --- /dev/null +++ b/attic/bitshilling/lib/shilling/views/style.scss @@ -0,0 +1,172 @@ + +body { + padding: 0; + margin: 0; + min-width: 960px; + + font-family: 'menlo', monospace; + font-size: 14px; + + background: #fff; + color: #2B2D2F; +} + + +.columns { + display: flex; + + .left { + width: 50%; + } + + .right { + width: 50%; + } +} + + +h1 { + font-size: 24px; + font-weight: normal; + padding-left: 15px; + margin-bottom: 20px; +} + + +h2 { + font-size: 16px; +} + +h2 span { + font-size: 14px; + color: #597898; + font-weight: normal; +} + +label { + display: inline-block; + width: 80px; + text-align: right; + padding-right: 10px; +} + +input[type=text] { + display: inline-block; + font-size: 14px; + padding: 8px; + border-radius: 0; + border: 0; +} + +table { + border-spacing: 0; + border-collapse: collapse; + + th { + text-align: left; + } + + td { + vertical-align: top; + padding: 5px 15px 5px 0; + } +} + + +ul { + list-style: none; + padding: 0; + margin: 0; +} + +input[type=submit] { + font-size: 14px; + font-family: menlo, monospace; + border-radius: 5px; + padding: 8px 20px; + background: #FFDC00; + color: #2B2D2F; + border: 0; +} + +input[type=submit].small { + font-size: 10px; + padding: 4px 10px; +} + + + +.wallet { + padding: 15px; + background: #7FDBFF; + + h2 { + margin-bottom: 0; + } + + .balance { + font-size: 30px; + } +} + + +.pending-transactions { + padding: 15px; + background: #A3E6FF; +} + +.peers { + padding: 15px; + background: #C6EFFF; + + li form { + display: inline; + } + + li { + padding: 5px 0px; + } +} + + +.ledger { + padding: 15px; + background: #E3F7FF; +} + + +.blockchain { + padding: 15px; + position: relative; + background: #001F3F; + color: #fff; + + form { + position: absolute; + top: 30px; + right: 15px; + } + + .blocks { + border: 1px solid #597898; + border-bottom: 0; + + .block { + margin: 0; + border-bottom: 2px dashed #597898; + padding: 10px; + + .header { + text-align: center; + padding: 0 8px 8px 8px; + color: #597898; + border-bottom: 1px solid #354c63; + margin-bottom: 10px; + } + + .id { + color: #597898; + } + } + } +} diff --git a/attic/bitshilling/lib/shilling/wallet.rb b/attic/bitshilling/lib/shilling/wallet.rb new file mode 100644 index 0000000..94b09cf --- /dev/null +++ b/attic/bitshilling/lib/shilling/wallet.rb @@ -0,0 +1,15 @@ +########### +# Single Address Wallet + +class Wallet + attr_reader :address + + def initialize( address ) + @address = address + end + + def generate_transaction( to, amount ) + Tx.new( address, to, amount ) + end + +end # class Wallet diff --git a/attic/bitshilling/shilling.png b/attic/bitshilling/shilling.png new file mode 100644 index 0000000000000000000000000000000000000000..24ba5d638fa16472fcfb46fd76f0041d9880fbb0 GIT binary patch literal 64978 zcmce7g;N|))GZ;nJHg%E9fDhc;O_437Tn!}2X|+2cL@+YI4msg?!3+K`~HDf_3BO4 z*7Quxbobo8bM~Hd??io9ltxCtM}UBUK$ew}P=SE>ObP++Jo!BSb8Y9vW^LTZ?;e)X zPttFa(EdHA2S0OjS6BQk133gsJHiQbb37Y`@%Tw1!8lKdA} z;)l;2tv>e`nlxj9WBV8h84<~%SlB#%+$Ssk61TiXRtS?dASk8 zKGw5|xX*x?I>P&Vsf1`vo5gF;8u9$L-q z{gv|g`X`5?lcBo^+!;7cUk~&-HzEPj`qllc-bO;AU~+ZH+L_oQ#&=a#O-R0s&5eo`a z5i_aP{NDaNBWEk>(Oo~9Kn*rbWw+XGwO{lV2>CuxV{J%AJ86sipg274+(#94c%CnK zZ`(S0MBjUou$deD?ee}Uor-X=cR*Fk$x5`A2+Me||6Bjmr>qatyx!)0Qp&XEnoCT=L!G_b6JxE4MS&P| zvDi7UYTp@f|F*4OwU50O>1uQKtf1TKAmlW$ceSIUl%lc6Us?_$+X?CaU7$y_otgbk{M33as3)kV`~nd7o0DM zJ$pfzT21}Qu7?Lbbu;uGb*bfW)7D(NX9B$hA_3>d3Akcq8UEL98F?uhIj)z}e08X+ zPQ!1cELrS+w}mNu)4*G8Q(ynCWAfot64K5nswXuSgR@V_=e$`RJDF@GdQ3nB7Doa$ zt8d|lo(@ma_G=zL+pp*g8+-8XpI7aG)*RT_*aX@`naEVb!&H(mGx7kg6xf!t)!k8{ zqtvH~;(|dO8uShKqrO$4(PRY;-|?jUj$VF-lW;d*I4dc#_uhw5ef8`+q+j*(J)XxG z@F+3EK;EvykkX4zmI(VD`Ojjj!>Ju0QN+s{9pY5W
K-uZl6ki}L9~bA)lqLrYFh?o2WMnlkHV zdcMe0f66rzvzM6dcDd7*@1M0FFUZwoj*c{8?xNvUJYOy!ZeJm1W43s!eP4{TC0gtK z)JEB2QZ^h0K>4=9Z$1T<2Qc@yJ4)_`X(QeqLc9S-n--7vCNrDJ@c|sSD@UDz0>Skc zHwA#ax7oAJE9-<>juy1#l?$7eTst%&7QZW<6j@&hOXy<9Jgtfsv&|+=siWKb+@;O2 zrv$d#t#z4bzwMZ^lV1MOGw<7ZjnCAlo}JKSWtx7i{;lb^YnCS{Prx5*-5+a7DLkoF zP)Xw~ztw-q@y|o2664Q5<;zH&UZ=G=&xON3kc0hQcctpg5e7Vq zRs+4WFk@+aMIKx#Co#=t+s;jK^he4>eyMk>^Erqt?~y5#T`=_5Hr+@eW#(?*W7h^4 z_Aal#?7{sr@rMvSe*eJX$+Uj6!@)k_%`d(=>H=_`j7%oy)X}Ve5)+|MI4tusyNEJp z1LXYH%d6Mgb!MWixe*Q!bO=h48)_&&%=*+~i#tRo9>GjlNeGnI!zP=5s*FLx0UI8H z<*Y?u>6@SHZTW1`X!rYFMT~TO-smP_SyV!_E37lHtJr+kz$5-3w{`kEP%Z0Fht0ur zl1;>KokGP;C*XbWEW;3w>;8^S7lSJ2j_km`oiO}w?FmoyO1;NT`qN@Wiyv42%|6pz zNdZgT7a@<^DiT9pAOH8W-$$uye(H7H(5mmlyJVvk;_-CfeZrQpObxF%%bn8czU8TlK zwsaNSWD@&Xra`X2t)lJqaN`b_(7We0k$#oSbcJhccjdedr`uR$W>atO+ff-uDa&fM zo0E<1DHCZB=zJ`u&sEU>MP4SzQomK{HEUMnG}80J+qLIyzv_ZNyrJ4@8Q0A-%>B!d zS~mew)Vz5K_RW~r{n3a%LF|k3G>>6`kf~n{n!rT>?kHkTQ#C|ht4H-9#>T~b?nP+# z+iEN#7I}&^oRu*D3=3G!nr3BBvxK$$aRU@IiJ-|u_k2$( z>1Qgl->45*n|9|guy;kpra*KME+*l*Pdmz^lRG+?*-It&t|0@k1iqi)=oF05g4lJw z6*BrGr7M9H8HCde$xZ>m?XDSzKJ;jWo_j*HN zq>a~wswVm2L2QaVvWP^(m>__@bVe>+8Y!`4YpR7quCGjv`e@#VPr{{1#Ip?U7X29S z2ji7M$K_j$CKEyf1e3tR$8HMAbrRBYfm9gFzEJJwe>QxTuJ~$H@iu6V$ME8IxL)Er zGo1_D-F6I=&LzJT*E=HEuDgysDEEWxQm3qaS})wU7jP%()YEh-)jeP?qN$;vpxtk- z*v&gzF#luTc{O>^39!ClSI@u_&&&FPsQIXzHu$^ys@jaPi zZ&5hnP#An%E}hv%l*^+Skqiw4ZqvPQjul029xJr;xCt)y8P)I6NOU5 z+xd)cGgZIt(@EES_oMZ8*P8;vj;&Q||B&10H5kAxi4uO3yF?iZ5iFxKw+}$GTrXA3 z^1y$t+ccwrfO!JNZ>hxer8OhRHKG8`R}S9qY(&F^~Abn!6cqXcEq+^U+nQ-()n*Y@&Kax{{hYA z-z%s%BlLJ?zlT;;l#0++0TY@xR{FoY$p3Y4`Q<7Up7DSC%BMNPCi}15hxrNaf6q!I z{l9K;aloffe1g~>|4J@SXURP6YoDr8cH;$}u3-9i5`)h{&=7qoL2B_BN;z+DVWMM` zYr9}lbg3n#(1il#BR^<9Momt>7PC#O=D2(PGU%7;(%z$>hSjxFUNjDbC%DefvAg$AgQ6V7C5pljSF19#3&+}5Se1AN6kqBACjh2ExngIAhqEV1a-By1$Qf}UE z)Uhtf;^cnh)zGv%4~h~GFqj$yB4s=8V!Dy0IqDooIK^ebx;cT%_@dE39jvG!D zC$@>1Or@ww1E_#frc%;H$QqWd8Dret%v6FaV!q!YGv18_>`BCUTKeswn#*S{db%9D z5i?WE4?N{5>=$PTS;&eHF{njOENHN-c*@4`E7gjPwyj0v&dYm7X4kwIXx;Ns(eg?C zpmJ=X9IzE~S;J*kRzWOi>~Tt9_3> z1sQ^e{*FRiaaS9~Qi9$JPj=I5GDtH}sQI$5k-$xnUY>&hg)=Ci8ef0qs8Fa>!=;;~ zXRY{C(B&!Svr9@06#`|3Ik8{u!F7_ObB;u%)DhyAqKLo6#Ub%a&-xf$5`*c*JDbpw z$ip#Ux1F6u?ee88+u#(?vK2#jgwl@d`}US}5^=Bhv94R96&*AJ39*e%eyLG}NaaAx z=iz}P#xmk6Q@d#EggFYY#hR9Gv-LqqW2}1(x-)%|C@KU-me$1QujTsLADqt+XfvYF znA|kKn|eCRYuz|_`EcWlFnv6?EKKT3iI8ZjsU2@r?#@oWDB5SC6^;4W&dxE=XyyvF zI-DWaV5i!=k4w(Oa7QEG0;}({&bCCFc27W~JS7HO{5=3{P863ksMyDmr~sGXY188wbN&*`F*{OJpi^;seVsS=SboWUHcFyNM};F1=w>u80SdFx7x_jYAnH|j_O}O_!lWah z_pni;rVxpSVEL)Xpvp3<)#h39L)Ouc=i&X|@3vlvvZfsWNk3)W!vf=%stXcftF)y7$TVCg`1m+@MKr%DsSEA+Ko8Q*#_I8to z+~e^IIxAp5&uyR3q2PaGrF+OO)4V;)$T|161_$|<<-e$0QaidGH_&@6)YjOFVClJ5 zh_peQ zF{Kw|Sfnws(*Jl{Hffh3$OD33>0=U@-W$x-3`#$dABmH>+b}f7D+=WO2;Seg%j|gKEU8YL;A%A^nb+o(k+f88 zjVuZY<7Zt?s?=Gqh4~)j>GLfoJL&&{f?cHT=rP+EH%FwRf?5CRq=-o)3K^k?Gjx@N zUbEL;rr7zLO0bZwY$eB|ziKL5+1RBlclY1 zgx}YNTfB1eRL(bvzetc`@%dRTyJkkz)(h7qe7p{uZZMTuP`y8nPXo6RDGZNZRCs9VIJA)GLeO&Zt36PXOX+2n)O zB72Vo&V5-JmQWo^!qk&qq{9O}R->WNP{QB1JZXvYgx&jmK~fj<%U^O%@3#uYDNJ4b zhsCvAcFYzF2}0(F=xEWhci-MUbqIgjp$hg#S#x+Kj~>Bz_Hp(H-Py&)>unbABX97sd|W3Bf=#BAjU3wS(5)|j`fuPP67&>0v%LM6`&H?la46fm zF~I^UkS;7Z@BxJ6*6M7)Xp%G6E)wnnkW)Jd7M6Fpg-eQkVIysklD)~QrVvjLn6ljt zy<{BOER1j33*C~(WH2Y!P4P`PeHdjy(BIV6lylH%BiCj2CY!qkkJebb8kLug1`$n1Ilk#B}ma$#)f?tz-}tN9&hroMAe> zM>LdgS3}RSuxtpDNo-7cH*L<}$jjEzub2~fGiZ1rAo@aFNd&YMVV|l|L&ARQiB;>i zd(z>L??nzv4|^y`tqKoyB&yoQ;^7^&@M}|MB-6Hi(iltJl`^UbZ8pae_xY`XGj0~? zjP6duXU7k1dF3|(|66- zk{KA=zqp{`(plAi}S9>#?4@(?F%9? zW*#pzJ{46ZbKV>cor2>%8^uFCN}N^*a1A^*{DyY$=EFR`Xp{(6ccGI=zDFzfS6=kRDg|+qWZdBs&$^gl~i0_l`k*{H~9wp zwl*@_MS29}h7lI}VIms}!ph8y2cbK7Yc-yr_^Ij}57F{M%xt>(!c<9QN_zYY$uGzH z71H#A)Z`kC!$P6Iuhgn28sLn9fXo`2l$_|c=S42zzu||Ctr%;tD49zcS#h-f#)VP07ezP$CQrq~)m!8}9?Zhkp!)-GQ0ZZt^) zECh>RW61T1xKXB+ny#nD+iGz8n*lfwfQ=yNvkQWx9XDzEd7k2S#LJyosQ zHjIbLp^;ZNK-jProT>P?1=2B>ksh?6gfu=c?!-#ruN>YSG%sJPz0|3yAY|He0_kEx z=DZsC4TW18YkZnR{z|c6YC+PY9Zu}DSQ#!kv`Zd42~uea*pBKzhphLJiwB>(Bmu{? z+b4mMR)Bhi(kQYi-_9V-5! zx^tb^X)5~vV@d~h;_?u!Xc ze;zeu_Vc#*H0G$|MPokp2y4@q4QvT%m3iF7jk-_B-uI0*%gyYIRtbhtku4i-G$ z#YL;w2P7JQ_Z6V`b*DB$-mOL-J`?^`XIN9N!P?;`g*i8q|3_Cjfv7{~IS z_p?ZO*t+MgN8h!)0!<5{z_VoKxxKh}mR8Vd-Z$_XzoVWD!^U*s8|~rONKLOWQ8%Ui zj&woozNubdXp~C@UeCHx3NzK{m5I+EPv}o(;5s7|j%%g6;o-r%aPMCdny|s`e6Dmc-j0{=+A8O%xrL}GA%nX`tsobIhpZ4PQaLhZ zA76R*9t0wBii{+6&dhe!7G-Pa9tP)WJ@0u3&ffP`S;{Yr(ff|~TFs@6L)JZ)H;W7g z#&HDZAMd$olQV*%Jnue^qh;bm8dytjVSUe2do)Y9{O3*U^k8)SKxG+o`;=BhZp-69 zbY9nC?ov+Lh7}Z-)mn*x7YSwgyfX#MQNzCexWnqA0HC%f;HfT2cW%48jjCO%R+zjr zVyW(=&BE1t{yPG|YL+L`Y4u)fxl#{7*X>C_g6K1Z(GWBjF=-WRq%gw-p$PB2lbHk} z;mH2|P~6y!2c}Dd`e!#}+amx@5T_%;=Y*3qAVs``Fx2*&j@FKjGyy1_aHQrNpwuc! zt|N9P)Ip)~3g_k~-TewKe%wpD1=CPf>Z+6DX32dZed^>m+@Uc2{Sn&~br01pq|Q6* zRQu^!-26wPT=H~4rkeSoyzsk@iZD2p)C+~+xo!6}j;okIMO&|G1{_e}4T`^2HISFP zLW#annM{P%Q?XBLV{H%gQ-ka9I`>m-fL4YKTS#KczFvX%uyg{z zd>Xe@GL&a%bEmTc_ui@EY)a;YvLy8Jbz8d%Z<2A-+QNRe$DY~X?dafSO+(jC#z{*H zR(m(5iOk%OWvyU5Lt|P=Bui8^OmqKTr926i)kpDI(t3ubcFlq<+sK{}?6PuDl#7~m zi+xJQ^{X5C%)UlesY#hSS-HAH90-|6S8ZGa_P9?)x3ha@r8s6(t2HVYeGrxtT&4}P zM{e+hBzi@%v1bc+lmdl~O(~~A&R6JZev)foDdkmL2KT`5NhPMkTgUSY{_thwoYZp| zG+V61FRW)9E;IHLYD$BHlIv*4y8ElSP^pS8KlOsU+a8-aR4lX-c=-6J?~jtU4C=|Y z>KJJTL~26Cu0-MLPZ}}lFGJF9)@7*`?`di95Pe%C`p9v~D1?$^+#&)~jEE?AIM+AG zd9&1?s_657k-E!P092g5252;@euq(u66G6*DcdH&p=mv6=&1Z;P+BdBg;B!5$a*RB z%RE5N+PQ&KYFCc?Z}EQN?SKk>hbUmKSOT|$trIM&e4ws(7KAnAvV-vZZyGPQg0R|= z7Rn|E-7y$7LkeQ`@?K66tndqzUfyk6*w<2-ADAI&EchT?!?m(-8B- z)dIs<0)gj8^!EiVLV1IoSx&Yuss_+Io5T#v;$%sQj`mu(Pn2j8q%F|UE^rSNB`R}i zLk{apDMluvS^Wv0^1k4@N2yXf-T$hE*iQNpXvK(4XjZp(Kq)dxLlP|}DJ5&u5zUB2 z7M~Z=2PWfDI|ly=Scuiaya-onPp!sE+-;`ei;HmvU;NPj6Lb5vP;kh#;>WxwKU(eP zbeH!2?*%PyFAn6w8f8j+EU*;zDA1lj#Mqhpw-78%JeKt#Cw&Y5Qk_DNrNx;{JIsR2 zH^eWqo&7zM!y-GnTIGTikg>mI+6f6(*@AqvUCPQ2@_cKXn^PgZ5BJ;*3$z)`4opHkwk={1Pnut zoiZ$) zR|JhT7;#|tHX*CbC(~bA9AW>7kRlfMUDK%hx$U!_s90F|;z>B3$dqWsh>x_cF$ z>kO6SBb77A@?`Uiij6o{f>y)^(}Wcry-*9M@f(oAHT>ddYn(>GAO!`=@2A__Tin(e z12WZuF64`g*V`0CM2ixdtS@V6m`#Sg9rm*gJTQhzob%^FZ2tl%aH5_F8;+6Esacq_ zO&fRX*W5|O%!zmr;mB)YvmLdwyaAiGGyqBT>*lQS6Rskjt32WI{a-%HBp6ut{3R1L z5mz~OO}De#Y1HxeCqq@V*UeJ!V$ zzllaH;uao2r8=DFp6A~)B3@6Em&#I6#Wq|N>SN6^4g#IKxk~u&jm>9>Q@PB}S?Ll? zDXPrbxh7wN0G-hYXDAZ#>rIW-YK#3F>5N|Im!N5urR~%6^?xIQ0oZ<>tR6~YHui3z zFs{3kNH{91`>!_9+TR}k$K$ID8Qwsh_{PAWjdvT??Un%>{5EQz)M*%r&jMRsqEfg? z`iHL~Jy-eCv9)k*Tfe^pbb9BGw#RC#o|}bQxEP$a_iTRG#jM`xtTxDt1-}qT{Ws>1 zKr-x~*1sraYQ-U?hj45~gP~;8fXpGhm>9(}m82w}ubKB6Nu#p5IQO(o2q(?ORG5I( zk!4AGL8sIblQKp*D3;RIh_alK-<~m2Ku*EnPEkL9a|u-GPe6-^aXSLd!8WOflMpbv zIPW1xVtI~2@41l&k>i9r*=3{%x=611@MP@5rF8a^}ue z7BZdgVHPY4w|_V4?%B|VrK_%3ksPb6Tx^xTSvAgtA6M)|TP;;ZHcZXTtt(e+Qjg$X z+%>6^dNELvq1f=xX?$s?Li9hb*l*^l`)ee=nuw$1UTL76ost4FsUQ%873rfaa9?e< z*G9}ljEPo|0d94v9_X<3wDV~zGB!`#q9u=Vonc*=%1_d!hVz_kv|GCYY=R7~ySnV+ zhcV))9L=EORn%=ZYlt#(ts40c`@*|@o1@{3FzPJOwZrox1(~9`iQy-7m^#XdqNu|3 ztkxWevX-PvqQYPpsU{oeHEhugvy%EJ2Y@!}OHhk8v&~X!fGlOQ=;Fz!<1C`iR$DzT zmB2eW`lO$IrqDC6P|z!O+)cAGS(FJZ|NQY4`?8CjUC{Y$ok><$!PeV*#FW*Haa8v7 zB4tW6++NV=s3-x&y(X`>mbWk-m!V?4B*b_onQOErS7%v8Ey`R4kuYczBf8PjaJ9)~ zyp*Vn5vI&ZwHaQfFfL(%DplsSnZ4TX)vsIe!Z5H|h6Ec&OsYw+07|C_D37`9$Xi^i zqF-rb!)@#3JySV#a{sehtA0x+?x0J&ijT-5PA3k!hvDWhi%Oo`p5Ho6ULPeLrGo9Y zJ#TF1YYsan_qve_{T^Jq*fC(K=IwsX{wOG}%9jF`VAjRyB)nh`D%a1*PrvM2r37Q; zs$k{eFk*%d)CbMo)kBFFigFf&i1u;8oq!^iIW^Hn!`&Cv8uhC0ldD?+ zTlGh*u|`7g>xM=_LjN*3+aD20tH~%Jf>&|+_PKc`P`FL%4)Ut!`FyA9jDddMxpq|+ zttcF4vQBb*o}{pkq^v=O1ZZ$yV6d|VP8D?6Y&THRY=XF(P65d#FL8 zs-1U8n>k;^-t|hNmbIMqt`IO(n#2KP3a`wHB9J7ZHLQ)a618llfX0sN5I_)Z5ZoeSdzpUOZLO|TMm zNyyT3up>)X%$^xq8f7dS*4ukLumTlYLR?-&6Z8Vd80~?j-v-3m0@Ee%pQU&R0ILMm zaWW z!7E;-!jH?XUysjv6KQ@Kyqz&kD@4HdZH2x9Ju@I~euL{%2bV4eyMkm1j9*XA{0?QK z5)sA`5z$tQ?&RN&sm`#MgNqOUm3#e&=(sQo+jdK~baf26DL%B}u`75Vr!p2q`0o_i zL`j-I`*sy2UF#)i>5`8UgL|7npeW-I7_W-)g$~_cvIjwoud#GAJq@T0liNMI4(K4T z0Rs_!hTKUE@ZSP_-5j@LD1{9S+zdR>(N)fQd>$|C31AS}MTxd50>wol7DS|M1a!+0Y*)IBC9J-qnaaun!riTCdh1!%zU`b$V_WJ81q#!3L(E?PI#wW9 zj;_TzRn5t!igQ>lQ~nWjU2!UJUTk5e-|Iz1Hf!WcX0Mg;p36zCt7WHUtf50kq*vx( zS0Am^;WIV8L5p;t0<~zrROq8+1TmU*6LSV2SW;5pwRG7QyZ&Z$+GKB=E948^DUR=H zjYXg`uH;Dj+oH1BW~DlaC&P!EOc$+uBF=Zz7q<+AmCc?~tIr#_LHuLRQ-9{JcD}*= z4L@mEa~gzyM(iBL0XmhOo6yf5j#xyR;qxi%+gE!Wd8~@%^B&d+0l2*Fs~1re(VwU$ z*As{FX(iybPWM+@HCVD!NB>?%(aYhX0=e-gT(Form$3QfiYcIC)U`{x za~=8G2kC^s6Dj&YD+olF87oD207RoG7)E`+G(>rkw+iyJi^R^RY579rd50&r4ShW< z5J83FEtphsD5#nK5~oL7JvF{2nGWX#FW$I2JafAapFF^U#N-6&y*qd#D7h0lnG5-D z=ohUL8~QD$&^jmTtE^MIR$0m|yaPPtbpOMtN^@wxGVhZ9I{`eP1-Awp;vc>pKzUyV-a8-?XwP5p+rD_QkdtE$vkK24c zLt*2|W=*}jlEu67_}p=+0eH}WQQ~wrS)glR)m$x~W-er7htIbMBw23Q`&WAU-r1%O ztwF`;8|WTJ_GwH&xH>MVD1p*q?dcr{~{4 zyQqO=V)%WG&URR&hMo|B-xw?K^a;iP5*wf|1-%HFGUcn>>72)6Zy50@~ zZmu_k4^A)2&J2O&T`w&)U4eM!!scuC>mKF5clfp%^|u>JgV7oNKu~h@Sj7TRW?eSP zi`B8ehvr~KgCA{Urq5jfS)HAtTQG7gCEtqDC%!P&(ZOiX)s`1#Nwp%S*%rG5DoBi? zu&2xxEr8k5Khtyk3s;Ba(`JPX)ym!*8$W)?(?q8RZ6*`IxLD&&Y<8&Qe7JZim`yeP zMaIeaJPVZnx)~Jw5>T!9?7zW4g1xsYhg!4AV!uYrwrM1o4vNi zhgaa!xO4)!!r2(H_zBV(wL7_vN%w2NE3W)NFqUSD$3=q{o_`!M@<^Z#z&dqXtQljr zJIFUg)`BQhe@ zd~F1po=68CZIRPD&$?`#H|h3pd}jg}Jb7J?o3=L$QcEvYke3i0O^y<8)Sh&CDO=UY z79zxVtul@4Rc#El#w>UF`dI2b{&CbrahQ&o+y|TIRhC%Ms6np=UwJQv6}))85b%RJ z3NqbK>PMdu80Dh>p2W1oip+v;mw!iBi1^oc?yfUAbCuw39lKAxbPIFnHcD!>k!4M; z%+~feTp#W0hp3df{S7ErNq|NS@kc8W#oIz%W52Un+rXs=F|xJ74#R`CR0wXX=L4% zy0?<4`}24)!*sl#?(LnJrh;Vk=ppSt#u*z*<{@nyg3SH*z3}YZ&`rar^pm!WQosV3 zsoX^gD791iEp=UJCgc#VI)5+uk~=^fz6mEKE4+#baz}>S4-46 zVR^3DV}f+@AUdxZQEn!)o%jnLrHWX)L zmzAiefEi`HWZH2vIFmnHL3-Rnon>0ek;>#1IbA{$f&@bXpHl55Vw123b^KR1 zzuh~gzn^bf5z5J=X;3l$CqHa4>wjJ@;_%KaYcIP7=P~${j&~>w{ECf}P7(Mo+LX16 z�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

*su3M&{j^v*b$gq$nxwkv$wm4iT zY1k4rZ{>ULjO_WLxh3y=-kvC3IBmi05q6K+ANlVX^ZddBthPltKHpqrp#hm@IZFTV z=+>s0{DB!ZMp`8s$Mc(jb)o%76?_VT+Plyf zDgp^qI3|yv8{ZeM#D{olxgG_`?PK~Y?(RF2sB@QDj@Y(l44x^6C@eVdvX~{7ibT&` zy<^TOUwZVo0!amb%jnilDh_iFVZGYQ30YuNi^(qkxA7EUar$-jUI>1W{2q7{bZf)7 zP@}Y;?9JSsR_!t&&0XtU+0==+9#|z4F*46{p1Kn`J%m3qWWoxqe&%nDV319zZy9^I zl^M%JYN@_`J{8FYm2^!w@%-5SM7W)1%Zi)hCFeTN^jKevcv$9mFfb-H{dm)5?i2)> zILHbnGnxDVw3*PtzSm$Qjj=K`>xM@RxK&0&`6;E){hy<_1VHzo&~0RY(BSbV=b0ey zDE{7@bm1N^*;P}Fjqs%V+t#o?18Hb}((pKSN0kb$3y&&vT#tjEN`V@Sby7@5Fx$RS zM;4#ffX8*Xq^fCJDkM}b8n~tUn zzN9@Q($F7HB;rd3L=|b!EymCI{sWzUi8=r$nAKR`%fn|gf0JUe?=fbEXbcLaAPpYt z53@z$jj%3Mv+V<1Zk=1rxVT;o;)RMnI;}2i9gq9lOv^RrWU7P8ByGBmEG6NHfxl4A zd&=t3v^EZnqA}Y{D|uoIW{aZ3&{7_~?s#$eugplPW{0&xxBC_8H{Zz}fnqN#z06BT0?)4WaHRV$5s#3dsoXdZhN@b#)oKg;sgUve2Sb zE;{XDPag_sd51D}z!Fr|YMZ_U?(~Cov>=avz>}>DM|2umzOZlj7QgzD@E+3WVYAQV zZnZ~84K#qOW4HIB%`~BT+vsr&LVRv#BSr$94P-ekCIO^;EJyW5fJlQ2kU3%~fvz2vAb@WVdx2M