From fd4434057734879a36db03dfc675a4fec4106006 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Mon, 12 Oct 2015 18:59:24 +0300 Subject: [PATCH 01/56] Initial commit --- .gitignore | 4 + CONTRIBUTING.md | 3 + Gemfile | 24 + Guardfile | 8 + README.md | 141 +- Rakefile | 84 + Rules | 71 + config.yaml | 51 + content/404.md | 14 + content/CNAME | 1 + ...5-10-12-documentation-added-to-forknote.md | 31 + content/blog/all_posts.html | 7 + content/blog/feed.atom | 9 + content/blog/index.html | 7 + content/coins/index.md | 217 + content/contact/error.md | 8 + content/contact/index.md | 72 + content/contact/invalid_field.md | 8 + content/contact/success.md | 8 + content/create.md | 31 + content/developers.md | 55 + content/documentation/daemon/html-rpc-api.md | 21 + content/documentation/daemon/index.md | 111 + content/documentation/daemon/json-rpc-api.md | 693 + content/documentation/index.md | 73 + .../documentation/payment-gateway/index.md | 209 + .../payment-gateway/json-rpc-api.md | 698 + content/documentation/simplewallet/index.md | 105 + .../simplewallet/json-rpc-api.md | 467 + content/download.md | 54 + content/guides/create-coin.md | 130 + content/guides/getting-started.md | 90 + content/guides/index.md | 15 + content/guides/starting-seed-node.md | 131 + content/guides/troubleshooting.md | 60 + content/index.md | 41 + layouts/_disqus.html | 13 + layouts/_meta.html | 16 + layouts/_posts.html | 7 + layouts/_posts_small.html | 3 + layouts/_social.html | 6 + layouts/all_posts.html | 12 + layouts/blog.html | 25 + layouts/contact.html | 31 + layouts/default.html | 14 + layouts/documentation.html | 32 + layouts/footer.html | 35 + layouts/head.html | 16 + layouts/header.html | 21 + layouts/headlines.html | 6 + layouts/overview.html | 10 + layouts/posts.html | 32 + layouts/sidebar-blog.html | 6 + layouts/sidebar-documentation.html | 24 + layouts/sidebar-giudes.html | 9 + layouts/sidebar.html | 18 + lib/blog_helper.rb | 43 + lib/default.rb | 3 + lib/search_generator.rb | 61 + lib/static.rb | 55 + lib/tip_filter.rb | 9 + static/assets/js/base58.js | 190 + static/assets/js/cn_util.js | 1091 + static/assets/js/config.js | 3 + static/assets/js/crypto.js | 22 + static/assets/js/lib/biginteger.js | 1609 + static/assets/js/mnemonic.js | 1194 + static/css/Octicons LICENSE | 7 + static/css/bootstrap.min.css | 14 + static/css/documentation.css | 1989 + static/css/octicons.css | 231 + static/css/octicons.eot | Bin 0 -> 30848 bytes static/css/octicons.svg | 195 + static/css/octicons.ttf | Bin 0 -> 30680 bytes static/css/octicons.woff | Bin 0 -> 17172 bytes static/css/pygments.css | 59 + static/css/reset.css | 171 + static/dist/ng-google-chart.js | 266 + static/dist/showErrors.min.js | 2 + static/favicon.ico | Bin 0 -> 4136 bytes static/images/cancel.png | Bin 0 -> 364 bytes static/images/cancel@2x.png | Bin 0 -> 629 bytes static/images/coins/bytecoin.png | Bin 0 -> 4164 bytes static/images/coins/bytecoin@2x.png | Bin 0 -> 6078 bytes static/images/coins/bytecoin@org.png | Bin 0 -> 33219 bytes static/images/coins/dashcoin.png | Bin 0 -> 2886 bytes static/images/coins/dashcoin@2x.png | Bin 0 -> 2962 bytes static/images/coins/dashcoin@org.png | Bin 0 -> 803 bytes static/images/coins/oneevilcoin.png | Bin 0 -> 8855 bytes static/images/coins/oneevilcoin@2x.png | Bin 0 -> 17106 bytes static/images/coins/oneevilcoin@org.png | Bin 0 -> 25902 bytes .../documentation/create-form-genesis.png | Bin 0 -> 34676 bytes .../images/documentation/create-form-seed.png | Bin 0 -> 30681 bytes static/images/documentation/create-form.png | Bin 0 -> 30385 bytes static/images/documentation/vps-vultr-ip.png | Bin 0 -> 61349 bytes .../documentation/vps-vultr-recommended.png | Bin 0 -> 278654 bytes static/images/expand-arrows.png | Bin 0 -> 361 bytes static/images/expand-arrows@2x.png | Bin 0 -> 587 bytes static/images/facebook-icon.png | Bin 0 -> 3270 bytes static/images/facebook-icon@2x.png | Bin 0 -> 3817 bytes static/images/feed-icon.png | Bin 0 -> 622 bytes static/images/feed-icon@2x.png | Bin 0 -> 1094 bytes static/images/forknote-large.png | Bin 0 -> 8723 bytes static/images/forknote-large@2x.png | Bin 0 -> 13686 bytes static/images/forknote-small.png | Bin 0 -> 2987 bytes static/images/forknote-small@2x.png | Bin 0 -> 3225 bytes static/images/header.png | Bin 0 -> 101 bytes static/images/header@2x.png | Bin 0 -> 206 bytes static/images/logo.png | Bin 0 -> 4038 bytes static/images/logo@2x.png | Bin 0 -> 2732 bytes static/images/search.png | Bin 0 -> 318 bytes static/images/search@2x.png | Bin 0 -> 575 bytes static/images/twitter-icon.png | Bin 0 -> 3846 bytes static/images/twitter-icon@2x.png | Bin 0 -> 5278 bytes static/js/app_create.js | 26 + static/js/bootstrap.min.js | 12 + static/js/dev_mode.js | 9 + static/js/documentation.js | 319 + static/js/jquery.js | 5 + static/js/retina.js | 10 + static/partials/create.html | 187 + static/partials/create.js | 522 + static/search-index.json | 19 + tmp/checksums | 3 + tmp/compiled_content | 49550 ++++++++++++++++ tmp/dependencies | Bin 0 -> 7498 bytes tmp/rule_memory | Bin 0 -> 38013 bytes 127 files changed, 61963 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 Gemfile create mode 100644 Guardfile create mode 100644 Rakefile create mode 100755 Rules create mode 100644 config.yaml create mode 100644 content/404.md create mode 100644 content/CNAME create mode 100644 content/blog/2015-10-12-documentation-added-to-forknote.md create mode 100644 content/blog/all_posts.html create mode 100644 content/blog/feed.atom create mode 100644 content/blog/index.html create mode 100644 content/coins/index.md create mode 100644 content/contact/error.md create mode 100644 content/contact/index.md create mode 100644 content/contact/invalid_field.md create mode 100644 content/contact/success.md create mode 100644 content/create.md create mode 100644 content/developers.md create mode 100644 content/documentation/daemon/html-rpc-api.md create mode 100644 content/documentation/daemon/index.md create mode 100644 content/documentation/daemon/json-rpc-api.md create mode 100644 content/documentation/index.md create mode 100644 content/documentation/payment-gateway/index.md create mode 100644 content/documentation/payment-gateway/json-rpc-api.md create mode 100644 content/documentation/simplewallet/index.md create mode 100644 content/documentation/simplewallet/json-rpc-api.md create mode 100644 content/download.md create mode 100644 content/guides/create-coin.md create mode 100644 content/guides/getting-started.md create mode 100644 content/guides/index.md create mode 100644 content/guides/starting-seed-node.md create mode 100644 content/guides/troubleshooting.md create mode 100644 content/index.md create mode 100644 layouts/_disqus.html create mode 100644 layouts/_meta.html create mode 100644 layouts/_posts.html create mode 100644 layouts/_posts_small.html create mode 100644 layouts/_social.html create mode 100644 layouts/all_posts.html create mode 100644 layouts/blog.html create mode 100644 layouts/contact.html create mode 100644 layouts/default.html create mode 100644 layouts/documentation.html create mode 100644 layouts/footer.html create mode 100644 layouts/head.html create mode 100644 layouts/header.html create mode 100644 layouts/headlines.html create mode 100644 layouts/overview.html create mode 100644 layouts/posts.html create mode 100644 layouts/sidebar-blog.html create mode 100644 layouts/sidebar-documentation.html create mode 100644 layouts/sidebar-giudes.html create mode 100644 layouts/sidebar.html create mode 100644 lib/blog_helper.rb create mode 100644 lib/default.rb create mode 100755 lib/search_generator.rb create mode 100644 lib/static.rb create mode 100644 lib/tip_filter.rb create mode 100644 static/assets/js/base58.js create mode 100644 static/assets/js/cn_util.js create mode 100644 static/assets/js/config.js create mode 100644 static/assets/js/crypto.js create mode 100644 static/assets/js/lib/biginteger.js create mode 100644 static/assets/js/mnemonic.js create mode 100755 static/css/Octicons LICENSE create mode 100755 static/css/bootstrap.min.css create mode 100644 static/css/documentation.css create mode 100755 static/css/octicons.css create mode 100755 static/css/octicons.eot create mode 100755 static/css/octicons.svg create mode 100755 static/css/octicons.ttf create mode 100755 static/css/octicons.woff create mode 100644 static/css/pygments.css create mode 100644 static/css/reset.css create mode 100755 static/dist/ng-google-chart.js create mode 100644 static/dist/showErrors.min.js create mode 100644 static/favicon.ico create mode 100644 static/images/cancel.png create mode 100644 static/images/cancel@2x.png create mode 100644 static/images/coins/bytecoin.png create mode 100644 static/images/coins/bytecoin@2x.png create mode 100644 static/images/coins/bytecoin@org.png create mode 100644 static/images/coins/dashcoin.png create mode 100644 static/images/coins/dashcoin@2x.png create mode 100644 static/images/coins/dashcoin@org.png create mode 100644 static/images/coins/oneevilcoin.png create mode 100644 static/images/coins/oneevilcoin@2x.png create mode 100644 static/images/coins/oneevilcoin@org.png create mode 100644 static/images/documentation/create-form-genesis.png create mode 100644 static/images/documentation/create-form-seed.png create mode 100644 static/images/documentation/create-form.png create mode 100644 static/images/documentation/vps-vultr-ip.png create mode 100644 static/images/documentation/vps-vultr-recommended.png create mode 100644 static/images/expand-arrows.png create mode 100644 static/images/expand-arrows@2x.png create mode 100644 static/images/facebook-icon.png create mode 100644 static/images/facebook-icon@2x.png create mode 100755 static/images/feed-icon.png create mode 100644 static/images/feed-icon@2x.png create mode 100644 static/images/forknote-large.png create mode 100644 static/images/forknote-large@2x.png create mode 100644 static/images/forknote-small.png create mode 100644 static/images/forknote-small@2x.png create mode 100644 static/images/header.png create mode 100644 static/images/header@2x.png create mode 100644 static/images/logo.png create mode 100644 static/images/logo@2x.png create mode 100644 static/images/search.png create mode 100644 static/images/search@2x.png create mode 100644 static/images/twitter-icon.png create mode 100644 static/images/twitter-icon@2x.png create mode 100644 static/js/app_create.js create mode 100755 static/js/bootstrap.min.js create mode 100644 static/js/dev_mode.js create mode 100644 static/js/documentation.js create mode 100644 static/js/jquery.js create mode 100644 static/js/retina.js create mode 100755 static/partials/create.html create mode 100755 static/partials/create.js create mode 100644 static/search-index.json create mode 100644 tmp/checksums create mode 100644 tmp/compiled_content create mode 100644 tmp/dependencies create mode 100644 tmp/rule_memory diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6940556 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +/output +Gemfile.lock +crash.log diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..98da194 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +Found a typo? Have an idea for improving the docs? Feel free to open a pull request and we'll get it merged as soon as we can! + +If you have a specific question or issues with the API, please [let us know](http://forknote.net/contact). diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..7a4b3f3 --- /dev/null +++ b/Gemfile @@ -0,0 +1,24 @@ +source "http://rubygems.org" + +ruby '2.1.6' + +gem 'builder' +gem 'coderay' +gem 'kramdown', '~> 1.8.0' +gem 'mime-types', '~> 1.16' +gem 'nanoc', '~> 3.8' +gem 'nokogiri', '~> 1.6.0' +gem 'rouge', '~> 1.4' +gem 'rake', '~> 0.9.2' +gem 'thin' +gem 'yajl-ruby', '~> 0.8.2' + +group :development do + gem 'adsf' + gem 'fssm' + gem 'guard-nanoc' +end + +group :test do + gem 'html-proofer' +end diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000..b5a2d16 --- /dev/null +++ b/Guardfile @@ -0,0 +1,8 @@ +# A sample Guardfile +# More info at https://github.com/guard/guard#readme + +guard 'nanoc' do + watch('nanoc.yaml') # Change this to config.yaml if you use the old config file name + watch('Rules') + watch(%r{^(content|layouts|lib|static)/.*$}) +end diff --git a/README.md b/README.md index 74c7fa8..6cde9f2 100644 --- a/README.md +++ b/README.md @@ -1 +1,140 @@ -# forknote.net +# developer.github.com + +This is a GitHub API resource built with [nanoc][nanoc]. + +All submissions are welcome. To submit a change, fork this repo, commit your changes, and send us a [pull request](http://help.github.com/send-pull-requests/). + +## Setup + +Ruby 1.9 is required to build the site. + +Get the nanoc gem, plus kramdown for Markdown parsing: + +```sh +$ bundle install +``` + +You can see the available commands with nanoc: + +```sh +$ bundle exec nanoc -h +``` + +Nanoc has [some nice documentation](http://nanoc.ws/docs/tutorial/) to get you started. Though if you're mainly concerned with editing or adding content, you won't need to know much about nanoc. + +[nanoc]: http://nanoc.ws/ + +## Styleguide + +Not sure how to structure the docs? Here's what the structure of the +API docs should look like: + + # API title + + * TOC + {:toc} + + ## API endpoint title + + [VERB] /path/to/endpoint + + ### Parameters + + Name | Type | Description + -----|------|-------------- + `name`|`type` | Description. + + ### Input (request JSON body) + + Name | Type | Description + -----|------|-------------- + `name`|`type` | Description. + + ### Response + + <%= headers 200, :pagination => default_pagination_rels, 'X-Custom-Header' => "value" %> + <%= json :resource_name %> + +**Note**: We're using [Kramdown Markdown extensions](http://kramdown.gettalong.org/syntax.html), such as definition lists. + +### JSON Responses + +We specify the JSON responses in Ruby so that we don't have to write +them by hand all over the docs. You can render the JSON for a resource +like this: + +```erb +<%= json :issue %> +``` + +This looks up `GitHub::Resources::ISSUE` in `lib/resources.rb`. + +Some actions return arrays. You can modify the JSON by passing a block: + +```erb +<%= json(:issue) { |hash| [hash] } %> +``` + +### Terminal blocks + +You can specify terminal blocks with `pre.terminal` elements. (It'd be nice if +Markdown could do this more cleanly.) + +```html +
+$ curl foobar
+....
+
+``` + +This is not a `curl` tutorial though. Not every API call needs +to show how to access it with `curl`. + +## Development + +Nanoc compiles the site into static files living in `./output`. It's +smart enough not to try to compile unchanged files: + +```sh +$ bundle exec nanoc compile +Loading site data... +Compiling site... + identical [0.00s] output/css/960.css + identical [0.00s] output/css/pygments.css + identical [0.00s] output/css/reset.css + identical [0.00s] output/css/styles.css + identical [0.00s] output/css/uv_active4d.css + update [0.28s] output/index.html + update [1.31s] output/v3/gists/comments/index.html + update [1.92s] output/v3/gists/index.html + update [0.25s] output/v3/issues/comments/index.html + update [0.99s] output/v3/issues/labels/index.html + update [0.49s] output/v3/issues/milestones/index.html + update [0.50s] output/v3/issues/index.html + update [0.05s] output/v3/index.html + +Site compiled in 5.81s. +``` + +You can setup whatever you want to view the files. If using the adsf +gem (as listed in the Gemfile), you can start Webrick: + +```sh +$ bundle exec nanoc view +$ open http://localhost:3000 +``` + +Compilation times got you down? Use `autocompile`! + +```sh +$ bundle exec nanoc autocompile +``` + +This starts a web server too, so there's no need to run `nanoc view`. +One thing: remember to add trailing slashes to all nanoc links! + +## Deploy + +```sh +$ bundle exec rake publish +``` diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..f6d7e24 --- /dev/null +++ b/Rakefile @@ -0,0 +1,84 @@ +require 'nanoc3/tasks' +require 'tmpdir' +- +task :default => [:test] + +desc "Compile the site" +task :compile do + `nanoc compile` +end + +desc "Test the output" +task :test => [:clean, :remove_output_dir, :compile] do + require 'html/proofer' + ignored_links = [%r{www.w3.org}] + HTML::Proofer.new("./output", :href_ignore => ignored_links, :href_swap => href_swap).run +end + +desc "Remove the output dir" +task :remove_output_dir do + FileUtils.rm_r('output') if File.exist?('output') +end + +# Prompt user for a commit message; default: P U B L I S H :emoji: +def commit_message(no_commit_msg = false) + publish_emojis = [':boom:', ':rocket:', ':metal:', ':bulb:', ':zap:', + ':sailboat:', ':gift:', ':ship:', ':shipit:', ':sparkles:', ':rainbow:'] + default_message = "P U B L I S H #{publish_emojis.sample}" + + unless no_commit_msg + print "Enter a commit message (default: '#{default_message}'): " + STDOUT.flush + mesg = STDIN.gets.chomp.strip + end + + mesg = default_message if mesg.nil? || mesg == '' + mesg.gsub(/'/, '') # Allow this to be handed off via -m '#{message}' +end + +desc "Publish to http://developer.github.com" +task :publish, [:no_commit_msg] => [:clean, :remove_output_dir] do |t, args| + mesg = commit_message(args[:no_commit_msg]) + sh "nanoc compile" + + # save precious files + if ENV['IS_HEROKU'] + `git checkout origin/gh-pages` + else + `git checkout gh-pages` + end + tmpdir = Dir.mktmpdir + FileUtils.cp_r("enterprise", tmpdir) + FileUtils.cp("robots.txt", tmpdir) + `git checkout master` + + ENV['GIT_DIR'] = File.expand_path(`git rev-parse --git-dir`.chomp) + ENV['RUBYOPT'] = nil + old_sha = `git rev-parse refs/remotes/origin/gh-pages`.chomp + Dir.chdir('output') do + ENV['GIT_INDEX_FILE'] = gif = '/tmp/dev.gh.i' + ENV['GIT_WORK_TREE'] = Dir.pwd + File.unlink(gif) if File.file?(gif) + # restore precious files + FileUtils.cp_r("#{tmpdir}/enterprise", ".") + FileUtils.cp("#{tmpdir}/robots.txt", ".") + FileUtils.rm_rf(tmpdir) if File.exists?(tmpdir) + `git add -A` + tsha = `git write-tree`.strip + puts "Created tree #{tsha}" + # Heroku runs git@1.7, we don't have the luxury of -m + if ENV['IS_HEROKU'] + `echo #{mesg} > changelog` + csha = `git commit-tree #{tsha} -p #{old_sha} < changelog`.strip + elsif old_sha.size == 40 + csha = `git commit-tree #{tsha} -p #{old_sha} -m '#{mesg}'`.strip + else + csha = `git commit-tree #{tsha} -m '#{mesg}'`.strip + end + puts "Created commit #{csha}" + puts `git show #{csha} --stat` + puts "Updating gh-pages from #{old_sha}" + `git update-ref refs/heads/gh-pages #{csha}` + `git push origin gh-pages` + end +end diff --git a/Rules b/Rules new file mode 100755 index 0000000..7f0b008 --- /dev/null +++ b/Rules @@ -0,0 +1,71 @@ +#!/usr/bin/env ruby + +# A few helpful tips about the Rules file: +# +# * The order of rules is important: for each item, only the first matching +# rule is applied. +# +# * Item identifiers start and end with a slash (e.g. “/about/” for the file +# “content/about.html”). To select all children, grandchildren, … of an +# item, use the pattern “/about/*/”; “/about/*” will also select the parent, +# because “*” matches zero or more characters. + +# Reset search-index by deleting it every time +preprocess do + File.delete("output/search-index.json") if File.exists?("output/search-index.json") +end + +compile '/static/*' do +end + +compile '/CNAME/' do +end + +compile '/blog/feed/' do + filter :erb + filter :kramdown, :toc_levels => [2] +end + +route 'blog/feed' do + '/blog.atom' +end + +compile '/blog/*' do + filter :search + filter :erb + filter :kramdown, :toc_levels => [2] + filter :colorize_syntax, + :colorizers => {:javascript => :rouge} + + layout item[:layout] || 'posts' +end + +compile '*' do + filter :erb + filter :kramdown, :toc_levels => [2] + filter :colorize_syntax, + :colorizers => {:javascript => :rouge} + layout item[:layout] || 'default' +end + +route '/static/*' do + item.identifier[7..-2] +end + +route '/CNAME/' do + '/CNAME' +end + +route '/feed' do + '/posts.atom' +end + +route '/404/' do + '/404.html' +end + +route '*' do + item.identifier + 'index.html' +end + +layout '*', :erb diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..f03b423 --- /dev/null +++ b/config.yaml @@ -0,0 +1,51 @@ +# A list of file extensions that nanoc will consider to be textual rather than +# binary. If an item with an extension not in this list is found, the file +# will be considered as binary. +text_extensions: [ 'css', 'erb', 'haml', 'htm', 'html', 'js', 'less', 'markdown', 'md', 'php', 'rb', 'sass', 'scss', 'txt', 'xhtml', 'xml', 'atom' ] + +# The path to the directory where all generated files will be written to. This +# can be an absolute path starting with a slash, but it can also be path +# relative to the site directory. +output_dir: output + +# A list of index filenames, i.e. names of files that will be served by a web +# server when a directory is requested. Usually, index files are named +# “index.hml”, but depending on the web server, this may be something else, +# such as “default.htm”. This list is used by nanoc to generate pretty URLs. +index_filenames: [ 'index.html' ] + +# Whether or not to generate a diff of the compiled content when compiling a +# site. The diff will contain the differences between the compiled content +# before and after the last site compilation. +enable_output_diff: false + +# The data sources where nanoc loads its data from. This is an array of +# hashes; each array element represents a single data source. By default, +# there is only a single data source that reads data from the “content/” and +# “layout/” directories in the site directory. +data_sources: + - + # The type is the identifier of the data source. By default, this will be + # `filesystem_unified`. + type: filesystem_unified + + # The path where items should be mounted (comparable to mount points in + # Unix-like systems). This is “/” by default, meaning that items will have + # “/” prefixed to their identifiers. If the items root were “/en/” + # instead, an item at content/about.html would have an identifier of + # “/en/about/” instead of just “/about/”. + items_root: / + + # The path where layouts should be mounted. The layouts root behaves the + # same as the items root, but applies to layouts rather than items. + layouts_root: / + + - + type: static + items_root: /static + +# For the atom feed. +base_url: http://bezkaries.com + +# Articles per page for the blog +page_size: 5 diff --git a/content/404.md b/content/404.md new file mode 100644 index 0000000..8353779 --- /dev/null +++ b/content/404.md @@ -0,0 +1,14 @@ +--- +title: 404 error | Forknote.net +layout: overview +--- + +
+
+ +

404 error

+ +The page you are looking for does not exist. + +
+
\ No newline at end of file diff --git a/content/CNAME b/content/CNAME new file mode 100644 index 0000000..13c09a7 --- /dev/null +++ b/content/CNAME @@ -0,0 +1 @@ +forknote.net diff --git a/content/blog/2015-10-12-documentation-added-to-forknote.md b/content/blog/2015-10-12-documentation-added-to-forknote.md new file mode 100644 index 0000000..92476f7 --- /dev/null +++ b/content/blog/2015-10-12-documentation-added-to-forknote.md @@ -0,0 +1,31 @@ +--- +kind: article +title: "Documentation added to Forknote" +created_at: 2015-10-12 +author_name: pmitchev +--- + +Documentation was added for: + +* [Daemon][documentation-daemon] +* [Simplewallet][documentation-simplewallet] +* [Payment gateway][documentation-payment-gateway] + +Guides for the most common questions were created: + +* [Getting started][guide-get-started] +* [Create coin][guide-create-coin] +* [Starting seed node][guide-starting-seed-node] + + +[documentation-daemon]: /documentation/daemon/ +[documentation-simplewallet]: /documentation/simplewallet/ +[documentation-payment-gateway]: /documentation/payment-gateway/ +[guide-get-started]: /guide/getting-started/ +[guide-create-coin]: /guide/create-coin/ +[guide-starting-seed-node]: /guide/starting-seed-node/ + + + + + diff --git a/content/blog/all_posts.html b/content/blog/all_posts.html new file mode 100644 index 0000000..02e4c9a --- /dev/null +++ b/content/blog/all_posts.html @@ -0,0 +1,7 @@ +--- +title: ¬ +layout: all_posts +--- + +<%= render '_posts_small', :posts => posts_list %> + diff --git a/content/blog/feed.atom b/content/blog/feed.atom new file mode 100644 index 0000000..650e191 --- /dev/null +++ b/content/blog/feed.atom @@ -0,0 +1,9 @@ +--- +title: "Forknote: Blog" +is_hidden: true +author_name: forknote +author_uri: http://forknote.net/blog/ +layout: false +--- + +<%= atom_feed :limit => 30, :articles => posts_list %> diff --git a/content/blog/index.html b/content/blog/index.html new file mode 100644 index 0000000..cd98ccf --- /dev/null +++ b/content/blog/index.html @@ -0,0 +1,7 @@ +--- +title: Blog | Forknote +layout: blog +--- + +<%= render '_posts', :posts => posts_list %> + diff --git a/content/coins/index.md b/content/coins/index.md new file mode 100644 index 0000000..1d63bdd --- /dev/null +++ b/content/coins/index.md @@ -0,0 +1,217 @@ +--- +title: Existing coins | Forknote +layout: overview +body_class: coins +--- + + + +
+
+

Join the Forknote Community.

+

The easiest way to create Cryptonote coins. Learn more.

+
+
+ +
+
    +
  • + +

    Bytecoin

    +

    The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

    +
  • +
  • + +

    Dashcoin

    +

    The original idea for cloning the core features of Bytecoin started with Dashcoin.

    +
  • +
  • + +

    OneEvilCoin

    +

    OneEvilCoin is the first coin joined the Forknote familly

    +
  • +
+
+
+
    +
  • + E +

    Ethanolium

    +

    +
  • +
  • + +

    Add Your Coin

    +

    Contact us to get your Forknote coin added to this list.

    +
  • +
  • +   +

     

    +

    +
  • +
+
+ +
+
+ +

New to Forknote?

+

A few tips you start:

+ +
+ +
+ +

Want to create your own cryptocurrency?

+

Visit the developer section or go streight to the documentation:

+ +
+
+ + + +
+ + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/content/contact/error.md b/content/contact/error.md new file mode 100644 index 0000000..2fa2e9b --- /dev/null +++ b/content/contact/error.md @@ -0,0 +1,8 @@ +--- +title: За контакти - грешка | BezKaries.com +layout: contact +--- + +# Форма за контакт + +Имаше проблем с изпращането на вашето запитване. Моля, изпратете ни email на адрес info@bezkaries.com. \ No newline at end of file diff --git a/content/contact/index.md b/content/contact/index.md new file mode 100644 index 0000000..ded8991 --- /dev/null +++ b/content/contact/index.md @@ -0,0 +1,72 @@ +--- +title: Contact us | Forknote.net +layout: contact +--- + + + + + +# Contact form + +
+ + +
diff --git a/content/contact/invalid_field.md b/content/contact/invalid_field.md new file mode 100644 index 0000000..380112e --- /dev/null +++ b/content/contact/invalid_field.md @@ -0,0 +1,8 @@ +--- +title: За контакти - невалидно поле | BezKaries.com +layout: contact +--- + +# Форма за контакт + +Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си. \ No newline at end of file diff --git a/content/contact/success.md b/content/contact/success.md new file mode 100644 index 0000000..f1e0723 --- /dev/null +++ b/content/contact/success.md @@ -0,0 +1,8 @@ +--- +title: За контакти - успешно изпратено | BezKaries.com +layout: contact +--- + +# Форма за контакт + +Вашето запитване беше изпратено успешно! \ No newline at end of file diff --git a/content/create.md b/content/create.md new file mode 100644 index 0000000..e0c3d10 --- /dev/null +++ b/content/create.md @@ -0,0 +1,31 @@ +--- +title: Create Cryptonote coin | Forknote +layout: overview +body_class: developers +--- + +
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + diff --git a/content/developers.md b/content/developers.md new file mode 100644 index 0000000..6b5ac13 --- /dev/null +++ b/content/developers.md @@ -0,0 +1,55 @@ +--- +title: Developers | Forknote +layout: overview +body_class: developers +--- + +
+
+

Create Cryptonote cryptocurrencies fast and easy.

+

All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

+ Create now +
+
+ +
+ +
+ +
+
+ +

Already have a configuration file?

+

We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

+ +
+ +
+ +

Ready to start a Forknote-based service?

+

Helpful resources for individual developers and companies:

+ +
+
diff --git a/content/documentation/daemon/html-rpc-api.md b/content/documentation/daemon/html-rpc-api.md new file mode 100644 index 0000000..36b2488 --- /dev/null +++ b/content/documentation/daemon/html-rpc-api.md @@ -0,0 +1,21 @@ +--- +title: Daemon HTTP RPC API | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Daemon HTTP RPC API + +URL | Description | Format | Arg 1 | Arg 2 | Return value +-----------|-----------|-----------|-----------|-----------|-----------| +/getheight | Returns current chain height | JSON | - | - | [int] height +/getknownblockids | Returns list of known block ids | JSON | - | - | [list] main chain block ids
[list] alternative chains block ids
[list] invalid block ids +/start_mine | Starts mining threads | JSON | [string] wallet address | [int] number of threads | [string] status +/stop_mine | Stops mining threads | JSON | - | - | [string] status +/gettransactions | Returns transactions as serialized blobs | JSON | [list] tx ids | - | [list] transactions as hex
[list] missing tx ids
[string] status +/sendrawtransactions | Send transaction to the network | JSON | [string] serialized transaction in hex form | - | [string] status +/getblocks.bin | Returns blocks in binary form | BIN | [list] block ids | - | [list] blocks
[int] start height
[int] current height
[string] status +/get_o_indexes.bin |Get global output indicies | BIN | [hash] transaction id | - | [vector] output indicies
[string] status +/getrandom_outs.bin | Get random output indicies
for a given amount
(purpose: for ring signatures) | BIN | [list] amounts | [int] count | [vector]
{ [int] amount; [list] outs }
output entries diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md new file mode 100644 index 0000000..9f80042 --- /dev/null +++ b/content/documentation/daemon/index.md @@ -0,0 +1,111 @@ +--- +title: Daemon configuration and commands| Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Daemon configuration and commands + +* TOC +{:toc} + +##Command line options + + --help Produce help message + --version Output version information + --os-version + --data-dir arg (=/Users/USER/.forknote) + Specify data directory + --config-file arg (=./configs/-.conf) Specify configuration file + + +##Command line options and settings options: + + +Option | Description |   Config Example   |   Console Example   +-----------|-----------|-----------|-----------| +log-file | A name of log file that you want to use for logging. | log-file = mylog.log | --log-file mylog.log +log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 +no-console | Disable daemon console commands | no-console | --no-console +testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet | --testnet +rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 | --rpc-bind-ip 127.0.0.1 +rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 | --rpc-bind-port 29081 +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 +allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port +P2P_STAT_TRUSTED
_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
_PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
_PUB_KEY 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 +extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt | --extra-messages-file message.txt +start-mining | Specify wallet address to mining for | start-mining = FPM...yR | --start-mining FPM...yR +mining-threads | Specify mining threads count | mining-threads = 1 | --mining-threads 1 +GENESIS_COINBASE
_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
_TX_HEX = 01..4a | --GENESIS_COINBASE
_TX_HEX 01..4a +CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX = 86 | --CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
SPEED_FACTOR = 18 | --EMISSION_
SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
_DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
_DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
_DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
DUST_THRESHOLD = 1000000 | --DEFAULT_
DUST_THRESHOLD 1000000 +CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW = 10 | --CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW 10 +MAX_BLOCK_
SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
SIZE_INITIAL = 20480 | --MAX_BLOCK_
SIZE_INITIAL 20480 +EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin | --CRYPTONOTE_NAME dashcoin +CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 | --CHECKPOINT 10:70d..f8 +print-genesis-tx | Prints genesis block transaction hex and exits | | --print-genesis-tx +PREMINED_PERCENT | Percent of premined coins from all coins coming into existence | PREMINED_PERCENT = 10 | --PREMINED_PERCENT 10 +genesis-block-reward-address | The premined coins will be sent to this address. Multiple addresses can be used | | --genesis-block-reward-address FPM...yR + + +##Example of a config file + +
$ cat ./notrealcoin.conf 
+
+CRYPTONOTE_NAME=notrealcoin
+seed-node=1.1.1.1:17100
+seed-node=2.2.2.2:17100
+seed-node=seed.notarealcoin.com:17100
+GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
+p2p-bind-port=17100
+rpc-bind-port=17101
+MONEY_SUPPLY=18446744073709551615
+DEFAULT_DUST_THRESHOLD=1000000
+MINIMUM_FEE=1000000
+CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
+CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
+BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
+CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
+CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
+UPGRADE_HEIGHT=1
+
+ +##Daemon commands + +Command | Description | Arg 1 | Arg 2 +-----------|-----------|-----------|-----------| +help | print forknoted commands | - | - +start_mining | Start mining in several threads to a given wallet address | [string] wallet_address | [uint] threads +stop_mining | Stop mining | - | - +show_hr | Show current mining hashrate | - | - +hide_hr | Stop showing current mining hashrate | - | - +exit | Exit forknoted | - | - +print_bc | Print blockchain info in a given blocks range | [uint] begin_height | [uint] end_height (optional) +print_block | Print block | [string] block_hash or [uint] block_height | - +print_cn | Print connections | - | - +print_pl | Print peer list | - | - +print_pool | Print transaction pool (long format) | - | - +print_pool_sh | Print transaction pool (short format) | - | - +set_log | Change current log detailization level | [uint] log level (0 - 4) | - +print_tx | Print transaction | [string] transaction_hash | - diff --git a/content/documentation/daemon/json-rpc-api.md b/content/documentation/daemon/json-rpc-api.md new file mode 100644 index 0000000..d2bac0d --- /dev/null +++ b/content/documentation/daemon/json-rpc-api.md @@ -0,0 +1,693 @@ +--- +title: Daemon JSON RPC API | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Daemon JSON RPC API + +* TOC +{:toc} + +To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon's arguments). You can choose any free port. To do that execute the following command from the command line: + +
+ forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
+
+ +Atlernatively, you can edit *rpc-bind-port* in your configuration file + + rpc-bind-port=29081 + + +If you want Daemon to be accessed from other computer not only yours you should also use a --rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line: + +
+ forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
+
+ +Atlernatively, you can edit your configuration file + + rpc-bind-port=29081 + rpc-bind-ip=0.0.0.0 + +Having done that you're ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100): + + http://126.0.1.100:29081/json_rpc + http://localhost:29081/json_rpc + + +## getblockcount + +Returns current chain height. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "object", + "properties" : { + "count" : { + "type" : "integer", + "minimum": 0, + "description": "" + }, + "status" : { + "type" : "string" + } + }, + "required": ["count", "status"] + } + }, + "required": ["result"] + } + +### Example (getblockcount) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockcount" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "count": 123456, + "status": "OK" + } + } + + +##getblockhash + +Returns block hash by its height + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "height" : { + "type" : "integer" + } + }, + "required" : ["jsonrpc", "method", "height"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "string", + "description": "" + } + }, + "required": ["result"] + } + +###Example (getblockhash) + +Input: + + { + "jsonrpc": "2.0", + "id": "test", + "method": "on_getblockhash", + "params": { + "height": 123456 + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": "a7428..." + } + + +##getblocktemplate + +Returns blocktemplate with an empty “hole” for nonce. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "reserve_size" : { + "type" : "integer" + }, + "wallet_address" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] + } + +Return value schema + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "difficulty" : { + "type" : "integer" + }, + "height" : { + "type" :"integer" + }, + "reserved_offset" : { + "type" : "integer" + }, + "blocktemplate_blob" : { + "type" : "string" + }, + "status" : { + "type" : "string" + } + }, + "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"] + } + "required": ["result"] + } + +###Example (getblocktemplate) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblocktemplate", + "params": { + "reserve_size": 200, + "wallet_address": "28j5g2Hbe1..." + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "blocktemplate_blob": "0100de...", + "difficulty": 65563, + "height": 123456, + "reserved_offset": 395, + "status": "" + } + } + + +##submitblock + +Submits mined block. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "block" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "block"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "status" : { + "type" : "string", + "description": "" + }, + "required": ["status"] + } + }, + "required": ["result"] + } + +### Example (submitblock) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "submitblock", + "params": ["0100b...."] + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "status" : "OK" + } + } + + +##getlastblockheader + +Returns last block header. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "object", + "properties" : { + "block_header : { + "type" : "object", + "properties" : { + "major_version" : { + "type" : "integer", + "description" : "" + }, + "minor_version" : { + "type" : "integer", + "description" : "" + }, + "timestamp" : { + "type" : "integer", + "description" : "UNIX timestamp" + }, + "prev_hash" : { + "type" : "string", + "description" : "previous block's hash" + }, + "nonce" : { + "type" : "integer", + "description" : "" + }, + "orphan_status" : { + "type" : "boolean", + "description" : "True if the block was marked as orphaned" + }, + "height" : { + "type" : "integer", + "description" : "" + }, + "depth" : { + "type" : "integer", + "description" : "last_block_height - this_block_height" + }, + "hash" : { + "type" : "string", + "description" : "" + }, + "difficulty" : { + "type" : "integer", + "description" : "" + }, + "reward" : { + "type" : "integer", + "description" : "Reward for the block in atomic units" + } + }, + "required": [ + "major_version", + "minor_version", + "timestamp", + "prev_hash", + "nonce", + "orphan_status", + "height", + "depth", + "hash", + "difficulty", + "reward" + ] + }, + "status" : { + "type" : "string" + } + }, + "required": ["block_header", "status"] + } + }, + "required": ["result"] + } + +### Example (getlastblockheader) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getlastblockheader" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getblockheaderbyhash + +Returns last block header by given hash. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "hash" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "hash"] + } + +Return value schema: + +*See [getlastblockheader](#getlastblockheader) above* + +### Example (getblockheaderbyhash) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockheaderbyhash", + "params": { + "hash" : "9a8be8..." + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getblockheaderbyheight + +Returns block header by given block height. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "height" : { + "type" : "integer" + } + }, + "required" : ["jsonrpc", "method", "height"] + } + +Return value schema: + +*See [getlastblockheader](#getlastblockheader) above* + +### Example (getblockheaderbyheight) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockheaderbyheight", + "params": { + "height" : 123456 + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getcurrencyId + +Returns unique currency identifier. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "currency_id_blob" : { + "type" : "string" + } + } + } + +### Example (getcurrencyId) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getcurrencyid" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "currency_id_blob" : "a7..." + } + } diff --git a/content/documentation/index.md b/content/documentation/index.md new file mode 100644 index 0000000..eafe588 --- /dev/null +++ b/content/documentation/index.md @@ -0,0 +1,73 @@ +--- +title: Documentation | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Forknote command line client overview + +Forknote works through 2 separate binary files operated through command line: + +* **forknoted** – daemon to synchronize the block chain and mine cryptonote tokens. + +* **simplewallet** – wallet to receive and send funds. + + +## Install Forknote + +1. Unzip the archive to one separate folder + + +## Launch Forknote + +1. Open forknoted. For downloadable Linux archive use: +
+     ./forknoted --config-file <path_to_config_file>
+    
+ +2. Wait until forknoted is synchronized. You will be notified with several green "SYNCHRONIZED OK" messages. + +3. Open simplewallet. For downloadable Linux archive use: +
+     ./simplewallet --config-file <path_to_config_file>
+    
+ +## Daemon: synchronization & mining + +*Main article: [Daemon configuration and commands][daemon_commands]* + +After forknoted is launched you will have to wait until it is synchronized with the network. You will be notified with several green "SYNCHRONIZED OK" messages. Here are the most important daemon commands: + + +Command | Description +-----------|-----------| +start_mining <wallet_address> [threads=1] | Start mining in several threads to a given wallet address +stop_mining | Stop mining +show_hr | Show current mining hashrate +hide_hr | Stop showing current mining hashrate +help | Show all daemon commands +exit | Exit forknoted + + +## Wallet: send and receive payments + +*Main article: [Simplewallet configuration and commands][simplewallet_commands]* + +Simplewallet can only be used after the daemon is launched and synchronized. Simlewallet automatically synchronizes with forknoted. Here are the most important wallet commands: + + +Command | Description +-----------|-----------| +address | Show your wallet address +balance | Show current wallet balance +transfer <mixin_count> <address> <amount> | Send money to <address> with a mixing degree of <mixin_count> +start_mining <threads> | Start mining in daemon with several threads to the current wallet address +stop_mining | Stop mining in daemon +help | Show all wallet commands +exit | Exit simplewallet + + +[daemon_commands]: /documentation/daemon/ +[simplewallet_commands]: /documentation/simplewallet/ \ No newline at end of file diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/payment-gateway/index.md new file mode 100644 index 0000000..c0db200 --- /dev/null +++ b/content/documentation/payment-gateway/index.md @@ -0,0 +1,209 @@ +--- +title: Payment gateway overview and configuration | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Payment gateway overview and configuration + +* TOC +{:toc} + +This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] and much more. [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] page contains detailed description of every method. + + +##Configure Forknote RPC Wallet + +To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use "--config" option further. The command below launches Forknote RPC Wallet with a specific config file: + + $ ./walletd --config /home/Downloads/myconfig.conf + +To get help on available options run: + + $ ./walletd -h + +Please note, Forknote RPC Wallet config file may consist only of these options: + +Option | Description | Config Example | Console Example +-----------|-----------|-----------|-----------| +bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 | --bind-address 127.0.0.1 +bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 | --bind-port 8071 +daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 | --daemon-address 127.0.0.1 +daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 | --daemon-port 8080 +wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet | --wallet-file mywallet +wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword | --wallet-password mypassword +generate-wallet | Generate new wallet | | --generate-wallet +log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log | --log-file mylog.log +server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet | --server-root /home/Downloads/RPCWallet +log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 +testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no | --testnet no +local | Option that allows you to start Forknote RPC Wallet as an in-process node | local | --local +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 +allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port +P2P_STAT_TRUSTED
_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
_PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
_PUB_KEY 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 +GENESIS_COINBASE
_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
_TX_HEX = 01..4a | --GENESIS_COINBASE
_TX_HEX 01..4a +CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX = 86 | --CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
SPEED_FACTOR = 18 | --EMISSION_
SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
_DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
_DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
_DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
DUST_THRESHOLD = 1000000 | --DEFAULT_
DUST_THRESHOLD 1000000 +CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW = 10 | --CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW 10 +MAX_BLOCK_
SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
SIZE_INITIAL = 20480 | --MAX_BLOCK_
SIZE_INITIAL 20480 +EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +MAX_TRANSACTION
_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
_SIZE_LIMIT = 20000 | --MAX_TRANSACTION
_SIZE_LIMIT 20000 + + +##Example of a config file + +
$ cat ./notrealcoin.conf 
+
+seed-node=1.1.1.1:17100
+seed-node=2.2.2.2:17100
+seed-node=seed.notarealcoin.com:17100
+GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
+p2p-bind-port=17100
+rpc-bind-port=17101
+MONEY_SUPPLY=18446744073709551615
+DEFAULT_DUST_THRESHOLD=1000000
+MINIMUM_FEE=1000000
+CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
+CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
+BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
+CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
+CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
+UPGRADE_HEIGHT=1
+wallet-file = mywallet
+wallet-password = mypassword
+daemon-port = 17100
+bind-port = 9090
+
+
+ +Note: config file's path is relative to current working directory, not server root. + +Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode). + +Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory. + + +##Generate a new wallet + +To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly. + +To generate a new wallet you should run the following command: + + $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet + +where: + +* **<mywallet>** is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet's name will result in new *.wallet file located in the same folder as RPC Wallet +* **<mypass>** is a secret password for the new wallet file. Whichever you like; +* **--generate-wallet** option tells RPC wallet to generate wallet file and exit. + +Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name. + +If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down. + + +##Start Forknote RPC Wallet + +There are two ways to start Forknote RPC Wallet: + +###Start with a remote connection to the Daemon + +Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server. + +* For local daemons use localhost or 127.0.0.1 as an IP address. +* For remote daemons specify the remote daemon's IP address. + +Default Forknote daemon ports are 8080 and 8081. + +Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection: + + daemon-address= + daemon-port=8080 + +Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode. + +Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users. + +###Start as in-process node + +You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don't have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance. + +Use the following command to start Forknote RPC Wallet with an in-process node + + $ ./walletd --config /home/Downloads/myconfig.conf --local + +##Run Forknote RPC Wallet + +Forknote RPC wallet can be started in both daemon and console modes. + +* **Daemon mode** - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window. + +* **Console mode** - Forknote RPC Wallet is launched and prints log messages on the screen. + +Forknote RPC wallet starts in console mode by default. + +###Start as daemon (UNIX only) + +To start RPC wallet as daemon just set "--daemon" (or short "-d") option. + + ./walletd --config /home/Downloads/myconfig.conf --daemon + +Note: it's a common practice for daemons to set server root directory. + +Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory. + +###Start as service (Windows only) + +To run RPC wallet as a service on Windows you have to do the following: + +1. Create a config file and place it in the same directory as your RPC wallet's executable resides in. + + A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root); + +2. Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR: + + walletd.exe --config /home/Downloads/myconfig.conf --register-service + +3. After you see message about successful service registration you can run it in your Services panel. + + +###Uninstall service (Windows only) + +If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR: + + walletd.exe --config /home/Downloads/myconfig.conf --unregister-service + +##Forknote RPC Wallet JSON RPC API + +Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme: + +1. Create a unique address for each user to identify his particular deposits with **create_address()** method. +2. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run **get_transaction_count()** method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed. +3. Run **get_transaction()** method to receive amounts and addresses of new incoming transactions. +4. Fund these amounts to the corresponding user accounts. +5. Withdraw with **send_transaction()** method that allows you to send transaction to one or several addresses. + +Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] + + +[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment_gateway/json_rpc_api/ diff --git a/content/documentation/payment-gateway/json-rpc-api.md b/content/documentation/payment-gateway/json-rpc-api.md new file mode 100644 index 0000000..808e5db --- /dev/null +++ b/content/documentation/payment-gateway/json-rpc-api.md @@ -0,0 +1,698 @@ +--- +title: Payment gateway JSON RPC API | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Payment gateway JSON RPC API + +* TOC +{:toc} + +On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method. + +More on how to start and operate Forknote RPC Wallet can be found here: [Forknote RPC Wallet][Forknote_RPC_Wallet] + +To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this: + + http://:/json_rpc + +Where: + +* <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost +* <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this [here][Configure_Forknote_RPC_Wallet]. + + +##send_transaction + +**send_transaction()** method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +payment_id | No | 64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service. | string | 96A3..A5BB +fee | Yes | Transaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000 | uint64 | 1000000 +unlock_time | No | Height of the block until which transaction is going to be locked for spending. | uint64 | 0 +mixin | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 +destinations | Yes | Array that contains addresses and amounts for the transaction:
* amount - uint64 - desired amount. Specify it in atomic units
* address - string - desired address
| array | "amount": 10000000000,
"address": "288Ck..Zv" | + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transaction_id | Identifier of the sent transaction. Identifier indicates a number of the transaction in your wallet. | uint64 | 25 + + +Input Example: + + { + "params": { + "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional + "fee": 1000000000, + "unlock_time": 0, + "mixin": 0, + "destinations": [ + { + "amount": 10000000000, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + }, + { + "amount": 500000, + "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + ] + }, + "jsonrpc": "2.0", + "id": "1", + "method": "send_transaction" + } + + +Return value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transaction_id":470 + } + } + + +##get_address + +**get_address()** method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out "15" in the methods body. The first address created on wallet generation has id 0. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +index | No | ID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address. | uint64 | 20 + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +address | Corresponding address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw + + + +Input example: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "get_address", + "params": { + "index": 42 + } + } + +Output value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + } + + +##create_address + +**create_address()** method creates an additional address in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +address | Created address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw + + +Input value example: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "create_address", + "params": { + } + } + +Output value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + } + + +##get_address_count + +**get_address_count()** method returns a number of addresses in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +count | A number of addresses in your wallet | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_address_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "count":2 + } + } + + +##delete_address + +**delete_address()** method deletes a specified address. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | An address to be deleted. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +In case of success returns an empty JSON object. + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "delete_address" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": {} + } + + + +##get_actual_balance + +**get_actual_balance()** method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address. + +* Actual Balance — your wallet's balance that is available for spending immediately +* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | Specify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +actual_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_actual_balance" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "actual_balance":32340960388304977 + } + } + + +##get_pending_balance + +**get_pending_balance()** method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address. + +* Actual Balance — your wallet's balance that is available for spending immediately +* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | Specify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +pending_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_pending_balance" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "pending_balance": 10000 + } + } + + +##get_transactions_count + +**get_transactions_count()** method returns a cumulative number of transactions in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transactions_count | A number of transactions | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transactions_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transactions_count":471 + } + } + + +##get_transfers_count + +**get_transfers_count()** method returns a cumulative number of transfers in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transfers_count | A number of transfers | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transfers_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transfers_count":2 + } + } + + +##get_transaction_id_by_transfer_id + +**get_transaction_id_by_transfer_id()** method returns and id of a transaction containing this particular transfer. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transfer_id | Yes | Transfer identifier | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transaction_id | Corresponding transaction id | uint64 | 21 + + +Input example: + + { + "params": { + "transfer_id": 0 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transaction_id_by_transfer_id" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result":{ + "transaction_id":469 + } + } + + +##get_transaction + +**get_transaction()** method returns information about a particular transaction. + +Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transaction_id | Yes | Requested transaction id | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +found | Is found or not | bool | True / False +transaction_info | Contains:
* 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
* 2. transfer_count - uint64 - a number of transfers in this transaction
* 3. total_amount - int64 - total transaction amount
* 4. fee - uint64 - transaction fee.
* 5. hash - string - transaction's hash
* 6. block_height - uint64 - height of the block containing this transaction
* 7. timestamp - uint64 - time when transaction was included into the block
* 8. extra - string - string of a variable length containing A-Z, 0-9 characters
* 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
* 10. transfers - array - contains 2 fields:
** address - string
** amount - int64
| object | See below + + +Input example: + + { + "params": { + "transaction_id": 1 + }, + "jsonrpc": "2.0", + "id": "1", + "method": + "get_transaction" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "found":true, + "transaction_info": { + "block_height":2, + "extra":"2jh1iak...123yh1g4g", + "fee":0, + "first_transfer_id":103, + "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0, + "transfers": + [ + { + "amount": 10000000000, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + }, + { + "amount": 500000, + "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + ] + } + } + } + + +##get_transfer + +**get_transfer()** method returns a transfer that corresponds to the requested identifier + +Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transfer_id | Yes | Requested transfer | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +found | Is found or not | bool | true / false +transfer_info | Returns transfer_info object containing:
* amount - uint64
* address - string | object | See below + + +Input example: + + { + "params": { + "transfer_id": 0 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transfer" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "found":true, + "transfer_info": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw", + "amount":100000 + } + } + } + + +##get_incoming_payments + +**get_incoming_payments()** method returns payments with a requested payment_id. This method will be depreciated soon. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +payments | Yes | Contains strings of payment_id's | array | 96A3937D88E210..B1FE9C0487A5BB + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +payments | Contains objects:
* id - string - in payment_id format
* payments - array, contains:
** tx_hash - string - hash of the transaction
** amount - uint64 - amount of the transaction
** block_height - uint64 - the height of the block containing a transaction
** unlock_time - uint64 - transaction unlock time
| array | See below + + +Input example: + + { + "params": { + "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"] + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_incoming_payments" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "payments": [ + { + "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", + "payments": + [ + { + "amount":10000000000, + "block_height":728, + "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "unlock_time":0 + } + ] + } + ] + } + } + + +##list_transactions + +**list_transactions()** method returns an array of transactions starting from a particular id. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +starting_transaction_id | Yes | Identifier of a starting transaction | uint32 | 20 +max_transaction_count | Yes | Maximum number of returned consecutive transactions | uint32 | 20 + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transactions | An array containing information about transactions:
Contains:
* block_height - uint64 - height of the block containing this transaction

* extra - string - string of a variable length containing A-Z, 0-9 characters
* fee - uint64 - transaction fee.
* first_transfer_id - uint64 - identifier of the first transfer in this transaction
* hash - string - transaction's hash
* timestamp - uint64 - time when transaction was included into the block
* total_amount - int64 - total transaction amount
* transfer_count - uint64 - a number of transfers in this transaction
* state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
* transfers - array - contains 2 fields:
** address - string
** amount - int64
| object | See below. + + +Input example: + + { + "params": { + "starting_transaction_id": 100, + "max_transaction_count": 50 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "list_transactions" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transactions": [ + { + "block_height":2, + "extra":"01e3...70f3acfc4", + "fee":0, + "first_transfer_id":-1, + "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0 + "transfers": [ + { + "amount": 102002, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + } + ] + }, + { + "block_height":3, + "extra":"01e3...70f3acfc4", + "fee":0, + "first_transfer_id":-1, + "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0 + "transfers": [ + { + "amount": 102002, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + } + ] + } + ] + } + } + + +[Forknote_RPC_Wallet]: /documentation/payment_gateway/ +[Configure_Forknote_RPC_Wallet]: /documentation/payment_gateway/#configure-forknote-rpc-wallet diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md new file mode 100644 index 0000000..f35cc6f --- /dev/null +++ b/content/documentation/simplewallet/index.md @@ -0,0 +1,105 @@ +--- +title: Simplewallet configuration and commands | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Simplewallet configuration and commands + +* TOC +{:toc} + +##General options + + --help Produce help message + --version Output version information + --data-dir arg (=/Users/USER/.forknote) + Specify data directory + --config-file arg (=./configs/-.conf) Specify configuration file + --command arg Specify command + + +##Wallet options + +Option | Description | Config Example | Console Example +-----------|-----------|-----------|-----------| +wallet-file | Use wallet <arg> | wallet-file = /home/USERNAME/
forknote-linux/dashcoin.wallet | --wallet-file /home/USERNAME/
forknote-linux/dashcoin.wallet +generate-new-wallet | Generate new wallet and save it to <arg> | | --generate-new-wallet /home/USERNAME/
forknote-linux/dashcoin.wallet +password | Wallet password | password = PASSWORD | --password PASSWORD +daemon-address | Use daemon instance at <host>:<port> | daemon-address = 127.0.0.1:29081 | --daemon-address 127.0.0.1:29081 +daemon-host | Use daemon instance at host <arg> instead of localhost | daemon-host = 127.0.0.1 | --daemon-host 127.0.0.1 +daemon-port | Use daemon instance at port <arg> instead of 8081 | daemon-port = 29081 | --daemon-port 29081 +set_log | Level of logging. Default is 1. | set_log = 4 | --set_log 4 +testnet | Used to deploy test nets. The daemon must be launched with --testnet flag | | --testnet +wallet-rpc-bind-ip | Specify ip to bind rpc server | wallet-rpc-bind-ip = 127.0.0.1 | --wallet-rpc-bind-ip 127.0.0.1 +wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server | wallet-rpc-bind-port = 29082 | --wallet-rpc-bind-port 29082 +GENESIS_COINBASE
_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
_TX_HEX = 01..4a | --GENESIS_COINBASE
_TX_HEX 01..4a +CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX = 86 | --CRYPTONOTE_
PUBLIC_ADDRESS_
BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
SPEED_FACTOR = 18 | --EMISSION_
SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
_GRANTED_FULL
_REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
_DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
_DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
_DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
DUST_THRESHOLD = 1000000 | --DEFAULT_
DUST_THRESHOLD 1000000 +CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW = 10 | --CRYPTONOTE_
MINED_MONEY_
UNLOCK_WINDOW 10 +MAX_BLOCK_
SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
SIZE_INITIAL = 20480 | --MAX_BLOCK_
SIZE_INITIAL 20480 +EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +MAX_TRANSACTION
_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
_SIZE_LIMIT = 20000 | --MAX_TRANSACTION
_SIZE_LIMIT 20000 +DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE | --DEFAULT_FEE 1000000000 +SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet | SYNC_FROM_ZERO | --SYNC_FROM_ZERO + + +##Example of a config file + +You can use the same configuration file as the daemon + +
$ cat ./notrealcoin.conf 
+
+CRYPTONOTE_NAME=notrealcoin
+seed-node=1.1.1.1:17100
+seed-node=2.2.2.2:17100
+seed-node=seed.notarealcoin.com:17100
+GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
+p2p-bind-port=17100
+rpc-bind-port=17101
+MONEY_SUPPLY=18446744073709551615
+DEFAULT_DUST_THRESHOLD=1000000
+MINIMUM_FEE=1000000
+CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
+CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
+BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
+CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
+CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
+UPGRADE_HEIGHT=1
+
+wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
+password=FAKE_PASSWORD
+wallet-rpc-bind-port=17102
+
+ + +##Wallet commands + +Command | Description | Arg 1 | Arg 2 | Arg 3 | Arg 4 | Arg 5 +-----------|-----------|-----------|-----------|-----------|-----------|-----------| +address | Show current wallet public address | - | - | - | - | - +balance | Show current wallet balance | - | - | - | - | - +bc_height | Show blockchain height | - | - | - | - | - +help | Print help on wallet commands | - | - | - | - | - +incoming_transfers | Show incoming transfers | - | - | - | - | - +list_transfers | Show all known transfers | - | - | - | - | - +payments | Show payments with the corresponding payment_id's. You may indicate more than one payment_id. | [string] payment_id | - | - | - | - +reset | Discard cache data and start synchronizing from scratch | - | - | - | - | - +save | Save wallet synchronized data | - | - | - | - | - +set_log | Change current log detailization level | [uint] log level (0 - 4) | - | - | - | - +start_mining | Start mining in daemon | - | - | - | - | - +stop_mining | Stop mining in daemon | - | - | - | - | - +transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count | [string] address | [double] amount | [string] -p payment_id | [double] -f fee + diff --git a/content/documentation/simplewallet/json-rpc-api.md b/content/documentation/simplewallet/json-rpc-api.md new file mode 100644 index 0000000..f0634d2 --- /dev/null +++ b/content/documentation/simplewallet/json-rpc-api.md @@ -0,0 +1,467 @@ +--- +title: Simplewallet JSON RPC API | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Simplewallet JSON RPC API + +* TOC +{:toc} + +To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet's arguments). You can choose any free port. To do that execute the following command from the command line: + + simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082 + +Having done that you're ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100): + + http://126.0.1.100:29082/json_rpc + http://localhost:29082/json_rpc + +Please note, there is no "refresh" RPC method. RPC wallet refresh is performed automatically each 20 seconds. + + +##getbalance + +Return balance. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "locked_amount" : { + "type" : "integer" + }, + "available_balance" : { + "type" : "integer" + } + } + } + +###Example (getbalance) + + { + "jsonrpc": "2.0", + "method": "getbalance", + "params": {} + } + + +##transfer + +Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time. + +Please note: fee param is a mandatory and should not be less than 0.01 BCN + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "destinations" : { + "type" : "array", + "items" : { + "amount" : { + "type" : "integer" + }, + "address" : { + "type" : "string" + } + }, + "minItems" : 1 + }, + + "payment_id": { + "type" : "string" + } + + "fee" : { + "type" : "integer" + }, + + "mixin" : { + "type" : "integer" + }, + + "unlock_time" : { + "type" : "integer" + "description" : "Unix timestamp" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "tx_hash" : { + "type" : "string" + } + } + } + +###Example (transfer) + +Please note, payment_id is an optional argument and can be left out. + + { + "jsonrpc":"2.0", + "method":"transfer", + "params":{ + "destinations":[ + { + "amount":11111, + "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" + }, + { + "amount":22222, + "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" + } + ], + "payment_id":"", + "fee":1000000, + "mixin":0, + "unlock_time":0 + } + } + + +##store + +Store wallet data. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : {} + } + +###Example (store) + + { + "jsonrpc": "2.0", + "method": "store", + "params": {} + } + + +##get_payments + +Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + + "payment_id" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "payments" : { + "type" : "array", + "items" : { + "amount" : { + "type" : "integer" + }, + "block_height" : { + "type" : "integer" + }, + "tx_hash" : { + "type" : "string" + }, + "unlock_time" : { + "type" : "integer" + } + } + } + } + } + +###Example (get_payments) + + { + "jsonrpc":"2.0", + "method":"get_payments", + "params":{ + "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9" + } + } + + +##get_transfers + +Returns the list of all the wallet's incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change). + +URL: + + /json_rpc + +Input: + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "result" : { + "type" : "transfers" + "transfers" : { + "type" : "array", + "items" : { + "address" : { + "type" : "string" + }, + "amount" : { + "type" : "integer" + }, + "blockIndex" : { + "type" : "integer" + }, + "fee" : { + "type" : "integer" + }, + "output" : { + "type" : "boolean" + }, + "paymentId" : { + "type" : "string" + }, + "time" : { + "type" : "integer" + }, + "transactionHash" : { + "type" : "string" + }, + "unlockTime" : { + "type" : "integer" + }, + } + } + } + } + } + +###Example (get_transfers) + + { + "jsonrpc": "2.0", + "method": "get_transfers", + "params": {} + } + + +##get_height + +Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "height" : { + "type" : "integer" + } + } + } + +###Example (get_height) + + { + "jsonrpc": "2.0", + "method": "get_height", + "params": {} + } + + +##reset + +Erases simplewallet's internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : {} + } + +###Example (reset) + + { + "jsonrpc": "2.0", + "method": "reset", + "params": {} + } diff --git a/content/download.md b/content/download.md new file mode 100644 index 0000000..f4a1125 --- /dev/null +++ b/content/download.md @@ -0,0 +1,54 @@ +--- +title: Download | Forknote +layout: overview +body_class: download +--- + +
+
+

Join the Forknote Community.

+

The easiest way to create Cryptonote coins. Learn more.

+
+
+ +
+
    +
  • + +

    Windows CLI

    +

    Daemon, simplewallet and payment gateway for Windows (64bit)

    +
  • +
  • + +

    Linux CLI

    +

    Daemon, simplewallet and payment gateway for Ubuntu (64bit)

    +
  • +
  • + +

    Mac CLI

    +

    Daemon, simplewallet and payment gateway for Mac (64bit)

    +
  • +
+
+ +
+
+ +

Want to connect to existing Forknote network?

+

Awesome! A few tips you may find useful:

+ +
+ +
+ +

Want to create your own cryptocurrency?

+

Follow our guides and launch in a few minutes:

+ +
+
diff --git a/content/guides/create-coin.md b/content/guides/create-coin.md new file mode 100644 index 0000000..c898cb7 --- /dev/null +++ b/content/guides/create-coin.md @@ -0,0 +1,130 @@ +--- +title: Create Cryptonote coin guide | Forknote +layout: documentation +body_class: developers +subnav_class: docs-guides +sidebar_nav: sidebar-giudes +--- + +# Create coin + +* TOC +{:toc} + + +Let's walk through the process of creating a configuration file for your coin. + + +## Creating config file + +Create the configuration file of your coin by using our [configuration form][create]. + +[![Create cryptonote coin form](/images/documentation/create-form.png)][create] + +Save the resulted configuration in the `configs` folder of Forknote. + +###Example on Linux/Mac: + +
$ cat >testcoin.conf 
+
+EMISSION_SPEED_FACTOR=18
+DIFFICULTY_TARGET=120
+CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
+MONEY_SUPPLY=18446744073709551615
+PREMINED_PERCENT=0
+DEFAULT_DUST_THRESHOLD=1000000
+MINIMUM_FEE=1000000
+CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
+CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
+CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
+p2p-bind-port=13539
+rpc-bind-port=13540
+BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
+CRYPTONOTE_NAME=testcoin
+UPGRADE_HEIGHT=1
+
+ + +If you want to learn more you can checkout the [supported parameters][supported-parameters] of the configuration file. + + +## Creating simplewallet addresses + +*This step is only required if your coin has premine* + +
$ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
+
+config path exist
+forknote wallet v1.0.8.1.614()
+Sync from timestamp: 1444336575
+Error: wallet failed to connect to daemon (http://localhost:13540).
+Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
+view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
+
+
+ +**Caution: Don't forget to backup the wallets** + + +## Genesis coinbase transaction creation + +### For coins without premine + +
$ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
+
+config path exist
+Modify this line into your coin configuration file as is: 
+GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
+
+
+ +###For coins with premine + +
$ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
+ --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
+ --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
+
+config path exist
+outs: 922337203685477580
+outs: 922337203685477580
+Modify this line into your coin configuration file as is: 
+GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
+
+
+ +You have to add `GENESIS_COINBASE_TX_HEX` to your configuration file. + +Alternatively, you can add it into the [configuration form][create] and save the config file again. + +[![Create cryptonote coin form - genesis](/images/documentation/create-form-genesis.png)][create] + +### Using simplewallet for wallets, containing premined coins: + +You must use the `SYNC_FROM_ZERO` option of simplewallet to see the premined coins. + +
$ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
+
+ + +## Adding seed nodes + +After you have all set in the configuration file, you can start the seed nodes. + +We recommend you use [Digital Ocean][ditital-ocean] or [Vultr][vultr]. The 5$ or 10$ option should be enough for most of the cases. +You can use our [guide about seed node creation][seed-node-guide] to get started fast. + +After you know the IP of the VPS, you have to add `seed-node` to your configuration file. + +
seed-node=1.1.1.1:40741
+
+ +Alternatively, you can add it into the [configuration form][create] and save the config file again. + +[![Create cryptonote coin form - seed](/images/documentation/create-form-seed.png)][create] + + +[supported-parameters]: /documentation/daemon/#command-line-options-and-settings-options +[create]: /create/ +[seed-node-guide]: /guides/starting-seed-node/ +[ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 +[vultr]: http://www.vultr.com/?ref=6832621 \ No newline at end of file diff --git a/content/guides/getting-started.md b/content/guides/getting-started.md new file mode 100644 index 0000000..e772649 --- /dev/null +++ b/content/guides/getting-started.md @@ -0,0 +1,90 @@ +--- +title: Getting Started | Forknote +layout: documentation +body_class: developers +subnav_class: docs-guides +sidebar_nav: sidebar-giudes +--- + +# Getting Started + +* TOC +{:toc} + +Let's walk through core Forknote concepts as we tackle a simple use case. + +## Overview + +Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must [download][download] the latest version of Forknote. + +## Starting the daemon for preconfigured networks + +Forknote comes preconfigured with 2 networks - Dashcoin and [Bytecoin][bytecoin]. + +### Connecting to Dashcoin + +To connect to Dashcoin open up a command prompt and enter the +following command (without the `$`): + +
+$ ./forknoted
+
+config path exist
+12:34:56.789012 INFO forknote v1.0.8.608()
+
+ +By default, Forknote will load the Dashcoin configuration file (`configs/-.conf`), if no configuration file is passed as option. + +### Connecting to Bytecoin + +To connect to Dashcoin open up a command prompt and enter the +following command (without the `$`): + +
+$ ./forknoted --config-file configs/bytecoin.conf
+
+config path exist
+12:34:56.789012 INFO forknote v1.0.8.608()
+
+ +## Starting the daemon for custom networks + +To connect to custom networks, you must save the configuraton file in the `configs` subfolder of Forknote. + +Next, let's start the daemon itself: + +
+$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
+
+config path exist
+12:34:56.789012 INFO forknote v1.0.8.608()
+
+ +Please note you have to change `CUSTOM_NETWORK` with appropriate file name. + +## Starting simplewallet + +Simplewallet uses the same configuration file as the daemon. + +To start simplewallet: + +
+$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
+
+config path exist
+forknote wallet v1.0.8.608()
+Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
+What do you want to do?
+[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
+
+ +Press `g` to create new wallet and type your wallet's name and password. + +A good practice for naming your wallet is to add `NETWORK.` prefix to your name.
+For example, for Dashcoin wallet use the `dashcoin.` prefix - `dashcoin.example_wallet` + +Don't forget to backup your wallet. + + +[download]: /download/ +[bytecoin]: https://bytecoin.org/ \ No newline at end of file diff --git a/content/guides/index.md b/content/guides/index.md new file mode 100644 index 0000000..bc05af6 --- /dev/null +++ b/content/guides/index.md @@ -0,0 +1,15 @@ +--- +title: Guides | Forknote +layout: documentation +body_class: developers +subnav_class: docs-guides +sidebar_nav: sidebar-giudes +--- + +# Development Guides + +This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes. + + diff --git a/content/guides/starting-seed-node.md b/content/guides/starting-seed-node.md new file mode 100644 index 0000000..1133fed --- /dev/null +++ b/content/guides/starting-seed-node.md @@ -0,0 +1,131 @@ +--- +title: Getting Started | Forknote +layout: documentation +body_class: developers +subnav_class: docs-guides +sidebar_nav: sidebar-giudes +--- + +# Starting seed node + +* TOC +{:toc} + +This guide will walk you through the process of starting a Forknote seed node on a **Ubuntu 14.04** VPS. + +## Getting a VPS + +Run forknoted on a VPS is the cheapest way to get your network started.
+You can get a VPS at [Digital Ocean][ditital-ocean] or [Vultr][vultr]. The 5$ option is what most coins need. + +[![Vultr recommended VPS](/images/documentation/vps-vultr-recommended.png)][vultr] + + +## Adding nodes to config file + +Once you have your VPS, you can see its IP. + +![Vultr IP VPS](/images/documentation/vps-vultr-ip.png) + +Add its IP to the seed nodes. + +![Create cryptonote coin form - seed](/images/documentation/create-form-seed.png) + + +## Installing Forknote + +Once you connect to the VPS, create and log into user `fork`. + +
$ useradd -m fork
+$ su fork
+$ cd ~
+
+ +Now you can download Forknote. + +
$ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
+
+--2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
+Resolving github.com (github.com)... 192.30.252.32
+
+
+ +Unarchive the downloaded file. + +
$ tar -zxvf forknote-linux.tar.gz 
+
+forknote-linux/
+forknote-linux/configs/
+forknote-linux/forknoted
+forknote-linux/simplewallet
+forknote-linux/walletd
+forknote-linux/configs/-.conf
+forknote-linux/configs/bytecoin.conf
+
+ + +## Saving the configuration file + +Log into the forknote directory + +
$ cd forknote-linux
+ +Write your configuration file + +
$ cat >configs/testcoin.conf 
+
+EMISSION_SPEED_FACTOR=18
+DIFFICULTY_TARGET=120
+CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
+MONEY_SUPPLY=18446744073709551615
+PREMINED_PERCENT=0
+DEFAULT_DUST_THRESHOLD=1000000
+MINIMUM_FEE=1000000
+CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
+CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
+CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
+p2p-bind-port=13539
+rpc-bind-port=13540
+BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
+CRYPTONOTE_NAME=testcoin
+UPGRADE_HEIGHT=1
+GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
+seed-node=45.32.238.88:13539
+
+
+ + +## Starting in upstart + +Log with `root` user and change the directory to `/etc/init/`. + +
$ cd /etc/init
+
+ +Create the upstart config file. + +
$ cat >forknote-testcoin-daemon.conf 
+
+description "testcoin daemon"
+
+start on runlevel [23]
+stop on shutdown
+
+exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
+
+post-stop exec sleep 30
+
+respawn
+respawn limit 5 30
+
+
+ +Start the service. + +
$ start forknote-testcoin-daemon 
+
+ +You now have your seed node up and running. It will automatically restart if something goes wrong. + +[ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 +[vultr]: http://www.vultr.com/?ref=6832621 \ No newline at end of file diff --git a/content/guides/troubleshooting.md b/content/guides/troubleshooting.md new file mode 100644 index 0000000..e4c1d00 --- /dev/null +++ b/content/guides/troubleshooting.md @@ -0,0 +1,60 @@ +--- +title: Troutbleshooting | Forknote +layout: documentation +body_class: developers +subnav_class: docs-guides +sidebar_nav: sidebar-giudes +--- + +# Troubleshooting + +* TOC +{:toc} + +A list of problems you may encounter on the way. + +##An existing connection was forcibly closed by the remote host + +###Symptom + +Nobody can connect to the seed node. `forknoted` on the seed node prints the following `WARNING` + +
+2015-Sep-22 22:51:12.627019 WARNING [node_server] [127.0.0.1:55741 INC] Exception in 
+connectionHandler: TcpConnection::read, WSAGetOverlappedResult failed, result=10054, 
+An existing connection was forcibly closed by the remote host.
+
+ +###Solution + +* Add the P2P port in "Inbound Rules" in the Windows Firewall on the seed node +* If you are behind NAT added `--p2p-external-port ` param to forknoted. + + +##Coinbase transaction doesn't use full amount of block reward + +###Symptom + +`forknoted` cannot start and prints the following `ERROR` + +
+20:41:36.303639 ERROR Coinbase transaction doesn't use full amount of block reward: spent 70.368744177663, block reward is 1844674.407370955160
+20:41:36.303736 INFO Block <5668876f735d91e7a4b7230dedddfeead0004e83a913eb1d8782101c5f8fc13a> has invalid miner transaction
+20:41:36.303830 ERROR Failed to add genesis block to blockchain
+20:41:36.303898 ERROR Failed to initialize blockchain storage
+20:41:36.303960 ERROR Failed to initialize core
+
+ +This error occurs when the loaded blockchain has different parameters than the configuration file. + +###Solution + +Delete the blockchain folder. + +On Windows delete this folder: + +
C:\Users\%user_name%\AppData\Roaming\%yourcoin%\
+ +On Linux/OSX: + +
$ rm -rf ~/.YOURCOIN/
diff --git a/content/index.md b/content/index.md new file mode 100644 index 0000000..c4a0601 --- /dev/null +++ b/content/index.md @@ -0,0 +1,41 @@ +--- +title: Create Cryptonote tokens | Forknote +layout: overview +--- + +
+

+ Leverage the power of
+ Bytecoin in your Coin. +

+

Get started with one of our guides, or jump straight into the download section.

+ Download + forknote +
+ +
+
+

Join the Forknote Community.

+

The easiest way to create Cryptonote coins. Learn more.

+
+
+ +
+ +
diff --git a/layouts/_disqus.html b/layouts/_disqus.html new file mode 100644 index 0000000..bbd0cf2 --- /dev/null +++ b/layouts/_disqus.html @@ -0,0 +1,13 @@ +
+ + \ No newline at end of file diff --git a/layouts/_meta.html b/layouts/_meta.html new file mode 100644 index 0000000..021990a --- /dev/null +++ b/layouts/_meta.html @@ -0,0 +1,16 @@ +

+ <%= @item[:title] %> +

+ +
+ +
diff --git a/layouts/_posts.html b/layouts/_posts.html new file mode 100644 index 0000000..74c70a3 --- /dev/null +++ b/layouts/_posts.html @@ -0,0 +1,7 @@ +<% @posts.each_with_index do |article, idx| %> +
+<%= render '_meta', :item => article %> +<%= get_post_start(article) %> + +
+<% end %> diff --git a/layouts/_posts_small.html b/layouts/_posts_small.html new file mode 100644 index 0000000..316f1d9 --- /dev/null +++ b/layouts/_posts_small.html @@ -0,0 +1,3 @@ +<% @posts.each do |article| %> +
  • <%= article[:title] %>
  • +<% end %> diff --git a/layouts/_social.html b/layouts/_social.html new file mode 100644 index 0000000..a91028e --- /dev/null +++ b/layouts/_social.html @@ -0,0 +1,6 @@ + + diff --git a/layouts/all_posts.html b/layouts/all_posts.html new file mode 100644 index 0000000..4c1e901 --- /dev/null +++ b/layouts/all_posts.html @@ -0,0 +1,12 @@ + diff --git a/layouts/blog.html b/layouts/blog.html new file mode 100644 index 0000000..33c288c --- /dev/null +++ b/layouts/blog.html @@ -0,0 +1,25 @@ +<%= render 'head' %> + + +
    + + + <%= render 'header' %> + +
    +
    + <%= yield %> +
    + + <%= render 'sidebar-blog', :posts_list => posts_list %> +
    + + <%= render 'footer' %> + + diff --git a/layouts/contact.html b/layouts/contact.html new file mode 100644 index 0000000..206b584 --- /dev/null +++ b/layouts/contact.html @@ -0,0 +1,31 @@ +<%= render 'head' %> + + + <%= render 'header' %> +
    +
    + <%= yield %> +
    + + + +
    + + <%= render 'footer' %> + + diff --git a/layouts/default.html b/layouts/default.html new file mode 100644 index 0000000..7d6d923 --- /dev/null +++ b/layouts/default.html @@ -0,0 +1,14 @@ +<%= render 'head' %> + + + <%= render 'header' %> + +
    +
    + <%= yield %> +
    +
    + + <%= render 'footer' %> + + diff --git a/layouts/documentation.html b/layouts/documentation.html new file mode 100644 index 0000000..a498e40 --- /dev/null +++ b/layouts/documentation.html @@ -0,0 +1,32 @@ +<%= render 'head' %> + + + <%= render 'header' %> + + + +
    +
    + <%= yield %> +
    + + +
    + + <%= render 'footer' %> + + diff --git a/layouts/footer.html b/layouts/footer.html new file mode 100644 index 0000000..748e8b2 --- /dev/null +++ b/layouts/footer.html @@ -0,0 +1,35 @@ + + + + \ No newline at end of file diff --git a/layouts/head.html b/layouts/head.html new file mode 100644 index 0000000..f422f05 --- /dev/null +++ b/layouts/head.html @@ -0,0 +1,16 @@ + + + + + + + + <%= @item[:title] %> + + + + + + + + diff --git a/layouts/header.html b/layouts/header.html new file mode 100644 index 0000000..b3b0d22 --- /dev/null +++ b/layouts/header.html @@ -0,0 +1,21 @@ +
    + +
    diff --git a/layouts/headlines.html b/layouts/headlines.html new file mode 100644 index 0000000..ab79d7e --- /dev/null +++ b/layouts/headlines.html @@ -0,0 +1,6 @@ +

    Recent Posts

    + diff --git a/layouts/overview.html b/layouts/overview.html new file mode 100644 index 0000000..583833d --- /dev/null +++ b/layouts/overview.html @@ -0,0 +1,10 @@ +<%= render 'head' %> + + + <%= render 'header' %> + + <%= yield %> + + <%= render 'footer' %> + + diff --git a/layouts/posts.html b/layouts/posts.html new file mode 100644 index 0000000..e947fa0 --- /dev/null +++ b/layouts/posts.html @@ -0,0 +1,32 @@ +<%= render 'head' %> + + +
    + + + <%= render 'header' %> + +
    +
    +
    + <%= render '_meta', :item => @item %> + + <%= yield %> + <%= render '_social', :item => @item %> + + <%= render '_disqus' %> +
    +
    + + <%= render 'sidebar-blog', :posts_list => posts_list %> +
    + + <%= render 'footer' %> + + diff --git a/layouts/sidebar-blog.html b/layouts/sidebar-blog.html new file mode 100644 index 0000000..8ec086b --- /dev/null +++ b/layouts/sidebar-blog.html @@ -0,0 +1,6 @@ + diff --git a/layouts/sidebar-documentation.html b/layouts/sidebar-documentation.html new file mode 100644 index 0000000..d75146d --- /dev/null +++ b/layouts/sidebar-documentation.html @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/layouts/sidebar-giudes.html b/layouts/sidebar-giudes.html new file mode 100644 index 0000000..0f2c614 --- /dev/null +++ b/layouts/sidebar-giudes.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/layouts/sidebar.html b/layouts/sidebar.html new file mode 100644 index 0000000..5e55dbf --- /dev/null +++ b/layouts/sidebar.html @@ -0,0 +1,18 @@ + diff --git a/lib/blog_helper.rb b/lib/blog_helper.rb new file mode 100644 index 0000000..3c71b86 --- /dev/null +++ b/lib/blog_helper.rb @@ -0,0 +1,43 @@ +module BlogHelper + MimeFormat ||= "application/vnd.github.%s+json".freeze + # Public: Filters the change items out. If a version is given, show only the + # items related to that version. + # + # version - Optional String version key. + # + # Returns an Array of all 30 Nanoc::Item objects, sorted in reverse + # chronological order. + + DefaultTimeFormat ||= "%B %-d, %Y".freeze + def post_date(item) + strftime item[:created_at] + end + + def strftime(time, format = DefaultTimeFormat) + attribute_to_time(time).strftime(format) + end + + def posts_list() + posts = @items.select { |item| item[:kind] == 'article' } + posts.sort! do |x, y| + attribute_to_time(y[:created_at]) <=> attribute_to_time(x[:created_at]) + end + end + + def get_post_start(post) + content = post.compiled_content + if content =~ /\s\s/ + content = content.partition('').first + + "" + end + return content + end + + def avatar_for(login) + %(Avatar for #{login}) % avatar_url_for(login) + end + + def avatar_url_for(login) + "https://github.com/#{login}.png" + end +end diff --git a/lib/default.rb b/lib/default.rb new file mode 100644 index 0000000..0b176c8 --- /dev/null +++ b/lib/default.rb @@ -0,0 +1,3 @@ +# All files in the 'lib' directory will be loaded +# before nanoc starts compiling. +include Nanoc::Helpers::Rendering, Nanoc::Helpers::Blogging, BlogHelper diff --git a/lib/search_generator.rb b/lib/search_generator.rb new file mode 100755 index 0000000..c824abd --- /dev/null +++ b/lib/search_generator.rb @@ -0,0 +1,61 @@ +require 'json' +require 'nokogiri' + +class SearchFilter < Nanoc::Filter + identifier :search + type :text + + $search_file_path = File.join(Dir.pwd, "static", "search-index.json") + $search_file_contents = { :pages => [] } + + sidebar = File.open(File.join(Dir.pwd, "layouts", "sidebar.html")) + $sidebar_doc = Nokogiri::HTML(sidebar) + sidebar.close + + def run(content, params={}) + # uses nokogiri to determine parent section name + containing_li_text = $sidebar_doc.xpath("//a[@href='#{@item.identifier}']/../../../h3/a[2]/text()") + + # we're looking at an overview page + containing_li_text = $sidebar_doc.xpath("//a[@href='#{@item.identifier}']/text()") if containing_li_text.empty? + + page = { :url => @item.identifier, :title => @item[:title].split("|")[0].strip, :section => "Blog/#{containing_li_text}" } + + $search_file_contents[:pages] << page + $search_file_contents[:pages] = merge_sort($search_file_contents[:pages]) + + write_search_file + + content + end + + def write_search_file + begin + File.open($search_file_path, 'w') {|f| f.write(JSON.pretty_generate($search_file_contents) << "\n") } # and final newline) + rescue + puts 'WARNING: cannot write search file.' + end + end + + private + + # basically we need a merge sort for elements like "/v3/orgs." Otherwise, + # nanoc puts "/v3/orgs/members" before "/v3/orgs." Children should respect their + # parents, yo. + def merge_sort(a) + return a if a.size <= 1 + l, r = split_array(a) + result = combine(merge_sort(l), merge_sort(r)) + end + + def split_array(a) + mid = (a.size / 2).round + [a.take(mid), a.drop(mid)] + end + + def combine(a, b) + return b.empty? ? a : b if a.empty? || b.empty? + smallest = a.first[:url] <= b.first[:url] ? a.shift : b.shift + combine(a, b).unshift(smallest) + end +end diff --git a/lib/static.rb b/lib/static.rb new file mode 100644 index 0000000..5d091fa --- /dev/null +++ b/lib/static.rb @@ -0,0 +1,55 @@ +require 'digest/sha1' + +module Nanoc3::DataSources + + class Static < Nanoc3::DataSource + + identifier :static + + def items + # Get prefix + prefix = config[:prefix] || 'static' + + # Get all files under prefix dir + filenames = Dir[prefix + '/**/*'].select { |f| File.file?(f) } + + # Convert filenames to items + filenames.map do |filename| + attributes = { + :extension => File.extname(filename)[1..-1], + :filename => filename, + } + identifier = filename[(prefix.length+1)..-1] + '/' + + mtime = File.mtime(filename) + checksum = checksum_for(filename) + + Nanoc3::Item.new( + filename, + attributes, + identifier, + :binary => true, :mtime => mtime, :checksum => checksum + ) + end + end + + private + + # Returns a checksum of the given filenames + # TODO un-duplicate this somewhere + def checksum_for(*filenames) + filenames.flatten.map do |filename| + digest = Digest::SHA1.new + File.open(filename, 'r') do |io| + until io.eof + data = io.readpartial(2**10) + digest.update(data) + end + end + digest.hexdigest + end.join('-') + end + + end + +end diff --git a/lib/tip_filter.rb b/lib/tip_filter.rb new file mode 100644 index 0000000..527a35a --- /dev/null +++ b/lib/tip_filter.rb @@ -0,0 +1,9 @@ +class TipFilter < Nanoc::Filter + identifier :tip_filter + type :text + + def run(content, params={}) + content = content.gsub(/

    \{\{#(tip|warning|error)}}<\/p>/, '

    ') + content.gsub(/

    \{\{\/(tip|warning|error)}}<\/p>/, '

    ') + end +end diff --git a/static/assets/js/base58.js b/static/assets/js/base58.js new file mode 100644 index 0000000..092bac5 --- /dev/null +++ b/static/assets/js/base58.js @@ -0,0 +1,190 @@ +var cnBase58 = (function () { + var b58 = {}; + + var alphabet_str = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + var alphabet = []; + for (var i = 0; i < alphabet_str.length; i++) { + alphabet.push(alphabet_str.charCodeAt(i)); + } + var encoded_block_sizes = [0, 2, 3, 5, 6, 7, 9, 10, 11]; + + var alphabet_size = alphabet.length; + var full_block_size = 8; + var full_encoded_block_size = 11; + + var UINT64_MAX = new JSBigInt(2).pow(64); + + function hextobin(hex) { + if (hex.length % 2 !== 0) throw "Hex string has invalid length!"; + var res = new Uint8Array(hex.length / 2); + for (var i = 0; i < hex.length / 2; ++i) { + res[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16); + } + return res; + } + + function bintohex(bin) { + var out = []; + for (var i = 0; i < bin.length; ++i) { + out.push(("0" + bin[i].toString(16)).slice(-2)); + } + return out.join(""); + } + + function strtobin(str) { + var res = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + res[i] = str.charCodeAt(i); + } + return res; + } + + function bintostr(bin) { + var out = []; + for (var i = 0; i < bin.length; i++) { + out.push(String.fromCharCode(bin[i])); + } + return out.join(""); + } + + function uint8_be_to_64(data) { + if (data.length < 1 || data.length > 8) { + throw "Invalid input length"; + } + var res = JSBigInt.ZERO; + var twopow8 = new JSBigInt(2).pow(8); + var i = 0; + switch (9 - data.length) { + case 1: + res = res.add(data[i++]); + case 2: + res = res.multiply(twopow8).add(data[i++]); + case 3: + res = res.multiply(twopow8).add(data[i++]); + case 4: + res = res.multiply(twopow8).add(data[i++]); + case 5: + res = res.multiply(twopow8).add(data[i++]); + case 6: + res = res.multiply(twopow8).add(data[i++]); + case 7: + res = res.multiply(twopow8).add(data[i++]); + case 8: + res = res.multiply(twopow8).add(data[i++]); + break; + default: + throw "Impossible condition"; + } + return res; + } + + function uint64_to_8be(num, size) { + var res = new Uint8Array(size); + if (size < 1 || size > 8) { + throw "Invalid input length"; + } + var twopow8 = new JSBigInt(2).pow(8); + for (var i = size - 1; i >= 0; i--) { + res[i] = num.remainder(twopow8).toJSValue(); + num = num.divide(twopow8); + } + return res; + } + + b58.encode_block = function (data, buf, index) { + if (data.length < 1 || data.length > full_encoded_block_size) { + throw "Invalid block length: " + data.length; + } + var num = uint8_be_to_64(data); + var i = encoded_block_sizes[data.length] - 1; + // while num > 0 + while (num.compare(0) === 1) { + var div = num.divRem(alphabet_size); + // remainder = num % alphabet_size + var remainder = div[1]; + // num = num / alphabet_size + num = div[0]; + buf[index + i] = alphabet[remainder.toJSValue()]; + i--; + } + return buf; + }; + + b58.encode = function (hex) { + var data = hextobin(hex); + if (data.length === 0) { + return ""; + } + var full_block_count = Math.floor(data.length / full_block_size); + var last_block_size = data.length % full_block_size; + var res_size = full_block_count * full_encoded_block_size + encoded_block_sizes[last_block_size]; + + var res = new Uint8Array(res_size); + var i; + for (i = 0; i < res_size; ++i) { + res[i] = alphabet[0]; + } + for (i = 0; i < full_block_count; i++) { + res = b58.encode_block(data.subarray(i * full_block_size, i * full_block_size + full_block_size), res, i * full_encoded_block_size); + } + if (last_block_size > 0) { + res = b58.encode_block(data.subarray(full_block_count * full_block_size, full_block_count * full_block_size + last_block_size), res, full_block_count * full_encoded_block_size) + } + return bintostr(res); + }; + + b58.decode_block = function (data, buf, index) { + if (data.length < 1 || data.length > full_encoded_block_size) { + throw "Invalid block length: " + data.length; + } + + var res_size = encoded_block_sizes.indexOf(data.length); + if (res_size <= 0) { + throw "Invalid block size"; + } + var res_num = new JSBigInt(0); + var order = new JSBigInt(1); + for (var i = data.length - 1; i >= 0; i--) { + var digit = alphabet.indexOf(data[i]); + if (digit < 0) { + throw "Invalid symbol"; + } + var product = order.multiply(digit).add(res_num); + // if product > UINT64_MAX + if (product.compare(UINT64_MAX) === 1) { + throw "Overflow"; + } + res_num = product; + order = order.multiply(alphabet_size); + } + if (res_size < full_block_size && (new JSBigInt(2).pow(8 * res_size).compare(res_num) <= 0)) { + throw "Overflow 2"; + } + buf.set(uint64_to_8be(res_num, res_size), index); + return buf; + }; + + b58.decode = function (enc) { + enc = strtobin(enc); + if (enc.length === 0) { + return ""; + } + var full_block_count = Math.floor(enc.length / full_encoded_block_size); + var last_block_size = enc.length % full_encoded_block_size; + var last_block_decoded_size = encoded_block_sizes.indexOf(last_block_size); + if (last_block_decoded_size < 0) { + throw "Invalid encoded length"; + } + var data_size = full_block_count * full_block_size + last_block_decoded_size; + var data = new Uint8Array(data_size); + for (var i = 0; i < full_block_count; i++) { + data = b58.decode_block(enc.subarray(i * full_encoded_block_size, i * full_encoded_block_size + full_encoded_block_size), data, i * full_block_size); + } + if (last_block_size > 0) { + data = b58.decode_block(enc.subarray(full_block_count * full_encoded_block_size, full_block_count * full_encoded_block_size + last_block_size), data, full_block_count * full_block_size); + } + return bintohex(data); + }; + + return b58; +})(); \ No newline at end of file diff --git a/static/assets/js/cn_util.js b/static/assets/js/cn_util.js new file mode 100644 index 0000000..fd30382 --- /dev/null +++ b/static/assets/js/cn_util.js @@ -0,0 +1,1091 @@ +// Copyright (c) 2014, MyMonero.com +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original Author: Lucas Jones + +// Edited by: Petar Mitchev + +var cnUtil = (function(initConfig) { + var config = $.extend({}, initConfig); + + var HASH_STATE_BYTES = 200; + var HASH_SIZE = 32; + var ADDRESS_CHECKSUM_SIZE = 4; + var CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = ''; + var UINT64_MAX = new JSBigInt(2).pow(64); + var CURRENT_TX_VERSION = 1; + var TX_EXTRA_NONCE_MAX_COUNT = 255; + var TX_EXTRA_TAGS = { + PADDING: '00', + PUBKEY: '01', + NONCE: '02', + MERGE_MINING: '03' + }; + var TX_EXTRA_NONCE_TAGS = { + PAYMENT_ID: '00' + }; + var KEY_SIZE = 32; + var STRUCT_SIZES = { + GE_P3: 160, + GE_P2: 120, + GE_P1P1: 160, + GE_CACHED: 160, + EC_SCALAR: 32, + EC_POINT: 32, + KEY_IMAGE: 32, + GE_DSMP: 160 * 8, // ge_cached * 8 + SIGNATURE: 64 // ec_scalar * 2 + }; + + this.configChanged = function(newConfig) { + config.coinUnitPlaces = newConfig.core.CRYPTONOTE_DISPLAY_DECIMAL_POINT; + config.coinSymbol = 'DSH'; + config.coinUnits = JSBigInt.pow(10, config.coinUnitPlaces); + config.dustThreshold = new JSBigInt(newConfig.core.DEFAULT_DUST_THRESHOLD); + config.maxBlockNumber = 500000000; + config.avgBlockTime = newConfig.core.DIFFICULTY_TARGET; + config.addressPrefix = newConfig.core.CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX; + CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = config.addressPrefix; + } + + this.valid_hex = function(hex) { + return /[0-9a-fA-F]+/.test(hex); + }; + + function hextobin(hex) { + if (hex.length % 2 !== 0) throw "Hex string has invalid length!"; + var res = new Uint8Array(hex.length / 2); + for (var i = 0; i < hex.length / 2; ++i) { + res[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16); + } + return res; + } + + function bintohex(bin) { + var out = []; + for (var i = 0; i < bin.length; ++i) { + out.push(("0" + bin[i].toString(16)).slice(-2)); + } + return out.join(""); + } + + this.sc_reduce = function(hex) { + var input = hextobin(hex); + if (input.length !== 64) { + throw "Invalid input length"; + } + var mem = Module._malloc(64); + Module.HEAPU8.set(input, mem); + Module.ccall('sc_reduce', 'void', ['number'], [mem]); + var output = Module.HEAPU8.subarray(mem, mem + 64); + Module._free(mem); + return bintohex(output); + }; + + this.sc_reduce32 = function(hex) { + var input = hextobin(hex); + if (input.length !== 32) { + throw "Invalid input length"; + } + var mem = Module._malloc(32); + Module.HEAPU8.set(input, mem); + Module.ccall('sc_reduce32', 'void', ['number'], [mem]); + var output = Module.HEAPU8.subarray(mem, mem + 32); + Module._free(mem); + return bintohex(output); + }; + + this.ge_scalarmult_base = function(hex) { + var input = hextobin(hex); + if (input.length !== 32) { + throw "Invalid input length"; + } + var input_mem = Module._malloc(32); + Module.HEAPU8.set(input, input_mem); + var ge_p3 = Module._malloc(STRUCT_SIZES.GE_P3); + Module.ccall('ge_scalarmult_base', 'void', ['number', 'number'], [ge_p3, input_mem]); + var output = Module.HEAPU8.subarray(ge_p3, ge_p3 + STRUCT_SIZES.GE_P3); + Module._free(input_mem); + Module._free(ge_p3); + return bintohex(output); + }; + + this.ge_p3_tobytes = function(hex) { + var input = hextobin(hex); + if (input.length !== STRUCT_SIZES.GE_P3) { + throw "Invalid input length"; + } + var ge_p3 = Module._malloc(STRUCT_SIZES.GE_P3); + Module.HEAPU8.set(input, ge_p3); + var out_mem = Module._malloc(32); + Module.ccall('ge_p3_tobytes', 'void', ['number', 'number'], [out_mem, ge_p3]); + var output = Module.HEAPU8.subarray(out_mem, out_mem + 32); + Module._free(ge_p3); + Module._free(out_mem); + return bintohex(output); + }; + + this.cn_fast_hash = function(input, inlen) { + if (inlen === undefined || !inlen) { + inlen = Math.floor(input.length / 2); + } + if (input.length !== inlen * 2) { + console.log("Input length not equal to specified"); + } + var state = this.keccak(input, inlen, HASH_STATE_BYTES); + return state.substr(0, HASH_SIZE * 2); + }; + + this.encode_varint = function(i) { + i = new JSBigInt(i); + var out = ''; + // While i >= b10000000 + while (i.compare(0x80) >= 0) { + // out.append i & b01111111 | b10000000 + out += ("0" + ((i.lowVal() & 0x7f) | 0x80).toString(16)).slice(-2); + i = i.divide(new JSBigInt(2).pow(7)); + } + out += ("0" + i.toJSValue().toString(16)).slice(-2); + return out; + }; + + this.pubkeys_to_string = function(spend, view) { + var prefix = this.encode_varint(CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX); + var data = prefix + spend + view; + var checksum = this.cn_fast_hash(data); + return cnBase58.encode(data + checksum.slice(0, ADDRESS_CHECKSUM_SIZE * 2)); + }; + + // Generate keypair from seed + this.generate_keys = function(seed) { + if (seed.length !== 64) throw "Invalid input length!"; + var sec = this.sc_reduce32(seed); + var point = this.ge_scalarmult_base(sec); + var pub = this.ge_p3_tobytes(point); + return { + 'sec': sec, + 'pub': pub + }; + }; + + this.sec_key_to_pub = function(sec) { + var point = this.ge_scalarmult_base(sec); + var pub = this.ge_p3_tobytes(point); + return pub; + }; + + this.keccak = function(hex, inlen, outlen) { + var input = hextobin(hex); + if (input.length !== inlen) { + throw "Invalid input length"; + } + if (outlen <= 0) { + throw "Invalid output length"; + } + var input_mem = Module._malloc(inlen); + Module.HEAPU8.set(input, input_mem); + var out_mem = Module._malloc(outlen); + Module._keccak(input_mem, inlen | 0, out_mem, outlen | 0); + var output = Module.HEAPU8.subarray(out_mem, out_mem + outlen); + Module._free(input_mem); + Module._free(out_mem); + return bintohex(output); + }; + + this.create_address = function(seed) { + var keys = {}; + var first; + if (seed.length !== 64) { + first = this.keccak(seed, seed.length / 2, 32); + } else { + first = seed; + } + keys.spend = this.generate_keys(first); + var second = this.keccak(first, 32, 32); + keys.view = this.generate_keys(second); + keys.public_addr = this.pubkeys_to_string(keys.spend.pub, keys.view.pub); + return keys; + }; + + this.create_addr_prefix = function(seed) { + var first; + if (seed.length !== 64) { + first = this.keccak(seed, seed.length / 2, 32); + } else { + first = seed; + } + var spend = this.generate_keys(first); + var prefix = this.encode_varint(CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX); + return cnBase58.encode(prefix + spend.pub).slice(0, 44); + }; + + this.generate_key_image = function(tx_pub, view_sec, spend_pub, spend_sec, output_index) { + if (tx_pub.length !== 64) { + throw "Invalid tx_pub length"; + } + if (view_sec.length !== 64) { + throw "Invalid view_sec length"; + } + if (spend_pub.length !== 64) { + throw "Invalid spend_pub length"; + } + if (spend_sec.length !== 64) { + throw "Invalid spend_sec length"; + } + var recv_derivation = this.generate_key_derivation(tx_pub, view_sec); + var ephemeral_pub = this.derive_public_key(recv_derivation, output_index, spend_pub); + var ephemeral_sec = this.derive_secret_key(recv_derivation, output_index, spend_sec); + var k_image = this.generate_key_image_2(ephemeral_pub, ephemeral_sec); + return { + ephemeral_pub: ephemeral_pub, + key_image: k_image + }; + }; + + + this.hash_to_ec = function(key) { + if (key.length !== (KEY_SIZE * 2)) { + throw "Invalid input length"; + } + var h_m = Module._malloc(HASH_SIZE); + var point_m = Module._malloc(STRUCT_SIZES.GE_P2); + var point2_m = Module._malloc(STRUCT_SIZES.GE_P1P1); + var res_m = Module._malloc(STRUCT_SIZES.GE_P3); + var hash = hextobin(this.cn_fast_hash(key, KEY_SIZE)); + Module.HEAPU8.set(hash, h_m); + Module.ccall("ge_fromfe_frombytes_vartime", "void", ["number", "number"], [point_m, h_m]); + Module.ccall("ge_mul8", "void", ["number", "number"], [point2_m, point_m]); + Module.ccall("ge_p1p1_to_p3", "void", ["number", "number"], [res_m, point2_m]); + var res = Module.HEAPU8.subarray(res_m, res_m + STRUCT_SIZES.GE_P3); + Module._free(h_m); + Module._free(point_m); + Module._free(point2_m); + Module._free(res_m); + return bintohex(res); + }; + + this.generate_key_image_2 = function(pub, sec) { + if (!pub || !sec || pub.length !== 64 || sec.length !== 64) { + throw "Invalid input length"; + } + var pub_m = Module._malloc(KEY_SIZE); + var sec_m = Module._malloc(KEY_SIZE); + Module.HEAPU8.set(hextobin(pub), pub_m); + Module.HEAPU8.set(hextobin(sec), sec_m); + if (Module.ccall("sc_check", "number", ["number"], [sec_m]) !== 0) { + throw "sc_check(sec) != 0"; + } + var point_m = Module._malloc(STRUCT_SIZES.GE_P3); + var point2_m = Module._malloc(STRUCT_SIZES.GE_P2); + var point_b = hextobin(this.hash_to_ec(pub)); + Module.HEAPU8.set(point_b, point_m); + var image_m = Module._malloc(STRUCT_SIZES.KEY_IMAGE); + Module.ccall("ge_scalarmult", "void", ["number", "number", "number"], [point2_m, sec_m, point_m]); + Module.ccall("ge_tobytes", "void", ["number", "number"], [image_m, point2_m]); + var res = Module.HEAPU8.subarray(image_m, image_m + STRUCT_SIZES.KEY_IMAGE); + Module._free(pub_m); + Module._free(sec_m); + Module._free(point_m); + Module._free(point2_m); + Module._free(image_m); + return bintohex(res); + }; + + this.generate_key_image_helper = function(keys, tx_pub_key, out_index) { + var recv_derivation = this.generate_key_derivation(tx_pub_key, keys.view.sec); + if (!recv_derivation) throw "Failed to generate key image"; + var ephemeral_pub = this.derive_public_key(recv_derivation, out_index, keys.spend.pub); + if (!ephemeral_pub) throw "Failed to generate key image"; + var ephemeral_sec = this.derive_secret_key(recv_derivation, out_index, keys.spend.sec); + var image = this.generate_key_image_2(ephemeral_pub, ephemeral_sec); + return { + in_ephemeral: { + pub: ephemeral_pub, + sec: ephemeral_sec + }, + image: image + }; + }; + + this.decode_address = function(address) { + var dec = cnBase58.decode(address); + var expectedPrefix = this.encode_varint(CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX); + var prefix = dec.slice(0, expectedPrefix.length); + if (prefix !== expectedPrefix) { + throw "Invalid address prefix"; + } + dec = dec.slice(expectedPrefix.length); + var spend = dec.slice(0, 64); + var view = dec.slice(64, 128); + var checksum = dec.slice(128, 128 + (ADDRESS_CHECKSUM_SIZE * 2)); + var expectedChecksum = this.cn_fast_hash(prefix + spend + view).slice(0, ADDRESS_CHECKSUM_SIZE * 2); + if (checksum !== expectedChecksum) { + throw "Invalid checksum"; + } + return { + spend: spend, + view: view + }; + }; + + // Generate a 256-bit crypto random + this.rand_32 = function() { + return mn_random(256); + }; + + // Generate a 128-bit crypto random + this.rand_16 = function() { + return mn_random(128); + }; + + this.random_keypair = function() { + return this.generate_keys(this.rand_32()); + }; + + this.add_pub_key_to_extra = function(extra, pubkey) { + if (pubkey.length !== 64) throw "Invalid pubkey length"; + // Append pubkey tag and pubkey + extra += TX_EXTRA_TAGS.PUBKEY + pubkey; + return extra; + }; + + this.add_nonce_to_extra = function(extra, nonce) { + // Append extra nonce + if ((nonce.length % 2) !== 0) { + throw "Invalid extra nonce"; + } + if ((nonce.length / 2) > TX_EXTRA_NONCE_MAX_COUNT) { + throw "Extra nonce must be at most " + TX_EXTRA_NONCE_MAX_COUNT + " bytes"; + } + // Add nonce tag + extra += TX_EXTRA_TAGS.NONCE; + // Encode length of nonce + extra += ('0' + (nonce.length / 2).toString(16)).slice(-2); + // Write nonce + extra += nonce; + return extra; + }; + + this.get_payment_id_nonce = function(payment_id) { + if (payment_id.length !== 64) { + throw "Invalid payment id"; + } + var res = ''; + res += TX_EXTRA_NONCE_TAGS.PAYMENT_ID; + res += payment_id; + return res; + }; + + this.abs_to_rel_offsets = function(offsets) { + if (offsets.length === 0) return offsets; + for (var i = offsets.length - 1; i >= 1; --i) { + offsets[i] = new JSBigInt(offsets[i]).subtract(offsets[i - 1]).toString(); + } + return offsets; + }; + + this.generate_key_derivation = function(pub, sec) { + if (pub.length !== 64 || sec.length !== 64) { + throw "Invalid input length"; + } + var pub_b = hextobin(pub); + var sec_b = hextobin(sec); + var pub_m = Module._malloc(KEY_SIZE); + Module.HEAPU8.set(pub_b, pub_m); + var sec_m = Module._malloc(KEY_SIZE); + Module.HEAPU8.set(sec_b, sec_m); + var ge_p3_m = Module._malloc(STRUCT_SIZES.GE_P3); + var ge_p2_m = Module._malloc(STRUCT_SIZES.GE_P2); + var ge_p1p1_m = Module._malloc(STRUCT_SIZES.GE_P1P1); + if (Module.ccall("ge_frombytes_vartime", "bool", ["number", "number"], [ge_p3_m, pub_m]) !== 0) { + throw "ge_frombytes_vartime returned non-zero error code"; + } + Module.ccall("ge_scalarmult", "void", ["number", "number", "number"], [ge_p2_m, sec_m, ge_p3_m]); + Module.ccall("ge_mul8", "void", ["number", "number"], [ge_p1p1_m, ge_p2_m]); + Module.ccall("ge_p1p1_to_p2", "void", ["number", "number"], [ge_p2_m, ge_p1p1_m]); + var derivation_m = Module._malloc(KEY_SIZE); + Module.ccall("ge_tobytes", "void", ["number", "number"], [derivation_m, ge_p2_m]); + var res = Module.HEAPU8.subarray(derivation_m, derivation_m + KEY_SIZE); + Module._free(pub_m); + Module._free(sec_m); + Module._free(ge_p3_m); + Module._free(ge_p2_m); + Module._free(ge_p1p1_m); + Module._free(derivation_m); + return bintohex(res); + }; + + this.hash_to_scalar = function(buf) { + var hash = this.cn_fast_hash(buf); + var scalar = this.sc_reduce32(hash); + return scalar; + }; + + this.derivation_to_scalar = function(derivation, output_index) { + var buf = ""; + if (derivation.length !== (STRUCT_SIZES.EC_POINT * 2)) { + throw "Invalid derivation length!"; + } + buf += derivation; + var enc = encode_varint(output_index); + if (enc.length > 10 * 2) { + throw "output_index didn't fit in 64-bit varint"; + } + buf += enc; + return this.hash_to_scalar(buf); + }; + + this.derive_public_key = function(derivation, out_index, pub) { + if (derivation.length !== 64 || pub.length !== 64) { + throw "Invalid input length!"; + } + var derivation_m = Module._malloc(KEY_SIZE); + var derivation_b = hextobin(derivation); + Module.HEAPU8.set(derivation_b, derivation_m); + var base_m = Module._malloc(KEY_SIZE); + var base_b = hextobin(pub); + Module.HEAPU8.set(base_b, base_m); + var point1_m = Module._malloc(STRUCT_SIZES.GE_P3); + var point2_m = Module._malloc(STRUCT_SIZES.GE_P3); + var point3_m = Module._malloc(STRUCT_SIZES.GE_CACHED); + var point4_m = Module._malloc(STRUCT_SIZES.GE_P1P1); + var point5_m = Module._malloc(STRUCT_SIZES.GE_P2); + var derived_key_m = Module._malloc(KEY_SIZE); + if (Module.ccall("ge_frombytes_vartime", "bool", ["number", "number"], [point1_m, base_m]) !== 0) { + throw "ge_frombytes_vartime returned non-zero error code"; + } + var scalar_m = Module._malloc(STRUCT_SIZES.EC_SCALAR); + var scalar_b = hextobin(this.derivation_to_scalar( + bintohex(Module.HEAPU8.subarray(derivation_m, derivation_m + STRUCT_SIZES.EC_POINT)), out_index)); + Module.HEAPU8.set(scalar_b, scalar_m); + Module.ccall("ge_scalarmult_base", "void", ["number", "number"], [point2_m, scalar_m]); + Module.ccall("ge_p3_to_cached", "void", ["number", "number"], [point3_m, point2_m]); + Module.ccall("ge_add", "void", ["number", "number", "number"], [point4_m, point1_m, point3_m]); + Module.ccall("ge_p1p1_to_p2", "void", ["number", "number"], [point5_m, point4_m]); + Module.ccall("ge_tobytes", "void", ["number", "number"], [derived_key_m, point5_m]); + var res = Module.HEAPU8.subarray(derived_key_m, derived_key_m + KEY_SIZE); + Module._free(derivation_m); + Module._free(base_m); + Module._free(scalar_m); + Module._free(point1_m); + Module._free(point2_m); + Module._free(point3_m); + Module._free(point4_m); + Module._free(point5_m); + Module._free(derived_key_m); + return bintohex(res); + }; + + this.derive_secret_key = function(derivation, out_index, sec) { + if (derivation.length !== 64 || sec.length !== 64) { + throw "Invalid input length!"; + } + var scalar_m = Module._malloc(STRUCT_SIZES.EC_SCALAR); + var scalar_b = hextobin(this.derivation_to_scalar(derivation, out_index)); + Module.HEAPU8.set(scalar_b, scalar_m); + var base_m = Module._malloc(KEY_SIZE); + Module.HEAPU8.set(hextobin(sec), base_m); + var derived_m = Module._malloc(STRUCT_SIZES.EC_POINT); + Module.ccall("sc_add", "void", ["number", "number", "number"], [derived_m, base_m, scalar_m]); + var res = Module.HEAPU8.subarray(derived_m, derived_m + STRUCT_SIZES.EC_POINT); + Module._free(scalar_m); + Module._free(base_m); + Module._free(derived_m); + return bintohex(res); + }; + + this.get_tx_prefix_hash = function(tx) { + var prefix = this.serialize_tx(tx, true); + return this.cn_fast_hash(prefix); + }; + + this.get_tx_hash = function(tx) { + if (typeof(tx) === 'string') { + return this.cn_fast_hash(tx); + } else { + return this.cn_fast_hash(this.serialize_tx(tx)); + } + }; + + this.serialize_tx = function(tx, headeronly) { + //tx: { + // version: uint64, + // unlock_time: uint64, + // extra: hex, + // vin: [{amount: uint64, k_image: hex, key_offsets: [uint64,..]},...], + // vout: [{amount: uint64, target: {key: hex}},...], + // signatures: [[s,s,...],...] + //} + if (headeronly === undefined) { + headeronly = false; + } + var buf = ""; + buf += this.encode_varint(tx.version); + buf += this.encode_varint(tx.unlock_time); + buf += this.encode_varint(tx.vin.length); + var i, j; + for (i = 0; i < tx.vin.length; i++) { + var vin = tx.vin[i]; + switch (vin.type) { + case "input_to_key": + buf += "02"; + buf += this.encode_varint(vin.amount); + buf += this.encode_varint(vin.key_offsets.length); + for (j = 0; j < vin.key_offsets.length; j++) { + buf += this.encode_varint(vin.key_offsets[j]); + } + buf += vin.k_image; + break; + default: + throw "Unhandled vin type: " + vin.type; + } + } + buf += this.encode_varint(tx.vout.length); + for (i = 0; i < tx.vout.length; i++) { + var vout = tx.vout[i]; + buf += this.encode_varint(vout.amount); + switch (vout.target.type) { + case "txout_to_key": + buf += "02"; + buf += vout.target.key; + break; + default: + throw "Unhandled txout target type: " + vout.target.type; + } + } + if (!this.valid_hex(tx.extra)) { + throw "Tx extra has invalid hex"; + } + buf += this.encode_varint(tx.extra.length / 2); + buf += tx.extra; + if (!headeronly) { + if (tx.vin.length !== tx.signatures.length) { + throw "Signatures length != vin length"; + } + for (i = 0; i < tx.vin.length; i++) { + for (j = 0; j < tx.signatures[i].length; j++) { + buf += tx.signatures[i][j]; + } + } + } + return buf; + }; + + // Random 32-byte ec scalar + this.random_scalar = function() { + var rand = this.sc_reduce(mn_random(64 * 8)); + return rand.slice(0, STRUCT_SIZES.EC_SCALAR * 2); + }; + + this.generate_ring_signature = function(prefix_hash, k_image, keys, sec, real_index) { + if (k_image.length !== STRUCT_SIZES.KEY_IMAGE * 2) { + throw "invalid key image length"; + } + if (sec.length !== KEY_SIZE * 2) { + throw "Invalid secret key length"; + } + if (prefix_hash.length !== HASH_SIZE * 2 || !this.valid_hex(prefix_hash)) { + throw "Invalid prefix hash"; + } + if (real_index >= keys.length || real_index < 0) { + throw "real_index is invalid"; + } + + var _ge_tobytes = Module.cwrap("ge_tobytes", "void", ["number", "number"]); + var _ge_p3_tobytes = Module.cwrap("ge_p3_tobytes", "void", ["number", "number"]); + var _ge_scalarmult_base = Module.cwrap("ge_scalarmult_base", "void", ["number", "number"]); + var _ge_scalarmult = Module.cwrap("ge_scalarmult", "void", ["number", "number", "number"]); + var _sc_add = Module.cwrap("sc_add", "void", ["number", "number", "number"]); + var _sc_sub = Module.cwrap("sc_sub", "void", ["number", "number", "number"]); + var _sc_mulsub = Module.cwrap("sc_mulsub", "void", ["number", "number", "number", "number"]); + var _sc_0 = Module.cwrap("sc_0", "void", ["number"]); + var _ge_double_scalarmult_base_vartime = Module.cwrap("ge_double_scalarmult_base_vartime", "void", ["number", "number", "number", "number"]); + var _ge_double_scalarmult_precomp_vartime = Module.cwrap("ge_double_scalarmult_precomp_vartime", "void", ["number", "number", "number", "number", "number"]); + var _ge_frombytes_vartime = Module.cwrap("ge_frombytes_vartime", "number", ["number", "number"]); + var _ge_dsm_precomp = Module.cwrap("ge_dsm_precomp", "void", ["number", "number"]); + + var buf_size = STRUCT_SIZES.EC_POINT * 2 * keys.length; + var buf_m = Module._malloc(buf_size); + var sig_size = STRUCT_SIZES.SIGNATURE * keys.length; + var sig_m = Module._malloc(sig_size); + + // Struct pointer helper functions + function buf_a(i) { + return buf_m + STRUCT_SIZES.EC_POINT * (2 * i); + } + + function buf_b(i) { + return buf_m + STRUCT_SIZES.EC_POINT * (2 * i + 1); + } + + function sig_c(i) { + return sig_m + STRUCT_SIZES.EC_SCALAR * (2 * i); + } + + function sig_r(i) { + return sig_m + STRUCT_SIZES.EC_SCALAR * (2 * i + 1); + } + + var image_m = Module._malloc(STRUCT_SIZES.KEY_IMAGE); + Module.HEAPU8.set(hextobin(k_image), image_m); + var i; + var image_unp_m = Module._malloc(STRUCT_SIZES.GE_P3); + var image_pre_m = Module._malloc(STRUCT_SIZES.GE_DSMP); + var sum_m = Module._malloc(STRUCT_SIZES.EC_SCALAR); + var k_m = Module._malloc(STRUCT_SIZES.EC_SCALAR); + var h_m = Module._malloc(STRUCT_SIZES.EC_SCALAR); + var tmp2_m = Module._malloc(STRUCT_SIZES.GE_P2); + var tmp3_m = Module._malloc(STRUCT_SIZES.GE_P3); + var pub_m = Module._malloc(KEY_SIZE); + var sec_m = Module._malloc(KEY_SIZE); + Module.HEAPU8.set(hextobin(sec), sec_m); + if (_ge_frombytes_vartime(image_unp_m, image_m) != 0) { + throw "failed to call ge_frombytes_vartime"; + } + _ge_dsm_precomp(image_pre_m, image_unp_m); + _sc_0(sum_m); + for (i = 0; i < keys.length; i++) { + if (i === real_index) { + // Real key + var rand = this.random_scalar(); + Module.HEAPU8.set(hextobin(rand), k_m); + _ge_scalarmult_base(tmp3_m, k_m); + _ge_p3_tobytes(buf_a(i), tmp3_m); + var ec = this.hash_to_ec(keys[i]); + Module.HEAPU8.set(hextobin(ec), tmp3_m); + _ge_scalarmult(tmp2_m, k_m, tmp3_m); + _ge_tobytes(buf_b(i), tmp2_m); + } else { + Module.HEAPU8.set(hextobin(this.random_scalar()), sig_c(i)); + Module.HEAPU8.set(hextobin(this.random_scalar()), sig_r(i)); + Module.HEAPU8.set(hextobin(keys[i]), pub_m); + if (Module.ccall("ge_frombytes_vartime", "void", ["number", "number"], [tmp3_m, pub_m]) !== 0) { + throw "Failed to call ge_frombytes_vartime"; + } + _ge_double_scalarmult_base_vartime(tmp2_m, sig_c(i), tmp3_m, sig_r(i)); + _ge_tobytes(buf_a(i), tmp2_m); + var ec = this.hash_to_ec(keys[i]); + Module.HEAPU8.set(hextobin(ec), tmp3_m); + _ge_double_scalarmult_precomp_vartime(tmp2_m, sig_r(i), tmp3_m, sig_c(i), image_pre_m); + _ge_tobytes(buf_b(i), tmp2_m); + _sc_add(sum_m, sum_m, sig_c(i)); + } + } + var buf_bin = Module.HEAPU8.subarray(buf_m, buf_m + buf_size); + var scalar = this.hash_to_scalar(prefix_hash + bintohex(buf_bin)); + Module.HEAPU8.set(hextobin(scalar), h_m); + _sc_sub(sig_c(real_index), h_m, sum_m); + _sc_mulsub(sig_r(real_index), sig_c(real_index), sec_m, k_m); + var sig_data = bintohex(Module.HEAPU8.subarray(sig_m, sig_m + sig_size)); + var sigs = []; + for (var k = 0; k < keys.length; k++) { + sigs.push(sig_data.slice(STRUCT_SIZES.SIGNATURE * 2 * k, STRUCT_SIZES.SIGNATURE * 2 * (k + 1))); + } + Module._free(image_m); + Module._free(image_unp_m); + Module._free(image_pre_m); + Module._free(sum_m); + Module._free(k_m); + Module._free(h_m); + Module._free(tmp2_m); + Module._free(tmp3_m); + Module._free(buf_m); + Module._free(sig_m); + Module._free(pub_m); + Module._free(sec_m); + return sigs; + }; + + this.construct_tx = function(keys, sources, dsts, fee_amount, unlock_time, extra) { + var tx = { + unlock_time: unlock_time, + version: CURRENT_TX_VERSION, + extra: extra, + vin: [], + vout: [], + signatures: [] + }; + var txkey = this.random_keypair(); + tx.extra = this.add_pub_key_to_extra(tx.extra, txkey.pub); + + var in_contexts = []; + var inputs_money = JSBigInt.ZERO; + var i, j; + console.log('Sources: '); + for (i = 0; i < sources.length; i++) { + console.log(i + ': ' + this.formatMoneyFull(sources[i].amount)); + if (sources[i].real_out >= sources[i].outputs.length) { + throw "real index >= outputs.length"; + } + inputs_money = inputs_money.add(sources[i].amount); + var res = this.generate_key_image_helper(keys, sources[i].real_out_tx_key, sources[i].real_out_in_tx); + in_contexts.push(res.in_ephemeral); + if (res.in_ephemeral.pub !== sources[i].outputs[sources[i].real_out].key) { + throw "in_ephemeral.pub != source.real_out.key"; + } + var input_to_key = {}; + input_to_key.type = "input_to_key"; + input_to_key.amount = sources[i].amount; + input_to_key.k_image = res.image; + input_to_key.key_offsets = []; + for (j = 0; j < sources[i].outputs.length; ++j) { + input_to_key.key_offsets.push(sources[i].outputs[j].index); + } + input_to_key.key_offsets = this.abs_to_rel_offsets(input_to_key.key_offsets); + tx.vin.push(input_to_key); + } + var outputs_money = JSBigInt.ZERO; + var out_index = 0; + + for (i = 0; i < dsts.length; ++i) { + if (new JSBigInt(dsts[i].amount).compare(0) !== 1) { + throw "dst.amount <= 0"; + } + dsts[i].keys = this.decode_address(dsts[i].address); + var out_derivation = this.generate_key_derivation(dsts[i].keys.view, txkey.sec); + var out_ephemeral_pub = this.derive_public_key(out_derivation, out_index, dsts[i].keys.spend); + var out = { + amount: dsts[i].amount.toString() + }; + // txout_to_key + out.target = { + type: "txout_to_key", + key: out_ephemeral_pub + }; + tx.vout.push(out); + ++out_index; + outputs_money = outputs_money.add(dsts[i].amount); + } + + if (outputs_money.add(fee_amount).compare(inputs_money) > 0) { + throw "outputs money (" + this.formatMoneyFull(outputs_money) + ") + fee (" + this.formatMoneyFull(fee_amount) + ") > inputs money (" + this.formatMoneyFull(inputs_money) + ")"; + } + + var tx_prefix_hash = this.get_tx_prefix_hash(tx); + + for (i = 0; i < sources.length; ++i) { + var src_keys = []; + for (j = 0; j < sources[i].outputs.length; ++j) { + src_keys.push(sources[i].outputs[j].key); + } + var sigs = this.generate_ring_signature(tx_prefix_hash, tx.vin[i].k_image, src_keys, + in_contexts[i].sec, sources[i].real_out); + tx.signatures.push(sigs); + } + return tx; + }; + + this.valid_keys = function(view_pub, view_sec, spend_pub, spend_sec) { + var expected_view_pub = this.sec_key_to_pub(view_sec); + var expected_spend_pub = this.sec_key_to_pub(spend_sec); + return (expected_spend_pub === spend_pub) && (expected_view_pub === view_pub); + }; + + +// TODO: All, critical + this.create_miner_transaction = function(height, median_size, already_generated_coins, current_block_size, fee, account_public_address, tx, extra_nonce, max_outs) { + var tx = { + unlock_time: unlock_time, + version: CURRENT_TX_VERSION, + extra: extra, + vin: [], + vout: [], + signatures: [] + }; + + var txkey = this.random_keypair(); + tx.extra = this.add_pub_key_to_extra(tx.extra, txkey.pub); + } + + + + this.create_transaction = function(pub_keys, sec_keys, dsts, outputs, mix_outs, fake_outputs_count, fee_amount, payment_id, unlock_time) { + unlock_time = unlock_time || 0; + mix_outs = mix_outs || []; + var i, j; + if (dsts.length === 0) { + throw 'Destinations empty'; + } + if (mix_outs.length !== outputs.length && fake_outputs_count !== 0) { + throw 'Wrong number of mix outs provided (' + outputs.length + ' outputs, ' + mix_outs.length + ' mix outs)'; + } + for (i = 0; i < mix_outs.length; i++) { + if ((mix_outs[i].outputs || []).length < fake_outputs_count) { + throw 'Not enough outputs to mix with'; + } + } + var keys = { + view: { + pub: pub_keys.view, + sec: sec_keys.view + }, + spend: { + pub: pub_keys.spend, + sec: sec_keys.spend + } + }; + if (!this.valid_keys(keys.view.pub, keys.view.sec, keys.spend.pub, keys.spend.sec)) { + throw "Invalid secret keys!"; + } + var needed_money = JSBigInt.ZERO; + for (i = 0; i < dsts.length; ++i) { + needed_money = needed_money.add(dsts[i].amount); + if (needed_money.compare(UINT64_MAX) !== -1) { + throw "Output overflow!"; + } + } + var found_money = JSBigInt.ZERO; + var sources = []; + console.log('Selected transfers: ', outputs); + for (i = 0; i < outputs.length; ++i) { + found_money = found_money.add(outputs[i].amount); + if (found_money.compare(UINT64_MAX) !== -1) { + throw "Input overflow!"; + } + var src = { + outputs: [] + }; + src.amount = new JSBigInt(outputs[i].amount).toString(); + + if (mix_outs.length !== 0) { + // Sort fake outputs by global index + mix_outs[i].outputs.sort(function(a, b) { + return new JSBigInt(a.global_index).compare(b.global_index); + }); + j = 0; + while ((src.outputs.length < fake_outputs_count) && (j < mix_outs[i].outputs.length)) { + var out = mix_outs[i].outputs[j]; + if (out.global_index === outputs[i].global_index) { + console.log('got mixin the same as output, skipping'); + j++; + continue; + } + var oe = {}; + oe.index = out.global_index.toString(); + oe.key = out.public_key; + src.outputs.push(oe); + j++; + } + } + + var real_oe = {}; + real_oe.index = new JSBigInt(outputs[i].global_index || 0).toString(); + real_oe.key = outputs[i].public_key; + var real_index = src.outputs.length; + for (j = 0; j < src.outputs.length; j++) { + if (new JSBigInt(real_oe.index).compare(src.outputs[j].index) < 0) { + real_index = j; + break; + } + } + // Add real_oe to outputs + src.outputs.splice(real_index, 0, real_oe); + src.real_out_tx_key = outputs[i].tx_pub_key; + // Real output entry index + src.real_out = real_index; + src.real_out_in_tx = outputs[i].index; + sources.push(src); + } + console.log('sources: ', sources); + var change = { + amount: JSBigInt.ZERO + }; + var cmp = needed_money.compare(found_money); + if (cmp < 0) { + change.amount = found_money.subtract(needed_money); + } else if (cmp > 0) { + throw "Need more money than found! (have: " + cnUtil.formatMoney(found_money) + " need: " + cnUtil.formatMoney(needed_money) + ")"; + } + var extra = ''; + if (payment_id) { + console.log("Adding payment id: " + payment_id); + var nonce = this.get_payment_id_nonce(payment_id); + console.log("Extra nonce: " + nonce); + extra = this.add_nonce_to_extra(extra, nonce); + } + return this.construct_tx(keys, sources, dsts, fee_amount, unlock_time, extra); + }; + + + function trimRight(str, char) { + while (str[str.length - 1] == char) str = str.slice(0, -1); + return str; + } + + function padLeft(str, len, char) { + while (str.length < len) { + str = char + str; + } + return str; + } + + this.printDsts = function(dsts) { + for (var i = 0; i < dsts.length; i++) { + console.log(dsts[i].address + ': ' + this.formatMoneyFull(dsts[i].amount)); + } + }; + + this.formatMoneyFull = function(units) { + units = units.toString(); + var symbol = units[0] === '-' ? '-' : ''; + if (symbol === '-') { + units = units.slice(1); + } + var decimal; + if (units.length >= config.coinUnitPlaces) { + decimal = units.substr(units.length - config.coinUnitPlaces, config.coinUnitPlaces); + } else { + decimal = padLeft(units, config.coinUnitPlaces, '0'); + } + return symbol + (units.substr(0, units.length - config.coinUnitPlaces) || '0') + '.' + decimal; + }; + + this.formatMoneyFullSymbol = function(units) { + return this.formatMoneyFull(units) + ' ' + config.coinSymbol; + }; + + this.formatMoney = function(units) { + var f = trimRight(this.formatMoneyFull(units), '0'); + if (f[f.length - 1] === '.') { + return f.slice(0, f.length - 1); + } + return f; + }; + + this.formatMoneySymbol = function(units) { + return this.formatMoney(units) + ' ' + config.coinSymbol; + }; + + this.parseMoney = function(str) { + if (!str) return JSBigInt.ZERO; + var negative = str[0] === '-'; + if (negative) { + str = str.slice(1); + } + var decimalIndex = str.indexOf('.'); + if (decimalIndex == -1) { + if (negative) { + return JSBigInt.multiply(str, config.coinUnits).negate(); + } + return JSBigInt.multiply(str, config.coinUnits); + } + if (decimalIndex + config.coinUnitPlaces + 1 < str.length) { + str = str.substr(0, decimalIndex + config.coinUnitPlaces + 1); + } + if (negative) { + return new JSBigInt(str.substr(0, decimalIndex)).exp10(config.coinUnitPlaces) + .add(new JSBigInt(str.substr(decimalIndex + 1)).exp10(decimalIndex + config.coinUnitPlaces - str.length + 1)).negate; + } + return new JSBigInt(str.substr(0, decimalIndex)).exp10(config.coinUnitPlaces) + .add(new JSBigInt(str.substr(decimalIndex + 1)).exp10(decimalIndex + config.coinUnitPlaces - str.length + 1)); + }; + + this.decompose_amount_into_digits = function(amount, dust_threshold) { + if (dust_threshold === undefined) { + dust_threshold = config.dustThreshold; + } + amount = amount.toString(); + var ret = []; + while (amount.length > 0) { + var remaining = new JSBigInt(amount); + if (remaining.compare(config.dustThreshold) <= 0) { + if (remaining.compare(0) > 0) { + ret.push(remaining); + } + break; + } + amount = amount.toString(); + var digit = amount[0]; + while (digit.length < amount.length) { + digit += "0"; + } + amount = amount.slice(1); + ret.push(new JSBigInt(digit)); + } + return ret; + }; + + this.decompose_tx_destinations = function(dsts, dust_threshold) { + var out = []; + for (var i = 0; i < dsts.length; i++) { + var digits = this.decompose_amount_into_digits(dsts[i].amount, dust_threshold); + for (var j = 0; j < digits.length; j++) { + if (digits[j].compare(0) > 0) { + out.push({ + address: dsts[i].address, + amount: digits[j] + }); + } + } + } + return out; + }; + + this.is_tx_unlocked = function(unlock_time, blockchain_height) { + if (!config.maxBlockNumber) { + throw "Max block number is not set in config!"; + } + if (unlock_time < config.maxBlockNumber) { + // unlock time is block height + return blockchain_height >= unlock_time; + } else { + // unlock time is timestamp + var current_time = Math.round(new Date().getTime() / 1000); + return current_time >= unlock_time; + } + }; + + this.tx_locked_reason = function(unlock_time, blockchain_height) { + if (unlock_time < config.maxBlockNumber) { + // unlock time is block height + var numBlocks = unlock_time - blockchain_height; + if (numBlocks <= 0) { + return "Transaction is unlocked"; + } + var unlock_prediction = moment().add(numBlocks * config.avgBlockTime, 'seconds'); + return "Will be unlocked in " + numBlocks + " blocks, ~" + unlock_prediction.fromNow(true) + ", " + unlock_prediction.calendar() + ""; + } else { + // unlock time is timestamp + var current_time = Math.round(new Date().getTime() / 1000); + var time_difference = unlock_time - current_time; + if(time_difference <= 0) { + return "Transaction is unlocked"; + } + var unlock_moment = moment(unlock_time * 1000); + return "Will be unlocked " + unlock_moment.fromNow() + ", " + unlock_moment.calendar(); + } + }; + + function assert(stmt, val) { + if (!stmt) { + throw "assert failed" + (val !== undefined ? ': ' + val : ''); + } + } + + return this; +})(config); diff --git a/static/assets/js/config.js b/static/assets/js/config.js new file mode 100644 index 0000000..d527ce0 --- /dev/null +++ b/static/assets/js/config.js @@ -0,0 +1,3 @@ +var config = { + +}; diff --git a/static/assets/js/crypto.js b/static/assets/js/crypto.js new file mode 100644 index 0000000..a096a5a --- /dev/null +++ b/static/assets/js/crypto.js @@ -0,0 +1,22 @@ +var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function";var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){return Module["read"](filename,true)};Module["load"]=function load(f){globalEval(read(f))};Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/");Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){return read(f,"binary")};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}this["Module"]=Module}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WEB){window["Module"]=Module}else{Module["load"]=importScripts}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]=="undefined"&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),forceAlign:(function(target,quantum){quantum=quantum||4;if(quantum==1)return target;if(isNumber(target)&&isNumber(quantum)){return Math.ceil(target/quantum)*quantum}else if(isNumber(quantum)&&isPowerOfTwo(quantum)){return"((("+target+")+"+(quantum-1)+")&"+ -quantum+")"}return"Math.ceil(("+target+")/"+quantum+")*"+quantum}),isNumberType:(function(type){return type in Runtime.INT_TYPES||type in Runtime.FLOAT_TYPES}),isPointerType:function isPointerType(type){return type[type.length-1]=="*"},isStructType:function isStructType(type){if(isPointerType(type))return false;if(isArrayType(type))return true;if(/?/.test(type))return true;return type[0]=="%"},INT_TYPES:{"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},FLOAT_TYPES:{"float":0,"double":0},or64:(function(x,y){var l=x|0|(y|0);var h=(Math.round(x/4294967296)|Math.round(y/4294967296))*4294967296;return l+h}),and64:(function(x,y){var l=(x|0)&(y|0);var h=(Math.round(x/4294967296)&Math.round(y/4294967296))*4294967296;return l+h}),xor64:(function(x,y){var l=(x|0)^(y|0);var h=(Math.round(x/4294967296)^Math.round(y/4294967296))*4294967296;return l+h}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),dedup:function dedup(items,ident){var seen={};if(ident){return items.filter((function(item){if(seen[item[ident]])return false;seen[item[ident]]=true;return true}))}else{return items.filter((function(item){if(seen[item])return false;seen[item]=true;return true}))}},set:function set(){var args=typeof arguments[0]==="object"?arguments[0]:arguments;var ret={};for(var i=0;i=0){diffs.push(curr-prev)}prev=curr;return curr}));if(type.name_&&type.name_[0]==="["){type.flatSize=parseInt(type.name_.substr(1))*type.flatSize/2}type.flatSize=Runtime.alignMemory(type.flatSize,type.alignSize);if(diffs.length==0){type.flatFactor=type.flatSize}else if(Runtime.dedup(diffs).length==1){type.flatFactor=diffs[0]}type.needsFlattening=type.flatFactor!=1;return type.flatIndexes},generateStructInfo:(function(struct,typeName,offset){var type,alignment;if(typeName){offset=offset||0;type=(typeof Types==="undefined"?Runtime.typeInfo:Types.types)[typeName];if(!type)return null;if(type.fields.length!=struct.length){printErr("Number of named fields must match the type for "+typeName+": possibly duplicate struct names. Cannot return structInfo");return null}alignment=type.flatIndexes}else{var type={fields:struct.map((function(item){return item[0]}))};alignment=Runtime.calculateStructAlignment(type)}var ret={__size__:type.flatSize};if(typeName){struct.forEach((function(item,i){if(typeof item==="string"){ret[item]=alignment[i]+offset}else{var key;for(var k in item)key=k;ret[key]=Runtime.generateStructInfo(item[key],type.fields[i],alignment[i])}}))}else{struct.forEach((function(item,i){ret[item[1]]=alignment[i]}))}return ret}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i0)return""}var c1=buffer[0];var c2=buffer[1];var c3=buffer[2];var c4=buffer[3];var ret;if(buffer.length==2){ret=String.fromCharCode((c1&31)<<6|c2&63)}else if(buffer.length==3){ret=String.fromCharCode((c1&15)<<12|(c2&63)<<6|c3&63)}else{var codePoint=(c1&7)<<18|(c2&63)<<12|(c3&63)<<6|c4&63;ret=String.fromCharCode(Math.floor((codePoint-65536)/1024)+55296,(codePoint-65536)%1024+56320)}buffer.length=0;return ret});this.processJSString=function processJSString(string){string=unescape(encodeURIComponent(string));var ret=[];for(var i=0;i=TOTAL_MEMORY)enlargeMemory();return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:8))*(quantum?quantum:8);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;function getSafeHeapType(bytes,isFloat){switch(bytes){case 1:return"i8";case 2:return"i16";case 4:return isFloat?"float":"i32";case 8:return"double";default:assert(0)}}function SAFE_HEAP_STORE(dest,value,bytes,isFloat){if(dest<=0)abort("segmentation fault storing "+bytes+" bytes to address "+dest);if(dest%bytes!==0)abort("alignment error storing to address "+dest+", which was expected to be aligned to a multiple of "+bytes);if(dest+bytes>Math.max(DYNAMICTOP,STATICTOP))abort("segmentation fault, exceeded the top of the available heap when storing "+bytes+" bytes to address "+dest+". STATICTOP="+STATICTOP+", DYNAMICTOP="+DYNAMICTOP);assert(DYNAMICTOP<=TOTAL_MEMORY);setValue(dest,value,getSafeHeapType(bytes,isFloat),1)}function SAFE_HEAP_LOAD(dest,bytes,isFloat,unsigned){if(dest<=0)abort("segmentation fault loading "+bytes+" bytes from address "+dest);if(dest%bytes!==0)abort("alignment error loading from address "+dest+", which was expected to be aligned to a multiple of "+bytes);if(dest+bytes>Math.max(DYNAMICTOP,STATICTOP))abort("segmentation fault, exceeded the top of the available heap when loading "+bytes+" bytes from address "+dest+". STATICTOP="+STATICTOP+", DYNAMICTOP="+DYNAMICTOP);assert(DYNAMICTOP<=TOTAL_MEMORY);var type=getSafeHeapType(bytes,isFloat);var ret=getValue(dest,type,1);if(unsigned)ret=unSign(ret,parseInt(type.substr(1)),1);return ret}function SAFE_FT_MASK(value,mask){var ret=value&mask;if(ret!==value){abort("Function table mask error: function pointer is "+value+" which is masked by "+mask+", the likely cause of this is that the function pointer is being called by the wrong type.")}return ret}var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var stack=0;var JSfuncs={"stackSave":(function(){stack=Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore(stack)}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc(str.length+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args){var func=getCFunc(ident);var cArgs=[];if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}else{switch(type){case"i1":SAFE_HEAP_STORE(ptr|0,value|0,1,0)|0;break;case"i8":SAFE_HEAP_STORE(ptr|0,value|0,1,0)|0;break;case"i16":SAFE_HEAP_STORE(ptr|0,value|0,2,0)|0;break;case"i32":SAFE_HEAP_STORE(ptr|0,value|0,4,0)|0;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],SAFE_HEAP_STORE(ptr|0,tempI64[0]|0,4,0)|0,SAFE_HEAP_STORE(ptr+4|0,tempI64[1]|0,4,0)|0;break;case"float":+SAFE_HEAP_STORE(ptr|0,+value,4,1);break;case"double":+SAFE_HEAP_STORE(ptr|0,+value,8,1);break;default:abort("invalid type for setValue: "+type)}}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";if(noSafe){switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}}else{switch(type){case"i1":return SAFE_HEAP_LOAD(ptr|0,1,0,0)|0;case"i8":return SAFE_HEAP_LOAD(ptr|0,1,0,0)|0;case"i16":return SAFE_HEAP_LOAD(ptr|0,2,0,0)|0;case"i32":return SAFE_HEAP_LOAD(ptr|0,4,0,0)|0;case"i64":return SAFE_HEAP_LOAD(ptr|0,8,0,0)|0;case"float":return+SAFE_HEAP_LOAD(ptr|0,4,1,0);case"double":return+SAFE_HEAP_LOAD(ptr|0,8,1,0);default:abort("invalid type for setValue: "+type)}}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i=128)hasUtf=true;else if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(!hasUtf){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}var utf8=new Runtime.UTF8Processor;for(i=0;i=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr){var iChar=0;for(var iCodeUnit=0;iCodeUnit=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++iCodeUnit);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}SAFE_HEAP_STORE(outPtr+iChar*4|0,codeUnit|0,4,0)|0;++iChar}SAFE_HEAP_STORE(outPtr+iChar*4|0,0|0,4,0)|0}Module["stringToUTF32"]=stringToUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a"}else{ret=name}paramLoop:while(i0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var final=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}final=parse()}catch(e){final+="?"}if(final.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return final}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){return x+4095&-4096}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function enlargeMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.")}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;var FAST_MEMORY=Module["FAST_MEMORY"]||2097152;var totalMemory=4096;while(totalMemory0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=Module.addOnPreRun=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=Module.addOnInit=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=Module.addOnPreMain=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=Module.addOnExit=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=Module.addOnPostRun=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var ret=(new Runtime.UTF8Processor).processJSString(stringy);if(length){ret.length=length}if(!dontAddNull){ret.push(0)}return ret}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i=0){return value}return bits<=32?2*Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;STATIC_BASE=8;STATICTOP=STATIC_BASE+Runtime.alignMemory(32659);__ATINIT__.push();allocate([40,102,101,95,97,100,100,40,121,44,32,119,44,32,120,41,44,32,33,102,101,95,105,115,110,111,110,122,101,114,111,40,121,41,41,0,0,0,0,0,47,104,111,109,101,47,108,117,99,97,115,47,116,104,105,110,45,119,97,108,108,101,116,47,99,114,121,112,116,111,45,111,112,115,46,99,0,0,0,0,103,101,95,102,114,111,109,102,101,95,102,114,111,109,98,121,116,101,115,95,118,97,114,116,105,109,101,0,0,0,0,0,102,101,95,105,115,110,111,110,122,101,114,111,40,114,45,62,88,41,0,0,0,0,0,0,33,102,101,95,105,115,110,111,110,122,101,114,111,40,99,104,101,99,107,95,118,41,0,0,40,40,40,98,32,45,32,49,41,32,38,32,126,98,41,32,124,32,40,40,98,32,45,32,50,41,32,38,32,126,40,98,32,45,32,49,41,41,41,32,61,61,32,40,117,110,115,105,103,110,101,100,32,105,110,116,41,32,45,49,0,0,0,0,102,101,95,99,109,111,118,0,182,120,89,255,133,114,211,0,189,110,21,255,15,10,106,0,41,192,1,0,152,232,121,255,188,60,160,255,153,113,206,255,0,183,226,254,180,13,72,255,176,160,14,254,211,201,134,255,158,24,143,0,127,105,53,0,96,12,189,0,167,215,251,255,159,76,128,254,106,101,225,255,30,252,4,0,146,12,174,0,89,241,178,254,10,229,166,255,123,221,42,254,30,20,212,0,82,128,3,0,48,209,243,0,119,121,64,255,50,227,156,255,0,110,197,1,103,27,144,0,133,59,140,1,189,241,36,255,248,37,195,1,96,220,55,0,183,76,62,255,195,66,61,0,50,76,164,1,225,164,76,255,76,61,163,255,117,62,31,0,81,145,64,255,118,65,14,0,162,115,214,255,6,138,46,0,124,230,244,255,10,138,143,0,52,26,194,0,184,244,76,0,129,143,41,1,190,244,19,255,123,170,122,255,98,129,68,0,121,213,147,0,86,101,30,255,161,103,155,0,140,89,67,255,239,229,190,1,67,11,181,0,198,240,137,254,238,69,188,255,234,113,60,255,37,255,57,255,69,178,182,254,128,208,179,0,118,26,125,254,3,7,214,255,241,50,77,255,85,203,197,255,211,135,250,255,25,48,100,255,187,213,180,254,17,88,105,0,83,209,158,1,5,115,98,0,4,174,60,254,171,55,110,255,217,181,17,255,20,188,170,0,146,156,102,254,87,214,174,255,114,122,155,1,233,44,170,0,127,8,239,1,214,236,234,0,175,5,219,0,49,106,61,255,6,66,208,255,2,106,110,255,81,234,19,255,215,107,192,255,67,151,238,0,19,42,108,255,229,85,113,1,50,68,135,255,17,106,9,0,50,103,1,255,80,1,168,1,35,152,30,255,16,168,185,1,56,89,232,255,101,210,252,0,41,250,71,0,204,170,79,255,14,46,239,255,80,77,239,0,189,214,75,255,17,141,249,0,38,80,76,255,190,85,117,0,86,228,170,0,156,216,208,1,195,207,164,255,150,66,76,255,175,225,16,255,141,80,98,1,76,219,242,0,198,162,114,0,46,218,152,0,155,43,241,254,155,160,104,255,178,9,252,254,100,110,212,0,14,5,167,0,233,239,163,255,28,151,157,1,101,146,10,255,254,158,70,254,71,249,228,0,88,30,50,0,68,58,160,255,191,24,104,1,129,66,129,255,192,50,85,255,8,179,138,255,38,250,201,0,115,80,160,0,131,230,113,0,125,88,147,0,90,68,199,0,253,76,158,0,28,255,118,0,113,250,254,0,66,75,46,0,230,218,43,0,229,120,186,1,148,68,43,0,136,124,238,1,187,107,197,255,84,53,246,255,51,116,254,255,51,187,165,0,2,17,175,0,66,84,160,1,247,58,30,0,35,65,53,254,69,236,191,0,45,134,245,1,163,123,221,0,32,110,20,255,52,23,165,0,186,214,71,0,233,176,96,0,242,239,54,1,57,89,138,0,83,0,84,255,136,160,100,0,92,142,120,254,104,124,190,0,181,177,62,255,250,41,85,0,152,130,42,1,96,252,246,0,151,151,63,254,239,133,62,0,32,56,156,0,45,167,189,255,142,133,179,1,131,86,211,0,187,179,150,254,250,170,14,255,68,113,21,255,222,186,59,255,66,7,241,1,69,6,72,0,86,156,108,254,55,167,89,0,109,52,219,254,13,176,23,255,196,44,106,255,239,149,71,255,164,140,125,255,159,173,1,0,51,41,231,0,145,62,33,0,138,111,93,1,185,83,69,0,144,115,46,0,97,151,16,255,24,228,26,0,49,217,226,0,113,75,234,254,193,153,12,255,182,48,96,255,14,13,26,0,128,195,249,254,69,193,59,0,132,37,81,254,125,106,60,0,214,240,169,1,164,227,66,0,210,163,78,0,37,52,151,0,99,77,26,0,238,156,213,255,213,192,209,1,73,46,84,0,20,65,41,1,54,206,79,0,201,131,146,254,170,111,24,255,177,33,50,254,171,38,203,255,78,247,116,0,209,221,153,0,133,128,178,1,58,44,25,0,201,39,59,1,189,19,252,0,49,229,210,1,117,187,117,0,181,179,184,1,0,114,219,0,48,94,147,0,245,41,56,0,125,13,204,254,244,173,119,0,44,221,32,254,84,234,20,0,249,160,198,1,236,126,234,255,143,62,221,0,129,89,214,255,55,139,5,254,68,20,191,255,14,204,178,1,35,195,217,0,47,51,206,1,38,246,165,0,206,27,6,254,158,87,36,0,217,52,146,255,125,123,215,255,85,60,31,255,171,13,7,0,218,245,88,254,252,35,60,0,55,214,160,255,133,101,56,0,224,32,19,254,147,64,234,0,26,145,162,1,114,118,125,0,248,252,250,0,101,94,196,255,198,141,226,254,51,42,182,0,135,12,9,254,109,172,210,255,197,236,194,1,241,65,154,0,48,156,47,255,153,67,55,255,218,165,34,254,74,180,179,0,218,66,71,1,88,122,99,0,212,181,219,255,92,42,231,255,239,0,154,0,245,77,183,255,94,81,170,1,18,213,216,0,171,93,71,0,52,94,248,0,18,151,161,254,197,209,66,255,174,244,15,254,162,48,183,0,49,61,240,254,182,93,195,0,199,228,6,1,200,5,17,255,137,45,237,255,108,148,4,0,90,79,237,255,39,63,77,255,53,82,207,1,142,22,118,255,101,232,18,1,92,26,67,0,5,200,88,255,33,168,138,255,149,225,72,0,2,209,27,255,44,245,168,1,220,237,17,255,30,211,105,254,141,238,221,0,128,80,245,254,111,254,14,0,222,95,190,1,223,9,241,0,146,76,212,255,108,205,104,255,63,117,153,0,144,69,48,0,35,228,111,0,192,33,193,255,112,214,190,254,115,152,151,0,23,102,88,0,51,74,248,0,226,199,143,254,204,162,101,255,208,97,189,1,245,104,18,0,230,246,30,255,23,148,69,0,110,88,52,254,226,181,89,255,208,47,90,254,114,161,80,255,33,116,248,0,179,152,87,255,69,144,177,1,88,238,26,255,58,32,113,1,1,77,69,0,59,121,52,255,152,238,83,0,52,8,193,0,231,39,233,255,199,34,138,0,222,68,173,0,91,57,242,254,220,210,127,255,192,7,246,254,151,35,187,0,195,236,165,0,111,93,206,0,212,247,133,1,154,133,209,255,155,231,10,0,64,78,38,0,122,249,100,1,30,19,97,255,62,91,249,1,248,133,77,0,197,63,168,254,116,10,82,0,184,236,113,254,212,203,194,255,61,100,252,254,36,5,202,255,119,91,153,255,129,79,29,0,103,103,171,254,237,215,111,255,216,53,69,0,239,240,23,0,194,149,221,255,38,225,222,0,232,255,180,254,118,82,133,255,57,209,177,1,139,232,133,0,158,176,46,254,194,115,46,0,88,247,229,1,28,103,191,0,221,222,175,254,149,235,44,0,151,228,25,254,218,105,103,0,142,85,210,0,149,129,190,255,213,65,94,254,117,134,224,255,82,198,117,0,157,221,220,0,163,101,36,0,197,114,37,0,104,172,166,254,11,182,0,0,81,72,188,255,97,188,16,255,69,6,10,0,199,147,145,255,8,9,115,1,65,214,175,255,217,173,209,0,80,127,166,0,247,229,4,254,167,183,124,255,90,28,204,254,175,59,240,255,11,41,248,1,108,40,51,255,144,177,195,254,150,250,126,0,138,91,65,1,120,60,222,255,245,193,239,0,29,214,189,255,128,2,25,0,80,154,162,0,77,220,107,1,234,205,74,255,54,166,103,255,116,72,9,0,228,94,47,255,30,200,25,255,35,214,89,255,61,176,140,255,83,226,163,255,75,130,172,0,128,38,17,0,95,137,152,255,215,124,159,1,79,93,0,0,148,82,157,254,195,130,251,255,40,202,76,255,251,126,224,0,157,99,62,254,207,7,225,255,96,68,195,0,140,186,157,255,131,19,231,255,42,128,254,0,52,219,61,254,102,203,72,0,141,7,11,255,186,164,213,0,31,122,119,0,133,242,145,0,208,252,232,255,91,213,182,255,143,4,250,254,249,215,74,0,165,30,111,1,171,9,223,0,229,123,34,1,92,130,26,255,77,155,45,1,195,139,28,255,59,224,78,0,136,17,247,0,108,121,32,0,79,250,189,255,96,227,252,254,38,241,62,0,62,174,125,255,155,111,93,255,10,230,206,1,97,197,40,255,0,49,57,254,65,250,13,0,18,251,150,255,220,109,210,255,5,174,166,254,44,129,189,0,235,35,147,255,37,247,141,255,72,141,4,255,103,107,255,0,247,90,4,0,53,44,42,0,2,30,240,0,4,59,63,0,88,78,36,0,113,167,180,0,190,71,193,255,199,158,164,255,58,8,172,0,77,33,12,0,65,63,3,0,153,77,33,255,172,254,102,1,228,221,4,255,87,30,254,1,146,41,86,255,138,204,239,254,108,141,17,255,187,242,135,0,210,208,127,0,68,45,14,254,73,96,62,0,81,60,24,255,170,6,36,255,3,249,26,0,35,213,109,0,22,129,54,255,21,35,225,255,234,61,56,255,58,217,6,0,143,124,88,0,236,126,66,0,209,38,183,255,34,238,6,255,174,145,102,0,95,22,211,0,196,15,153,254,46,84,232,255,117,34,146,1,231,250,74,255,27,134,100,1,92,187,195,255,170,198,112,0,120,28,42,0,209,70,67,0,29,81,31,0,29,168,100,1,169,173,160,0,107,35,117,0,62,96,59,255,81,12,69,1,135,239,190,255,220,252,18,0,163,220,58,255,137,137,188,255,83,102,109,0,96,6,76,0,234,222,210,255,185,174,205,1,60,158,213,255,13,241,214,0,172,129,140,0,93,104,242,0,192,156,251,0,43,117,30,0,225,81,158,0,127,232,218,0,226,28,203,0,233,27,151,255,117,43,5,255,242,14,47,255,33,20,6,0,137,251,44,254,27,31,245,255,183,214,125,254,40,121,149,0,186,158,213,255,89,8,227,0,69,88,0,254,203,135,225,0,201,174,203,0,147,71,184,0,18,121,41,254,94,5,78,0,224,214,240,254,36,5,180,0,251,135,231,1,163,138,212,0,210,249,116,254,88,129,187,0,19,8,49,254,62,14,144,255,159,76,211,0,214,51,82,0,109,117,228,254,103,223,203,255,75,252,15,1,154,71,220,255,23,13,91,1,141,168,96,255,181,182,133,0,250,51,55,0,234,234,212,254,175,63,158,0,39,240,52,1,158,189,36,255,213,40,85,1,32,180,247,255,19,102,26,1,84,24,97,255,69,21,222,0,148,139,122,255,220,213,235,1,232,203,255,0,121,57,147,0,227,7,154,0,53,22,147,1,72,1,225,0,82,134,48,254,83,60,157,255,145,72,169,0,34,103,239,0,198,233,47,0,116,19,4,255,184,106,9,255,183,129,83,0,36,176,230,1,34,103,72,0,219,162,134,0,245,42,158,0,32,149,96,254,165,44,144,0,202,239,72,254,215,150,5,0,42,66,36,1,132,215,175,0,86,174,86,255,26,197,156,255,49,232,135,254,103,182,82,0,253,128,176,1,153,178,122,0,245,250,10,0,236,24,178,0,137,106,132,0,40,29,41,0,50,30,152,255,124,105,38,0,230,191,75,0,143,43,170,0,44,131,20,255,44,13,23,255,237,255,155,1,159,109,100,255,112,181,24,255,104,220,108,0,55,211,131,0,99,12,213,255,152,151,145,255,238,5,159,0,97,155,8,0,33,108,81,0,1,3,103,0,62,109,34,255,250,155,180,0,32,71,195,255,38,70,145,1,159,95,245,0,69,229,101,1,136,28,240,0,79,224,25,0,78,110,121,255,248,168,124,0,187,128,247,0,2,147,235,254,79,11,132,0,70,58,12,1,181,8,163,255,79,137,133,255,37,170,11,255,141,243,85,255,176,231,215,255,204,150,164,255,239,215,39,255,46,87,156,254,8,163,88,255,172,34,232,0,66,44,102,255,27,54,41,254,236,99,87,255,41,123,169,1,52,114,43,0,117,134,40,0,155,134,26,0,231,207,91,254,35,132,38,255,19,102,125,254,36,227,133,255,118,3,113,255,29,13,124,0,152,96,74,1,88,146,206,255,167,191,220,254,162,18,88,255,182,100,23,0,31,117,52,0,81,46,106,1,12,2,7,0,69,80,201,1,209,246,172,0,12,48,141,1,224,211,88,0,116,226,159,0,122,98,130,0,65,236,234,1,225,226,9,255,207,226,123,1,89,214,59,0,112,135,88,1,90,244,203,255,49,11,38,1,129,108,186,0,89,112,15,1,101,46,204,255,127,204,45,254,79,255,221,255,51,73,18,255,127,42,101,255,241,21,202,0,160,227,7,0,105,50,236,0,79,52,197,255,104,202,208,1,180,15,16,0,101,197,78,255,98,77,203,0,41,185,241,1,35,193,124,0,35,155,23,255,207,53,192,0,11,125,163,1,249,158,185,255,4,131,48,0,21,93,111,255,61,121,231,1,69,200,36,255,185,48,185,255,111,238,21,255,39,50,25,255,99,215,163,255,87,212,30,255,164,147,5,255,128,6,35,1,108,223,110,255,194,76,178,0,74,101,180,0,243,47,48,0,174,25,43,255,82,173,253,1,54,114,192,255,40,55,91,0,215,108,176,255,11,56,7,0,224,233,76,0,209,98,202,254,242,25,125,0,44,193,93,254,203,8,177,0,135,176,19,0,112,71,213,255,206,59,176,1,4,67,26,0,14,143,213,254,42,55,208,255,60,67,120,0,193,21,163,0,99,164,115,0,10,20,118,0,156,212,222,254,160,7,217,255,114,245,76,1,117,59,123,0,176,194,86,254,213,15,176,0,78,206,207,254,213,129,59,0,233,251,22,1,96,55,152,255,236,255,15,255,197,89,84,255,93,149,133,0,174,160,113,0,234,99,169,255,152,116,88,0,144,164,83,255,95,29,198,255,34,47,15,255,99,120,134,255,5,236,193,0,249,247,126,255,147,187,30,0,50,230,117,255,108,217,219,255,163,81,166,255,72,25,169,254,155,121,79,255,28,155,89,254,7,126,17,0,147,65,33,1,47,234,253,0,26,51,18,0,105,83,199,255,163,196,230,0,113,248,164,0,226,254,218,0,189,209,203,255,164,247,222,254,255,35,165,0,4,188,243,1,127,179,71,0,37,237,254,255,100,186,240,0,5,57,71,254,103,72,73,255,244,18,81,254,229,210,132,255,238,6,180,255,11,229,174,255,227,221,192,1,17,49,28,0,163,215,196,254,9,118,4,255,51,240,71,0,113,129,109,255,76,240,231,0,188,177,127,0,125,71,44,1,26,175,243,0,94,169,25,254,27,230,29,0,15,139,119,1,168,170,186,255,172,197,76,255,252,75,188,0,137,124,196,0,72,22,96,255,45,151,249,1,220,145,100,0,64,192,159,255,120,239,226,0,129,178,146,0,0,192,125,0,235,138,234,0,183,157,146,0,83,199,192,255,184,172,72,255,73,225,128,0,77,6,250,255,186,65,67,0,104,246,207,0,188,32,138,255,218,24,242,0,67,138,81,254,237,129,121,255,20,207,150,1,41,199,16,255,6,20,128,0,159,118,5,0,181,16,143,255,220,38,15,0,23,64,147,254,73,26,13,0,87,228,57,1,204,124,128,0,43,24,223,0,219,99,199,0,22,75,20,255,19,27,126,0,157,62,215,0,110,29,230,0,179,167,255,1,54,252,190,0,221,204,182,254,179,158,65,255,81,157,3,0,194,218,159,0,170,223,0,0,224,11,32,255,38,197,98,0,168,164,37,0,23,88,7,1,164,186,110,0,96,36,134,0,234,242,229,0,250,121,19,0,242,254,112,255,3,47,94,1,9,239,6,255,81,134,153,254,214,253,168,255,67,124,224,0,245,95,74,0,28,30,44,254,1,109,220,255,178,89,89,0,252,36,76,0,24,198,46,255,76,77,111,0,134,234,136,255,39,94,29,0,185,72,234,255,70,68,135,255,231,102,7,254,77,231,140,0,167,47,58,1,148,97,118,255,16,27,225,1,166,206,143,255,110,178,214,255,180,131,162,0,143,141,225,1,13,218,78,255,114,153,33,1,98,104,204,0,175,114,117,1,167,206,75,0,202,196,83,1,58,64,67,0,138,47,111,1,196,247,128,255,137,224,224,254,158,112,207,0,154,100,255,1,134,37,107,0,198,128,79,255,127,209,155,255,163,254,185,254,60,14,243,0,31,219,112,254,29,217,65,0,200,13,116,254,123,60,196,255,224,59,184,254,242,89,196,0,123,16,75,254,149,16,206,0,69,254,48,1,231,116,223,255,209,160,65,1,200,80,98,0,37,194,184,254,148,63,34,0,139,240,65,255,217,144,132,255,56,38,45,254,199,120,210,0,108,177,166,255,160,222,4,0,220,126,119,254,165,107,160,255,82,220,248,1,241,175,136,0,144,141,23,255,169,138,84,0,160,137,78,255,226,118,80,255,52,27,132,255,63,96,139,255,152,250,39,0,188,155,15,0,232,51,150,254,40,15,232,255,240,229,9,255,137,175,27,255,75,73,97,1,218,212,11,0,135,5,162,1,107,185,213,0,2,249,107,255,40,242,70,0,219,200,25,0,25,157,13,0,67,82,80,255,196,249,23,255,145,20,149,0,50,72,146,0,94,76,148,1,24,251,65,0,31,192,23,0,184,212,201,255,123,233,162,1,247,173,72,0,162,87,219,254,126,134,89,0,159,11,12,254,166,105,29,0,73,27,228,1,113,120,183,255,66,163,109,1,212,143,11,255,159,231,168,1,255,128,90,0,57,14,58,254,89,52,10,255,253,8,163,1,0,145,210,255,10,129,85,1,46,181,27,0,103,136,160,254,126,188,209,255,34,35,111,0,215,219,24,255,212,11,214,254,101,5,118,0,232,197,133,255,223,167,109,255,237,80,86,255,70,139,94,0,158,193,191,1,155,15,51,255,15,190,115,0,78,135,207,255,249,10,27,1,181,125,233,0,95,172,13,254,170,213,161,255,39,236,138,255,95,93,87,255,190,128,95,0,125,15,206,0,166,150,159,0,227,15,158,255,206,158,120,255,42,141,128,0,101,178,120,1,156,109,131,0,218,14,44,254,247,168,206,255,212,112,28,0,112,17,228,255,90,16,37,1,197,222,108,0,254,207,83,255,9,90,243,255,243,244,172,0,26,88,115,255,205,116,122,0,191,230,193,0,180,100,11,1,217,37,96,255,154,78,156,0,235,234,31,255,206,178,178,255,149,192,251,0,182,250,135,0,246,22,105,0,124,193,109,255,2,210,149,255,169,17,170,0,0,96,110,255,117,9,8,1,50,123,40,255,193,189,99,0,34,227,160,0,48,80,70,254,211,51,236,0,45,122,245,254,44,174,8,0,173,37,233,255,158,65,171,0,122,69,215,255,90,80,2,255,131,106,96,254,227,114,135,0,205,49,119,254,176,62,64,255,82,51,17,255,241,20,243,255,130,13,8,254,128,217,243,255,162,27,1,254,90,118,241,0,246,198,246,255,55,16,118,255,200,159,157,0,163,17,1,0,140,107,121,0,85,161,118,255,38,0,149,0,156,47,238,0,9,166,166,1,75,98,181,255,50,74,25,0,66,15,47,0,139,225,159,0,76,3,142,255,14,238,184,0,11,207,53,255,183,192,186,1,171,32,174,255,191,76,221,1,247,170,219,0,25,172,50,254,217,9,233,0,203,126,68,255,183,92,48,0,127,167,183,1,65,49,254,0,16,63,127,1,254,21,170,255,59,224,127,254,22,48,63,255,27,78,130,254,40,195,29,0,250,132,112,254,35,203,144,0,104,169,168,0,207,253,30,255,104,40,38,254,94,228,88,0,206,16,128,255,212,55,122,255,223,22,234,0,223,197,127,0,253,181,181,1,145,102,118,0,236,153,36,255,212,217,72,255,20,38,24,254,138,62,62,0,152,140,4,0,230,220,99,255,1,21,212,255,148,201,231,0,244,123,9,254,0,171,210,0,51,58,37,255,1,255,14,255,244,183,145,254,0,242,166,0,22,74,132,0,121,216,41,0,95,195,114,254,133,24,151,255,156,226,231,255,247,5,77,255,246,148,115,254,225,92,81,255,222,80,246,254,170,123,89,255,74,199,141,0,29,20,8,255,138,136,70,255,93,75,92,0,221,147,49,254,52,126,226,0,229,124,23,0,46,9,181,0,205,64,52,1,131,254,28,0,151,158,212,0,131,64,78,0,206,25,171,0,0,230,139,0,191,253,110,254,103,247,167,0,64,40,40,1,42,165,241,255,59,75,228,254,124,243,189,255,196,92,178,255,130,140,86,255,141,89,56,1,147,198,5,255,203,248,158,254,144,162,141,0,11,172,226,0,130,42,21,255,1,167,143,255,144,36,36,255,48,88,164,254,168,170,220,0,98,71,214,0,91,208,79,0,159,76,201,1,166,42,214,255,69,255,0,255,6,128,125,255,190,1,140,0,146,83,218,255,215,238,72,1,122,127,53,0,189,116,165,255,84,8,66,255,214,3,208,255,213,110,133,0,195,168,44,1,158,231,69,0,162,64,200,254,91,58,104,0,182,58,187,254,249,228,136,0,203,134,76,254,99,221,233,0,75,254,214,254,80,69,154,0,64,152,248,254,236,136,202,255,157,105,153,254,149,175,20,0,22,35,19,255,124,121,233,0,186,250,198,254,132,229,139,0,137,80,174,255,165,125,68,0,144,202,148,254,235,239,248,0,135,184,118,0,101,94,17,255,122,72,70,254,69,130,146,0,127,222,248,1,69,127,118,255,30,82,215,254,188,74,19,255,229,167,194,254,117,25,66,255,65,234,56,254,213,22,156,0,151,59,93,254,45,28,27,255,186,126,164,255,32,6,239,0,127,114,99,1,219,52,2,255,99,96,166,254,62,190,126,255,108,222,168,1,75,226,174,0,230,226,199,0,60,117,218,255,252,248,20,1,214,188,204,0,31,194,134,254,123,69,192,255,169,173,36,254,55,98,91,0,223,42,102,254,137,1,102,0,157,90,25,0,239,122,64,255,252,6,233,0,7,54,20,255,82,116,174,0,135,37,54,255,15,186,125,0,227,112,175,255,100,180,225,255,42,237,244,255,244,173,226,254,248,18,33,0,171,99,150,255,74,235,50,255,117,82,32,254,106,168,237,0,207,109,208,1,228,9,186,0,135,60,169,254,179,92,143,0,244,170,104,255,235,45,124,255,70,99,186,0,117,137,183,0,224,31,215,0,40,9,100,0,26,16,95,1,68,217,87,0,8,151,20,255,26,100,58,255,176,165,203,1,52,118,70,0,7,32,254,254,244,254,245,255,167,144,194,255,125,113,23,255,176,121,181,0,136,84,209,0,138,6,30,255,89,48,28,0,33,155,14,255,25,240,154,0,141,205,109,1,70,115,62,255,20,40,107,254,138,154,199,255,94,223,226,255,157,171,38,0,163,177,25,254,45,118,3,255,14,222,23,1,209,190,81,255,118,123,232,1,13,213,101,255,123,55,123,254,27,246,165,0,50,99,76,255,140,214,32,255,97,65,67,255,24,12,28,0,174,86,78,1,64,247,96,0,160,135,67,0,66,55,243,255,147,204,96,255,26,6,33,255,98,51,83,1,153,213,208,255,2,184,54,255,25,218,11,0,49,67,246,254,18,149,72,255,13,25,72,0,42,79,214,0,42,4,38,1,27,139,144,255,149,187,23,0,18,164,132,0,245,84,184,254,120,198,104,255,126,218,96,0,56,117,234,255,13,29,214,254,68,47,10,255,167,154,132,254,152,38,198,0,66,178,89,255,200,46,171,255,13,99,83,255,210,187,253,255,170,45,42,1,138,209,124,0,214,162,141,0,12,230,156,0,102,36,112,254,3,147,67,0,52,215,123,255,233,171,54,255,98,137,62,0,247,218,39,255,231,218,236,0,247,191,127,0,195,146,84,0,165,176,92,255,19,212,94,255,17,74,227,0,88,40,153,1,198,147,1,255,206,67,245,254,240,3,218,255,61,141,213,255,97,183,106,0,195,232,235,254,95,86,154,0,209,48,205,254,118,209,241,255,240,120,223,1,213,29,159,0,163,127,147,255,13,218,93,0,85,24,68,254,70,20,80,255,189,5,140,1,82,97,254,255,99,99,191,255,132,84,133,255,107,218,116,255,112,122,46,0,105,17,32,0,194,160,63,255,68,222,39,1,216,253,92,0,177,105,205,255,149,201,195,0,42,225,11,255,40,162,115,0,9,7,81,0,165,218,219,0,180,22,0,254,29,146,252,255,146,207,225,1,180,135,96,0,31,163,112,0,177,11,219,255,133,12,193,254,43,78,50,0,65,113,121,1,59,217,6,255,110,94,24,1,112,172,111,0,7,15,96,0,36,85,123,0,71,150,21,255,208,73,188,0,192,11,167,1,213,245,34,0,9,230,92,0,162,142,39,255,215,90,27,0,98,97,89,0,94,79,211,0,90,157,240,0,95,220,126,1,102,176,226,0,36,30,224,254,35,31,127,0,231,232,115,1,85,83,130,0,210,73,245,255,47,143,114,255,68,65,197,0,59,72,62,255,183,133,173,254,93,121,118,255,59,177,81,255,234,69,173,255,205,128,177,0,220,244,51,0,26,244,209,1,73,222,77,255,163,8,96,254,150,149,211,0,158,254,203,1,54,127,139,0,161,224,59,0,4,109,22,255,222,42,45,255,208,146,102,255,236,142,187,0,50,205,245,255,10,74,89,254,48,79,142,0,222,76,130,255,30,166,63,0,236,12,13,255,49,184,244,0,187,113,102,0,218,101,253,0,153,57,182,254,32,150,42,0,25,198,146,1,237,241,56,0,140,68,5,0,91,164,172,255,78,145,186,254,67,52,205,0,219,207,129,1,109,115,17,0,54,143,58,1,21,248,120,255,179,255,30,0,193,236,66,255,1,255,7,255,253,192,48,255,19,69,217,1,3,214,0,255,64,101,146,1,223,125,35,255,235,73,179,255,249,167,226,0,225,175,10,1,97,162,58,0,106,112,171,1,84,172,5,255,133,140,178,255,134,245,142,0,97,90,125,255,186,203,185,255,223,77,23,255,192,92,106,0,15,198,115,255,217,152,248,0,171,178,120,255,228,134,53,0,176,54,193,1,250,251,53,0,213,10,100,1,34,199,106,0,151,31,244,254,172,224,87,255,14,237,23,255,253,85,26,255,127,39,116,255,172,104,100,0,251,14,70,255,212,208,138,255,253,211,250,0,176,49,165,0,15,76,123,255,37,218,160,255,92,135,16,1,10,126,114,255,70,5,224,255,247,249,141,0,68,20,60,1,241,210,189,255,195,217,187,1,151,3,113,0,151,92,174,0,231,62,178,255,219,183,225,0,23,23,33,255,205,181,80,0,57,184,248,255,67,180,1,255,90,123,93,255,39,0,162,255,96,248,52,255,84,66,140,0,34,127,228,255,194,138,7,1,166,110,188,0,21,17,155,1,154,190,198,255,214,80,59,255,18,7,143,0,72,29,226,1,199,217,249,0,232,161,71,1,149,190,201,0,217,175,95,254,113,147,67,255,138,143,199,255,127,204,1,0,29,182,83,1,206,230,155,255,186,204,60,0,10,125,85,255,232,96,25,255,255,89,247,255,213,254,175,1,232,193,81,0,28,43,156,254,12,69,8,0,147,24,248,0,18,198,49,0,134,60,35,0,118,246,18,255,49,88,254,254,228,21,186,255,182,65,112,1,219,22,1,255,22,126,52,255,189,53,49,255,112,25,143,0,38,127,55,255,226,101,163,254,208,133,61,255,137,69,174,1,190,118,145,255,60,98,219,255,217,13,245,255,250,136,10,0,84,254,226,0,201,31,125,1,240,51,251,255,31,131,130,255,2,138,50,255,215,215,177,1,223,12,238,255,252,149,56,255,124,91,68,255,72,126,170,254,119,255,100,0,130,135,232,255,14,79,178,0,250,131,197,0,138,198,208,0,121,216,139,254,119,18,36,255,29,193,122,0,16,42,45,255,213,240,235,1,230,190,169,255,198,35,228,254,110,173,72,0,214,221,241,255,56,148,135,0,192,117,78,254,141,93,207,255,143,65,149,0,21,18,98,255,95,44,244,1,106,191,77,0,254,85,8,254,214,110,176,255,73,173,19,254,160,196,199,255,237,90,144,0,193,172,113,255,200,155,136,254,228,90,221,0,137,49,74,1,164,221,215,255,209,189,5,255,105,236,55,255,42,31,129,1,193,255,236,0,46,217,60,0,138,88,187,255,226,82,236,255,81,69,151,255,142,190,16,1,13,134,8,0,127,122,48,255,81,64,156,0,171,243,139,0,237,35,246,0,122,143,193,254,212,122,146,0,95,41,255,1,87,132,77,0,4,212,31,0,17,31,78,0,39,45,173,254,24,142,217,255,95,9,6,255,227,83,6,0,98,59,130,254,62,30,33,0,8,115,211,1,162,97,128,255,7,184,23,254,116,28,168,255,248,138,151,255,98,244,240,0,186,118,130,0,114,248,235,255,105,173,200,1,160,124,71,255,94,36,164,1,175,65,146,255,238,241,170,254,202,198,197,0,228,71,138,254,45,246,109,255,194,52,158,0,133,187,176,0,83,252,154,254,89,189,221,255,170,73,252,0,148,58,125,0,36,68,51,254,42,69,177,255,168,76,86,255,38,100,204,255,38,53,35,0,175,19,97,0,225,238,253,255,81,81,135,0,210,27,255,254,235,73,107,0,8,207,115,0,82,127,136,0,84,99,21,254,207,19,136,0,100,164,101,0,80,208,77,255,132,207,237,255,15,3,15,255,33,166,110,0,156,95,85,255,37,185,111,1,150,106,35,255,166,151,76,0,114,87,135,255,159,194,64,0,12,122,31,255,232,7,101,254,173,119,98,0,154,71,220,254,191,57,53,255,168,232,160,255,224,32,99,255,218,156,165,0,151,153,163,0,217,13,148,1,197,113,89,0,149,28,161,254,207,23,30,0,105,132,227,255,54,230,94,255,133,173,204,255,92,183,157,255,88,144,252,254,102,33,90,0,159,97,3,0,181,218,155,255,240,114,119,0,106,214,53,255,165,190,115,1,152,91,225,255,88,106,44,255,208,61,113,0,151,52,124,0,191,27,156,255,110,54,236,1,14,30,166,255,39,127,207,1,229,199,28,0,188,228,188,254,100,157,235,0,246,218,183,1,107,22,193,255,206,160,95,0,76,239,147,0,207,161,117,0,51,166,2,255,52,117,10,254,73,56,227,255,152,193,225,0,132,94,136,255,101,191,209,0,32,107,229,255,198,43,180,1,100,210,118,0,114,67,153,255,23,88,26,255,89,154,92,1,220,120,140,255,144,114,207,255,252,115,250,255,34,206,72,0,138,133,127,255,8,178,124,1,87,75,97,0,15,229,92,254,240,67,131,255,118,123,227,254,146,120,104,255,145,213,255,1,129,187,70,255,219,119,54,0,1,19,173,0,45,150,148,1,248,83,72,0,203,233,169,1,142,107,56,0,247,249,38,1,45,242,80,255,30,233,103,0,96,82,70,0,23,201,111,0,81,39,30,255,161,183,78,255,194,234,33,255,68,227,140,254,216,206,116,0,70,27,235,255,104,144,79,0,164,230,93,254,214,135,156,0,154,187,242,254,188,20,131,255,36,109,174,0,159,112,241,0,5,110,149,1,36,165,218,0,166,29,19,1,178,46,73,0,93,43,32,254,248,189,237,0,102,155,141,0,201,93,195,255,241,139,253,255,15,111,98,255,108,65,163,254,155,79,190,255,73,174,193,254,246,40,48,255,107,88,11,254,202,97,85,255,253,204,18,255,113,242,66,0,110,160,194,254,208,18,186,0,81,21,60,0,188,104,167,255,124,166,97,254,210,133,142,0,56,242,137,254,41,111,130,0,111,151,58,1,111,213,141,255,183,172,241,255,38,6,196,255,185,7,123,255,46,11,246,0,245,105,119,1,15,2,161,255,8,206,45,255,18,202,74,255,83,124,115,1,212,141,157,0,83,8,209,254,139,15,232,255,172,54,173,254,50,247,132,0,214,189,213,0,144,184,105,0,223,254,248,0,255,147,240,255,23,188,72,0,7,51,54,0,188,25,180,254,220,180,0,255,83,160,20,0,163,189,243,255,58,209,194,255,87,73,60,0,106,24,49,0,245,249,220,0,22,173,167,0,118,11,195,255,19,126,237,0,110,159,37,255,59,82,47,0,180,187,86,0,188,148,208,1,100,37,133,255,7,112,193,0,129,188,156,255,84,106,129,255,133,225,202,0,14,236,111,255,40,20,101,0,172,172,49,254,51,54,74,255,251,185,184,255,93,155,224,255,180,249,224,1,230,178,146,0,72,57,54,254,178,62,184,0,119,205,72,0,185,239,253,255,61,15,218,0,196,67,56,255,234,32,171,1,46,219,228,0,208,108,234,255,20,63,232,255,165,53,199,1,133,228,5,255,52,205,107,0,74,238,140,255,150,156,219,254,239,172,178,255,251,189,223,254,32,142,211,255,218,15,138,1,241,196,80,0,28,36,98,254,22,234,199,0,61,237,220,255,246,57,37,0,142,17,142,255,157,62,26,0,43,238,95,254,3,217,6,255,213,25,240,1,39,220,174,255,154,205,48,254,19,13,192,255,244,34,54,254,140,16,155,0,240,181,5,254,155,193,60,0,166,128,4,255,36,145,56,255,150,240,219,0,120,51,145,0,82,153,42,1,140,236,146,0,107,92,248,1,189,10,3,0,63,136,242,0,211,39,24,0,19,202,161,1,173,27,186,255,210,204,239,254,41,209,162,255,182,254,159,255,172,116,52,0,195,103,222,254,205,69,59,0,53,22,41,1,218,48,194,0,80,210,242,0,210,188,207,0,187,161,161,254,216,17,1,0,136,225,113,0,250,184,63,0,223,30,98,254,77,168,162,0,59,53,175,0,19,201,10,255,139,224,194,0,147,193,154,255,212,189,12,254,1,200,174,255,50,133,113,1,94,179,90,0,173,182,135,0,94,177,113,0,43,89,215,255,136,252,106,255,123,134,83,254,5,245,66,255,82,49,39,1,220,2,224,0,97,129,177,0,77,59,89,0,61,29,155,1,203,171,220,255,92,78,139,0,145,33,181,255,169,24,141,1,55,150,179,0,139,60,80,255,218,39,97,0,2,147,107,255,60,248,72,0,173,230,47,1,6,83,182,255,16,105,162,254,137,212,81,255,180,184,134,1,39,222,164,255,221,105,251,1,239,112,125,0,63,7,97,0,63,104,227,255,148,58,12,0,90,60,224,255,84,212,252,0,79,215,168,0,248,221,199,1,115,121,1,0,36,172,120,0,32,162,187,255,57,107,49,255,147,42,21,0,106,198,43,1,57,74,87,0,126,203,81,255,129,135,195,0,140,31,177,0,221,139,194,0,3,222,215,0,131,68,231,0,177,86,178,254,124,151,180,0,184,124,38,1,70,163,17,0,249,251,181,1,42,55,227,0,226,161,44,0,23,236,110,0,51,149,142,1,93,5,236,0,218,183,106,254,67,24,77,0,40,245,209,255,222,121,153,0,165,57,30,0,83,125,60,0,70,38,82,1,229,6,188,0,109,222,157,255,55,118,63,255,205,151,186,0,227,33,149,255,254,176,246,1,227,177,227,0,34,106,163,254,176,43,79,0,106,95,78,1,185,241,122,255,185,14,61,0,36,1,202,0,13,178,162,255,247,11,132,0,161,230,92,1,65,1,185,255,212,50,165,1,141,146,64,255,158,242,218,0,21,164,125,0,213,139,122,1,67,71,87,0,203,158,178,1,151,92,43,0,152,111,5,255,39,3,239,255,217,255,250,255,176,63,71,255,74,245,77,1,250,174,18,255,34,49,227,255,246,46,251,255,154,35,48,1,125,157,61,255,106,36,78,255,97,236,153,0,136,187,120,255,113,134,171,255,19,213,217,254,216,94,209,255,252,5,61,0,94,3,202,0,3,26,183,255,64,191,43,255,30,23,21,0,129,141,77,255,102,120,7,1,194,76,140,0,188,175,52,255,17,81,148,0,232,86,55,1,225,48,172,0,134,42,42,255,238,50,47,0,169,18,254,0,20,147,87,255,14,195,239,255,69,247,23,0,238,229,128,255,177,49,112,0,168,98,251,255,121,71,248,0,243,8,145,254,246,227,153,255,219,169,177,254,251,139,165,255,12,163,185,255,164,40,171,255,153,159,27,254,243,109,91,255,222,24,112,1,18,214,231,0,107,157,181,254,195,147,0,255,194,99,104,255,89,140,190,255,177,66,126,254,106,185,66,0,49,218,31,0,252,174,158,0,188,79,230,1,238,41,224,0,212,234,8,1,136,11,181,0,166,117,83,255,68,195,94,0,46,132,201,0,240,152,88,0,164,57,69,254,160,224,42,255,59,215,67,255,119,195,141,255,36,180,121,254,207,47,8,255,174,210,223,0,101,197,68,255,255,82,141,1,250,137,233,0,97,86,133,1,16,80,69,0,132,131,159,0,116,93,100,0,45,141,139,0,152,172,157,255,90,43,91,0,71,153,46,0,39,16,112,255,217,136,97,255,220,198,25,254,177,53,49,0,222,88,134,255,128,15,60,0,207,192,169,255,192,116,209,255,106,78,211,1,200,213,183,255,7,12,122,254,222,203,60,255,33,110,199,254,251,106,117,0,228,225,4,1,120,58,7,255,221,193,84,254,112,133,27,0,189,200,201,255,139,135,150,0,234,55,176,255,61,50,65,0,152,108,169,255,220,85,1,255,112,135,227,0,162,26,186,0,207,96,185,254,244,136,107,0,93,153,50,1,198,97,151,0,110,11,86,255,143,117,174,255,115,212,200,0,5,202,183,0,237,164,10,254,185,239,62,0,236,120,18,254,98,123,99,255,168,201,194,254,46,234,214,0,191,133,49,255,99,169,119,0,190,187,35,1,115,21,45,255,249,131,72,0,112,6,123,255,214,49,181,254,166,233,34,0,92,197,102,254,253,228,205,255,3,59,201,1,42,98,46,0,219,37,35,255,169,195,38,0,94,124,193,1,156,43,223,0,95,72,133,254,120,206,191,0,122,197,239,255,177,187,79,255,254,46,2,1,250,167,190,0,84,129,19,0,203,113,166,255,249,31,189,254,72,157,202,255,208,71,73,255,207,24,72,0,10,16,18,1,210,81,76,255,88,208,192,255,126,243,107,255,238,141,120,255,199,121,234,255,137,12,59,255,36,220,123,255,148,179,60,254,240,12,29,0,66,0,97,1,36,30,38,255,115,1,93,255,96,103,231,255,197,158,59,1,192,164,240,0,202,202,57,255,24,174,48,0,89,77,155,1,42,76,215,0,244,151,233,0,23,48,81,0,239,127,52,254,227,130,37,255,248,116,93,1,124,132,118,0,173,254,192,1,6,235,83,255,110,175,231,1,251,28,182,0,129,249,93,254,84,184,128,0,76,181,62,0,175,128,186,0,100,53,136,254,109,29,226,0,221,233,58,1,20,99,74,0,0,22,160,0,134,13,21,0,9,52,55,255,17,89,140,0,175,34,59,0,84,165,119,255,224,226,234,255,7,72,166,255,123,115,255,1,18,214,246,0,250,7,71,1,217,220,185,0,212,35,76,255,38,125,175,0,189,97,210,0,114,238,44,255,41,188,169,254,45,186,154,0,81,92,22,0,132,160,193,0,121,208,98,255,13,81,44,255,203,156,82,0,71,58,21,255,208,114,191,254,50,38,147,0,154,216,195,0,101,25,18,0,60,250,215,255,233,132,235,255,103,175,142,1,16,14,92,0,141,31,110,254,238,241,45,255,153,217,239,1,97,168,47,255,249,85,16,1,28,175,62,255,57,254,54,0,222,231,126,0,166,45,117,254,18,189,96,255,228,76,50,0,200,244,94,0,198,152,120,1,68,34,69,255,12,65,160,254,101,19,90,0,167,197,120,255,68,54,185,255,41,218,188,0,113,168,48,0,88,105,189,1,26,82,32,255,185,93,164,1,228,240,237,255,66,182,53,0,171,197,92,255,107,9,233,1,199,120,144,255,78,49,10,255,109,170,105,255,90,4,31,255,28,244,113,255,74,58,11,0,62,220,246,255,121,154,200,254,144,210,178,255,126,57,129,1,43,250,14,255,101,111,28,1,47,86,241,255,61,70,150,255,53,73,5,255,30,26,158,0,209,26,86,0,138,237,74,0,164,95,188,0,142,60,29,254,162,116,248,255,187,175,160,0,151,18,16,0,209,111,65,254,203,134,39,255,88,108,49,255,131,26,71,255,221,27,215,254,104,105,93,255,31,236,31,254,135,0,211,255,143,127,110,1,212,73,229,0,233,67,167,254,195,1,208,255,132,17,221,255,51,217,90,0,67,235,50,255,223,210,143,0,179,53,130,1,233,106,198,0,217,173,220,255,112,229,24,255,175,154,93,254,71,203,246,255,48,66,133,255,3,136,230,255,23,221,113,254,235,111,213,0,170,120,95,254,251,221,2,0,45,130,158,254,105,94,217,255,242,52,180,254,213,68,45,255,104,38,28,0,244,158,76,0,161,200,96,255,207,53,13,255,187,67,148,0,170,54,248,0,119,162,178,255,83,20,11,0,42,42,192,1,146,159,163,255,183,232,111,0,77,229,21,255,71,53,143,0,27,76,34,0,246,136,47,255,219,39,182,255,92,224,201,1,19,142,14,255,69,182,241,255,163,118,245,0,9,109,106,1,170,181,247,255,78,47,238,255,84,210,176,255,213,107,139,0,39,38,11,0,72,21,150,0,72,130,69,0,205,77,155,254,142,133,21,0,71,111,172,254,226,42,59,255,179,0,215,1,33,128,241,0,234,252,13,1,184,79,8,0,110,30,73,255,246,141,189,0,170,207,218,1,74,154,69,255,138,246,49,255,155,32,100,0,125,74,105,255,90,85,61,255,35,229,177,255,62,125,193,255,153,86,188,1,73,120,212,0,209,123,246,254,135,209,38,255,151,58,44,1,92,69,214,255,14,12,88,255,252,153,166,255,253,207,112,255,60,78,83,255,227,124,110,0,180,96,252,255,53,117,33,254,164,220,82,255,41,1,27,255,38,164,166,255,164,99,169,254,61,144,70,255,192,166,18,0,107,250,66,0,197,65,50,0,1,179,18,255,255,104,1,255,43,153,35,255,80,111,168,0,110,175,168,0,41,105,45,255,219,14,205,255,164,233,140,254,43,1,118,0,233,67,195,0,178,82,159,255,138,87,122,255,212,238,90,255,144,35,124,254,25,140,164,0,251,215,44,254,133,70,107,255,101,227,80,254,92,169,55,0,215,42,49,0,114,180,85,255,33,232,27,1,172,213,25,0,62,176,123,254,32,133,24,255,225,191,62,0,93,70,153,0,181,42,104,1,22,191,224,255,200,200,140,255,249,234,37,0,149,57,141,0,195,56,208,255,254,130,70,255,32,173,240,255,29,220,199,0,110,100,115,255,132,229,249,0,228,233,223,255,37,216,209,254,178,177,209,255,183,45,165,254,224,97,114,0,137,97,168,255,225,222,172,0,165,13,49,1,210,235,204,255,252,4,28,254,70,160,151,0,232,190,52,254,83,248,93,255,62,215,77,1,175,175,179,255,160,50,66,0,121,48,208,0,63,169,209,255,0,210,200,0,224,187,44,1,73,162,82,0,9,176,143,255,19,76,193,255,29,59,167,1,24,43,154,0,28,190,190,0,141,188,129,0,232,235,203,255,234,0,109,255,54,65,159,0,60,88,232,255,121,253,150,254,252,233,131,255,198,110,41,1,83,77,71,255,200,22,59,254,106,253,242,255,21,12,207,255,237,66,189,0,90,198,202,1,225,172,127,0,53,22,202,0,56,230,132,0,1,86,183,0,109,190,42,0,243,68,174,1,109,228,154,0,200,177,122,1,35,160,183,255,177,48,85,255,90,218,169,255,248,152,78,0,202,254,110,0,6,52,43,0,142,98,65,255,63,145,22,0,70,106,93,0,232,138,107,1,110,179,61,255,211,129,218,1,242,209,92,0,35,90,217,1,182,143,106,255,116,101,217,255,114,250,221,255,173,204,6,0,60,150,163,0,73,172,44,255,239,110,80,255,237,76,153,254,161,140,249,0,149,232,229,0,133,31,40,255,174,164,119,0,113,51,214,0,129,228,2,254,64,34,243,0,107,227,244,255,174,106,200,255,84,153,70,1,50,35,16,0,250,74,216,254,236,189,66,255,153,249,13,0,230,178,4,255,221,41,238,0,118,227,121,255,94,87,140,254,254,119,92,0,73,239,246,254,117,87,128,0,19,211,145,255,177,46,252,0,229,91,246,1,69,128,247,255,202,77,54,1,8,11,9,255,153,96,166,0,217,214,173,255,134,192,2,1,0,207,0,0,189,174,107,1,140,134,100,0,158,193,243,1,182,102,171,0,235,154,51,0,142,5,123,255,60,168,89,1,217,14,92,255,19,214,5,1,211,167,254,0,44,6,202,254,120,18,236,255,15,113,184,255,184,223,139],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([40,177,119,254,182,123,90,255,176,165,176,0,247,77,194,0,27,234,120,0,231,0,214,255,59,39,30,0,125,99,145,255,150,68,68,1,141,222,248,0,153,123,210,255,110,127,152,255,229,33,214,1,135,221,197,0,137,97,2,0,12,143,204,255,81,41,188,0,115,79,130,255,94,3,132,0,152,175,187,255,124,141,10,255,126,192,179,255,11,103,198,0,149,6,45,0,219,85,187,1,230,18,178,255,72,182,152,0,3,198,184,255,128,112,224,1,97,161,230,0,254,99,38,255,58,159,197,0,151,66,219,0,59,69,143,255,185,112,249,0,119,136,47,255,123,130,132,0,168,71,95,255,113,176,40,1,232,185,173,0,207,93,117,1,68,157,108,255,102,5,147,254,49,97,33,0,89,65,111,254,247,30,163,255,124,217,221,1,102,250,216,0,198,174,75,254,57,55,18,0,227,5,236,1,229,213,173,0,201,109,218,1,49,233,239,0,30,55,158,1,25,178,106,0,155,111,188,1,94,126,140,0,215,31,238,1,77,240,16,0,213,242,25,1,38,71,168,0,205,186,93,254,49,211,140,255,219,0,180,255,134,118,165,0,160,147,134,255,110,186,35,255,198,243,42,0,243,146,119,0,134,235,163,1,4,241,135,255,193,46,193,254,103,180,79,255,225,4,184,254,242,118,130,0,146,135,176,1,234,111,30,0,69,66,213,254,41,96,123,0,121,94,42,255,178,191,195,255,46,130,42,0,117,84,8,255,233,49,214,254,238,122,109,0,6,71,89,1,236,211,123,0,244,13,48,254,119,148,14,0,114,28,86,255,75,237,25,255,145,229,16,254,129,100,53,255,134,150,120,254,168,157,50,0,23,72,104,255,224,49,14,0,255,123,22,255,151,185,151,255,170,80,184,1,134,182,20,0,41,100,101,1,153,33,16,0,76,154,111,1,86,206,234,255,192,160,164,254,165,123,93,255,1,216,164,254,67,17,175,255,169,11,59,255,158,41,61,255,73,188,14,255,195,6,137,255,22,147,29,255,20,103,3,255,246,130,227,255,122,40,128,0,226,47,24,254,35,36,32,0,152,186,183,255,69,202,20,0,195,133,195,0,222,51,247,0,169,171,94,1,183,0,160,255,64,205,18,1,156,83,15,255,197,58,249,254,251,89,110,255,50,10,88,254,51,43,216,0,98,242,198,1,245,151,113,0,171,236,194,1,197,31,199,255,229,81,38,1,41,59,20,0,253,104,230,0,152,93,14,255,246,242,146,254,214,169,240,255,240,102,108,254,160,167,236,0,154,218,188,0,150,233,202,255,27,19,250,1,2,71,133,255,175,12,63,1,145,183,198,0,104,120,115,255,130,251,247,0,17,212,167,255,62,123,132,255,247,100,189,0,155,223,152,0,143,197,33,0,155,59,44,255,150,93,240,1,127,3,87,255,95,71,207,1,167,85,1,255,188,152,116,255,10,23,23,0,137,195,93,1,54,98,97,0,240,0,168,255,148,188,127,0,134,107,151,0,76,253,171,0,90,132,192,0,146,22,54,0,224,66,54,254,230,186,229,255,39,182,196,0,148,251,130,255,65,131,108,254,128,1,160,0,169,49,167,254,199,254,148,255,251,6,131,0,187,254,129,255,85,82,62,0,178,23,58,255,254,132,5,0,164,213,39,0,134,252,146,254,37,53,81,255,155,134,82,0,205,167,238,255,94,45,180,255,132,40,161,0,254,111,112,1,54,75,217,0,179,230,221,1,235,94,191,255,23,243,48,1,202,145,203,255,39,118,42,255,117,141,253,0,254,0,222,0,43,251,50,0,54,169,234,1,80,68,208,0,148,203,243,254,145,7,135,0,6,254,0,0,252,185,127,0,98,8,129,255,38,35,72,255,211,36,220,1,40,26,89,0,168,64,197,254,3,222,239,255,2,83,215,254,180,159,105,0,58,115,194,0,186,116,106,255,229,247,219,255,129,118,193,0,202,174,183,1,166,161,72,0,201,107,147,254,237,136,74,0,233,230,106,1,105,111,168,0,64,224,30,1,1,229,3,0,102,151,175,255,194,238,228,255,254,250,212,0,187,237,121,0,67,251,96,1,197,30,11,0,183,95,204,0,205,89,138,0,64,221,37,1,255,223,30,255,178,48,211,255,241,200,90,255,167,209,96,255,57,130,221,0,46,114,200,255,61,184,66,0,55,182,24,254,110,182,33,0,171,190,232,255,114,94,31,0,18,221,8,0,47,231,254,0,255,112,83,0,118,15,215,255,173,25,40,254,192,193,31,255,238,21,146,255,171,193,118,255,101,234,53,254,131,212,112,0,89,192,107,1,8,208,27,0,181,217,15,255,231,149,232,0,140,236,126,0,144,9,199,255,12,79,181,254,147,182,202,255,19,109,182,255,49,212,225,0,74,163,203,0,175,233,148,0,26,112,51,0,193,193,9,255,15,135,249,0,150,227,130,0,204,0,219,1,24,242,205,0,238,208,117,255,22,244,112,0,26,229,34,0,37,80,188,255,38,45,206,254,240,90,225,255,29,3,47,255,42,224,76,0,186,243,167,0,32,132,15,255,5,51,125,0,139,135,24,0,6,241,219,0,172,229,133,255,246,214,50,0,231,11,207,255,191,126,83,1,180,163,170,255,245,56,24,1,178,164,211,255,3,16,202,1,98,57,118,255,141,131,89,254,33,51,24,0,243,149,91,255,253,52,14,0,35,169,67,254,49,30,88,255,179,27,36,255,165,140,183,0,58,189,151,0,88,31,0,0,75,169,66,0,66,101,199,255,24,216,199,1,121,196,26,255,14,79,203,254,240,226,81,255,94,28,10,255,83,193,240,255,204,193,131,255,94,15,86,0,218,40,157,0,51,193,209,0,0,242,177,0,102,185,247,0,158,109,116,0,38,135,91,0,223,175,149,0,220,66,1,255,86,60,232,0,25,96,37,255,225,122,162,1,215,187,168,255,158,157,46,0,56,171,162,0,232,240,101,1,122,22,9,0,51,9,21,255,53,25,238,255,217,30,232,254,125,169,148,0,13,232,102,0,148,9,37,0,165,97,141,1,228,131,41,0,222,15,243,255,254,18,17,0,6,60,237,1,106,3,113,0,59,132,189,0,92,112,30,0,105,208,213,0,48,84,179,255,187,121,231,254,27,216,109,255,162,221,107,254,73,239,195,255,250,31,57,255,149,135,89,255,185,23,115,1,3,163,157,255,18,112,250,0,25,57,187,255,161,96,164,0,47,16,243,0,12,141,251,254,67,234,184,255,41,18,161,0,175,6,96,255,160,172,52,254,24,176,183,255,198,193,85,1,124,121,137,255,151,50,114,255,220,203,60,255,207,239,5,1,0,38,107,255,55,238,94,254,70,152,94,0,213,220,77,1,120,17,69,255,85,164,190,255,203,234,81,0,38,49,37,254,61,144,124,0,137,78,49,254,168,247,48,0,95,164,252,0,105,169,135,0,253,228,134,0,64,166,75,0,81,73,20,255,207,210,10,0,234,106,150,255,94,34,90,255,254,159,57,254,220,133,99,0,139,147,180,254,24,23,185,0,41,57,30,255,189,97,76,0,65,187,223,255,224,172,37,255,34,62,95,1,231,144,240,0,77,106,126,254,64,152,91,0,29,98,155,0,226,251,53,255,234,211,5,255,144,203,222,255,164,176,221,254,5,231,24,0,179,122,205,0,36,1,134,255,125,70,151,254,97,228,252,0,172,129,23,254,48,90,209,255,150,224,82,1,84,134,30,0,241,196,46,0,103,113,234,255,46,101,121,254,40,124,250,255,135,45,242,254,9,249,168,255,140,108,131,255,143,163,171,0,50,173,199,255,88,222,142,255,200,95,158,0,142,192,163,255,7,117,135,0,111,124,22,0,236,12,65,254,68,38,65,255,227,174,254,0,244,245,38,0,240,50,208,255,161,63,250,0,60,209,239,0,122,35,19,0,14,33,230,254,2,159,113,0,106,20,127,255,228,205,96,0,137,210,174,254,180,212,144,255,89,98,154,1,34,88,139,0,167,162,112,1,65,110,197,0,241,37,169,0,66,56,131,255,10,201,83,254,133,253,187,255,177,112,45,254,196,251,0,0,196,250,151,255,238,232,214,255,150,209,205,0,28,240,118,0,71,76,83,1,236,99,91,0,42,250,131,1,96,18,64,255,118,222,35,0,113,214,203,255,122,119,184,255,66,19,36,0,204,64,249,0,146,89,139,0,134,62,135,1,104,233,101,0,188,84,26,0,49,249,129,0,208,214,75,255,207,130,77,255,115,175,235,0,171,2,137,255,175,145,186,1,55,245,135,255,154,86,181,1,100,58,246,255,109,199,60,255,82,204,134,255,215,49,230,1,140,229,192,255,222,193,251,255,81,136,15,255,179,149,162,255,23,39,29,255,7,95,75,254,191,81,222,0,241,81,90,255,107,49,201,255,244,211,157,0,222,140,149,255,65,219,56,254,189,246,90,255,178,59,157,1,48,219,52,0,98,34,215,0,28,17,187,255,175,169,24,0,92,79,161,255,236,200,194,1,147,143,234,0,229,225,7,1,197,168,14,0,235,51,53,1,253,120,174,0,197,6,168,255,202,117,171,0,163,21,206,0,114,85,90,255,15,41,10,255,194,19,99,0,65,55,216,254,162,146,116,0,50,206,212,255,64,146,29,255,158,158,131,1,100,165,130,255,172,23,129,255,125,53,9,255,15,193,18,1,26,49,11,255,181,174,201,1,135,201,14,255,100,19,149,0,219,98,79,0,42,99,143,254,96,0,48,255,197,249,83,254,104,149,79,255,235,110,136,254,82,128,44,255,65,41,36,254,88,211,10,0,187,121,187,0,98,134,199,0,171,188,179,254,210,11,238,255,66,123,130,254,52,234,61,0,48,113,23,254,6,86,120,255,119,178,245,0,87,129,201,0,242,141,209,0,202,114,85,0,148,22,161,0,103,195,48,0,25,49,171,255,138,67,130,0,182,73,122,254,148,24,130,0,211,229,154,0,32,155,158,0,84,105,61,0,177,194,9,255,166,89,86,1,54,83,187,0,249,40,117,255,109,3,215,255,53,146,44,1,63,47,179,0,194,216,3,254,14,84,136,0,136,177,13,255,72,243,186,255,117,17,125,255,211,58,211,255,93,79,223,0,90,88,245,255,139,209,111,255,70,222,47,0,10,246,79,255,198,217,178,0,227,225,11,1,78,126,179,255,62,43,126,0,103,148,35,0,129,8,165,254,245,240,148,0,61,51,142,0,81,208,134,0,15,137,115,255,211,119,236,255,159,245,248,255,2,134,136,255,230,139,58,1,160,164,254,0,114,85,141,255,49,166,182,255,144,70,84,1,85,182,7,0,46,53,93,0,9,166,161,255,55,162,178,255,45,184,188,0,146,28,44,254,169,90,49,0,120,178,241,1,14,123,127,255,7,241,199,1,189,66,50,255,198,143,101,254,189,243,135,255,141,24,24,254,75,97,87,0,118,251,154,1,237,54,156,0,171,146,207,255,131,196,246,255,136,64,113,1,151,232,57,0,240,218,115,0,49,61,27,255,64,129,73,1,252,169,27,255,40,132,10,1,90,201,193,255,252,121,240,1,186,206,41,0,43,198,97,0,145,100,183,0,204,216,80,254,172,150,65,0,249,229,196,254,104,123,73,255,77,104,96,254,130,180,8,0,104,123,57,0,220,202,229,255,102,249,211,0,86,14,232,255,182,78,209,0,239,225,164,0,106,13,32,255,120,73,17,255,134,67,233,0,83,254,181,0,183,236,112,1,48,64,131,255,241,216,243,255,65,193,226,0,206,241,100,254,100,134,166,255,237,202,197,0,55,13,81,0,32,124,102,255,40,228,177,0,118,181,31,1,231,160,134,255,119,187,202,0,0,142,60,255,128,38,189,255,166,201,150,0,207,120,26,1,54,184,172,0,12,242,204,254,133,66,230,0,34,38,31,1,184,112,80,0,32,51,165,254,191,243,55,0,58,73,146,254,155,167,205,255,100,104,152,255,197,254,207,255,173,19,247,0,238,10,202,0,239,151,242,0,94,59,39,255,240,29,102,255,10,92,154,255,229,84,219,255,161,129,80,0,208,90,204,1,240,219,174,255,158,102,145,1,53,178,76,255,52,108,168,1,83,222,107,0,211,36,109,0,118,58,56,0,8,29,22,0,237,160,199,0,170,209,157,0,137,71,47,0,143,86,32,0,198,242,2,0,212,48,136,1,92,172,186,0,230,151,105,1,96,191,229,0,138,80,191,254,240,216,130,255,98,43,6,254,168,196,49,0,253,18,91,1,144,73,121,0,61,146,39,1,63,104,24,255,184,165,112,254,126,235,98,0,80,213,98,255,123,60,87,255,82,140,245,1,223,120,173,255,15,198,134,1,206,60,239,0,231,234,92,255,33,238,19,255,165,113,142,1,176,119,38,0,160,43,166,254,239,91,105,0,107,61,194,1,25,4,68,0,15,139,51,0,164,132,106,255,34,116,46,254,168,95,197,0,137,212,23,0,72,156,58,0,137,112,69,254,150,105,154,255,236,201,157,0,23,212,154,255,136,82,227,254,226,59,221,255,95,149,192,0,81,118,52,255,33,43,215,1,14,147,75,255,89,156,121,254,14,18,79,0,147,208,139,1,151,218,62,255,156,88,8,1,210,184,98,255,20,175,123,255,102,83,229,0,220,65,116,1,150,250,4,255,92,142,220,255,34,247,66,255,204,225,179,254,151,81,151,0,71,40,236,255,138,63,62,0,6,79,240,255,183,185,181,0,118,50,27,0,63,227,192,0,123,99,58,1,50,224,155,255,17,225,223,254,220,224,77,255,14,44,123,1,141,128,175,0,248,212,200,0,150,59,183,255,147,97,29,0,150,204,181,0,253,37,71,0,145,85,119,0,154,200,186,0,2,128,249,255,83,24,124,0,14,87,143,0,168,51,245,1,124,151,231,255,208,240,197,1,124,190,185,0,48,58,246,0,20,233,232,0,125,18,98,255,13,254,31,255,245,177,130,255,108,142,35,0,171,125,242,254,140,12,34,255,165,161,162,0,206,205,101,0,247,25,34,1,100,145,57,0,39,70,57,0,118,204,203,255,242,0,162,0,165,244,30,0,198,116,226,0,128,111,153,255,140,54,182,1,60,122,15,255,155,58,57,1,54,50,198,0,171,211,29,255,107,138,167,255,173,107,199,255,109,161,193,0,89,72,242,255,206,115,89,255,250,254,142,254,177,202,94,255,81,89,50,0,7,105,66,255,25,254,255,254,203,64,23,255,79,222,108,255,39,249,75,0,241,124,50,0,239,152,133,0,221,241,105,0,147,151,98,0,213,161,121,254,242,49,137,0,233,37,249,254,42,183,27,0,184,119,230,255,217,32,163,255,208,251,228,1,137,62,131,255,79,64,9,254,94,48,113,0,17,138,50,254,193,255,22,0,247,18,197,1,67,55,104,0,16,205,95,255,48,37,66,0,55,156,63,1,64,82,74,255,200,53,71,254,239,67,125,0,26,224,222,0,223,137,93,255,30,224,202,255,9,220,132,0,198,38,235,1,102,141,86,0,60,43,81,1,136,28,26,0,233,36,8,254,207,242,148,0,164,162,63,0,51,46,224,255,114,48,79,255,9,175,226,0,222,3,193,255,47,160,232,255,255,93,105,254,14,42,230,0,26,138,82,1,208,43,244,0,27,39,38,255,98,208,127,255,64,149,182,255,5,250,209,0,187,60,28,254,49,25,218,255,169,116,205,255,119,18,120,0,156,116,147,255,132,53,109,255,13,10,202,0,110,83,167,0,157,219,137,255,6,3,130,255,50,167,30,255,60,159,47,255,129,128,157,254,94,3,189,0,3,166,68,0,83,223,215,0,150,90,194,1,15,168,65,0,227,83,51,255,205,171,66,255,54,187,60,1,152,102,45,255,119,154,225,0,240,247,136,0,100,197,178,255,139,71,223,255,204,82,16,1,41,206,42,255,156,192,221,255,216,123,244,255,218,218,185,255,187,186,239,255,252,172,160,255,195,52,22,0,144,174,181,254,187,100,115,255,211,78,176,255,27,7,193,0,147,213,104,255,90,201,10,255,80,123,66,1,22,33,186,0,1,7,99,254,30,206,10,0,229,234,5,0,53,30,210,0,138,8,220,254,71,55,167,0,72,225,86,1,118,190,188,0,254,193,101,1,171,249,172,255,94,158,183,254,93,2,108,255,176,93,76,255,73,99,79,255,74,64,129,254,246,46,65,0,99,241,127,254,246,151,102,255,44,53,208,254,59,102,234,0,154,175,164,255,88,242,32,0,111,38,1,0,255,182,190,255,115,176,15,254,169,60,129,0,122,237,241,0,90,76,63,0,62,74,120,255,122,195,110,0,119,4,178,0,222,242,210,0,130,33,46,254,156,40,41,0,167,146,112,1,49,163,111,255,121,176,235,0,76,207,14,255,3,25,198,1,41,235,213,0,85,36,214,1,49,92,109,255,200,24,30,254,168,236,195,0,145,39,124,1,236,195,149,0,90,36,184,255,67,85,170,255,38,35,26,254,131,124,68,255,239,155,35,255,54,201,164,0,196,22,117,255,49,15,205,0,24,224,29,1,126,113,144,0,117,21,182,0,203,159,141,0,223,135,77,0,176,230,176,255,190,229,215,255,99,37,181,255,51,21,138,255,25,189,89,255,49,48,165,254,152,45,247,0,170,108,222,0,80,202,5,0,27,69,103,254,204,22,129,255,180,252,62,254,210,1,91,255,146,110,254,255,219,162,28,0,223,252,213,1,59,8,33,0,206,16,244,0,129,211,48,0,107,160,208,0,112,59,209,0,109,77,216,254,34,21,185,255,246,99,56,255,179,139,19,255,185,29,50,255,84,89,19,0,74,250,98,255,225,42,200,255,192,217,205,255,210,16,167,0,99,132,95,1,43,230,57,0,254,11,203,255,99,188,63,255,119,193,251,254,80,105,54,0,232,181,189,1,183,69,112,255,208,171,165,255,47,109,180,255,123,83,165,0,146,162,52,255,154,11,4,255,151,227,90,255,146,137,97,254,61,233,41,255,94,42,55,255,108,164,236,0,152,68,254,0,10,140,131,255,10,106,79,254,243,158,137,0,67,178,66,254,177,123,198,255,15,62,34,0,197,88,42,255,149,95,177,255,152,0,198,255,149,254,113,255,225,90,163,255,125,217,247,0,18,17,224,0,128,66,120,254,192,25,9,255,50,221,205,0,49,212,70,0,233,255,164,0,2,209,9,0,221,52,219,254,172,224,244,255,94,56,206,1,242,179,2,255,31,91,164,1,230,46,138,255,189,230,220,0,57,47,61,255,111,11,157,0,177,91,152,0,28,230,98,0,97,87,126,0,198,89,145,255,167,79,107,0,249,77,160,1,29,233,230,255,150,21,86,254,60,11,193,0,151,37,36,254,185,150,243,255,228,212,83,1,172,151,180,0,201,169,155,0,244,60,234,0,142,235,4,1,67,218,60,0,192,113,75,1,116,243,207,255,65,172,155,0,81,30,156,255,80,72,33,254,18,231,109,255,142,107,21,254,125,26,132,255,176,16,59,255,150,201,58,0,206,169,201,0,208,121,226,0,40,172,14,255,150,61,94,255,56,57,156,255,141,60,145,255,45,108,149,255,238,145,155,255,209,85,31,254,192,12,210,0,99,98,93,254,152,16,151,0,225,185,220,0,141,235,44,255,160,172,21,254,71,26,31,255,13,64,93,254,28,56,198,0,177,62,248,1,182,8,241,0,166,101,148,255,78,81,133,255,129,222,215,1,188,169,129,255,232,7,97,0,49,112,60,255,217,229,251,0,119,108,138,0,39,19,123,254,131,49,235,0,132,84,145,0,130,230,148,255,25,74,187,0,5,245,54,255,185,219,241,1,18,194,228,255,241,202,102,0,105,113,202,0,155,235,79,0,21,9,178,255,156,1,239,0,200,148,61,0,115,247,210,255,49,221,135,0,58,189,8,1,35,46,9,0,81,65,5,255,52,158,185,255,125,116,46,255,74,140,13,255,210,92,172,254,147,23,71,0,217,224,253,254,115,108,180,255,145,58,48,254,219,177,24,255,156,255,60,1,154,147,242,0,253,134,87,0,53,75,229,0,48,195,222,255,31,175,50,255,156,210,120,255,208,35,222,255,18,248,179,1,2,10,101,255,157,194,248,255,158,204,101,255,104,254,197,255,79,62,4,0,178,172,101,1,96,146,251,255,65,10,156,0,2,137,165,255,116,4,231,0,242,215,1,0,19,35,29,255,43,161,79,0,59,149,246,1,251,66,176,0,200,33,3,255,80,110,142,255,195,161,17,1,228,56,66,255,123,47,145,254,132,4,164,0,67,174,172,0,25,253,114,0,87,97,87,1,250,220,84,0,96,91,200,255,37,125,59,0,19,65,118,0,161,52,241,255,237,172,6,255,176,191,255,255,1,65,130,254,223,190,230,0,101,253,231,255,146,35,109,0,250,29,77,1,49,0,19,0,123,90,155,1,22,86,32,255,218,213,65,0,111,93,127,0,60,93,169,255,8,127,182,0,17,186,14,254,253,137,246,255,213,25,48,254,76,238,0,255,248,92,70,255,99,224,139,0,184,9,255,1,7,164,208,0,205,131,198,1,87,214,199,0,130,214,95,0,221,149,222,0,23,38,171,254,197,110,213,0,43,115,140,254,215,177,118,0,96,52,66,1,117,158,237,0,14,64,182,255,46,63,174,255,158,95,190,255,225,205,177,255,43,5,142,255,172,99,212,255,244,187,147,0,29,51,153,255,228,116,24,254,30,101,207,0,19,246,150,255,134,231,5,0,125,134,226,1,77,65,98,0,236,130,33,255,5,110,62,0,69,108,127,255,7,113,22,0,145,20,83,254,194,161,231,255,131,181,60,0,217,209,177,255,229,148,212,254,3,131,184,0,117,177,187,1,28,14,31,255,176,102,80,0,50,84,151,255,125,31,54,255,21,157,133,255,19,179,139,1,224,232,26,0,34,117,170,255,167,252,171,255,73,141,206,254,129,250,35,0,72,79,236,1,220,229,20,255,41,202,173,255,99,76,238,255,198,22,224,255,108,198,195,255,36,141,96,1,236,158,59,255,106,100,87,0,110,226,2,0,227,234,222,0,154,93,119,255,74,112,164,255,67,91,2,255,21,145,33,255,102,214,137,255,175,230,103,254,163,246,166,0,93,247,116,254,167,224,28,255,220,2,57,1,171,206,84,0,123,228,17,255,27,120,119,0,119,11,147,1,180,47,225,255,104,200,185,254,165,2,114,0,77,78,212,0,45,154,177,255,24,196,121,254,82,157,182,0,90,16,190,1,12,147,197,0,95,239,152,255,11,235,71,0,86,146,119,255,172,134,214,0,60,131,196,0,161,225,129,0,31,130,120,254,95,200,51,0,105,231,210,255,58,9,148,255,43,168,221,255,124,237,142,0,198,211,50,254,46,245,103,0,164,248,84,0,152,70,208,255,180,117,177,0,70,79,185,0,243,74,32,0,149,156,207,0,197,196,161,1,245,53,239,0,15,93,246,254,139,240,49,255,196,88,36,255,162,38,123,0,128,200,157,1,174,76,103,255,173,169,34,254,216,1,171,255,114,51,17,0,136,228,194,0,110,150,56,254,106,246,159,0,19,184,79,255,150,77,240,255,155,80,162,0,0,53,169,255,29,151,86,0,68,94,16,0,92,7,110,254,98,117,149,255,249,77,230,255,253,10,140,0,214,124,92,254,35,118,235,0,89,48,57,1,22,53,166,0,184,144,61,255,179,255,194,0,214,248,61,254,59,110,246,0,121,21,81,254,166,3,228,0,106,64,26,255,69,232,134,255,242,220,53,254,46,220,85,0,113,149,247,255,97,179,103,255,190,127,11,0,135,209,182,0,95,52,129,1,170,144,206,255,122,200,204,255,168,100,146,0,60,144,149,254,70,60,40,0,122,52,177,255,246,211,101,255,174,237,8,0,7,51,120,0,19,31,173,0,126,239,156,255,143,189,203,0,196,128,88,255,233,133,226,255,30,125,173,255,201,108,50,0,123,100,59,255,254,163,3,1,221,148,181,255,214,136,57,254,222,180,137,255,207,88,54,255,28,33,251,255,67,214,52,1,210,208,100,0,81,170,94,0,145,40,53,0,224,111,231,254,35,28,244,255,226,199,195,254,238,17,230,0,217,217,164,254,169,157,221,0,218,46,162,1,199,207,163,255,108,115,162,1,14,96,187,255,118,60,76,0,184,159,152,0,209,231,71,254,42,164,186,255,186,153,51,254,221,171,182,255,162,142,173,0,235,47,193,0,7,139,16,1,95,164,64,255,16,221,166,0,219,197,16,0,132,29,44,255,100,69,117,255,60,235,88,254,40,81,173,0,71,190,61,255,187,88,157,0,231,11,23,0,237,117,164,0,225,168,223,255,154,114,116,255,163,152,242,1,24,32,170,0,125,98,113,254,168,19,76,0,17,157,220,254,155,52,5,0,19,111,161,255,71,90,252,255,173,110,240,0,10,198,121,255,253,255,240,255,66,123,210,0,221,194,215,254,121,163,17,255,225,7,99,0,190,49,182,0,115,9,133,1,232,26,138,255,213,68,132,0,44,119,122,255,179,98,51,0,149,90,106,0,71,50,230,255,10,153,118,255,177,70,25,0,165,87,205,0,55,138,234,0,238,30,97,0,113,155,207,0,98,153,127,0,34,107,219,254,117,114,172,255,76,180,255,254,242,57,179,255,221,34,172,254,56,162,49,255,83,3,255,255,113,221,189,255,188,25,228,254,16,88,89,255,71,28,198,254,22,17,149,255,243,121,254,255,107,202,99,255,9,206,14,1,220,47,153,0,107,137,39,1,97,49,194,255,149,51,197,254,186,58,11,255,107,43,232,1,200,6,14,255,181,133,65,254,221,228,171,255,123,62,231,1,227,234,179,255,34,189,212,254,244,187,249,0,190,13,80,1,130,89,1,0,223,133,173,0,9,222,198,255,66,127,74,0,167,216,93,255,155,168,198,1,66,145,0,0,68,102,46,1,172,90,154,0,216,128,75,255,160,40,51,0,158,17,27,1,124,240,49,0,236,202,176,255,151,124,192,255,38,193,190,0,95,182,61,0,163,147,124,255,255,165,51,255,28,40,17,254,215,96,78,0,86,145,218,254,31,36,202,255,86,9,5,0,111,41,200,255,237,108,97,0,57,62,44,0,117,184,15,1,45,241,116,0,152,1,220,255,157,165,188,0,250,15,131,1,60,44,125,255,65,220,251,255,75,50,184,0,53,90,128,255,231,80,194,255,136,129,127,1,21,18,187,255,45,58,161,255,71,147,34,0,174,249,11,254,35,141,29,0,239,68,177,255,115,110,58,0,238,190,177,1,87,245,166,255,190,49,247,255,146,83,184,255,173,14,39,255,146,215,104,0,142,223,120,0,149,200,155,255,212,207,145,1,16,181,217,0,173,32,87,255,255,35,181,0,119,223,161,1,200,223,94,255,70,6,186,255,192,67,85,255,50,169,152,0,144,26,123,255,56,243,179,254,20,68,136,0,39,140,188,254,253,208,5,255,200,115,135,1,43,172,229,255,156,104,187,0,151,251,167,0,52,135,23,0,151,153,72,0,147,197,107,254,148,158,5,255,238,143,206,0,126,153,137,255,88,152,197,254,7,68,167,0,252,159,165,255,239,78,54,255,24,63,55,255,38,222,94,0,237,183,12,255,206,204,210,0,19,39,246,254,30,74,231,0,135,108,29,1,179,115,0,0,117,118,116,1,132,6,252,255,145,129,161,1,105,67,141,0,82,37,226,255,238,226,228,255,204,214,129,254,162,123,100,255,185,121,234,0,45,108,231,0,66,8,56,255,132,136,128,0,172,224,66,254,175,157,188,0,230,223,226,254,242,219,69,0,184,14,119,1,82,162,56,0,114,123,20,0,162,103,85,255,49,239,99,254,156,135,215,0,111,255,167,254,39,196,214,0,144,38,79,1,249,168,125,0,155,97,156,255,23,52,219,255,150,22,144,0,44,149,165,255,40,127,183,0,196,77,233,255,118,129,210,255,170,135,230,255,214,119,198,0,233,240,35,0,253,52,7,255,117,102,48,255,21,204,154,255,179,136,177,255,23,2,3,1,149,130,89,255,252,17,159,1,70,60,26,0,144,107,17,0,180,190,60,255,56,182,59,255,110,71,54,255,198,18,129,255,149,224,87,255,223,21,152,255,138,22,182,255,250,156,205,0,236,45,208,255,79,148,242,1,101,70,209,0,103,78,174,0,101,144,172,255,152,136,237,1,191,194,136,0,113,80,125,1,152,4,141,0,155,150,53,255,196,116,245,0,239,114,73,254,19,82,17,255,124,125,234,255,40,52,191,0,42,210,158,255,155,132,165,0,178,5,42,1,64,92,40,255,36,85,77,255,178,228,118,0,137,66,96,254,115,226,66,0,110,240,69,254,151,111,80,0,167,174,236,255,227,108,107,255,188,242,65,255,183,81,255,0,57,206,181,255,47,34,181,255,213,240,158,1,71,75,95,0,156,40,24,255,102,210,81,0,171,199,228,255,154,34,41,0,227,175,75,0,21,239,195,0,138,229,95,1,76,192,49,0,117,123,87,1,227,225,130,0,125,62,63,255,2,198,171,0,254,36,13,254,145,186,206,0,148,255,244,255,35,0,166,0,30,150,219,1,92,228,212,0,92,198,60,254,62,133,200,255,201,41,59,0,125,238,109,255,180,163,238,1,140,122,82,0,9,22,88,255,197,157,47,255,153,94,57,0,88,30,182,0,84,161,85,0,178,146,124,0,166,166,7,255,21,208,223,0,156,182,242,0,155,121,185,0,83,156,174,254,154,16,118,255,186,83,232,1,223,58,121,255,29,23,88,0,35,125,127,255,170,5,149,254,164,12,130,255,155,196,29,0,161,96,136,0,7,35,29,1,162,37,251,0,3,46,242,255,0,217,188,0,57,174,226,1,206,233,2,0,57,187,136,254,123,189,9,255,201,117,127,255,186,36,204,0,231,25,216,0,80,78,105,0,19,134,129,255,148,203,68,0,141,81,125,254,248,165,200,255,214,144,135,0,151,55,166,255,38,235,91,0,21,46,154,0,223,254,150,255,35,153,180,255,125,176,29,1,43,98,30,255,216,122,230,255,233,160,12,0,57,185,12,254,240,113,7,255,5,9,16,254,26,91,108,0,109,198,203,0,8,147,40,0,129,134,228,255,124,186,40,255,114,98,132,254,166,132,23,0,99,69,44,0,9,242,238,255,184,53,59,0,132,129,102,255,52,32,243,254,147,223,200,255,123,83,179,254,135,144,201,255,141,37,56,1,151,60,227,255,90,73,156,1,203,172,187,0,80,151,47,255,94,137,231,255,36,191,59,255,225,209,181,255,74,215,213,254,6,118,179,255,153,54,193,1,50,0,231,0,104,157,72,1,140,227,154,255,182,226,16,254,96,225,92,255,115,20,170,254,6,250,78,0,248,75,173,255,53,89,6,255,0,180,118,0,72,173,1,0,64,8,206,1,174,133,223,0,185,62,133,255,214,11,98,0,197,31,208,0,171,167,244,255,22,231,181,1,150,218,185,0,247,169,97,1,165,139,247,255,47,120,149,1,103,248,51,0,60,69,28,254,25,179,196,0,124,7,218,254,58,107,81,0,184,233,156,255,252,74,36,0,118,188,67,0,141,95,53,255,222,94,165,254,46,61,53,0,206,59,115,255,47,236,250,255,74,5,32,1,129,154,238,255,106,32,226,0,121,187,61,255,3,166,241,254,67,170,172,255,29,216,178,255,23,201,252,0,253,110,243,0,200,125,57,0,109,192,96,255,52,115,238,0,38,121,243,255,201,56,33,0,194,118,130,0,75,96,25,255,170,30,230,254,39,63,253,0,36,45,250,255,251,1,239,0,160,212,92,1,45,209,237,0,243,33,87,254,237,84,201,255,212,18,157,254,212,99,127,255,217,98,16,254,139,172,239,0,168,201,130,255,143,193,169,255,238,151,193,1,215,104,41,0,239,61,165,254,2,3,242,0,22,203,177,254,177,204,22,0,149,129,213,254,31,11,41,255,0,159,121,254,160,25,114,255,162,80,200,0,157,151,11,0,154,134,78,1,216,54,252,0,48,103,133,0,105,220,197,0,253,168,77,254,53,179,23,0,24,121,240,1,255,46,96,255,107,60,135,254,98,205,249,255,63,249,119,255,120,59,211,255,114,180,55,254,91,85,237,0,149,212,77,1,56,73,49,0,86,198,150,0,93,209,160,0,69,205,182,255,244,90,43,0,20,36,176,0,122,116,221,0,51,167,39,1,231,1,63,255,13,197,134,0,3,209,34,255,135,59,202,0,167,100,78,0,47,223,76,0,185,60,62,0,178,166,123,1,132,12,161,255,61,174,43,0,195,69,144,0,127,47,191,1,34,44,78,0,57,234,52,1,255,22,40,255,246,94,146,0,83,228,128,0,60,78,224,255,0,96,210,255,153,175,236,0,159,21,73,0,180,115,196,254,131,225,106,0,255,167,134,0,159,8,112,255,120,68,194,255,176,196,198,255,118,48,168,255,93,169,1,0,112,200,102,1,74,24,254,0,19,141,4,254,142,62,63,0,131,179,187,255,77,156,155,255,119,86,164,0,170,208,146,255,208,133,154,255,148,155,58,255,162,120,232,254,252,213,155,0,241,13,42,0,94,50,131,0,179,170,112,0,140,83,151,255,55,119,84,1,140,35,239,255,153,45,67,1,236,175,39,0,54,151,103,255,158,42,65,255,196,239,135,254,86,53,203,0,149,97,47,254,216,35,17,255,70,3,70,1,103,36,90,255,40,26,173,0,184,48,13,0,163,219,217,255,81,6,1,255,221,170,108,254,233,208,93,0,100,201,249,254,86,36,35,255,209,154,30,1,227,201,251,255,2,189,167,254,100,57,3,0,13,128,41,0,197,100,75,0,150,204,235,255,145,174,59,0,120,248,149,255,85,55,225,0,114,210,53,254,199,204,119,0,14,247,74,1,63,251,129,0,67,104,151,1,135,130,80,0,79,89,55,255,117,230,157,255,25,96,143,0,213,145,5,0,69,241,120,1,149,243,95,255,114,42,20,0,131,72,2,0,154,53,20,255,73,62,109,0,196,102,152,0,41,12,204,255,122,38,11,1,250,10,145,0,207,125,148,0,246,244,222,255,41,32,85,1,112,213,126,0,162,249,86,1,71,198,127,255,81,9,21,1,98,39,4,255,204,71,45,1,75,111,137,0,234,59,231,0,32,48,95,255,204,31,114,1,29,196,181,255,51,241,167,254,93,109,142,0,104,144,45,0,235,12,181,255,52,112,164,0,76,254,202,255,174,14,162,0,61,235,147,255,43,64,185,254,233,125,217,0,243,88,167,254,74,49,8,0,156,204,66,0,124,214,123,0,38,221,118,1,146,112,236,0,114,98,177,0,151,89,199,0,87,197,112,0,185,149,161,0,44,96,165,0,248,179,20,255,188,219,216,254,40,62,13,0,243,142,141,0,229,227,206,255,172,202,35,255,117,176,225,255,82,110,38,1,42,245,14,255,20,83,97,0,49,171,10,0,242,119,120,0,25,232,61,0,212,240,147,255,4,115,56,255,145,17,239,254,202,17,251,255,249,18,245,255,99,117,239,0,184,4,179,255,246,237,51,255,37,239,137,255,166,112,166,255,81,188,33,255,185,250,142,255,54,187,173,0,208,112,201,0,246,43,228,1,104,184,88,255,212,52,196,255,51,117,108,255,254,117,155,0,46,91,15,255,87,14,144,255,87,227,204,0,83,26,83,1,159,76,227,0,159,27,213,1,24,151,108,0,117,144,179,254,137,209,82,0,38,159,10,0,115,133,201,0,223,182,156,1,110,196,93,255,57,60,233,0,5,167,105,255,154,197,164,0,96,34,186,255,147,133,37,1,220,99,190,0,1,167,84,255,20,145,171,0,194,197,251,254,95,78,133,255,252,248,243,255,225,93,131,255,187,134,196,255,216,153,170,0,20,118,158,254,140,1,118,0,86,158,15,1,45,211,41,255,147,1,100,254,113,116,76,255,211,127,108,1,103,15,48,0,193,16,102,1,69,51,95,255,107,128,157,0,137,171,233,0,90,124,144,1,106,161,182,0,175,76,236,1,200,141,172,255,163,58,104,0,233,180,52,255,240,253,14,255,162,113,254,255,38,239,138,254,52,46,166,0,241,101,33,254,131,186,156,0,111,208,62,255,124,94,160,255,31,172,254,0,112,174,56,255,188,99,27,255,67,138,251,0,125,58,128,1,156,152,174,255,178,12,247,255,252,84,158,0,82,197,14,254,172,200,83,255,37,39,46,1,106,207,167,0,24,189,34,0,131,178,144,0,206,213,4,0,161,226,210,0,72,51,105,255,97,45,187,255,78,184,223,255,176,29,251,0,79,160,86,255,116,37,178,0,82,77,213,1,82,84,141,255,226,101,212,1,175,88,199,255,245,94,247,1,172,118,109,255,166,185,190,0,131,181,120,0,87,254,93,255,134,240,73,255,32,245,143,255,139,162,103,255,179,98,18,254,217,204,112,0,147,223,120,255,53,10,243,0,166,140,150,0,125,80,200,255,14,109,219,255,91,218,1,255,252,252,47,254,109,156,116,255,115,49,127,1,204,87,211,255,148,202,217,255,26,85,249,255,14,245,134,1,76,89,169,255,242,45,230,0,59,98,172,255,114,73,132,254,78,155,49,255,158,126,84,0,49,175,43,255,16,182,84,255,157,103,35,0,104,193,109,255,67,221,154,0,201,172,1,254,8,162,88,0,165,1,29,255,125,155,229,255,30,154,220,1,103,239,92,0,220,1,109,255,202,198,1,0,94,2,142,1,36,54,44,0,235,226,158,255,170,251,214,255,185,77,9,0,97,74,242,0,219,163,149,255,240,35,118,255,223,114,88,254,192,199,3,0,106,37,24,255,201,161,118,255,97,89,99,1,224,58,103,255,101,199,147,254,222,60,99,0,234,25,59,1,52,135,27,0,102,3,91,254,168,216,235,0,229,232,136,0,104,60,129,0,46,168,238,0,39,191,67,0,75,163,47,0,143,97,98,255,56,216,168,1,168,233,252,255,35,111,22,255,92,84,43,0,26,200,87,1,91,253,152,0,202,56,70,0,142,8,77,0,80,10,175,1,252,199,76,0,22,110,82,255,129,1,194,0,11,128,61,1,87,14,145,255,253,222,190,1,15,72,174,0,85,163,86,254,58,99,44,255,45,24,188,254,26,205,15,0,19,229,210,254,248,67,195,0,99,71,184,0,154,199,37,255,151,243,121,255,38,51,75,255,201,85,130,254,44,65,250,0,57,147,243,254,146,43,59,255,89,28,53,0,33,84,24,255,179,51,18,254,189,70,83,0,11,156,179,1,98,134,119,0,158,111,111,0,119,154,73,255,200,63,140,254,45,13,13,255,154,192,2,254,81,72,42,0,46,160,185,254,44,112,6,0,146,215,149,1,26,176,104,0,68,28,87,1,236,50,153,255,179,128,250,254,206,193,191,255,166,92,137,254,53,40,239,0,210,1,204,254,168,173,35,0,141,243,45,1,36,50,109,255,15,242,194,255,227,159,122,255,176,175,202,254,70,57,72,0,40,223,56,0,208,162,58,255,183,98,93,0,15,111,12,0,30,8,76,255,132,127,246,255,45,242,103,0,69,181,15,255,10,209,30,0,3,179,121,0,241,232,218,1,123,199,88,255,2,210,202,1,188,130,81,255,94,101,208,1,103,36,45,0,76,193,24,1,95,26,241,255,165,162,187,0,36,114,140,0,202,66,5,255,37,56,147,0,152,11,243,1,127,85,232,255,250,135,212,1,185,177,113,0,90,220,75,255,69,248,146,0,50,111,50,0,92,22,80,0,244,36,115,254,163,100,82,255,25,193,6,1,127,61,36,0,253,67,30,254,65,236,170,255,161,17,215,254,63,175,140,0,55,127,4,0,79,112,233,0,109,160,40,0,143,83,7,255,65,26,238,255,217,169,140,255,78,94,189,255,0,147,190,255,147,71,186,254,106,77,127,255,233,157,233,1,135,87,237,255,208,13,236,1,155,109,36,255,180,100,218,0,180,163,18,0,190,110,9,1,17,63,123,255,179,136,180,255,165,123,123,255,144,188,81,254,71,240,108,255,25,112,11,255,227,218,51,255,167,50,234,255,114,79,108,255,31,19,115,255,183,240,99,0,227,87,143,255,72,217,248,255,102,169,95,1,129,149,149,0,238,133,12,1,227,204,35,0,208,115,26,1,102,8,234,0,112,88,143,1,144,249,14,0,240,158,172,254,100,112,119,0,194,141,153,254,40,56,83,255,121,176,46,0,42,53,76,255,158,191,154,0,91,209,92,0,173,13,16,1,5,72,226,255,204,254,149,0,80,184,207,0,100,9,122,254,118,101,171,255,252,203,0,254,160,207,54,0,56,72,249,1,56,140,13,255,10,64,107,254,91,101,52,255,225,181,248,1,139,255,132,0,230,145,17,0,233,56,23,0,119,1,241,255,213,169,151,255,99,99,9,254,185,15,191,255,173,103,109,1,174,13,251,255,178,88,7,254,27,59,68,255,10,33,2,255,248,97,59,0,26,30,146,1,176,147,10,0,95,121,207,1,188,88,24,0,185,94,254,254,115,55,201,0,24,50,70,0,120,53,6,0,142,66,146,0,228,226,249,255,104,192,222,1,173,68,219,0,162,184,36,255,143,102,137,255,157,11,23,0,125,45,98,0,235,93,225,254,56,112,160,255,70,116,243,1,153,249,55,255,129,39,17,1,241,80,244,0,87,69,21,1,94,228,73,255,78,66,65,255,194,227,231,0,61,146,87,255,173,155,23,255,112,116,219,254,216,38,11,255,131,186,133,0,94,212,187,0,100,47,91,0,204,254,175,255,222,18,215,254,173,68,108,255,227,228,79,255,38,221,213,0,163,227,150,254,31,190,18,0,160,179,11,1,10,90,94,255,220,174,88,0,163,211,229,255,199,136,52,0,130,95,221,255,140,188,231,254,139,113,128,255,117,171,236,254,49,220,20,255,59,20,171,255,228,109,188,0,20,225,32,254,195,16,174,0,227,254,136,1,135,39,105,0,150,77,206,255,210,238,226,0,55,212,132,254,239,57,124,0,170,194,93,255,249,16,247,255,24,151,62,255,10,151,10,0,79,139,178,255,120,242,202,0,26,219,213,0,62,125,35,255,144,2,108,255,230,33,83,255,81,45,216,1,224,62,17,0,214,217,125,0,98,153,153,255,179,176,106,254,131,93,138,255,109,62,36,255,178,121,32,255,120,252,70,0,220,248,37,0,204,88,103,1,128,220,251,255,236,227,7,1,106,49,198,255,60,56,107,0,99,114,238,0,220,204,94,1,73,187,1,0,89,154,34,0,78,217,165,255,14,195,249,255,9,230,253,255,205,135,245,0,26,252,7,255,84,205,27,1,134,2,112,0,37,158,32,0,231,91,237,255,191,170,204,255,152,7,222,0,109,192,49,0,193,166,146,255,232,19,181,255,105,142,52,255,103,16,27,1,253,200,165,0,195,217,4,255,52,189,144,255,123,155,160,254,87,130,54,255,78,120,61,255,14,56,41,0,25,41,125,255,87,168,245,0,214,165,70,0,212,169,6,255,219,211,194,254,72,93,164,255,197,33,103,255,43,142,141,0,131,225,172,0,244,105,28,0,68,68,225,0,136,84,13,255,130,57,40,254,139,77,56,0,84,150,53,0,54,95,157,0,144,13,177,254,95,115,186,0,117,23,118,255,244,166,241,255,11,186,135,0,178,106,203,255,97,218,93,0,43,253,45,0,164,152,4,0,139,118,239,0,96,1,24,254,235,153,211,255,168,110,20,255,50,239,176,0,114,41,232,0,193,250,53,0,254,160,111,254,136,122,41,255,97,108,67,0,215,152,23,255,140,209,212,0,42,189,163,0,202,42,50,255,106,106,189,255,190,68,217,255,233,58,117,0,229,220,243,1,197,3,4,0,37,120,54,254,4,156,134,255,36,61,171,254,165,136,100,255,212,232,14,0,90,174,10,0,216,198,65,255,12,3,64,0,116,113,115,255,248,103,8,0,231,125,18,255,160,28,197,0,30,184,35,1,223,73,249,255,123,20,46,254,135,56,37,255,173,13,229,1,119,161,34,255,245,61,73,0,205,125,112,0,137,104,134,0,217,246,30,255,237,142,143,0,65,159,102,255,108,164,190,0,219,117,173,255,34,37,120,254,200,69,80,0,31,124,218,254,74,27,160,255,186,154,199,255,71,199,252,0,104,81,159,1,17,200,39,0,211,61,192,1,26,238,91,0,148,217,12,0,59,91,213,255,11,81,183,255,129,230,122,255,114,203,145,1,119,180,66,255,72,138,180,0,224,149,106,0,119,82,104,255,208,140,43,0,98,9,182,255,205,101,134,255,18,101,38,0,95,197,166,255,203,241,147,0,62,208,145,255,133,246,251,0,2,169,14,0,13,247,184,0,142,7,254,0,36,200,23,255,88,205,223,0,91,129,52,255,21,186,30,0,143,228,210,1,247,234,248,255,230,69,31,254,176,186,135,255,238,205,52,1,139,79,43,0,17,176,217,254,32,243,67,0,242,111,233,0,44,35,9,255,227,114,81,1,4,71,12,255,38,105,191,0,7,117,50,255,81,79,16,0,63,68,65,255,157,36,110,255,77,241,3,255,226,45,251,1,142,25,206,0,120,123,209,1,28,254,238,255,5,128,126,255,91,222,215,255,162,15,191,0,86,240,73,0,135,185,81,254,44,241,163,0,212,219,210,255,112,162,155,0,207,101,118,0,168,72,56,255,196,5,52,0,72,172,242,255,126,22,157,255,146,96,59,255,162,121,152,254,140,16,95,0,195,254,200,254,82,150,162,0,119,43,145,254,204,172,78,255,166,224,159,0,104,19,237,255,245,126,208,255,226,59,213,0,117,217,197,0,152,72,237],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([220,31,23,254,14,90,231,255,188,212,64,1,60,101,246,255,85,24,86,0,1,177,109,0,146,83,32,1,75,182,192,0,119,241,224,0,185,237,27,255,184,101,82,1,235,37,77,255,253,134,19,0,232,246,122,0,60,106,179,0,195,11,12,0,109,66,235,1,125,113,59,0,61,40,164,0,175,104,240,0,2,47,187,255,50,12,141,0,194,139,181,255,135,250,104,0,97,92,222,255,217,149,201,255,203,241,118,255,79,151,67,0,122,142,218,255,149,245,239,0,138,42,200,254,80,37,97,255,124,112,167,255,36,138,87,255,130,29,147,255,241,87,78,255,204,97,19,1,177,209,22,255,247,227,127,254,99,119,83,255,212,25,198,1,16,179,179,0,145,77,172,254,89,153,14,255,218,189,167,0,107,233,59,255,35,33,243,254,44,112,112,255,161,127,79,1,204,175,10,0,40,21,138,254,104,116,228,0,199,95,137,255,133,190,168,255,146,165,234,1,183,99,39,0,183,220,54,254,255,222,133,0,162,219,121,254,63,239,6,0,225,102,54,255,251,18,246,0,4,34,129,1,135,36,131,0,206,50,59,1,15,97,183,0,171,216,135,255,101,152,43,255,150,251,91,0,38,145,95,0,34,204,38,254,178,140,83,255,25,129,243,255,76,144,37,0,106,36,26,254,118,144,172,255,68,186,229,255,107,161,213,255,46,163,68,255,149,170,253,0,187,17,15,0,218,160,165,255,171,35,246,1,96,13,19,0,165,203,117,0,214,107,192,255,244,123,177,1,100,3,104,0,178,242,97,255,251,76,130,255,211,77,42,1,250,79,70,255,63,244,80,1,105,101,246,0,61,136,58,1,238,91,213,0,14,59,98,255,167,84,77,0,17,132,46,254,57,175,197,255,185,62,184,0,76,64,207,0,172,175,208,254,175,74,37,0,138,27,211,254,148,125,194,0,10,89,81,0,168,203,101,255,43,213,209,1,235,245,54,0,30,35,226,255,9,126,70,0,226,125,94,254,156,117,20,255,57,248,112,1,230,48,64,255,164,92,166,1,224,214,230,255,36,120,143,0,55,8,43,255,251,1,245,1,106,98,165,0,74,107,106,254,53,4,54,255,90,178,150,1,3,120,123,255,244,5,89,1,114,250,61,255,254,153,82,1,77,15,17,0,57,238,90,1,95,223,230,0,236,52,47,254,103,148,164,255,121,207,36,1,18,16,185,255,75,20,74,0,187,11,101,0,46,48,129,255,22,239,210,255,77,236,129,255,111,77,204,255,61,72,97,255,199,217,251,255,42,215,204,0,133,145,201,255,57,230,146,1,235,100,198,0,146,73,35,254,108,198,20,255,182,79,210,255,82,103,136,0,246,108,176,0,34,17,60,255,19,74,114,254,168,170,78,255,157,239,20,255,149,41,168,0,58,121,28,0,79,179,134,255,231,121,135,255,174,209,98,255,243,122,190,0,171,166,205,0,212,116,48,0,29,108,66,255,162,222,182,1,14,119,21,0,213,39,249,255,254,223,228,255,183,165,198,0,133,190,48,0,124,208,109,255,119,175,85,255,9,209,121,1,48,171,189,255,195,71,134,1,136,219,51,255,182,91,141,254,49,159,72,0,35,118,245,255,112,186,227,255,59,137,31,0,137,44,163,0,114,103,60,254,8,213,150,0,162,10,113,255,194,104,72,0,220,131,116,255,178,79,92,0,203,250,213,254,93,193,189,255,130,255,34,254,212,188,151,0,136,17,20,255,20,101,83,255,212,206,166,0,229,238,73,255,151,74,3,255,168,87,215,0,155,188,133,255,166,129,73,0,240,79,133,255,178,211,81,255,203,72,163,254,193,168,165,0,14,164,199,254,30,255,204,0,65,72,91,1,166,74,102,255,200,42,0,255,194,113,227,255,66,23,208,0,229,216,100,255,24,239,26,0,10,233,62,255,123,10,178,1,26,36,174,255,119,219,199,1,45,163,190,0,16,168,42,0,166,57,198,255,28,26,26,0,126,165,231,0,251,108,100,255,61,229,121,255,58,118,138,0,76,207,17,0,13,34,112,254,89,16,168,0,37,208,105,255,35,201,215,255,40,106,101,254,6,239,114,0,40,103,226,254,246,127,110,255,63,167,58,0,132,240,142,0,5,158,88,255,129,73,158,255,94,89,146,0,230,54,146,0,8,45,173,0,79,169,1,0,115,186,247,0,84,64,131,0,67,224,253,255,207,189,64,0,154,28,81,1,45,184,54,255,87,212,224,255,0,96,73,255,129,33,235,1,52,66,80,255,251,174,155,255,4,179,37,0,234,164,93,254,93,175,253,0,198,69,87,255,224,106,46,0,99,29,210,0,62,188,114,255,44,234,8,0,169,175,247,255,23,109,137,255,229,182,39,0,192,165,94,254,245,101,217,0,191,88,96,0,196,94,99,255,106,238,11,254,53,126,243,0,94,1,101,255,46,147,2,0,201,124,124,255,141,12,218,0,13,166,157,1,48,251,237,255,155,250,124,255,106,148,146,255,182,13,202,0,28,61,167,0,217,152,8,254,220,130,45,255,200,230,255,1,55,65,87,255,93,191,97,254,114,251,14,0,32,105,92,1,26,207,141,0,24,207,13,254,21,50,48,255,186,148,116,255,211,43,225,0,37,34,162,254,164,210,42,255,68,23,96,255,182,214,8,255,245,117,137,255,66,195,50,0,75,12,83,254,80,140,164,0,9,165,36,1,228,110,227,0,241,17,90,1,25,52,212,0,6,223,12,255,139,243,57,0,12,113,75,1,246,183,191,255,213,191,69,255,230,15,142,0,1,195,196,255,138,171,47,255,64,63,106,1,16,169,214,255,207,174,56,1,88,73,133,255,182,133,140,0,177,14,25,255,147,184,53,255,10,227,161,255,120,216,244,255,73,77,233,0,157,238,139,1,59,65,233,0,70,251,216,1,41,184,153,255,32,203,112,0,146,147,253,0,87,101,109,1,44,82,133,255,244,150,53,255,94,152,232,255,59,93,39,255,88,147,220,255,78,81,13,1,32,47,252,255,160,19,114,255,93,107,39,255,118,16,211,1,185,119,209,255,227,219,127,254,88,105,236,255,162,110,23,255,36,166,110,255,91,236,221,255,66,234,116,0,111,19,244,254,10,233,26,0,32,183,6,254,2,191,242,0,218,156,53,254,41,60,70,255,168,236,111,0,121,185,126,255,238,142,207,255,55,126,52,0,220,129,208,254,80,204,164,255,67,23,144,254,218,40,108,255,127,202,164,0,203,33,3,255,2,158,0,0,37,96,188,255,192,49,74,0,109,4,0,0,111,167,10,254,91,218,135,255,203,66,173,255,150,194,226,0,201,253,6,255,174,102,121,0,205,191,110,0,53,194,4,0,81,40,45,254,35,102,143,255,12,108,198,255,16,27,232,255,252,71,186,1,176,110,114,0,142,3,117,1,113,77,142,0,19,156,197,1,92,47,252,0,53,232,22,1,54,18,235,0,46,35,189,255,236,212,129,0,2,96,208,254,200,238,199,255,59,175,164,255,146,43,231,0,194,217,52,255,3,223,12,0,138,54,178,254,85,235,207,0,232,207,34,0,49,52,50,255,166,113,89,255,10,45,216,255,62,173,28,0,111,165,246,0,118,115,91,255,128,84,60,0,167,144,203,0,87,13,243,0,22,30,228,1,177,113,146,255,129,170,230,254,252,153,129,255,145,225,43,0,70,231,5,255,122,105,126,254,86,246,148,255,110,37,154,254,209,3,91,0,68,145,62,0,228,16,165,255,55,221,249,254,178,210,91,0,83,146,226,254,69,146,186,0,93,210,104,254,16,25,173,0,231,186,38,0,189,122,140,255,251,13,112,255,105,110,93,0,251,72,170,0,192,23,223,255,24,3,202,1,225,93,228,0,153,147,199,254,109,170,22,0,248,101,246,255,178,124,12,255,178,254,102,254,55,4,65,0,125,214,180,0,183,96,147,0,45,117,23,254,132,191,249,0,143,176,203,254,136,183,54,255,146,234,177,0,146,101,86,255,44,123,143,1,33,209,152,0,192,90,41,254,83,15,125,255,213,172,82,0,215,169,144,0,16,13,34,0,32,209,100,255,84,18,249,1,197,17,236,255,217,186,230,0,49,160,176,255,111,118,97,255,237,104,235,0,79,59,92,254,69,249,11,255,35,172,74,1,19,118,68,0,222,124,165,255,180,66,35,255,86,174,246,0,43,74,111,255,126,144,86,255,228,234,91,0,242,213,24,254,69,44,235,255,220,180,35,0,8,248,7,255,102,47,92,255,240,205,102,255,113,230,171,1,31,185,201,255,194,246,70,255,122,17,187,0,134,70,199,255,149,3,150,255,117,63,103,0,65,104,123,255,212,54,19,1,6,141,88,0,83,134,243,255,136,53,103,0,169,27,180,0,177,49,24,0,111,54,167,0,195,61,215,255,31,1,108,1,60,42,70,0,185,3,162,255,194,149,40,255,246,127,38,254,190,119,38,255,61,119,8,1,96,161,219,255,42,203,221,1,177,242,164,255,245,159,10,0,116,196,0,0,5,93,205,254,128,127,179,0,125,237,246,255,149,162,217,255,87,37,20,254,140,238,192,0,9,9,193,0,97,1,226,0,29,38,10,0,0,136,63,255,229,72,210,254,38,134,92,255,78,218,208,1,104,36,84,255,12,5,193,255,242,175,61,255,191,169,46,1,179,147,147,255,113,190,139,254,125,172,31,0,3,75,252,254,215,36,15,0,193,27,24,1,255,69,149,255,110,129,118,0,203,93,249,0,138,137,64,254,38,70,6,0,153,116,222,0,161,74,123,0,193,99,79,255,118,59,94,255,61,12,43,1,146,177,157,0,46,147,191,0,16,255,38,0,11,51,31,1,60,58,98,255,111,194,77,1,154,91,244,0,140,40,144,1,173,10,251,0,203,209,50,254,108,130,78,0,228,180,90,0,174,7,250,0,31,174,60,0,41,171,30,0,116,99,82,255,118,193,139,255,187,173,198,254,218,111,56,0,185,123,216,0,249,158,52,0,52,180,93,255,201,9,91,255,56,45,166,254,132,155,203,255,58,232,110,0,52,211,89,255,253,0,162,1,9,87,183,0,145,136,44,1,94,122,245,0,85,188,171,1,147,92,198,0,0,8,104,0,30,95,174,0,221,230,52,1,247,247,235,255,137,174,53,255,35,21,204,255,71,227,214,1,232,82,194,0,11,48,227,255,170,73,184,255,198,251,252,254,44,112,34,0,131,101,131,255,72,168,187,0,132,135,125,255,138,104,97,255,238,184,168,255,243,104,84,255,135,216,226,255,139,144,237,0,188,137,150,1,80,56,140,255,86,169,167,255,194,78,25,255,220,17,180,255,17,13,193,0,117,137,212,255,141,224,151,0,49,244,175,0,193,99,175,255,19,99,154,1,255,65,62,255,156,210,55,255,242,244,3,255,250,14,149,0,158,88,217,255,157,207,134,254,251,232,28,0,46,156,251,255,171,56,184,255,239,51,234,0,142,138,131,255,25,254,243,1,10,201,194,0,63,97,75,0,210,239,162,0,192,200,31,1,117,214,243,0,24,71,222,254,54,40,232,255,76,183,111,254,144,14,87,255,214,79,136,255,216,196,212,0,132,27,140,254,131,5,253,0,124,108,19,255,28,215,75,0,76,222,55,254,233,182,63,0,68,171,191,254,52,111,222,255,10,105,77,255,80,170,235,0,143,24,88,255,45,231,121,0,148,129,224,1,61,246,84,0,253,46,219,255,239,76,33,0,49,148,18,254,230,37,69,0,67,134,22,254,142,155,94,0,31,157,211,254,213,42,30,255,4,228,247,254,252,176,13,255,39,0,31,254,241,244,255,255,170,45,10,254,253,222,249,0,222,114,132,0,255,47,6,255,180,163,179,1,84,94,151,255,89,209,82,254,229,52,169,255,213,236,0,1,214,56,228,255,135,119,151,255,112,201,193,0,83,160,53,254,6,151,66,0,18,162,17,0,233,97,91,0,131,5,78,1,181,120,53,255,117,95,63,255,237,117,185,0,191,126,136,255,144,119,233,0,183,57,97,1,47,201,187,255,167,165,119,1,45,100,126,0,21,98,6,254,145,150,95,255,120,54,152,0,209,98,104,0,143,111,30,254,184,148,249,0,235,216,46,0,248,202,148,255,57,95,22,0,242,225,163,0,233,247,232,255,71,171,19,255,103,244,49,255,84,103,93,255,68,121,244,1,82,224,13,0,41,79,43,255,249,206,167,255,215,52,21,254,192,32,22,255,247,111,60,0,101,74,38,255,22,91,84,254,29,28,13,255,198,231,215,254,244,154,200,0,223,137,237,0,211,132,14,0,95,64,206,255,17,62,247,255,233,131,121,1,93,23,77,0,205,204,52,254,81,189,136,0,180,219,138,1,143,18,94,0,204,43,140,254,188,175,219,0,111,98,143,255,151,63,162,255,211,50,71,254,19,146,53,0,146,45,83,254,178,82,238,255,16,133,84,255,226,198,93,255,201,97,20,255,120,118,35,255,114,50,231,255,162,229,156,255,211,26,12,0,114,39,115,255,206,212,134,0,197,217,160,255,116,129,94,254,199,215,219,255,75,223,249,1,253,116,181,255,232,215,104,255,228,130,246,255,185,117,86,0,14,5,8,0,239,29,61,1,237,87,133,255,125,146,137,254,204,168,223,0,46,168,245,0,154,105,22,0,220,212,161,255,107,69,24,255,137,218,181,255,241,84,198,255,130,122,211,255,141,8,153,255,190,177,118,0,96,89,178,0,255,16,48,254,122,96,105,255,117,54,232,255,34,126,105,255,204,67,166,0,232,52,138,255,211,147,12,0,25,54,7,0,44,15,215,254,51,236,45,0,190,68,129,1,106,147,225,0,28,93,45,254,236,141,15,255,17,61,161,0,220,115,192,0,236,145,24,254,111,168,169,0,224,58,63,255,127,164,188,0,82,234,75,1,224,158,134,0,209,68,110,1,217,166,217,0,70,225,166,1,187,193,143,255,16,7,88,255,10,205,140,0,117,192,156,1,17,56,38,0,27,124,108,1,171,215,55,255,95,253,212,0,155,135,168,255,246,178,153,254,154,68,74,0,232,61,96,254,105,132,59,0,33,76,199,1,189,176,130,255,9,104,25,254,75,198,102,255,233,1,112,0,108,220,20,255,114,230,70,0,140,194,133,255,57,158,164,254,146,6,80,255,169,196,97,1,85,183,130,0,70,158,222,1,59,237,234,255,96,25,26,255,232,175,97,255,11,121,248,254,88,35,194,0,219,180,252,254,74,8,227,0,195,227,73,1,184,110,161,255,49,233,164,1,128,53,47,0,82,14,121,255,193,190,58,0,48,174,117,255,132,23,32,0,40,10,134,1,22,51,25,255,240,11,176,255,110,57,146,0,117,143,239,1,157,101,118,255,54,84,76,0,205,184,18,255,47,4,72,255,78,112,85,255,193,50,66,1,93,16,52,255,8,105,134,0,12,109,72,255,58,156,251,0,144,35,204,0,44,160,117,254,50,107,194,0,1,68,165,255,111,110,162,0,158,83,40,254,76,214,234,0,58,216,205,255,171,96,147,255,40,227,114,1,176,227,241,0,70,249,183,1,136,84,139,255,60,122,247,254,143,9,117,255,177,174,137,254,73,247,143,0,236,185,126,255,62,25,247,255,45,64,56,255,161,244,6,0,34,57,56,1,105,202,83,0,128,147,208,0,6,103,10,255,74,138,65,255,97,80,100,255,214,174,33,255,50,134,74,255,110,151,130,254,111,84,172,0,84,199,75,254,248,59,112,255,8,216,178,1,9,183,95,0,238,27,8,254,170,205,220,0,195,229,135,0,98,76,237,255,226,91,26,1,82,219,39,255,225,190,199,1,217,200,121,255,81,179,8,255,140,65,206,0,178,207,87,254,250,252,46,255,104,89,110,1,253,189,158,255,144,214,158,255,160,245,54,255,53,183,92,1,21,200,194,255,146,33,113,1,209,1,255,0,235,106,43,255,167,52,232,0,157,229,221,0,51,30,25,0,250,221,27,1,65,147,87,255,79,123,196,0,65,196,223,255,76,44,17,1,85,241,68,0,202,183,249,255,65,212,212,255,9,33,154,1,71,59,80,0,175,194,59,255,141,72,9,0,100,160,244,0,230,208,56,0,59,25,75,254,80,194,194,0,18,3,200,254,160,159,115,0,132,143,247,1,111,93,57,255,58,237,11,1,134,222,135,255,122,163,108,1,123,43,190,255,251,189,206,254,80,182,72,255,208,246,224,1,17,60,9,0,161,207,38,0,141,109,91,0,216,15,211,255,136,78,110,0,98,163,104,255,21,80,121,255,173,178,183,1,127,143,4,0,104,60,82,254,214,16,13,255,96,238,33,1,158,148,230,255,127,129,62,255,51,255,210,255,62,141,236,254,157,55,224,255,114,39,244,0,192,188,250,255,228,76,53,0,98,84,81,255,173,203,61,254,147,50,55,255,204,235,191,0,52,197,244,0,88,43,211,254,27,191,119,0,188,231,154,0,66,81,161,0,92,193,160,1,250,227,120,0,123,55,226,0,184,17,72,0,133,168,10,254,22,135,156,255,41,25,103,255,48,202,58,0,186,149,81,255,188,134,239,0,235,181,189,254,217,139,188,255,74,48,82,0,46,218,229,0,189,253,251,0,50,229,12,255,211,141,191,1,128,244,25,255,169,231,122,254,86,47,189,255,132,183,23,255,37,178,150,255,51,137,253,0,200,78,31,0,22,105,50,0,130,60,0,0,132,163,91,254,23,231,187,0,192,79,239,0,157,102,164,255,192,82,20,1,24,181,103,255,240,9,234,0,1,123,164,255,133,233,0,255,202,242,242,0,60,186,245,0,241,16,199,255,224,116,158,254,191,125,91,255,224,86,207,0,121,37,231,255,227,9,198,255,15,153,239,255,121,232,217,254,75,112,82,0,95,12,57,254,51,214,105,255,148,220,97,1,199,98,36,0,156,209,12,254,10,212,52,0,217,180,55,254,212,170,232,255,216,20,84,255,157,250,135,0,157,99,127,254,1,206,41,0,149,36,70,1,54,196,201,255,87,116,0,254,235,171,150,0,27,163,234,0,202,135,180,0,208,95,0,254,123,156,93,0,183,62,75,0,137,235,182,0,204,225,255,255,214,139,210,255,2,115,8,255,29,12,111,0,52,156,1,0,253,21,251,255,37,165,31,254,12,130,211,0,106,18,53,254,42,99,154,0,14,217,61,254,216,11,92,255,200,197,112,254,147,38,199,0,36,252,120,254,107,169,77,0,1,123,159,255,207,75,102,0,163,175,196,0,44,1,240,0,120,186,176,254,13,98,76,255,237,124,241,255,232,146,188,255,200,96,224,0,204,31,41,0,208,200,13,0,21,225,96,255,175,156,196,0,247,208,126,0,62,184,244,254,2,171,81,0,85,115,158,0,54,64,45,255,19,138,114,0,135,71,205,0,227,47,147,1,218,231,66,0,253,209,28,0,244,15,173,255,6,15,118,254,16,150,208,255,185,22,50,255,86,112,207,255,75,113,215,1,63,146,43,255,4,225,19,254,227,23,62,255,14,255,214,254,45,8,205,255,87,197,151,254,210,82,215,255,245,248,247,255,128,248,70,0,225,247,87,0,90,120,70,0,213,245,92,0,13,133,226,0,47,181,5,1,92,163,105,255,6,30,133,254,232,178,61,255,230,149,24,255,18,49,158,0,228,100,61,254,116,243,251,255,77,75,92,1,81,219,147,255,76,163,254,254,141,213,246,0,232,37,152,254,97,44,100,0,201,37,50,1,212,244,57,0,174,171,183,255,249,74,112,0,166,156,30,0,222,221,97,255,243,93,73,254,251,101,100,255,216,217,93,255,254,138,187,255,142,190,52,255,59,203,177,255,200,94,52,0,115,114,158,255,165,152,104,1,126,99,226,255,118,157,244,1,107,200,16,0,193,90,229,0,121,6,88,0,156,32,93,254,125,241,211,255,14,237,157,255,165,154,21,255,184,224,22,255,250,24,152,255,113,77,31,0,247,171,23,255,237,177,204,255,52,137,145,255,194,182,114,0,224,234,149,0,10,111,103,1,201,129,4,0,238,142,78,0,52,6,40,255,110,213,165,254,60,207,253,0,62,215,69,0,96,97,0,255,49,45,202,0,120,121,22,255,235,139,48,1,198,45,34,255,182,50,27,1,131,210,91,255,46,54,128,0,175,123,105,255,198,141,78,254,67,244,239,255,245,54,103,254,78,38,242,255,2,92,249,254,251,174,87,255,139,63,144,0,24,108,27,255,34,102,18,1,34,22,152,0,66,229,118,254,50,143,99,0,144,169,149,1,118,30,152,0,178,8,121,1,8,159,18,0,90,101,230,255,129,29,119,0,68,36,11,1,232,183,55,0,23,255,96,255,161,41,193,255,63,139,222,0,15,179,243,0,255,100,15,255,82,53,135,0,137,57,149,1,99,240,170,255,22,230,228,254,49,180,82,255,61,82,43,0,110,245,217,0,199,125,61,0,46,253,52,0,141,197,219,0,211,159,193,0,55,121,105,254,183,20,129,0,169,119,170,255,203,178,139,255,135,40,182,255,172,13,202,255,65,178,148,0,8,207,43,0,122,53,127,1,74,161,48,0,227,214,128,254,86,11,243,255,100,86,7,1,245,68,134,255,61,43,21,1,152,84,94,255,190,60,250,254,239,118,232,255,214,136,37,1,113,76,107,255,93,104,100,1,144,206,23,255,110,150,154,1,228,103,185,0,218,49,50,254,135,77,139,255,185,1,78,0,0,161,148,255,97,29,233,255,207,148,149,255,160,168,0,0,91,128,171,255,6,28,19,254,11,111,247,0,39,187,150,255,138,232,149,0,117,62,68,255,63,216,188,255,235,234,32,254,29,57,160,255,25,12,241,1,169,60,191,0,32,131,141,255,237,159,123,255,94,197,94,254,116,254,3,255,92,179,97,254,121,97,92,255,170,112,14,0,21,149,248,0,248,227,3,0,80,96,109,0,75,192,74,1,12,90,226,255,161,106,68,1,208,114,127,255,114,42,255,254,74,26,74,255,247,179,150,254,121,140,60,0,147,70,200,255,214,40,161,255,161,188,201,255,141,65,135,255,242,115,252,0,62,47,202,0,180,149,255,254,130,55,237,0,165,17,186,255,10,169,194,0,156,109,218,255,112,140,123,255,104,128,223,254,177,142,108,255,121,37,219,255,128,77,18,255,111,108,23,1,91,192,75,0,174,245,22,255,4,236,62,255,43,64,153,1,227,173,254,0,237,122,132,1,127,89,186,255,142,82,128,254,252,84,174,0,90,179,177,1,243,214,87,255,103,60,162,255,208,130,14,255,11,130,139,0,206,129,219,255,94,217,157,255,239,230,230,255,116,115,159,254,164,107,95,0,51,218,2,1,216,125,198,255,140,202,128,254,11,95,68,255,55,9,93,254,174,153,6,255,204,172,96,0,69,160,110,0,213,38,49,254,27,80,213,0,118,125,114,0,70,70,67,255,15,142,73,255,131,122,185,255,243,20,50,254,130,237,40,0,210,159,140,1,197,151,65,255,84,153,66,0,195,126,90,0,16,238,236,1,118,187,102,255,3,24,133,255,187,69,230,0,56,197,92,1,213,69,94,255,80,138,229,1,206,7,230,0,222,111,230,1,91,233,119,255,9,89,7,1,2,98,1,0,148,74,133,255,51,246,180,255,228,177,112,1,58,189,108,255,194,203,237,254,21,209,195,0,147,10,35,1,86,157,226,0,31,163,139,254,56,7,75,255,62,90,116,0,181,60,169,0,138,162,212,254,81,167,31,0,205,90,112,255,33,112,227,0,83,151,117,1,177,224,73,255,174,144,217,255,230,204,79,255,22,77,232,255,114,78,234,0,224,57,126,254,9,49,141,0,242,147,165,1,104,182,140,255,167,132,12,1,123,68,127,0,225,87,39,1,251,108,8,0,198,193,143,1,121,135,207,255,172,22,70,0,50,68,116,255,101,175,40,255,248,105,233,0,166,203,7,0,110,197,218,0,215,254,26,254,168,226,253,0,31,143,96,0,11,103,41,0,183,129,203,254,100,247,74,255,213,126,132,0,210,147,44,0,199,234,27,1,148,47,181,0,155,91,158,1,54,105,175,255,2,78,145,254,102,154,95,0,128,207,127,254,52,124,236,255,130,84,71,0,221,243,211,0,152,170,207,0,222,106,199,0,183,84,94,254,92,200,56,255,138,182,115,1,142,96,146,0,133,136,228,0,97,18,150,0,55,251,66,0,140,102,4,0,202,103,151,0,30,19,248,255,51,184,207,0,202,198,89,0,55,197,225,254,169,95,249,255,66,65,68,255,188,234,126,0,166,223,100,1,112,239,244,0,144,23,194,0,58,39,182,0,244,44,24,254,175,68,179,255,152,118,154,1,176,162,130,0,217,114,204,254,173,126,78,255,33,222,30,255,36,2,91,255,2,143,243,0,9,235,215,0,3,171,151,1,24,215,245,255,168,47,164,254,241,146,207,0,69,129,180,0,68,243,113,0,144,53,72,254,251,45,14,0,23,110,168,0,68,68,79,255,110,70,95,254,174,91,144,255,33,206,95,255,137,41,7,255,19,187,153,254,35,255,112,255,9,145,185,254,50,157,37,0,11,112,49,1,102,8,190,255,234,243,169,1,60,85,23,0,74,39,189,0,116,49,239,0,173,213,210,0,46,161,108,255,159,150,37,0,196,120,185,255,34,98,6,255,153,195,62,255,97,230,71,255,102,61,76,0,26,212,236,255,164,97,16,0,198,59,146,0,163,23,196,0,56,24,61,0,181,98,193,0,251,147,229,255,98,189,24,255,46,54,206,255,234,82,246,0,183,103,38,1,109,62,204,0,10,240,224,0,146,22,117,255,142,154,120,0,69,212,35,0,208,99,118,1,121,255,3,255,72,6,194,0,117,17,197,255,125,15,23,0,154,79,153,0,214,94,197,255,185,55,147,255,62,254,78,254,127,82,153,0,110,102,63,255,108,82,161,255,105,187,212,1,80,138,39,0,60,255,93,255,72,12,186,0,210,251,31,1,190,167,144,255,228,44,19,254,128,67,232,0,214,249,107,254,136,145,86,255,132,46,176,0,189,187,227,255,208,22,140,0,217,211,116,0,50,81,186,254,139,250,31,0,30,64,198,1,135,155,100,0,160,206,23,254,187,162,211,255,16,188,63,0,254,208,49,0,85,84,191,0,241,192,242,255,153,126,145,1,234,162,162,255,230,97,216,1,64,135,126,0,190,148,223,1,52,0,43,255,28,39,189,1,64,136,238,0,175,196,185,0,98,226,213,255,127,159,244,1,226,175,60,0,160,233,142,1,180,243,207,255,69,152,89,1,31,101,21,0,144,25,164,254,139,191,209,0,91,25,121,0,32,147,5,0,39,186,123,255,63,115,230,255,93,167,198,255,143,213,220,255,179,156,19,255,25,66,122,0,214,160,217,255,2,45,62,255,106,79,146,254,51,137,99,255,87,100,231,255,175,145,232,255,101,184,1,255,174,9,125,0,82,37,161,1,36,114,141,255,48,222,142,255,245,186,154,0,5,174,221,254,63,114,155,255,135,55,160,1,80,31,135,0,126,250,179,1,236,218,45,0,20,28,145,1,16,147,73,0,249,189,132,1,17,189,192,255,223,142,198,255,72,20,15,255,250,53,237,254,15,11,18,0,27,211,113,254,213,107,56,255,174,147,146,255,96,126,48,0,23,193,109,1,37,162,94,0,199,157,249,254,24,128,187,255,205,49,178,254,93,164,42,255,43,119,235,1,88,183,237,255,218,210,1,255,107,254,42,0,230,10,99,255,162,0,226,0,219,237,91,0,129,178,203,0,208,50,95,254,206,208,95,255,247,191,89,254,110,234,79,255,165,61,243,0,20,122,112,255,246,246,185,254,103,4,123,0,233,99,230,1,219,91,252,255,199,222,22,255,179,245,233,255,211,241,234,0,111,250,192,255,85,84,136,0,101,58,50,255,131,173,156,254,119,45,51,255,118,233,16,254,242,90,214,0,94,159,219,1,3,3,234,255,98,76,92,254,80,54,230,0,5,228,231,254,53,24,223,255,113,56,118,1,20,132,1,255,171,210,236,0,56,241,158,255,186,115,19,255,8,229,174,0,48,44,0,1,114,114,166,255,6,73,226,255,205,89,244,0,137,227,75,1,248,173,56,0,74,120,246,254,119,3,11,255,81,120,198,255,136,122,98,255,146,241,221,1,109,194,78,255,223,241,70,1,214,200,169,255,97,190,47,255,47,103,174,255,99,92,72,254,118,233,180,255,193,35,233,254,26,229,32,255,222,252,198,0,204,43,71,255,199,84,172,0,134,102,190,0,111,238,97,254,230,40,230,0,227,205,64,254,200,12,225,0,166,25,222,0,113,69,51,255,143,159,24,0,167,184,74,0,29,224,116,254,158,208,233,0,193,116,126,255,212,11,133,255,22,58,140,1,204,36,51,255,232,30,43,0,235,70,181,255,64,56,146,254,169,18,84,255,226,1,13,255,200,50,176,255,52,213,245,254,168,209,97,0,191,71,55,0,34,78,156,0,232,144,58,1,185,74,189,0,186,142,149,254,64,69,127,255,161,203,147,255,176,151,191,0,136,231,203,254,163,182,137,0,161,126,251,254,233,32,66,0,68,207,66,0,30,28,37,0,93,114,96,1,254,92,247,255,44,171,69,0,202,119,11,255,188,118,50,1,255,83,136,255,71,82,26,0,70,227,2,0,32,235,121,1,181,41,154,0,71,134,229,254,202,255,36,0,41,152,5,0,154,63,73,255,34,182,124,0,121,221,150,255,26,204,213,1,41,172,87,0,90,157,146,255,109,130,20,0,71,107,200,255,243,102,189,0,1,195,145,254,46,88,117,0,8,206,227,0,191,110,253,255,109,128,20,254,134,85,51,255,137,177,112,1,216,34,22,255,131,16,208,255,121,149,170,0,114,19,23,1,166,80,31,255,113,240,122,0,232,179,250,0,68,110,180,254,210,170,119,0,223,108,164,255,207,79,233,255,27,229,226,254,209,98,81,255,79,68,7,0,131,185,100,0,170,29,162,255,17,162,107,255,57,21,11,1,100,200,181,255,127,65,166,1,165,134,204,0,104,167,168,0,1,164,79,0,146,135,59,1,70,50,128,255,102,119,13,254,227,6,135,0,162,142,179,255,160,100,222,0,27,224,219,1,158,93,195,255,234,141,137,0,16,24,125,255,238,206,47,255,97,17,98,255,116,110,12,255,96,115,77,0,91,227,232,255,248,254,79,255,92,229,6,254,88,198,139,0,206,75,129,0,250,77,206,255,141,244,123,1,138,69,220,0,32,151,6,1,131,167,22,255,237,68,167,254,199,189,150,0,163,171,138,255,51,188,6,255,95,29,137,254,148,226,179,0,181,107,208,255,134,31,82,255,151,101,45,255,129,202,225,0,224,72,147,0,48,138,151,255,195,64,206,254,237,218,158,0,106,29,137,254,253,189,233,255,103,15,17,255,194,97,255,0,178,45,169,254,198,225,155,0,39,48,117,255,135,106,115,0,97,38,181,0,150,47,65,255,83,130,229,254,246,38,129,0,92,239,154,254,91,99,127,0,161,111,33,255,238,217,242,255,131,185,195,255,213,191,158,255,41,150,218,0,132,169,131,0,89,84,252,1,171,70,128,255,163,248,203,254,1,50,180,255,124,76,85,1,251,111,80,0,99,66,239,255,154,237,182,255,221,126,133,254,74,204,99,255,65,147,119,255,99,56,167,255,79,248,149,255,116,155,228,255,237,43,14,254,69,137,11,255,22,250,241,1,91,122,143,255,205,249,243,0,212,26,60,255,48,182,176,1,48,23,191,255,203,121,152,254,45,74,213,255,62,90,18,254,245,163,230,255,185,106,116,255,83,35,159,0,12,33,2,255,80,34,62,0,16,87,174,255,173,101,85,0,202,36,81,254,160,69,204,255,64,225,187,0,58,206,94,0,86,144,47,0,229,86,245,0,63,145,190,1,37,5,39,0,109,251,26,0,137,147,234,0,162,121,145,255,144,116,206,255,197,232,185,255,183,190,140,255,73,12,254,255,139,20,242,255,170,90,239,255,97,66,187,255,245,181,135,254,222,136,52,0,245,5,51,254,203,47,78,0,152,101,216,0,73,23,125,0,254,96,33,1,235,210,73,255,43,209,88,1,7,129,109,0,122,104,228,254,170,242,203,0,242,204,135,255,202,28,233,255,65,6,127,0,159,144,71,0,100,140,95,0,78,150,13,0,251,107,118,1,182,58,125,255,1,38,108,255,141,189,209,255,8,155,125,1,113,163,91,255,121,79,190,255,134,239,108,255,76,47,248,0,163,228,239,0,17,111,10,0,88,149,75,255,215,235,239,0,167,159,24,255,47,151,108,255,107,209,188,0,233,231,99,254,28,202,148,255,174,35,138,255,110,24,68,255,2,69,181,0,107,102,82,0,102,237,7,0,92,36,237,255,221,162,83,1,55,202,6,255,135,234,135,255,24,250,222,0,65,94,168,254,245,248,210,255,167,108,201,254,255,161,111,0,205,8,254,0,136,13,116,0,100,176,132,255,43,215,126,255,177,133,130,255,158,79,148,0,67,224,37,1,12,206,21,255,62,34,110,1,237,104,175,255,80,132,111,255,142,174,72,0,84,229,180,254,105,179,140,0,64,248,15,255,233,138,16,0,245,67,123,254,218,121,212,255,63,95,218,1,213,133,137,255,143,182,82,255,48,28,11,0,244,114,141,1,209,175,76,255,157,181,150,255,186,229,3,255,164,157,111,1,231,189,139,0,119,202,190,255,218,106,64,255,68,235,63,254,96,26,172,255,187,47,11,1,215,18,251,255,81,84,89,0,68,58,128,0,94,113,5,1,92,129,208,255,97,15,83,254,9,28,188,0,239,9,164,0,60,205,152,0,192,163,98,255,184,18,60,0,217,182,139,0,109,59,120,255,4,192,251,0,169,210,240,255,37,172,92,254,148,211,245,255,179,65,52,0,253,13,115,0,185,174,206,1,114,188,149,255,237,90,173,0,43,199,192,255,88,108,113,0,52,35,76,0,66,25,148,255,221,4,7,255,151,241,114,255,190,209,232,0,98,50,199,0,151,150,213,255,18,74,36,1,53,40,7,0,19,135,65,255,26,172,69,0,174,237,85,0,99,95,41,0,3,56,16,0,39,160,177,255,200,106,218,254,185,68,84,255,91,186,61,254,67,143,141,255,13,244,166,255,99,114,198,0,199,110,163,255,193,18,186,0,124,239,246,1,110,68,22,0,2,235,46,1,212,60,107,0,105,42,105,1,14,230,152,0,7,5,131,0,141,104,154,255,213,3,6,0,131,228,162,255,179,100,28,1,231,123,85,255,206,14,223,1,253,96,230,0,38,152,149,1,98,137,122,0,214,205,3,255,226,152,179,255,6,133,137,0,158,69,140,255,113,162,154,255,180,243,172,255,27,189,115,255,143,46,220,255,213,134,225,255,126,29,69,0,188,43,137,1,242,70,9,0,90,204,255,255,231,170,147,0,23,56,19,254,56,125,157,255,48,179,218,255,79,182,253,255,38,212,191,1,41,235,124,0,96,151,28,0,135,148,190,0,205,249,39,254,52,96,136,255,212,44,136,255,67,209,131,255,252,130,23,255,219,128,20,255,198,129,118,0,108,101,11,0,178,5,146,1,62,7,100,255,181,236,94,254,28,26,164,0,76,22,112,255,120,102,79,0,202,192,229,1,200,176,215,0,41,64,244,255,206,184,78,0,167,45,63,1,160,35,0,255,59,12,142,255,204,9,144,255,219,94,229,1,122,27,112,0,189,105,109,255,64,208,74,255,251,127,55,1,2,226,198,0,44,76,209,0,151,152,77,255,210,23,46,1,201,171,69,255,44,211,231,0,190,37,224,255,245,196,62,255,169,181,222,255,34,211,17,0,119,241,197,255,229,35,152,1,21,69,40,255,178,226,161,0,148,179,193,0,219,194,254,1,40,206,51,255,231,92,250,1,67,153,170,0,21,148,241,0,170,69,82,255,121,18,231,255,92,114,3,0,184,62,230,0,225,201,87,255,146,96,162,255,181,242,220,0,173,187,221,1,226,62,170,255,56,126,217,1,117,13,227,255,179,44,239,0,157,141,155,255,144,221,83,0,235,209,208,0,42,17,165,1,251,81,133,0,124,245,201,254,97,211,24,255,83,214,166,0,154,36,9,255,248,47,127,0,90,219,140,255,161,217,38,254,212,147,63,255,66,84,148,1,207,3,1,0,230,134,89,1,127,78,122,255,224,155,1,255,82,136,74,0,178,156,208,255,186,25,49,255,222,3,210,1,229,150,190,255,85,162,52,255,41,84,141,255,73,123,84,254,93,17,150,0,119,19,28,1,32,22,215,255,28,23,204,255,142,241,52,255,228,52,125,0,29,76,207,0,215,167,250,254,175,164,230,0,55,207,105,1,109,187,245,255,161,44,220,1,41,101,128,255,167,16,94,0,93,214,107,255,118,72,0,254,80,61,234,255,121,175,125,0,139,169,251,0,97,39,147,254,250,196,49,255,165,179,110,254,223,70,187,255,22,142,125,1,154,179,138,255,118,176,42,1,10,174,153,0,156,92,102,0,168,13,161,255,143,16,32,0,250,197,180,255,203,163,44,1,87,32,36,0,161,153,20,255,123,252,15,0,25,227,80,0,60,88,142,0,17,22,201,1,154,205,77,255,39,63,47,0,8,122,141,0,128,23,182,254,204,39,19,255,4,112,29,255,23,36,140,255,210,234,116,254,53,50,63,255,121,171,104,255,160,219,94,0,87,82,14,254,231,42,5,0,165,139,127,254,86,78,38,0,130,60,66,254,203,30,45,255,46,196,122,1,249,53,162,255,136,143,103,254,215,210,114,0,231,7,160,254,169,152,42,255,111,45,246,0,142,131,135,255,131,71,204,255,36,226,11,0,0,28,242,255,225,138,213,255,247,46,216,254,245,3,183,0,108,252,74,1,206,26,48,255,205,54,246,255,211,198,36,255,121,35,50,0,52,216,202,255,38,139,129,254,242,73,148,0,67,231,141,255,42,47,204,0,78,116,25,1,4,225,191,255,6,147,228,0,58,88,177,0,122,165,229,255,252,83,201,255,224,167,96,1,177,184,158,255,242,105,179,1,248,198,240,0,133,66,203,1,254,36,47,0,45,24,115,255,119,62,254,0,196,225,186,254,123,141,172,0,26,85,41,255,226,111,183,0,213,231,151,0,4,59,7,255,238,138,148,0,66,147,33,255,31,246,141,255,209,141,116,255,104,112,31,0,88,161,172,0,83,215,230,254,47,111,151,0,45,38,52,1,132,45,204,0,138,128,109,254,233,117,134,255,243,190,173,254,241,236,240,0,82,127,236,254,40,223,161,255,110,182,225,255,123,174,239,0,135,242,145,1,51,209,154,0,150,3,115,254,217,164,252,255,55,156,69,1,84,94,255,255,232,73,45,1,20,19,212,255,96,197,59,254,96,251,33,0,38,199,73,1,64,172,247,255,117,116,56,255,228,17,18,0,62,138,103,1,246,229,164,255,244,118,201,254,86,32,159,255,109,34,137,1,85,211,186,0,10,193,193,254,122,194,177,0,122,238,102,255,162,218,171,0,108,217,161,1,158,170,34,0,176,47,155,1,181,228,11,255,8,156,0,0,16,75,93,0,206,98,255,1,58,154,35,0,12,243,184,254,67,117,66,255,230,229,123,0,201,42,110,0,134,228,178,254,186,108,118,255,58,19,154,255,82,169,62,255,114,143,115,1,239,196,50,255,173,48,193,255,147,2,84,255,150,134,147,254,95,232,73,0,109,227,52,254,191,137,10,0,40,204,30,254,76,52,97,255,164,235,126,0,254,124,188,0,74,182,21,1,121,29,35,255,241,30,7,254,85,218,214,255,7,84,150,254,81,27,117,255,160,159,152,254,66,24,221,255,227,10,60,1,141,135,102,0,208,189,150,1,117,179,92,0,132,22,136,255,120,199,28,0,21,129,79,254,182,9,65,0,218,163,169,0,246,147,198,255,107,38,144,1,78,175,205,255,214,5,250,254,47,88,29,255,164,47,204,255,43,55,6,255,131,134,207,254,116,100,214,0,96,140,75,1,106,220,144,0,195,32,28,1,172,81,5,255,199,179,52,255,37,84,203,0,170,112,174,0,11,4,91,0,69,244,27,1,117,131,92,0,33,152,175,255,140,153,107,255,251,135,43,254,87,138,4,255,198,234,147,254,121,152,84,255,205,101,155,1,157,9,25,0,72,106,17,254,108,153,0,255,189,229,186,0,193,8,176,255,174,149,209,0,238,130,29,0,233,214,126,1,61,226,102,0,57,163,4,1,198,111,51,255,45,79,78,1,115,210,10,255,218,9,25,255,158,139,198,255,211,82,187,254,80,133,83,0,157,129,230,1,243,133,134,255,40,136,16,0,77,107,79,255,183,85,92,1,177,204,202,0,163,71,147,255,152,69,190,0,172,51,188,1,250,210,172,255,211,242,113,1,89,89,26,255,64,66,111,254,116,152,42,0,161,39,27,255,54,80,254,0,106,209,115,1,103,124,97,0,221,230,98,255,31,231,6,0,178,192,120,254,15,217,203,255,124,158,79,0,112,145,247,0,92,250,48,1,163,181,193,255,37,47,142,254,144,189,165,255,46,146,240,0,6,75,128,0,41,157,200,254,87,121,213,0,1,113,236,0,5,45,250,0,144,12,82,0,31,108,231,0,225,239,119,255,167,7,189,255,187,228,132,255,110,189,34,0,94,44,204,1,162,52,197,0,78,188,241,254,57,20,141,0,244,146,47,1,206,100,51,0,125,107,148,254,27,195,77,0,152,253,90,1,7,143,144,255,51,37,31,0,34,119,38,255,7,197,118,0,153,188,211,0,151,20,116,254,245,65,52,255,180,253,110,1,47,177,209,0,161,99,17,255,118,222,202,0,125,179,252,1,123,54,126,255,145,57,191,0,55,186,121,0,10,243,138,0,205,211,229,255,125,156,241,254,148,156,185,255,227,19,188,255,124,41,32,255,31,34,206,254,17,57,83,0,204,22,37,255,42,96,98,0,119,102,184,1,3,190,28,0,110,82,218,255,200,204,192,255,201,145,118,0,117,204,146,0,132,32,98,1,192,194,121,0,106,161,248,1,237,88,124,0,23,212,26,0,205,171,90,255,248,48,216,1,141,37,230,255,124,203,0,254,158,168,30,255,214,248,21,0,112,187,7,255,75,133,239,255,74,227,243,255,250,147,70,0,214,120,162,0,167,9,179,255,22,158,18,0,218,77,209,1,97,109,81,255,244,33,179,255,57,52,57,255,65,172,210,255,249,71,209,255,142,169,238,0,158,189,153,255,174,254,103,254,98,33,14,0,141,76,230,255,113,139,52,255,15,58,212,0,168,215,201,255,248,204,215,1,223,68,160,255,57,154,183,254,47,231,121,0,106,166,137,0,81,136,138,0,165,43,51,0,231,139,61,0,57,95,59,254,118,98,25,255,151,63,236,1,94,190,250,255,169,185,114,1,5,250,58,255,75,105,97,1,215,223,134,0,113,99,163,1,128,62,112,0,99,106,147,0,163,195,10,0,33,205,182,0,214,14,174,255,129,38,231,255,53,182,223,0,98,42,159,255,247,13,40,0,188,210,177,1,6,21,0,255,255,61,148,254,137,45,129,255,89,26,116,254,126,38,114,0,251,50,242,254,121,134,128,255,204,249,167,254,165,235,215,0,202,177,243,0,133,141,62,0,240,130,190,1,110,175,255,0,0,20,146,1,37,210,121,255,7,39,130,0,142,250,84,255,141,200,207,0,9,95,104,255,11,244,174,0,134,232,126,0,167,1,123,254,16,193,149,255,232,233,239,1,213,70,112,255,252,116,160,254,242,222,220,255,205,85,227,0,7,185,58,0,118,247,63,1,116,77,177,255,62,245,200,254,63,18,37,255,107,53,232,254,50,221,211,0,162,219,7,254,2,94,43,0,182,62,182,254,160,78,200,255,135,140,170,0,235,184,228,0,175,53,138,254,80,58,77,255,152,201,2,1,63,196,34,0,5,30,184,0,171,176,154,0,121,59,206,0,38,99,39,0,172,80,77,254,0,134,151,0,186,33,241,254,94,253,223,255,44,114,252,0,108,126,57,255,201,40,13,255,39,229,27,255,39,239,23,1,151,121,51,255,153,150,248,0,10,234,174,255,118,246,4,254,200,245,38,0,69,161,242,1,16,178,150,0,113,56,130,0,171,31,105,0,26,88,108,255,49,42,106,0,251,169,66,0,69,93,149,0,20,57,254,0,164,25,111,0,90,188,90,255,204,4,197,0,40,213,50,1,212,96,132,255,88,138,180,254,228,146,124,255,184,246,247,0,65,117,86,255,253,102,210,254,254,121,36,0,137,115,3,255,60,24,216,0,134,18,29,0,59,226,97,0,176,142,71,0,7,209,161,0,189,84,51,254,155,250,72,0,213,84,235,255,45,222,224,0,238,148,143,255,170,42,53,255,78,167,117,0,186,0,40,255,125,177,103,255,69,225,66,0,227,7,88,1,75,172,6,0,169,45,227,1,16,36,70,255,50,2,9,255,139,193,22,0,143,183,231,254,218,69,50,0,236,56,161,1,213,131,42,0,138,145,44,254,136,229,40,255,49,63,35,255,61,145,245,255,101,192,2,254,232,167,113,0,152,104,38,1,121,185,218,0,121,139,211,254,119,240,35,0,65,189,217,254,187,179,162,255,160,187,230,0,62,248,14,255,60,78,97,0,255,247,163,255,225,59,91,255,107,71,58,255,241,47,33,1,50,117,236,0,219,177,63,254,244,90,179,0,35,194,215,255,189,67,50,255,23,135,129,0,104,189,37,255,185,57,194,0,35,62,231,255,220,248,108,0,12,231,178,0,143,80,91,1,131,93,101,255,144,39,2,1,255,250,178],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);allocate([5,17,236,254,139,32,46,0,204,188,38,254,245,115,52,255,191,113,73,254,191,108,69,255,22,69,245,1,23,203,178,0,170,99,170,0,65,248,111,0,37,108,153,255,64,37,69,0,0,88,62,254,89,148,144,255,191,68,224,1,241,39,53,0,41,203,237,255,145,126,194,255,221,42,253,255,25,99,151,0,97,253,223,1,74,115,49,255,6,175,72,255,59,176,203,0,124,183,249,1,228,228,99,0,129,12,207,254,168,192,195,255,204,176,16,254,152,234,171,0,77,37,85,255,33,120,135,255,142,194,227,1,31,214,58,0,213,187,125,255,232,46,60,255,190,116,42,254,151,178,19,255,51,62,237,254,204,236,193,0,194,232,60,0,172,34,157,255,189,16,184,254,103,3,95,255,141,233,36,254,41,25,11,255,21,195,166,0,118,245,45,0,67,213,149,255,159,12,18,255,187,164,227,1,160,25,5,0,12,78,195,1,43,197,225,0,48,142,41,254,196,155,60,255,223,199,18,1,145,136,156,0,252,117,169,254,145,226,238,0,239,23,107,0,109,181,188,255,230,112,49,254,73,170,237,255,231,183,227,255,80,220,20,0,194,107,127,1,127,205,101,0,46,52,197,1,210,171,36,255,88,3,90,255,56,151,141,0,96,187,255,255,42,78,200,0,254,70,70,1,244,125,168,0,204,68,138,1,124,215,70,0,102,66,200,254,17,52,228,0,117,220,143,254,203,248,123,0,56,18,174,255,186,151,164,255,51,232,208,1,160,228,43,255,249,29,25,1,68,190,63,0,133,59,140,1,189,241,36,255,248,37,195,1,96,220,55,0,183,76,62,255,195,66,61,0,50,76,164,1,225,164,76,255,76,61,163,255,117,62,31,0,81,145,64,255,118,65,14,0,162,115,214,255,6,138,46,0,124,230,244,255,10,138,143,0,52,26,194,0,184,244,76,0,129,143,41,1,190,244,19,255,123,170,122,255,98,129,68,0,121,213,147,0,86,101,30,255,161,103,155,0,140,89,67,255,239,229,190,1,67,11,181,0,198,240,137,254,238,69,188,255,67,151,238,0,19,42,108,255,229,85,113,1,50,68,135,255,17,106,9,0,50,103,1,255,80,1,168,1,35,152,30,255,16,168,185,1,56,89,232,255,101,210,252,0,41,250,71,0,204,170,79,255,14,46,239,255,80,77,239,0,189,214,75,255,17,141,249,0,38,80,76,255,190,85,117,0,86,228,170,0,156,216,208,1,195,207,164,255,150,66,76,255,175,225,16,255,141,80,98,1,76,219,242,0,198,162,114,0,46,218,152,0,155,43,241,254,155,160,104,255,51,187,165,0,2,17,175,0,66,84,160,1,247,58,30,0,35,65,53,254,69,236,191,0,45,134,245,1,163,123,221,0,32,110,20,255,52,23,165,0,186,214,71,0,233,176,96,0,242,239,54,1,57,89,138,0,83,0,84,255,136,160,100,0,92,142,120,254,104,124,190,0,181,177,62,255,250,41,85,0,152,130,42,1,96,252,246,0,151,151,63,254,239,133,62,0,32,56,156,0,45,167,189,255,142,133,179,1,131,86,211,0,187,179,150,254,250,170,14,255,210,163,78,0,37,52,151,0,99,77,26,0,238,156,213,255,213,192,209,1,73,46,84,0,20,65,41,1,54,206,79,0,201,131,146,254,170,111,24,255,177,33,50,254,171,38,203,255,78,247,116,0,209,221,153,0,133,128,178,1,58,44,25,0,201,39,59,1,189,19,252,0,49,229,210,1,117,187,117,0,181,179,184,1,0,114,219,0,48,94,147,0,245,41,56,0,125,13,204,254,244,173,119,0,44,221,32,254,84,234,20,0,249,160,198,1,236,126,234,255,47,99,168,254,170,226,153,255,102,179,216,0,226,141,122,255,122,66,153,254,182,245,134,0,227,228,25,1,214,57,235,255,216,173,56,255,181,231,210,0,119,128,157,255,129,95,136,255,110,126,51,0,2,169,183,255,7,130,98,254,69,176,94,255,116,4,227,1,217,242,145,255,202,173,31,1,105,1,39,255,46,175,69,0,228,47,58,255,215,224,69,254,207,56,69,255,16,254,139,255,23,207,212,255,202,20,126,255,95,213,96,255,9,176,33,0,200,5,207,255,241,42,128,254,35,33,192,255,248,229,196,1,129,17,120,0,251,103,151,255,7,52,112,255,140,56,66,255,40,226,245,255,217,70,37,254,172,214,9,255,72,67,134,1,146,192,214,255,44,38,112,0,68,184,75,255,206,90,251,0,149,235,141,0,181,170,58,0,116,244,239,0,92,157,2,0,102,173,98,0,233,137,96,1,127,49,203,0,5,155,148,0,23,148,9,255,211,122,12,0,34,134,26,255,219,204,136,0,134,8,41,255,224,83,43,254,85,25,247,0,109,127,0,254,169,136,48,0,238,119,219,255,231,173,213,0,206,18,254,254,8,186,7,255,126,9,7,1,111,42,72,0,111,52,236,254,96,63,141,0,147,191,127,254,205,78,192,255,14,106,237,1,187,219,76,0,175,243,187,254,105,89,173,0,85,25,89,1,162,243,148,0,2,118,209,254,33,158,9,0,139,163,46,255,93,70,40,0,108,42,142,254,111,252,142,255,155,223,144,0,51,229,167,255,73,252,155,255,94,116,12,255,152,160,218,255,156,238,37,255,179,234,207,255,197,0,179,255,154,164,141,0,225,196,104,0,10,35,25,254,209,212,242,255,97,253,222,254,184,101,229,0,222,18,127,1,164,136,135,255,30,207,140,254,146,97,243,0,129,192,26,254,201,84,33,255,111,10,78,255,147,81,178,255,4,4,24,0,161,238,215,255,6,141,33,0,53,215,14,255,41,181,208,255,231,139,157,0,179,203,221,255,255,185,113,0,189,226,172,255,113,66,214,255,202,62,45,255,102,64,8,255,78,174,16,254,133,117,68,255,220,227,61,255,55,242,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250,146,248,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,66,28,254,77,93,218,255,85,164,113,254,84,201,69,255,19,80,70,255,228,25,251,255,161,155,226,0,21,228,98,255,98,173,253,254,240,199,249,255,243,154,124,0,216,32,153,255,92,250,251,254,184,34,48,0,13,120,71,1,190,95,22,0,224,219,40,254,59,210,158,255,163,69,160,0,120,24,52,255,121,44,48,255,198,97,223,0,3,43,69,0,178,44,117,0,253,147,0,1,237,162,13,255,32,32,163,254,19,247,29,255,33,76,209,0,68,40,157,255,134,145,179,254,238,64,70,255,168,48,73,1,250,9,69,0,240,27,185,255,47,67,247,0,63,68,122,0,216,36,127,255,126,6,49,0,204,15,105,0,1,0,0,0,0,0,0,0,130,128,0,0,0,0,0,0,138,128,0,0,0,0,0,128,0,128,0,128,0,0,0,128,139,128,0,0,0,0,0,0,1,0,0,128,0,0,0,0,129,128,0,128,0,0,0,128,9,128,0,0,0,0,0,128,138,0,0,0,0,0,0,0,136,0,0,0,0,0,0,0,9,128,0,128,0,0,0,0,10,0,0,128,0,0,0,0,139,128,0,128,0,0,0,0,139,0,0,0,0,0,0,128,137,128,0,0,0,0,0,128,3,128,0,0,0,0,0,128,2,128,0,0,0,0,0,128,128,0,0,0,0,0,0,128,10,128,0,0,0,0,0,0,10,0,0,128,0,0,0,128,129,128,0,128,0,0,0,128,128,128,0,0,0,0,0,128,1,0,0,128,0,0,0,0,8,128,0,128,0,0,0,128,1,0,0,0,3,0,0,0,6,0,0,0,10,0,0,0,15,0,0,0,21,0,0,0,28,0,0,0,36,0,0,0,45,0,0,0,55,0,0,0,2,0,0,0,14,0,0,0,27,0,0,0,41,0,0,0,56,0,0,0,8,0,0,0,25,0,0,0,43,0,0,0,62,0,0,0,18,0,0,0,39,0,0,0,61,0,0,0,20,0,0,0,44,0,0,0,10,0,0,0,7,0,0,0,11,0,0,0,17,0,0,0,18,0,0,0,3,0,0,0,5,0,0,0,16,0,0,0,8,0,0,0,21,0,0,0,24,0,0,0,4,0,0,0,15,0,0,0,23,0,0,0,19,0,0,0,13,0,0,0,12,0,0,0,2,0,0,0,20,0,0,0,14,0,0,0,22,0,0,0,9,0,0,0,6,0,0,0,1,0,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+30720);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}Module["_bitshift64Ashr"]=_bitshift64Ashr;function _malloc(bytes){var ptr=Runtime.dynamicAlloc(bytes+8);return ptr+8&4294967288}Module["_malloc"]=_malloc;Module["_i64Subtract"]=_i64Subtract;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}Module["_i64Add"]=_i64Add;Module["_memset"]=_memset;Module["_bitshift64Lshr"]=_bitshift64Lshr;function _free(){}Module["_free"]=_free;Module["_bitshift64Shl"]=_bitshift64Shl;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var ___errno_state=0;function ___setErrNo(value){SAFE_HEAP_STORE(___errno_state|0,value|0,4,0)|0;return value}var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){if(stream.tty.output.length){stream.tty.ops.put_char(stream.tty,10)}}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.buffer.byteLength:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(){done(this.error)});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{return flags}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{return fs.readlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var accmode=flag&2097155;var perms=["r","w","rw"][accmode];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if((flags&2097155)!==0||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),getStreamFromPtr:(function(ptr){return FS.streams[ptr-1]}),getPtrForStream:(function(stream){return stream?stream.fd+1:0}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}var mounts=FS.getMounts(FS.root.mount);var completed=0;function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=mounts.length){callback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){if(err===ERRNO_CODES.EISDIR)err=ERRNO_CODES.EPERM;throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return link.node_ops.readlink(link)}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module["printErr"]("read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream}),close:(function(stream){try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}return stream.stream_ops.llseek(stream,offset,whence)}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret="";var utf8=new Runtime.UTF8Processor;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=Math.floor(idx/this.chunkSize);return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperty(lazyArray,"length",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})});Object.defineProperty(lazyArray,"chunkSize",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperty(node,"usedBytes",{get:(function(){return this.contents.length})});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);var canvas=Module["canvas"];function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===canvas||document["mozPointerLockElement"]===canvas||document["webkitPointerLockElement"]===canvas||document["msPointerLockElement"]===canvas}if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&canvas.requestPointerLock){canvas.requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);ctx=GL.getContext(contextHandle).GLctx;canvas.style.backgroundColor="black"}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:(function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullScreenChange(){Browser.isFullScreen=false;var canvasContainer=canvas.parentNode;if((document["webkitFullScreenElement"]||document["webkitFullscreenElement"]||document["mozFullScreenElement"]||document["mozFullscreenElement"]||document["fullScreenElement"]||document["fullscreenElement"]||document["msFullScreenElement"]||document["msFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.cancelFullScreen=document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["webkitCancelFullScreen"]||document["msExitFullscreen"]||document["exitFullscreen"]||(function(){});canvas.cancelFullScreen=canvas.cancelFullScreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullScreen=true;if(Browser.resizeCanvas)Browser.setFullScreenCanvasSize()}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas)Browser.setWindowedCanvasSize()}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullScreen);Browser.updateCanvasDimensions(canvas)}if(!Browser.fullScreenHandlersInstalled){Browser.fullScreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullScreenChange,false);document.addEventListener("mozfullscreenchange",fullScreenChange,false);document.addEventListener("webkitfullscreenchange",fullScreenChange,false);document.addEventListener("MSFullscreenChange",fullScreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullScreen=canvasContainer["requestFullScreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);canvasContainer.requestFullScreen()}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(!ABORT)func()}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(!ABORT)func()}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(!ABORT)func()}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=-event.wheelDelta;break;case"wheel":delta=event.deltaY;break;default:throw"unrecognized mouse wheel event: "+event.type}return Math.max(-1,Math.min(1,delta))}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){Browser.lastTouches[touch.identifier]=Browser.touches[touch.identifier];Browser.touches[touch.identifier]={x:adjustedX,y:adjustedY}}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),xhrLoad:(function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)}),asyncLoad:(function(url,onload,onerror,noRunDep){Browser.xhrLoad(url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(!noRunDep)removeRunDependency("al "+url)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(!noRunDep)addRunDependency("al "+url)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=SAFE_HEAP_LOAD(SDL.screen+Runtime.QUANTUM_SIZE*0|0,4,0,1)|0;flags=flags|8388608;SAFE_HEAP_STORE(SDL.screen+Runtime.QUANTUM_SIZE*0|0,flags|0,4,0)|0}Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=SAFE_HEAP_LOAD(SDL.screen+Runtime.QUANTUM_SIZE*0|0,4,0,1)|0;flags=flags&~8388608;SAFE_HEAP_STORE(SDL.screen+Runtime.QUANTUM_SIZE*0|0,flags|0,4,0)|0}Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>0|0,fa(a>>0|0,1,0,0)|0|0,1,0);ga(k+1>>0|0,fa(a+1>>0|0,1,0,0)|0|0,1,0);ga(k+2>>0|0,fa(a+2>>0|0,1,0,0)|0|0,1,0);ga(k+3>>0|0,fa(a+3>>0|0,1,0,0)|0|0,1,0)}function ua(a){a=a|0;ga(k>>0|0,fa(a>>0|0,1,0,0)|0|0,1,0);ga(k+1>>0|0,fa(a+1>>0|0,1,0,0)|0|0,1,0);ga(k+2>>0|0,fa(a+2>>0|0,1,0,0)|0|0,1,0);ga(k+3>>0|0,fa(a+3>>0|0,1,0,0)|0|0,1,0);ga(k+4>>0|0,fa(a+4>>0|0,1,0,0)|0|0,1,0);ga(k+5>>0|0,fa(a+5>>0|0,1,0,0)|0|0,1,0);ga(k+6>>0|0,fa(a+6>>0|0,1,0,0)|0|0,1,0);ga(k+7>>0|0,fa(a+7>>0|0,1,0,0)|0|0,1,0)}function va(a){a=a|0;D=a}function wa(){return D|0}function xa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0;d=i;Y=b+40|0;j=b+44|0;m=b+48|0;p=b+52|0;s=b+56|0;v=b+60|0;y=b+64|0;B=b+68|0;E=b+72|0;F=b+76|0;V=b+4|0;S=b+8|0;Q=b+12|0;h=b+16|0;n=b+20|0;r=b+24|0;w=b+28|0;A=b+32|0;P=b+36|0;ja=(fa(V|0,4,0,0)|0|0)+(fa(j|0,4,0,0)|0|0)|0;ia=(fa(S|0,4,0,0)|0|0)+(fa(m|0,4,0,0)|0|0)|0;ha=(fa(Q|0,4,0,0)|0|0)+(fa(p|0,4,0,0)|0|0)|0;ea=(fa(h|0,4,0,0)|0|0)+(fa(s|0,4,0,0)|0|0)|0;da=(fa(n|0,4,0,0)|0|0)+(fa(v|0,4,0,0)|0|0)|0;ca=(fa(r|0,4,0,0)|0|0)+(fa(y|0,4,0,0)|0|0)|0;ba=(fa(w|0,4,0,0)|0|0)+(fa(B|0,4,0,0)|0|0)|0;aa=(fa(A|0,4,0,0)|0|0)+(fa(E|0,4,0,0)|0|0)|0;$=(fa(P|0,4,0,0)|0|0)+(fa(F|0,4,0,0)|0|0)|0;ga(a|0,(fa(b|0,4,0,0)|0|0)+(fa(Y|0,4,0,0)|0|0)|0,4,0);ka=a+4|0;ga(ka|0,ja|0,4,0);ja=a+8|0;ga(ja|0,ia|0,4,0);ia=a+12|0;ga(ia|0,ha|0,4,0);ha=a+16|0;ga(ha|0,ea|0,4,0);ea=a+20|0;ga(ea|0,da|0,4,0);da=a+24|0;ga(da|0,ca|0,4,0);ca=a+28|0;ga(ca|0,ba|0,4,0);ba=a+32|0;ga(ba|0,aa|0,4,0);aa=a+36|0;ga(aa|0,$|0,4,0);$=a+40|0;V=(fa(j|0,4,0,0)|0|0)-(fa(V|0,4,0,0)|0|0)|0;S=(fa(m|0,4,0,0)|0|0)-(fa(S|0,4,0,0)|0|0)|0;Q=(fa(p|0,4,0,0)|0|0)-(fa(Q|0,4,0,0)|0|0)|0;h=(fa(s|0,4,0,0)|0|0)-(fa(h|0,4,0,0)|0|0)|0;n=(fa(v|0,4,0,0)|0|0)-(fa(n|0,4,0,0)|0|0)|0;r=(fa(y|0,4,0,0)|0|0)-(fa(r|0,4,0,0)|0|0)|0;w=(fa(B|0,4,0,0)|0|0)-(fa(w|0,4,0,0)|0|0)|0;A=(fa(E|0,4,0,0)|0|0)-(fa(A|0,4,0,0)|0|0)|0;P=(fa(F|0,4,0,0)|0|0)-(fa(P|0,4,0,0)|0|0)|0;ga($|0,(fa(Y|0,4,0,0)|0|0)-(fa(b|0,4,0,0)|0|0)|0,4,0);Y=a+44|0;ga(Y|0,V|0,4,0);V=a+48|0;ga(V|0,S|0,4,0);S=a+52|0;ga(S|0,Q|0,4,0);Q=a+56|0;ga(Q|0,h|0,4,0);h=a+60|0;ga(h|0,n|0,4,0);n=a+64|0;ga(n|0,r|0,4,0);r=a+68|0;ga(r|0,w|0,4,0);w=a+72|0;ga(w|0,A|0,4,0);A=a+76|0;ga(A|0,P|0,4,0);P=a+80|0;ya(P,a,c);ya($,$,c+40|0);F=a+120|0;ya(F,c+120|0,b+120|0);ya(a,b+80|0,c+80|0);E=(fa(a|0,4,0,0)|0)<<1;B=(fa(ka|0,4,0,0)|0)<<1;y=(fa(ja|0,4,0,0)|0)<<1;v=(fa(ia|0,4,0,0)|0)<<1;s=(fa(ha|0,4,0,0)|0)<<1;p=(fa(ea|0,4,0,0)|0)<<1;m=(fa(da|0,4,0,0)|0)<<1;j=(fa(ca|0,4,0,0)|0)<<1;f=(fa(ba|0,4,0,0)|0)<<1;c=(fa(aa|0,4,0,0)|0)<<1;Z=fa(P|0,4,0,0)|0|0;O=a+84|0;W=fa(O|0,4,0,0)|0|0;N=a+88|0;T=fa(N|0,4,0,0)|0|0;M=a+92|0;b=fa(M|0,4,0,0)|0|0;L=a+96|0;g=fa(L|0,4,0,0)|0|0;K=a+100|0;l=fa(K|0,4,0,0)|0|0;J=a+104|0;q=fa(J|0,4,0,0)|0|0;I=a+108|0;u=fa(I|0,4,0,0)|0|0;H=a+112|0;z=fa(H|0,4,0,0)|0|0;G=a+116|0;D=fa(G|0,4,0,0)|0|0;_=fa($|0,4,0,0)|0|0;X=fa(Y|0,4,0,0)|0|0;U=fa(V|0,4,0,0)|0|0;R=fa(S|0,4,0,0)|0|0;e=fa(Q|0,4,0,0)|0|0;k=fa(h|0,4,0,0)|0|0;o=fa(n|0,4,0,0)|0|0;t=fa(r|0,4,0,0)|0|0;x=fa(w|0,4,0,0)|0|0;C=fa(A|0,4,0,0)|0|0;ga(a|0,Z-_|0,4,0);ga(ka|0,W-X|0,4,0);ga(ja|0,T-U|0,4,0);ga(ia|0,b-R|0,4,0);ga(ha|0,g-e|0,4,0);ga(ea|0,l-k|0,4,0);ga(da|0,q-o|0,4,0);ga(ca|0,u-t|0,4,0);ga(ba|0,z-x|0,4,0);ga(aa|0,D-C|0,4,0);ga($|0,_+Z|0,4,0);ga(Y|0,X+W|0,4,0);ga(V|0,U+T|0,4,0);ga(S|0,R+b|0,4,0);ga(Q|0,e+g|0,4,0);ga(h|0,k+l|0,4,0);ga(n|0,o+q|0,4,0);ga(r|0,t+u|0,4,0);ga(w|0,x+z|0,4,0);ga(A|0,C+D|0,4,0);D=fa(F|0,4,0,0)|0|0;C=a+124|0;A=fa(C|0,4,0,0)|0|0;z=a+128|0;x=fa(z|0,4,0,0)|0|0;w=a+132|0;u=fa(w|0,4,0,0)|0|0;t=a+136|0;r=fa(t|0,4,0,0)|0|0;q=a+140|0;o=fa(q|0,4,0,0)|0|0;n=a+144|0;l=fa(n|0,4,0,0)|0|0;k=a+148|0;h=fa(k|0,4,0,0)|0|0;g=a+152|0;e=fa(g|0,4,0,0)|0|0;a=a+156|0;b=fa(a|0,4,0,0)|0|0;ga(P|0,D+E|0,4,0);ga(O|0,A+B|0,4,0);ga(N|0,x+y|0,4,0);ga(M|0,u+v|0,4,0);ga(L|0,r+s|0,4,0);ga(K|0,o+p|0,4,0);ga(J|0,l+m|0,4,0);ga(I|0,h+j|0,4,0);ga(H|0,e+f|0,4,0);ga(G|0,b+c|0,4,0);ga(F|0,E-D|0,4,0);ga(C|0,B-A|0,4,0);ga(z|0,y-x|0,4,0);ga(w|0,v-u|0,4,0);ga(t|0,s-r|0,4,0);ga(q|0,p-o|0,4,0);ga(n|0,m-l|0,4,0);ga(k|0,j-h|0,4,0);ga(g|0,f-e|0,4,0);ga(a|0,c-b|0,4,0);i=d;return}function ya(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,ib=0,jb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0;d=i;m=fa(b|0,4,0,0)|0|0;t=fa(b+4|0,4,0,0)|0|0;k=fa(b+8|0,4,0,0)|0|0;Zb=fa(b+12|0,4,0,0)|0|0;e=fa(b+16|0,4,0,0)|0|0;Ca=fa(b+20|0,4,0,0)|0|0;Ba=fa(b+24|0,4,0,0)|0|0;Hb=fa(b+28|0,4,0,0)|0|0;h=fa(b+32|0,4,0,0)|0|0;ja=fa(b+36|0,4,0,0)|0|0;I=fa(c|0,4,0,0)|0|0;K=fa(c+4|0,4,0,0)|0|0;G=fa(c+8|0,4,0,0)|0|0;E=fa(c+12|0,4,0,0)|0|0;B=fa(c+16|0,4,0,0)|0|0;z=fa(c+20|0,4,0,0)|0|0;x=fa(c+24|0,4,0,0)|0|0;v=fa(c+28|0,4,0,0)|0|0;l=fa(c+32|0,4,0,0)|0|0;u=fa(c+36|0,4,0,0)|0|0;Wc=K*19|0;jc=G*19|0;zb=E*19|0;Ka=B*19|0;rc=z*19|0;Lb=x*19|0;Wa=v*19|0;_c=l*19|0;Yc=u*19|0;q=t<<1;f=Zb<<1;N=Ca<<1;j=Hb<<1;b=ja<<1;p=((m|0)<0)<<31>>31;J=((I|0)<0)<<31>>31;Uc=sb(I|0,J|0,m|0,p|0)|0;Tc=D;L=((K|0)<0)<<31>>31;Ec=sb(K|0,L|0,m|0,p|0)|0;Dc=D;H=((G|0)<0)<<31>>31;Cb=sb(G|0,H|0,m|0,p|0)|0;Bb=D;F=((E|0)<0)<<31>>31;Na=sb(E|0,F|0,m|0,p|0)|0;Ma=D;C=((B|0)<0)<<31>>31;uc=sb(B|0,C|0,m|0,p|0)|0;tc=D;A=((z|0)<0)<<31>>31;Ob=sb(z|0,A|0,m|0,p|0)|0;Nb=D;y=((x|0)<0)<<31>>31;Za=sb(x|0,y|0,m|0,p|0)|0;Ya=D;w=((v|0)<0)<<31>>31;ma=sb(v|0,w|0,m|0,p|0)|0;la=D;Xc=((l|0)<0)<<31>>31;Q=sb(l|0,Xc|0,m|0,p|0)|0;P=D;p=sb(u|0,((u|0)<0)<<31>>31|0,m|0,p|0)|0;m=D;u=((t|0)<0)<<31>>31;lc=sb(I|0,J|0,t|0,u|0)|0;mc=D;o=((q|0)<0)<<31>>31;Gb=sb(K|0,L|0,q|0,o|0)|0;Fb=D;Pa=sb(G|0,H|0,t|0,u|0)|0;Oa=D;wc=sb(E|0,F|0,q|0,o|0)|0;vc=D;Qb=sb(B|0,C|0,t|0,u|0)|0;Pb=D;$a=sb(z|0,A|0,q|0,o|0)|0;_a=D;oa=sb(x|0,y|0,t|0,u|0)|0;na=D;S=sb(v|0,w|0,q|0,o|0)|0;R=D;u=sb(l|0,Xc|0,t|0,u|0)|0;t=D;Xc=((Yc|0)<0)<<31>>31;o=sb(Yc|0,Xc|0,q|0,o|0)|0;q=D;l=((k|0)<0)<<31>>31;Eb=sb(I|0,J|0,k|0,l|0)|0;Db=D;Ta=sb(K|0,L|0,k|0,l|0)|0;Sa=D;yc=sb(G|0,H|0,k|0,l|0)|0;xc=D;Sb=sb(E|0,F|0,k|0,l|0)|0;Rb=D;bb=sb(B|0,C|0,k|0,l|0)|0;ab=D;qa=sb(z|0,A|0,k|0,l|0)|0;pa=D;U=sb(x|0,y|0,k|0,l|0)|0;T=D;w=sb(v|0,w|0,k|0,l|0)|0;v=D;Zc=((_c|0)<0)<<31>>31;Gc=sb(_c|0,Zc|0,k|0,l|0)|0;Fc=D;l=sb(Yc|0,Xc|0,k|0,l|0)|0;k=D;_b=((Zb|0)<0)<<31>>31;Ra=sb(I|0,J|0,Zb|0,_b|0)|0;Qa=D;ia=((f|0)<0)<<31>>31;Cc=sb(K|0,L|0,f|0,ia|0)|0;Bc=D;Ub=sb(G|0,H|0,Zb|0,_b|0)|0;Tb=D;db=sb(E|0,F|0,f|0,ia|0)|0;cb=D;sa=sb(B|0,C|0,Zb|0,_b|0)|0;ra=D;W=sb(z|0,A|0,f|0,ia|0)|0;V=D;y=sb(x|0,y|0,Zb|0,_b|0)|0;x=D;Xa=((Wa|0)<0)<<31>>31;Ic=sb(Wa|0,Xa|0,f|0,ia|0)|0;Hc=D;_b=sb(_c|0,Zc|0,Zb|0,_b|0)|0;Zb=D;ia=sb(Yc|0,Xc|0,f|0,ia|0)|0;f=D;O=((e|0)<0)<<31>>31;Ac=sb(I|0,J|0,e|0,O|0)|0;zc=D;Yb=sb(K|0,L|0,e|0,O|0)|0;Xb=D;ib=sb(G|0,H|0,e|0,O|0)|0;eb=D;ua=sb(E|0,F|0,e|0,O|0)|0;ta=D;Y=sb(B|0,C|0,e|0,O|0)|0;X=D;A=sb(z|0,A|0,e|0,O|0)|0;z=D;Mb=((Lb|0)<0)<<31>>31;Kc=sb(Lb|0,Mb|0,e|0,O|0)|0;Jc=D;ac=sb(Wa|0,Xa|0,e|0,O|0)|0;$b=D;pb=sb(_c|0,Zc|0,e|0,O|0)|0;ob=D;O=sb(Yc|0,Xc|0,e|0,O|0)|0;e=D;Da=((Ca|0)<0)<<31>>31;Wb=sb(I|0,J|0,Ca|0,Da|0)|0;Vb=D;c=((N|0)<0)<<31>>31;nb=sb(K|0,L|0,N|0,c|0)|0;mb=D;wa=sb(G|0,H|0,Ca|0,Da|0)|0;va=D;_=sb(E|0,F|0,N|0,c|0)|0;Z=D;C=sb(B|0,C|0,Ca|0,Da|0)|0;B=D;sc=((rc|0)<0)<<31>>31;Mc=sb(rc|0,sc|0,N|0,c|0)|0;Lc=D;cc=sb(Lb|0,Mb|0,Ca|0,Da|0)|0;bc=D;rb=sb(Wa|0,Xa|0,N|0,c|0)|0;qb=D;Da=sb(_c|0,Zc|0,Ca|0,Da|0)|0;Ca=D;c=sb(Yc|0,Xc|0,N|0,c|0)|0;N=D;g=((Ba|0)<0)<<31>>31;lb=sb(I|0,J|0,Ba|0,g|0)|0;jb=D;Aa=sb(K|0,L|0,Ba|0,g|0)|0;za=D;aa=sb(G|0,H|0,Ba|0,g|0)|0;$=D;F=sb(E|0,F|0,Ba|0,g|0)|0;E=D;La=((Ka|0)<0)<<31>>31;Oc=sb(Ka|0,La|0,Ba|0,g|0)|0;Nc=D;ec=sb(rc|0,sc|0,Ba|0,g|0)|0;dc=D;ub=sb(Lb|0,Mb|0,Ba|0,g|0)|0;tb=D;Fa=sb(Wa|0,Xa|0,Ba|0,g|0)|0;Ea=D;n=sb(_c|0,Zc|0,Ba|0,g|0)|0;s=D;g=sb(Yc|0,Xc|0,Ba|0,g|0)|0;Ba=D;Ib=((Hb|0)<0)<<31>>31;ya=sb(I|0,J|0,Hb|0,Ib|0)|0;xa=D;ha=((j|0)<0)<<31>>31;ea=sb(K|0,L|0,j|0,ha|0)|0;da=D;H=sb(G|0,H|0,Hb|0,Ib|0)|0;G=D;Ab=((zb|0)<0)<<31>>31;Qc=sb(zb|0,Ab|0,j|0,ha|0)|0;Pc=D;gc=sb(Ka|0,La|0,Hb|0,Ib|0)|0;fc=D;wb=sb(rc|0,sc|0,j|0,ha|0)|0;vb=D;Ha=sb(Lb|0,Mb|0,Hb|0,Ib|0)|0;Ga=D;oc=sb(Wa|0,Xa|0,j|0,ha|0)|0;nc=D;Ib=sb(_c|0,Zc|0,Hb|0,Ib|0)|0;Hb=D;ha=sb(Yc|0,Xc|0,j|0,ha|0)|0;j=D;M=((h|0)<0)<<31>>31;ca=sb(I|0,J|0,h|0,M|0)|0;ba=D;L=sb(K|0,L|0,h|0,M|0)|0;K=D;kc=((jc|0)<0)<<31>>31;Sc=sb(jc|0,kc|0,h|0,M|0)|0;Rc=D;ic=sb(zb|0,Ab|0,h|0,M|0)|0;hc=D;yb=sb(Ka|0,La|0,h|0,M|0)|0;xb=D;Ja=sb(rc|0,sc|0,h|0,M|0)|0;Ia=D;qc=sb(Lb|0,Mb|0,h|0,M|0)|0;pc=D;Kb=sb(Wa|0,Xa|0,h|0,M|0)|0;Jb=D;Va=sb(_c|0,Zc|0,h|0,M|0)|0;Ua=D;M=sb(Yc|0,Xc|0,h|0,M|0)|0;h=D;ka=((ja|0)<0)<<31>>31;J=sb(I|0,J|0,ja|0,ka|0)|0;I=D;r=((b|0)<0)<<31>>31;Wc=sb(Wc|0,((Wc|0)<0)<<31>>31|0,b|0,r|0)|0;Vc=D;kc=sb(jc|0,kc|0,ja|0,ka|0)|0;jc=D;Ab=sb(zb|0,Ab|0,b|0,r|0)|0;zb=D;La=sb(Ka|0,La|0,ja|0,ka|0)|0;Ka=D;sc=sb(rc|0,sc|0,b|0,r|0)|0;rc=D;Mb=sb(Lb|0,Mb|0,ja|0,ka|0)|0;Lb=D;Xa=sb(Wa|0,Xa|0,b|0,r|0)|0;Wa=D;ka=sb(_c|0,Zc|0,ja|0,ka|0)|0;ja=D;r=sb(Yc|0,Xc|0,b|0,r|0)|0;b=D;Tc=hb(Wc|0,Vc|0,Uc|0,Tc|0)|0;Rc=hb(Tc|0,D|0,Sc|0,Rc|0)|0;Pc=hb(Rc|0,D|0,Qc|0,Pc|0)|0;Nc=hb(Pc|0,D|0,Oc|0,Nc|0)|0;Lc=hb(Nc|0,D|0,Mc|0,Lc|0)|0;Jc=hb(Lc|0,D|0,Kc|0,Jc|0)|0;Hc=hb(Jc|0,D|0,Ic|0,Hc|0)|0;Fc=hb(Hc|0,D|0,Gc|0,Fc|0)|0;q=hb(Fc|0,D|0,o|0,q|0)|0;o=D;mc=hb(Ec|0,Dc|0,lc|0,mc|0)|0;lc=D;zc=hb(Cc|0,Bc|0,Ac|0,zc|0)|0;xc=hb(zc|0,D|0,yc|0,xc|0)|0;vc=hb(xc|0,D|0,wc|0,vc|0)|0;tc=hb(vc|0,D|0,uc|0,tc|0)|0;rc=hb(tc|0,D|0,sc|0,rc|0)|0;pc=hb(rc|0,D|0,qc|0,pc|0)|0;nc=hb(pc|0,D|0,oc|0,nc|0)|0;s=hb(nc|0,D|0,n|0,s|0)|0;N=hb(s|0,D|0,c|0,N|0)|0;c=D;s=hb(q|0,o|0,33554432,0)|0;s=fb(s|0,D|0,26)|0;n=D;jc=hb(mc|0,lc|0,kc|0,jc|0)|0;hc=hb(jc|0,D|0,ic|0,hc|0)|0;fc=hb(hc|0,D|0,gc|0,fc|0)|0;dc=hb(fc|0,D|0,ec|0,dc|0)|0;bc=hb(dc|0,D|0,cc|0,bc|0)|0;$b=hb(bc|0,D|0,ac|0,$b|0)|0;Zb=hb($b|0,D|0,_b|0,Zb|0)|0;k=hb(Zb|0,D|0,l|0,k|0)|0;k=hb(k|0,D|0,s|0,n|0)|0;l=D;n=kb(s|0,n|0,26)|0;n=gb(q|0,o|0,n|0,D|0)|0;o=D;q=hb(N|0,c|0,33554432,0)|0;q=fb(q|0,D|0,26)|0;s=D;Vb=hb(Yb|0,Xb|0,Wb|0,Vb|0)|0;Tb=hb(Vb|0,D|0,Ub|0,Tb|0)|0;Rb=hb(Tb|0,D|0,Sb|0,Rb|0)|0;Pb=hb(Rb|0,D|0,Qb|0,Pb|0)|0;Nb=hb(Pb|0,D|0,Ob|0,Nb|0)|0;Lb=hb(Nb|0,D|0,Mb|0,Lb|0)|0;Jb=hb(Lb|0,D|0,Kb|0,Jb|0)|0;Hb=hb(Jb|0,D|0,Ib|0,Hb|0)|0;Ba=hb(Hb|0,D|0,g|0,Ba|0)|0;Ba=hb(Ba|0,D|0,q|0,s|0)|0;g=D;s=kb(q|0,s|0,26)|0;s=gb(N|0,c|0,s|0,D|0)|0;c=D;N=hb(k|0,l|0,16777216,0)|0;N=fb(N|0,D|0,25)|0;q=D;Db=hb(Gb|0,Fb|0,Eb|0,Db|0)|0;Bb=hb(Db|0,D|0,Cb|0,Bb|0)|0;zb=hb(Bb|0,D|0,Ab|0,zb|0)|0;xb=hb(zb|0,D|0,yb|0,xb|0)|0;vb=hb(xb|0,D|0,wb|0,vb|0)|0;tb=hb(vb|0,D|0,ub|0,tb|0)|0;qb=hb(tb|0,D|0,rb|0,qb|0)|0;ob=hb(qb|0,D|0,pb|0,ob|0)|0;f=hb(ob|0,D|0,ia|0,f|0)|0;f=hb(f|0,D|0,N|0,q|0)|0;ia=D;q=kb(N|0,q|0,25)|0;q=gb(k|0,l|0,q|0,D|0)|0;l=D;k=hb(Ba|0,g|0,16777216,0)|0;k=fb(k|0,D|0,25)|0;N=D;jb=hb(nb|0,mb|0,lb|0,jb|0)|0;eb=hb(jb|0,D|0,ib|0,eb|0)|0;cb=hb(eb|0,D|0,db|0,cb|0)|0;ab=hb(cb|0,D|0,bb|0,ab|0)|0;_a=hb(ab|0,D|0,$a|0,_a|0)|0;Ya=hb(_a|0,D|0,Za|0,Ya|0)|0;Wa=hb(Ya|0,D|0,Xa|0,Wa|0)|0;Ua=hb(Wa|0,D|0,Va|0,Ua|0)|0;j=hb(Ua|0,D|0,ha|0,j|0)|0;j=hb(j|0,D|0,k|0,N|0)|0;ha=D;N=kb(k|0,N|0,25)|0;N=gb(Ba|0,g|0,N|0,D|0)|0;g=D;Ba=hb(f|0,ia|0,33554432,0)|0;Ba=fb(Ba|0,D|0,26)|0;k=D;Qa=hb(Ta|0,Sa|0,Ra|0,Qa|0)|0;Oa=hb(Qa|0,D|0,Pa|0,Oa|0)|0;Ma=hb(Oa|0,D|0,Na|0,Ma|0)|0;Ka=hb(Ma|0,D|0,La|0,Ka|0)|0;Ia=hb(Ka|0,D|0,Ja|0,Ia|0)|0;Ga=hb(Ia|0,D|0,Ha|0,Ga|0)|0;Ea=hb(Ga|0,D|0,Fa|0,Ea|0)|0;Ca=hb(Ea|0,D|0,Da|0,Ca|0)|0;e=hb(Ca|0,D|0,O|0,e|0)|0;e=hb(e|0,D|0,Ba|0,k|0)|0;O=D;k=kb(Ba|0,k|0,26)|0;k=gb(f|0,ia|0,k|0,D|0)|0;ia=hb(j|0,ha|0,33554432,0)|0;ia=fb(ia|0,D|0,26)|0;f=D;xa=hb(Aa|0,za|0,ya|0,xa|0)|0;va=hb(xa|0,D|0,wa|0,va|0)|0;ta=hb(va|0,D|0,ua|0,ta|0)|0;ra=hb(ta|0,D|0,sa|0,ra|0)|0;pa=hb(ra|0,D|0,qa|0,pa|0)|0;na=hb(pa|0,D|0,oa|0,na|0)|0;la=hb(na|0,D|0,ma|0,la|0)|0;ja=hb(la|0,D|0,ka|0,ja|0)|0;h=hb(ja|0,D|0,M|0,h|0)|0;h=hb(h|0,D|0,ia|0,f|0)|0;M=D;f=kb(ia|0,f|0,26)|0;f=gb(j|0,ha|0,f|0,D|0)|0;ha=hb(e|0,O|0,16777216,0)|0;ha=fb(ha|0,D|0,25)|0;j=D;c=hb(ha|0,j|0,s|0,c|0)|0;s=D;j=kb(ha|0,j|0,25)|0;j=gb(e|0,O|0,j|0,D|0)|0;O=hb(h|0,M|0,16777216,0)|0;O=fb(O|0,D|0,25)|0;e=D;ba=hb(ea|0,da|0,ca|0,ba|0)|0;$=hb(ba|0,D|0,aa|0,$|0)|0;Z=hb($|0,D|0,_|0,Z|0)|0;X=hb(Z|0,D|0,Y|0,X|0)|0;V=hb(X|0,D|0,W|0,V|0)|0;T=hb(V|0,D|0,U|0,T|0)|0;R=hb(T|0,D|0,S|0,R|0)|0;P=hb(R|0,D|0,Q|0,P|0)|0;b=hb(P|0,D|0,r|0,b|0)|0;b=hb(b|0,D|0,O|0,e|0)|0;r=D;e=kb(O|0,e|0,25)|0;e=gb(h|0,M|0,e|0,D|0)|0;M=hb(c|0,s|0,33554432,0)|0;M=fb(M|0,D|0,26)|0;h=D;g=hb(N|0,g|0,M|0,h|0)|0;h=kb(M|0,h|0,26)|0;h=gb(c|0,s|0,h|0,D|0)|0;s=hb(b|0,r|0,33554432,0)|0;s=fb(s|0,D|0,26)|0;c=D;I=hb(L|0,K|0,J|0,I|0)|0;G=hb(I|0,D|0,H|0,G|0)|0;E=hb(G|0,D|0,F|0,E|0)|0;B=hb(E|0,D|0,C|0,B|0)|0;z=hb(B|0,D|0,A|0,z|0)|0;x=hb(z|0,D|0,y|0,x|0)|0;v=hb(x|0,D|0,w|0,v|0)|0;t=hb(v|0,D|0,u|0,t|0)|0;m=hb(t|0,D|0,p|0,m|0)|0;m=hb(m|0,D|0,s|0,c|0)|0;p=D;c=kb(s|0,c|0,26)|0;c=gb(b|0,r|0,c|0,D|0)|0;r=hb(m|0,p|0,16777216,0)|0;r=fb(r|0,D|0,25)|0;b=D;s=sb(r|0,b|0,19,0)|0;o=hb(s|0,D|0,n|0,o|0)|0;n=D;b=kb(r|0,b|0,25)|0;b=gb(m|0,p|0,b|0,D|0)|0;p=hb(o|0,n|0,33554432,0)|0;p=fb(p|0,D|0,26)|0;m=D;l=hb(q|0,l|0,p|0,m|0)|0;m=kb(p|0,m|0,26)|0;m=gb(o|0,n|0,m|0,D|0)|0;ga(a|0,m|0,4,0);ga(a+4|0,l|0,4,0);ga(a+8|0,k|0,4,0);ga(a+12|0,j|0,4,0);ga(a+16|0,h|0,4,0);ga(a+20|0,g|0,4,0);ga(a+24|0,f|0,4,0);ga(a+28|0,e|0,4,0);ga(a+32|0,c|0,4,0);ga(a+36|0,b|0,4,0);i=d;return}function za(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=i;i=i+608|0;g=c+480|0;e=c+320|0;m=c+160|0;d=c;Aa(a,b);q=fa(b+4|0,4,0,0)|0|0;p=fa(b+8|0,4,0,0)|0|0;o=fa(b+12|0,4,0,0)|0|0;n=fa(b+16|0,4,0,0)|0|0;l=fa(b+20|0,4,0,0)|0|0;f=fa(b+24|0,4,0,0)|0|0;j=fa(b+28|0,4,0,0)|0|0;k=fa(b+32|0,4,0,0)|0|0;h=fa(b+36|0,4,0,0)|0|0;ga(g|0,fa(b|0,4,0,0)|0|0,4,0);ga(g+4|0,q|0,4,0);ga(g+8|0,p|0,4,0);ga(g+12|0,o|0,4,0);ga(g+16|0,n|0,4,0);ga(g+20|0,l|0,4,0);ga(g+24|0,f|0,4,0);ga(g+28|0,j|0,4,0);ga(g+32|0,k|0,4,0);ga(g+36|0,h|0,4,0);h=fa(b+44|0,4,0,0)|0|0;k=fa(b+48|0,4,0,0)|0|0;j=fa(b+52|0,4,0,0)|0|0;f=fa(b+56|0,4,0,0)|0|0;l=fa(b+60|0,4,0,0)|0|0;n=fa(b+64|0,4,0,0)|0|0;o=fa(b+68|0,4,0,0)|0|0;p=fa(b+72|0,4,0,0)|0|0;q=fa(b+76|0,4,0,0)|0|0;ga(g+40|0,fa(b+40|0,4,0,0)|0|0,4,0);ga(g+44|0,h|0,4,0);ga(g+48|0,k|0,4,0);ga(g+52|0,j|0,4,0);ga(g+56|0,f|0,4,0);ga(g+60|0,l|0,4,0);ga(g+64|0,n|0,4,0);ga(g+68|0,o|0,4,0);ga(g+72|0,p|0,4,0);ga(g+76|0,q|0,4,0);q=fa(b+84|0,4,0,0)|0|0;p=fa(b+88|0,4,0,0)|0|0;o=fa(b+92|0,4,0,0)|0|0;n=fa(b+96|0,4,0,0)|0|0;l=fa(b+100|0,4,0,0)|0|0;f=fa(b+104|0,4,0,0)|0|0;j=fa(b+108|0,4,0,0)|0|0;k=fa(b+112|0,4,0,0)|0|0;h=fa(b+116|0,4,0,0)|0|0;ga(g+80|0,fa(b+80|0,4,0,0)|0|0,4,0);ga(g+84|0,q|0,4,0);ga(g+88|0,p|0,4,0);ga(g+92|0,o|0,4,0);ga(g+96|0,n|0,4,0);ga(g+100|0,l|0,4,0);ga(g+104|0,f|0,4,0);ga(g+108|0,j|0,4,0);ga(g+112|0,k|0,4,0);ga(g+116|0,h|0,4,0);Ea(e,g);g=e+120|0;ya(m,e,g);b=e+40|0;h=e+80|0;ya(m+40|0,b,h);ya(m+80|0,h,g);ya(m+120|0,e,b);xa(e,m,a);ya(d,e,g);k=d+40|0;ya(k,b,h);j=d+80|0;ya(j,h,g);f=d+120|0;ya(f,e,b);l=a+160|0;Aa(l,d);xa(e,m,l);ya(d,e,g);ya(k,b,h);ya(j,h,g);ya(f,e,b);l=a+320|0;Aa(l,d);xa(e,m,l);ya(d,e,g);ya(k,b,h);ya(j,h,g);ya(f,e,b);l=a+480|0;Aa(l,d);xa(e,m,l);ya(d,e,g);ya(k,b,h);ya(j,h,g);ya(f,e,b);l=a+640|0;Aa(l,d);xa(e,m,l);ya(d,e,g);ya(k,b,h);ya(j,h,g);ya(f,e,b);l=a+800|0;Aa(l,d);xa(e,m,l);ya(d,e,g);ya(k,b,h);ya(j,h,g);ya(f,e,b);l=a+960|0;Aa(l,d);xa(e,m,l);ya(d,e,g);ya(k,b,h);ya(j,h,g);ya(f,e,b);Aa(a+1120|0,d);i=c;return}function Aa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;c=i;n=b+40|0;w=b+44|0;v=b+48|0;u=b+52|0;t=b+56|0;s=b+60|0;r=b+64|0;q=b+68|0;p=b+72|0;o=b+76|0;d=b+4|0;e=b+8|0;f=b+12|0;g=b+16|0;h=b+20|0;j=b+24|0;k=b+28|0;l=b+32|0;m=b+36|0;F=(fa(d|0,4,0,0)|0|0)+(fa(w|0,4,0,0)|0|0)|0;E=(fa(e|0,4,0,0)|0|0)+(fa(v|0,4,0,0)|0|0)|0;D=(fa(f|0,4,0,0)|0|0)+(fa(u|0,4,0,0)|0|0)|0;C=(fa(g|0,4,0,0)|0|0)+(fa(t|0,4,0,0)|0|0)|0;B=(fa(h|0,4,0,0)|0|0)+(fa(s|0,4,0,0)|0|0)|0;A=(fa(j|0,4,0,0)|0|0)+(fa(r|0,4,0,0)|0|0)|0;z=(fa(k|0,4,0,0)|0|0)+(fa(q|0,4,0,0)|0|0)|0;y=(fa(l|0,4,0,0)|0|0)+(fa(p|0,4,0,0)|0|0)|0;x=(fa(m|0,4,0,0)|0|0)+(fa(o|0,4,0,0)|0|0)|0;ga(a|0,(fa(b|0,4,0,0)|0|0)+(fa(n|0,4,0,0)|0|0)|0,4,0);ga(a+4|0,F|0,4,0);ga(a+8|0,E|0,4,0);ga(a+12|0,D|0,4,0);ga(a+16|0,C|0,4,0);ga(a+20|0,B|0,4,0);ga(a+24|0,A|0,4,0);ga(a+28|0,z|0,4,0);ga(a+32|0,y|0,4,0);ga(a+36|0,x|0,4,0);d=(fa(w|0,4,0,0)|0|0)-(fa(d|0,4,0,0)|0|0)|0;e=(fa(v|0,4,0,0)|0|0)-(fa(e|0,4,0,0)|0|0)|0;f=(fa(u|0,4,0,0)|0|0)-(fa(f|0,4,0,0)|0|0)|0;g=(fa(t|0,4,0,0)|0|0)-(fa(g|0,4,0,0)|0|0)|0;h=(fa(s|0,4,0,0)|0|0)-(fa(h|0,4,0,0)|0|0)|0;j=(fa(r|0,4,0,0)|0|0)-(fa(j|0,4,0,0)|0|0)|0;k=(fa(q|0,4,0,0)|0|0)-(fa(k|0,4,0,0)|0|0)|0;l=(fa(p|0,4,0,0)|0|0)-(fa(l|0,4,0,0)|0|0)|0;m=(fa(o|0,4,0,0)|0|0)-(fa(m|0,4,0,0)|0|0)|0;ga(a+40|0,(fa(n|0,4,0,0)|0|0)-(fa(b|0,4,0,0)|0|0)|0,4,0);ga(a+44|0,d|0,4,0);ga(a+48|0,e|0,4,0);ga(a+52|0,f|0,4,0);ga(a+56|0,g|0,4,0);ga(a+60|0,h|0,4,0);ga(a+64|0,j|0,4,0);ga(a+68|0,k|0,4,0);ga(a+72|0,l|0,4,0);ga(a+76|0,m|0,4,0);m=fa(b+84|0,4,0,0)|0|0;l=fa(b+88|0,4,0,0)|0|0;k=fa(b+92|0,4,0,0)|0|0;j=fa(b+96|0,4,0,0)|0|0;h=fa(b+100|0,4,0,0)|0|0;g=fa(b+104|0,4,0,0)|0|0;f=fa(b+108|0,4,0,0)|0|0;e=fa(b+112|0,4,0,0)|0|0;d=fa(b+116|0,4,0,0)|0|0;ga(a+80|0,fa(b+80|0,4,0,0)|0|0,4,0);ga(a+84|0,m|0,4,0);ga(a+88|0,l|0,4,0);ga(a+92|0,k|0,4,0);ga(a+96|0,j|0,4,0);ga(a+100|0,h|0,4,0);ga(a+104|0,g|0,4,0);ga(a+108|0,f|0,4,0);ga(a+112|0,e|0,4,0);ga(a+116|0,d|0,4,0);ya(a+120|0,b+120|0,320);i=c;return}function Ba(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=i;e=b+120|0;ya(a,b,e);d=b+40|0;f=b+80|0;ya(a+40|0,d,f);ya(a+80|0,f,e);ya(a+120|0,b,d);i=c;return}function Ca(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,Aa=0,Ba=0,Ca=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0;g=i;i=i+2112|0;e=g+1856|0;f=g+1600|0;k=g+320|0;h=g+160|0;j=g;Da(e,b);Da(f,d);za(k,c);l=a+0|0;b=l+40|0;do{ga(l|0,0|0,4,0);l=l+4|0}while((l|0)<(b|0));c=a+40|0;ga(c|0,1|0,4,0);l=a+44|0;b=l+36|0;do{ga(l|0,0|0,4,0);l=l+4|0}while((l|0)<(b|0));d=a+80|0;ga(d|0,1|0,4,0);l=a+84|0;b=l+36|0;do{ga(l|0,0|0,4,0);l=l+4|0}while((l|0)<(b|0));Ia=255;while(1){if((fa(e+Ia>>0|0,1,0,0)|0|0)!=0){break}b=Ia+ -1|0;if((fa(f+Ia>>0|0,1,0,0)|0|0)!=0){break}if((Ia|0)>0){Ia=b}else{Ia=b;break}}if(!((Ia|0)>-1)){i=g;return}t=h+120|0;w=j+40|0;u=h+40|0;v=h+80|0;x=j+80|0;y=j+120|0;z=j+44|0;A=j+48|0;B=j+52|0;C=j+56|0;D=j+60|0;E=j+64|0;F=j+68|0;G=j+72|0;H=j+76|0;I=j+4|0;J=j+8|0;K=j+12|0;L=j+16|0;M=j+20|0;N=j+24|0;O=j+28|0;P=j+32|0;Q=j+36|0;R=h+4|0;S=h+8|0;n=h+12|0;U=h+16|0;V=h+20|0;W=h+24|0;X=h+28|0;Y=h+32|0;Z=h+36|0;_=h+44|0;$=h+48|0;aa=h+52|0;ba=h+56|0;ca=h+60|0;da=h+64|0;ea=h+68|0;ha=h+72|0;ia=h+76|0;ja=j+84|0;ka=j+88|0;la=j+92|0;ma=j+96|0;na=j+100|0;oa=j+104|0;pa=j+108|0;qa=j+112|0;ra=j+116|0;sa=h+84|0;ta=h+88|0;ua=h+92|0;va=h+96|0;wa=h+100|0;Aa=h+104|0;Ba=h+108|0;Ca=h+112|0;Ha=h+116|0;T=h+124|0;s=h+128|0;r=h+132|0;q=h+136|0;p=h+140|0;m=h+144|0;l=h+148|0;b=h+152|0;o=h+156|0;while(1){Ea(h,a);Ja=fa(e+Ia>>0|0,1,0,0)|0|0;if(!(Ja<<24>>24>0)){if(Ja<<24>>24<0){ya(j,h,t);ya(w,u,v);ya(x,v,t);ya(y,h,u);Fa(h,j,k+(((Ja<<24>>24|0)/-2|0)*160|0)|0)}}else{ya(j,h,t);ya(w,u,v);ya(x,v,t);ya(y,h,u);xa(h,j,k+(((Ja<<24>>24|0)/2|0)*160|0)|0)}Ja=fa(f+Ia>>0|0,1,0,0)|0|0;if(!(Ja<<24>>24>0)){if(Ja<<24>>24<0){ya(j,h,t);ya(w,u,v);ya(x,v,t);ya(y,h,u);$a=(Ja<<24>>24|0)/-2|0;kb=fa(w|0,4,0,0)|0|0;Ya=fa(z|0,4,0,0)|0|0;Qa=fa(A|0,4,0,0)|0|0;bb=fa(B|0,4,0,0)|0|0;fb=fa(C|0,4,0,0)|0|0;jb=fa(D|0,4,0,0)|0|0;La=fa(E|0,4,0,0)|0|0;Pa=fa(F|0,4,0,0)|0|0;Ta=fa(G|0,4,0,0)|0|0;Xa=fa(H|0,4,0,0)|0|0;ab=fa(j|0,4,0,0)|0|0;Ua=fa(I|0,4,0,0)|0|0;Ma=fa(J|0,4,0,0)|0|0;db=fa(K|0,4,0,0)|0|0;hb=fa(L|0,4,0,0)|0|0;Ja=fa(M|0,4,0,0)|0|0;Na=fa(N|0,4,0,0)|0|0;Ra=fa(O|0,4,0,0)|0|0;Va=fa(P|0,4,0,0)|0|0;Za=fa(Q|0,4,0,0)|0|0;ga(h|0,ab+kb|0,4,0);ga(R|0,Ua+Ya|0,4,0);ga(S|0,Ma+Qa|0,4,0);ga(n|0,db+bb|0,4,0);ga(U|0,hb+fb|0,4,0);ga(V|0,Ja+jb|0,4,0);ga(W|0,Na+La|0,4,0);ga(X|0,Ra+Pa|0,4,0);ga(Y|0,Va+Ta|0,4,0);ga(Z|0,Za+Xa|0,4,0);ga(u|0,kb-ab|0,4,0);ga(_|0,Ya-Ua|0,4,0);ga($|0,Qa-Ma|0,4,0);ga(aa|0,bb-db|0,4,0);ga(ba|0,fb-hb|0,4,0);ga(ca|0,jb-Ja|0,4,0);ga(da|0,La-Na|0,4,0);ga(ea|0,Pa-Ra|0,4,0);ga(ha|0,Ta-Va|0,4,0);ga(ia|0,Xa-Za|0,4,0);ya(v,h,31120+($a*120|0)|0);ya(u,u,31080+($a*120|0)|0);ya(t,31160+($a*120|0)|0,y);$a=(fa(x|0,4,0,0)|0)<<1;Za=(fa(ja|0,4,0,0)|0)<<1;Xa=(fa(ka|0,4,0,0)|0)<<1;Va=(fa(la|0,4,0,0)|0)<<1;Ta=(fa(ma|0,4,0,0)|0)<<1;Ra=(fa(na|0,4,0,0)|0)<<1;Pa=(fa(oa|0,4,0,0)|0)<<1;Na=(fa(pa|0,4,0,0)|0)<<1;La=(fa(qa|0,4,0,0)|0)<<1;Ja=(fa(ra|0,4,0,0)|0)<<1;jb=fa(v|0,4,0,0)|0|0;hb=fa(sa|0,4,0,0)|0|0;fb=fa(ta|0,4,0,0)|0|0;db=fa(ua|0,4,0,0)|0|0;bb=fa(va|0,4,0,0)|0|0;Ma=fa(wa|0,4,0,0)|0|0;Qa=fa(Aa|0,4,0,0)|0|0;Ua=fa(Ba|0,4,0,0)|0|0;Ya=fa(Ca|0,4,0,0)|0|0;ab=fa(Ha|0,4,0,0)|0|0;kb=fa(u|0,4,0,0)|0|0;ib=fa(_|0,4,0,0)|0|0;gb=fa($|0,4,0,0)|0|0;eb=fa(aa|0,4,0,0)|0|0;cb=fa(ba|0,4,0,0)|0|0;Ka=fa(ca|0,4,0,0)|0|0;Oa=fa(da|0,4,0,0)|0|0;Sa=fa(ea|0,4,0,0)|0|0;Wa=fa(ha|0,4,0,0)|0|0;_a=fa(ia|0,4,0,0)|0|0;ga(h|0,jb-kb|0,4,0);ga(R|0,hb-ib|0,4,0);ga(S|0,fb-gb|0,4,0);ga(n|0,db-eb|0,4,0);ga(U|0,bb-cb|0,4,0);ga(V|0,Ma-Ka|0,4,0);ga(W|0,Qa-Oa|0,4,0);ga(X|0,Ua-Sa|0,4,0);ga(Y|0,Ya-Wa|0,4,0);ga(Z|0,ab-_a|0,4,0);ga(u|0,kb+jb|0,4,0);ga(_|0,ib+hb|0,4,0);ga($|0,gb+fb|0,4,0);ga(aa|0,eb+db|0,4,0);ga(ba|0,cb+bb|0,4,0);ga(ca|0,Ka+Ma|0,4,0);ga(da|0,Oa+Qa|0,4,0);ga(ea|0,Sa+Ua|0,4,0);ga(ha|0,Wa+Ya|0,4,0);ga(ia|0,_a+ab|0,4,0);ab=fa(t|0,4,0,0)|0|0;_a=fa(T|0,4,0,0)|0|0;Ya=fa(s|0,4,0,0)|0|0;Wa=fa(r|0,4,0,0)|0|0;Ua=fa(q|0,4,0,0)|0|0;Sa=fa(p|0,4,0,0)|0|0;Qa=fa(m|0,4,0,0)|0|0;Oa=fa(l|0,4,0,0)|0|0;Ma=fa(b|0,4,0,0)|0|0;Ka=fa(o|0,4,0,0)|0|0;ga(v|0,$a-ab|0,4,0);ga(sa|0,Za-_a|0,4,0);ga(ta|0,Xa-Ya|0,4,0);ga(ua|0,Va-Wa|0,4,0);ga(va|0,Ta-Ua|0,4,0);ga(wa|0,Ra-Sa|0,4,0);ga(Aa|0,Pa-Qa|0,4,0);ga(Ba|0,Na-Oa|0,4,0);ga(Ca|0,La-Ma|0,4,0);ga(Ha|0,Ja-Ka|0,4,0);ga(t|0,ab+$a|0,4,0);ga(T|0,_a+Za|0,4,0);ga(s|0,Ya+Xa|0,4,0);ga(r|0,Wa+Va|0,4,0);ga(q|0,Ua+Ta|0,4,0);ga(p|0,Sa+Ra|0,4,0);ga(m|0,Qa+Pa|0,4,0);ga(l|0,Oa+Na|0,4,0);ga(b|0,Ma+La|0,4,0);ga(o|0,Ka+Ja|0,4,0)}}else{ya(j,h,t);ya(w,u,v);ya(x,v,t);ya(y,h,u);Ga(h,j,31080+(((Ja<<24>>24|0)/2|0)*120|0)|0)}ya(a,h,t);ya(c,u,v);ya(d,v,t);if((Ia|0)>0){Ia=Ia+ -1|0}else{break}}i=g;return}function Da(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;c=i;d=0;do{ga(a+d>>0|0,(fa(b+(d>>3)>>0|0,1,0,1)|0|0)>>>(d&7)&1|0,1,0);d=d+1|0}while((d|0)!=256);b=0;do{d=a+b|0;a:do{if((fa(d>>0|0,1,0,0)|0|0)!=0){e=1;do{f=e+b|0;if((f|0)>=256){break a}h=a+f|0;j=fa(h>>0|0,1,0,0)|0|0;b:do{if(!(j<<24>>24==0)){g=fa(d>>0|0,1,0,0)|0|0;k=j<<24>>24<>0|0,j|0,1,0);ga(h>>0|0,0|0,1,0);break}g=g-k|0;if(!((g|0)>-16)){break a}ga(d>>0|0,g|0,1,0);while(1){g=a+f|0;if((fa(g>>0|0,1,0,0)|0|0)==0){break}ga(g>>0|0,0|0,1,0);f=f+1|0;if((f|0)>=256){break b}}ga(g>>0|0,1|0,1,0)}}while(0);e=e+1|0}while((e|0)<7)}}while(0);b=b+1|0}while((b|0)!=256);i=c;return}function Ea(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0;c=i;i=i+48|0;H=c;Ja(a,b);R=a+80|0;ka=b+40|0;Ja(R,ka);v=a+120|0;La(v,b+80|0);la=a+40|0;ja=(fa(b+44|0,4,0,0)|0|0)+(fa(b+4|0,4,0,0)|0|0)|0;ia=(fa(b+48|0,4,0,0)|0|0)+(fa(b+8|0,4,0,0)|0|0)|0;ha=(fa(b+52|0,4,0,0)|0|0)+(fa(b+12|0,4,0,0)|0|0)|0;ea=(fa(b+56|0,4,0,0)|0|0)+(fa(b+16|0,4,0,0)|0|0)|0;da=(fa(b+60|0,4,0,0)|0|0)+(fa(b+20|0,4,0,0)|0|0)|0;ca=(fa(b+64|0,4,0,0)|0|0)+(fa(b+24|0,4,0,0)|0|0)|0;ba=(fa(b+68|0,4,0,0)|0|0)+(fa(b+28|0,4,0,0)|0|0)|0;aa=(fa(b+72|0,4,0,0)|0|0)+(fa(b+32|0,4,0,0)|0|0)|0;$=(fa(b+76|0,4,0,0)|0|0)+(fa(b+36|0,4,0,0)|0|0)|0;ga(la|0,(fa(ka|0,4,0,0)|0|0)+(fa(b|0,4,0,0)|0|0)|0,4,0);ka=a+44|0;ga(ka|0,ja|0,4,0);ja=a+48|0;ga(ja|0,ia|0,4,0);ia=a+52|0;ga(ia|0,ha|0,4,0);ha=a+56|0;ga(ha|0,ea|0,4,0);ea=a+60|0;ga(ea|0,da|0,4,0);da=a+64|0;ga(da|0,ca|0,4,0);ca=a+68|0;ga(ca|0,ba|0,4,0);ba=a+72|0;ga(ba|0,aa|0,4,0);aa=a+76|0;ga(aa|0,$|0,4,0);Ja(H,la);$=fa(R|0,4,0,0)|0|0;Q=a+84|0;_=fa(Q|0,4,0,0)|0|0;P=a+88|0;Z=fa(P|0,4,0,0)|0|0;O=a+92|0;Y=fa(O|0,4,0,0)|0|0;N=a+96|0;X=fa(N|0,4,0,0)|0|0;M=a+100|0;W=fa(M|0,4,0,0)|0|0;L=a+104|0;V=fa(L|0,4,0,0)|0|0;K=a+108|0;U=fa(K|0,4,0,0)|0|0;J=a+112|0;T=fa(J|0,4,0,0)|0|0;I=a+116|0;S=fa(I|0,4,0,0)|0|0;u=fa(a|0,4,0,0)|0|0;F=a+4|0;s=fa(F|0,4,0,0)|0|0;D=a+8|0;q=fa(D|0,4,0,0)|0|0;B=a+12|0;o=fa(B|0,4,0,0)|0|0;z=a+16|0;m=fa(z|0,4,0,0)|0|0;x=a+20|0;k=fa(x|0,4,0,0)|0|0;e=a+24|0;h=fa(e|0,4,0,0)|0|0;j=a+28|0;f=fa(j|0,4,0,0)|0|0;n=a+32|0;d=fa(n|0,4,0,0)|0|0;r=a+36|0;b=fa(r|0,4,0,0)|0|0;G=u+$|0;E=s+_|0;C=q+Z|0;A=o+Y|0;y=m+X|0;w=k+W|0;g=h+V|0;l=f+U|0;p=d+T|0;t=b+S|0;ga(la|0,G|0,4,0);ga(ka|0,E|0,4,0);ga(ja|0,C|0,4,0);ga(ia|0,A|0,4,0);ga(ha|0,y|0,4,0);ga(ea|0,w|0,4,0);ga(da|0,g|0,4,0);ga(ca|0,l|0,4,0);ga(ba|0,p|0,4,0);ga(aa|0,t|0,4,0);u=$-u|0;s=_-s|0;q=Z-q|0;o=Y-o|0;m=X-m|0;k=W-k|0;h=V-h|0;f=U-f|0;d=T-d|0;b=S-b|0;ga(R|0,u|0,4,0);ga(Q|0,s|0,4,0);ga(P|0,q|0,4,0);ga(O|0,o|0,4,0);ga(N|0,m|0,4,0);ga(M|0,k|0,4,0);ga(L|0,h|0,4,0);ga(K|0,f|0,4,0);ga(J|0,d|0,4,0);ga(I|0,b|0,4,0);E=(fa(H+4|0,4,0,0)|0|0)-E|0;C=(fa(H+8|0,4,0,0)|0|0)-C|0;A=(fa(H+12|0,4,0,0)|0|0)-A|0;y=(fa(H+16|0,4,0,0)|0|0)-y|0;w=(fa(H+20|0,4,0,0)|0|0)-w|0;g=(fa(H+24|0,4,0,0)|0|0)-g|0;l=(fa(H+28|0,4,0,0)|0|0)-l|0;p=(fa(H+32|0,4,0,0)|0|0)-p|0;t=(fa(H+36|0,4,0,0)|0|0)-t|0;ga(a|0,(fa(H|0,4,0,0)|0|0)-G|0,4,0);ga(F|0,E|0,4,0);ga(D|0,C|0,4,0);ga(B|0,A|0,4,0);ga(z|0,y|0,4,0);ga(x|0,w|0,4,0);ga(e|0,g|0,4,0);ga(j|0,l|0,4,0);ga(n|0,p|0,4,0);ga(r|0,t|0,4,0);t=a+124|0;r=a+128|0;p=a+132|0;n=a+136|0;l=a+140|0;j=a+144|0;g=a+148|0;e=a+152|0;a=a+156|0;s=(fa(t|0,4,0,0)|0|0)-s|0;q=(fa(r|0,4,0,0)|0|0)-q|0;o=(fa(p|0,4,0,0)|0|0)-o|0;m=(fa(n|0,4,0,0)|0|0)-m|0;k=(fa(l|0,4,0,0)|0|0)-k|0;h=(fa(j|0,4,0,0)|0|0)-h|0;f=(fa(g|0,4,0,0)|0|0)-f|0;d=(fa(e|0,4,0,0)|0|0)-d|0;b=(fa(a|0,4,0,0)|0|0)-b|0;ga(v|0,(fa(v|0,4,0,0)|0|0)-u|0,4,0);ga(t|0,s|0,4,0);ga(r|0,q|0,4,0);ga(p|0,o|0,4,0);ga(n|0,m|0,4,0);ga(l|0,k|0,4,0);ga(j|0,h|0,4,0);ga(g|0,f|0,4,0);ga(e|0,d|0,4,0);ga(a|0,b|0,4,0);i=c;return}function Fa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0;d=i;Y=b+40|0;h=b+44|0;l=b+48|0;o=b+52|0;r=b+56|0;u=b+60|0;x=b+64|0;A=b+68|0;D=b+72|0;F=b+76|0;V=b+4|0;S=b+8|0;Q=b+12|0;j=b+16|0;n=b+20|0;s=b+24|0;w=b+28|0;B=b+32|0;P=b+36|0;ja=(fa(V|0,4,0,0)|0|0)+(fa(h|0,4,0,0)|0|0)|0;ia=(fa(S|0,4,0,0)|0|0)+(fa(l|0,4,0,0)|0|0)|0;ha=(fa(Q|0,4,0,0)|0|0)+(fa(o|0,4,0,0)|0|0)|0;ea=(fa(j|0,4,0,0)|0|0)+(fa(r|0,4,0,0)|0|0)|0;da=(fa(n|0,4,0,0)|0|0)+(fa(u|0,4,0,0)|0|0)|0;ca=(fa(s|0,4,0,0)|0|0)+(fa(x|0,4,0,0)|0|0)|0;ba=(fa(w|0,4,0,0)|0|0)+(fa(A|0,4,0,0)|0|0)|0;aa=(fa(B|0,4,0,0)|0|0)+(fa(D|0,4,0,0)|0|0)|0;$=(fa(P|0,4,0,0)|0|0)+(fa(F|0,4,0,0)|0|0)|0;ga(a|0,(fa(b|0,4,0,0)|0|0)+(fa(Y|0,4,0,0)|0|0)|0,4,0);ka=a+4|0;ga(ka|0,ja|0,4,0);ja=a+8|0;ga(ja|0,ia|0,4,0);ia=a+12|0;ga(ia|0,ha|0,4,0);ha=a+16|0;ga(ha|0,ea|0,4,0);ea=a+20|0;ga(ea|0,da|0,4,0);da=a+24|0;ga(da|0,ca|0,4,0);ca=a+28|0;ga(ca|0,ba|0,4,0);ba=a+32|0;ga(ba|0,aa|0,4,0);aa=a+36|0;ga(aa|0,$|0,4,0);$=a+40|0;V=(fa(h|0,4,0,0)|0|0)-(fa(V|0,4,0,0)|0|0)|0;S=(fa(l|0,4,0,0)|0|0)-(fa(S|0,4,0,0)|0|0)|0;Q=(fa(o|0,4,0,0)|0|0)-(fa(Q|0,4,0,0)|0|0)|0;j=(fa(r|0,4,0,0)|0|0)-(fa(j|0,4,0,0)|0|0)|0;n=(fa(u|0,4,0,0)|0|0)-(fa(n|0,4,0,0)|0|0)|0;s=(fa(x|0,4,0,0)|0|0)-(fa(s|0,4,0,0)|0|0)|0;w=(fa(A|0,4,0,0)|0|0)-(fa(w|0,4,0,0)|0|0)|0;B=(fa(D|0,4,0,0)|0|0)-(fa(B|0,4,0,0)|0|0)|0;P=(fa(F|0,4,0,0)|0|0)-(fa(P|0,4,0,0)|0|0)|0;ga($|0,(fa(Y|0,4,0,0)|0|0)-(fa(b|0,4,0,0)|0|0)|0,4,0);Y=a+44|0;ga(Y|0,V|0,4,0);V=a+48|0;ga(V|0,S|0,4,0);S=a+52|0;ga(S|0,Q|0,4,0);Q=a+56|0;ga(Q|0,j|0,4,0);j=a+60|0;ga(j|0,n|0,4,0);n=a+64|0;ga(n|0,s|0,4,0);s=a+68|0;ga(s|0,w|0,4,0);w=a+72|0;ga(w|0,B|0,4,0);B=a+76|0;ga(B|0,P|0,4,0);P=a+80|0;ya(P,a,c+40|0);ya($,$,c);F=a+120|0;ya(F,c+120|0,b+120|0);ya(a,b+80|0,c+80|0);D=(fa(a|0,4,0,0)|0)<<1;A=(fa(ka|0,4,0,0)|0)<<1;x=(fa(ja|0,4,0,0)|0)<<1;u=(fa(ia|0,4,0,0)|0)<<1;r=(fa(ha|0,4,0,0)|0)<<1;o=(fa(ea|0,4,0,0)|0)<<1;l=(fa(da|0,4,0,0)|0)<<1;h=(fa(ca|0,4,0,0)|0)<<1;e=(fa(ba|0,4,0,0)|0)<<1;b=(fa(aa|0,4,0,0)|0)<<1;Z=fa(P|0,4,0,0)|0|0;O=a+84|0;W=fa(O|0,4,0,0)|0|0;N=a+88|0;T=fa(N|0,4,0,0)|0|0;M=a+92|0;c=fa(M|0,4,0,0)|0|0;L=a+96|0;g=fa(L|0,4,0,0)|0|0;K=a+100|0;m=fa(K|0,4,0,0)|0|0;J=a+104|0;q=fa(J|0,4,0,0)|0|0;I=a+108|0;v=fa(I|0,4,0,0)|0|0;H=a+112|0;z=fa(H|0,4,0,0)|0|0;G=a+116|0;E=fa(G|0,4,0,0)|0|0;_=fa($|0,4,0,0)|0|0;X=fa(Y|0,4,0,0)|0|0;U=fa(V|0,4,0,0)|0|0;R=fa(S|0,4,0,0)|0|0;f=fa(Q|0,4,0,0)|0|0;k=fa(j|0,4,0,0)|0|0;p=fa(n|0,4,0,0)|0|0;t=fa(s|0,4,0,0)|0|0;y=fa(w|0,4,0,0)|0|0;C=fa(B|0,4,0,0)|0|0;ga(a|0,Z-_|0,4,0);ga(ka|0,W-X|0,4,0);ga(ja|0,T-U|0,4,0);ga(ia|0,c-R|0,4,0);ga(ha|0,g-f|0,4,0);ga(ea|0,m-k|0,4,0);ga(da|0,q-p|0,4,0);ga(ca|0,v-t|0,4,0);ga(ba|0,z-y|0,4,0);ga(aa|0,E-C|0,4,0);ga($|0,_+Z|0,4,0);ga(Y|0,X+W|0,4,0);ga(V|0,U+T|0,4,0);ga(S|0,R+c|0,4,0);ga(Q|0,f+g|0,4,0);ga(j|0,k+m|0,4,0);ga(n|0,p+q|0,4,0);ga(s|0,t+v|0,4,0);ga(w|0,y+z|0,4,0);ga(B|0,C+E|0,4,0);E=fa(F|0,4,0,0)|0|0;C=a+124|0;B=fa(C|0,4,0,0)|0|0;z=a+128|0;y=fa(z|0,4,0,0)|0|0;w=a+132|0;v=fa(w|0,4,0,0)|0|0;t=a+136|0;s=fa(t|0,4,0,0)|0|0;q=a+140|0;p=fa(q|0,4,0,0)|0|0;n=a+144|0;m=fa(n|0,4,0,0)|0|0;k=a+148|0;j=fa(k|0,4,0,0)|0|0;g=a+152|0;f=fa(g|0,4,0,0)|0|0;a=a+156|0;c=fa(a|0,4,0,0)|0|0;ga(P|0,D-E|0,4,0);ga(O|0,A-B|0,4,0);ga(N|0,x-y|0,4,0);ga(M|0,u-v|0,4,0);ga(L|0,r-s|0,4,0);ga(K|0,o-p|0,4,0);ga(J|0,l-m|0,4,0);ga(I|0,h-j|0,4,0);ga(H|0,e-f|0,4,0);ga(G|0,b-c|0,4,0);ga(F|0,E+D|0,4,0);ga(C|0,B+A|0,4,0);ga(z|0,y+x|0,4,0);ga(w|0,v+u|0,4,0);ga(t|0,s+r|0,4,0);ga(q|0,p+o|0,4,0);ga(n|0,m+l|0,4,0);ga(k|0,j+h|0,4,0);ga(g|0,f+e|0,4,0);ga(a|0,c+b|0,4,0);i=d;return}function Ga(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0;d=i;Y=b+40|0;j=b+44|0;m=b+48|0;p=b+52|0;s=b+56|0;v=b+60|0;y=b+64|0;B=b+68|0;E=b+72|0;F=b+76|0;V=b+4|0;S=b+8|0;Q=b+12|0;h=b+16|0;n=b+20|0;r=b+24|0;w=b+28|0;A=b+32|0;P=b+36|0;ja=(fa(V|0,4,0,0)|0|0)+(fa(j|0,4,0,0)|0|0)|0;ia=(fa(S|0,4,0,0)|0|0)+(fa(m|0,4,0,0)|0|0)|0;ha=(fa(Q|0,4,0,0)|0|0)+(fa(p|0,4,0,0)|0|0)|0;ea=(fa(h|0,4,0,0)|0|0)+(fa(s|0,4,0,0)|0|0)|0;da=(fa(n|0,4,0,0)|0|0)+(fa(v|0,4,0,0)|0|0)|0;ca=(fa(r|0,4,0,0)|0|0)+(fa(y|0,4,0,0)|0|0)|0;ba=(fa(w|0,4,0,0)|0|0)+(fa(B|0,4,0,0)|0|0)|0;aa=(fa(A|0,4,0,0)|0|0)+(fa(E|0,4,0,0)|0|0)|0;$=(fa(P|0,4,0,0)|0|0)+(fa(F|0,4,0,0)|0|0)|0;ga(a|0,(fa(b|0,4,0,0)|0|0)+(fa(Y|0,4,0,0)|0|0)|0,4,0);ka=a+4|0;ga(ka|0,ja|0,4,0);ja=a+8|0;ga(ja|0,ia|0,4,0);ia=a+12|0;ga(ia|0,ha|0,4,0);ha=a+16|0;ga(ha|0,ea|0,4,0);ea=a+20|0;ga(ea|0,da|0,4,0);da=a+24|0;ga(da|0,ca|0,4,0);ca=a+28|0;ga(ca|0,ba|0,4,0);ba=a+32|0;ga(ba|0,aa|0,4,0);aa=a+36|0;ga(aa|0,$|0,4,0);$=a+40|0;V=(fa(j|0,4,0,0)|0|0)-(fa(V|0,4,0,0)|0|0)|0;S=(fa(m|0,4,0,0)|0|0)-(fa(S|0,4,0,0)|0|0)|0;Q=(fa(p|0,4,0,0)|0|0)-(fa(Q|0,4,0,0)|0|0)|0;h=(fa(s|0,4,0,0)|0|0)-(fa(h|0,4,0,0)|0|0)|0;n=(fa(v|0,4,0,0)|0|0)-(fa(n|0,4,0,0)|0|0)|0;r=(fa(y|0,4,0,0)|0|0)-(fa(r|0,4,0,0)|0|0)|0;w=(fa(B|0,4,0,0)|0|0)-(fa(w|0,4,0,0)|0|0)|0;A=(fa(E|0,4,0,0)|0|0)-(fa(A|0,4,0,0)|0|0)|0;P=(fa(F|0,4,0,0)|0|0)-(fa(P|0,4,0,0)|0|0)|0;ga($|0,(fa(Y|0,4,0,0)|0|0)-(fa(b|0,4,0,0)|0|0)|0,4,0);Y=a+44|0;ga(Y|0,V|0,4,0);V=a+48|0;ga(V|0,S|0,4,0);S=a+52|0;ga(S|0,Q|0,4,0);Q=a+56|0;ga(Q|0,h|0,4,0);h=a+60|0;ga(h|0,n|0,4,0);n=a+64|0;ga(n|0,r|0,4,0);r=a+68|0;ga(r|0,w|0,4,0);w=a+72|0;ga(w|0,A|0,4,0);A=a+76|0;ga(A|0,P|0,4,0);P=a+80|0;ya(P,a,c);ya($,$,c+40|0);F=a+120|0;ya(F,c+80|0,b+120|0);E=(fa(b+80|0,4,0,0)|0)<<1;B=(fa(b+84|0,4,0,0)|0)<<1;y=(fa(b+88|0,4,0,0)|0)<<1;v=(fa(b+92|0,4,0,0)|0)<<1;s=(fa(b+96|0,4,0,0)|0)<<1;p=(fa(b+100|0,4,0,0)|0)<<1;m=(fa(b+104|0,4,0,0)|0)<<1;j=(fa(b+108|0,4,0,0)|0)<<1;f=(fa(b+112|0,4,0,0)|0)<<1;b=(fa(b+116|0,4,0,0)|0)<<1;Z=fa(P|0,4,0,0)|0|0;O=a+84|0;W=fa(O|0,4,0,0)|0|0;N=a+88|0;T=fa(N|0,4,0,0)|0|0;M=a+92|0;c=fa(M|0,4,0,0)|0|0;L=a+96|0;g=fa(L|0,4,0,0)|0|0;K=a+100|0;l=fa(K|0,4,0,0)|0|0;J=a+104|0;q=fa(J|0,4,0,0)|0|0;I=a+108|0;u=fa(I|0,4,0,0)|0|0;H=a+112|0;z=fa(H|0,4,0,0)|0|0;G=a+116|0;D=fa(G|0,4,0,0)|0|0;_=fa($|0,4,0,0)|0|0;X=fa(Y|0,4,0,0)|0|0;U=fa(V|0,4,0,0)|0|0;R=fa(S|0,4,0,0)|0|0;e=fa(Q|0,4,0,0)|0|0;k=fa(h|0,4,0,0)|0|0;o=fa(n|0,4,0,0)|0|0;t=fa(r|0,4,0,0)|0|0;x=fa(w|0,4,0,0)|0|0;C=fa(A|0,4,0,0)|0|0;ga(a|0,Z-_|0,4,0);ga(ka|0,W-X|0,4,0);ga(ja|0,T-U|0,4,0);ga(ia|0,c-R|0,4,0);ga(ha|0,g-e|0,4,0);ga(ea|0,l-k|0,4,0);ga(da|0,q-o|0,4,0);ga(ca|0,u-t|0,4,0);ga(ba|0,z-x|0,4,0);ga(aa|0,D-C|0,4,0);ga($|0,_+Z|0,4,0);ga(Y|0,X+W|0,4,0);ga(V|0,U+T|0,4,0);ga(S|0,R+c|0,4,0);ga(Q|0,e+g|0,4,0);ga(h|0,k+l|0,4,0);ga(n|0,o+q|0,4,0);ga(r|0,t+u|0,4,0);ga(w|0,x+z|0,4,0);ga(A|0,C+D|0,4,0);D=fa(F|0,4,0,0)|0|0;C=a+124|0;A=fa(C|0,4,0,0)|0|0;z=a+128|0;x=fa(z|0,4,0,0)|0|0;w=a+132|0;u=fa(w|0,4,0,0)|0|0;t=a+136|0;r=fa(t|0,4,0,0)|0|0;q=a+140|0;o=fa(q|0,4,0,0)|0|0;n=a+144|0;l=fa(n|0,4,0,0)|0|0;k=a+148|0;h=fa(k|0,4,0,0)|0|0;g=a+152|0;e=fa(g|0,4,0,0)|0|0;a=a+156|0;c=fa(a|0,4,0,0)|0|0;ga(P|0,D+E|0,4,0);ga(O|0,A+B|0,4,0);ga(N|0,x+y|0,4,0);ga(M|0,u+v|0,4,0);ga(L|0,r+s|0,4,0);ga(K|0,o+p|0,4,0);ga(J|0,l+m|0,4,0);ga(I|0,h+j|0,4,0);ga(H|0,e+f|0,4,0);ga(G|0,c+b|0,4,0);ga(F|0,E-D|0,4,0);ga(C|0,B-A|0,4,0);ga(z|0,y-x|0,4,0);ga(w|0,v-u|0,4,0);ga(t|0,s-r|0,4,0);ga(q|0,p-o|0,4,0);ga(n|0,m-l|0,4,0);ga(k|0,j-h|0,4,0);ga(g|0,f-e|0,4,0);ga(a|0,b-c|0,4,0);i=d;return}function Ha(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;d=b+120|0;ya(a,b,d);e=b+80|0;ya(a+40|0,b+40|0,e);ya(a+80|0,e,d);i=c;return}function Ia(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;h=i;i=i+192|0;f=h+160|0;c=h+120|0;t=h+80|0;d=h+40|0;e=h;k=fa(b>>0|0,1,0,1)|0|0;m=kb(fa(b+1>>0|0,1,0,1)|0|0|0,0,8)|0;l=D;oa=kb(fa(b+2>>0|0,1,0,1)|0|0|0,0,16)|0;l=l|D;B=kb(fa(b+3>>0|0,1,0,1)|0|0|0,0,24)|0;B=m|k|oa|B;l=l|D;oa=fa(b+6>>0|0,1,0,0)|0|0;k=fa(b+4>>0|0,1,0,1)|0|0;m=kb(fa(b+5>>0|0,1,0,1)|0|0|0,0,8)|0;pa=D;oa=kb(oa&255|0,0,16)|0;oa=m|k|oa;pa=pa|D;k=kb(oa|0,pa|0,6)|0;m=D;n=fa(b+9>>0|0,1,0,0)|0|0;ma=fa(b+7>>0|0,1,0,1)|0|0;o=kb(fa(b+8>>0|0,1,0,1)|0|0|0,0,8)|0;p=D;n=kb(n&255|0,0,16)|0;n=o|ma|n;p=p|D;ma=fa(b+12>>0|0,1,0,0)|0|0;o=fa(b+10>>0|0,1,0,1)|0|0;A=kb(fa(b+11>>0|0,1,0,1)|0|0|0,0,8)|0;na=D;ma=kb(ma&255|0,0,16)|0;ma=A|o|ma;na=na|D;o=kb(ma|0,na|0,3)|0;A=D;z=fa(b+15>>0|0,1,0,0)|0|0;ka=fa(b+13>>0|0,1,0,1)|0|0;u=kb(fa(b+14>>0|0,1,0,1)|0|0|0,0,8)|0;x=D;z=kb(z&255|0,0,16)|0;z=u|ka|z;x=x|D;ka=fa(b+16>>0|0,1,0,1)|0|0;u=kb(fa(b+17>>0|0,1,0,1)|0|0|0,0,8)|0;w=D;j=kb(fa(b+18>>0|0,1,0,1)|0|0|0,0,16)|0;w=w|D;y=kb(fa(b+19>>0|0,1,0,1)|0|0|0,0,24)|0;y=u|ka|j|y;w=w|D;j=fa(b+22>>0|0,1,0,0)|0|0;ka=fa(b+20>>0|0,1,0,1)|0|0;u=kb(fa(b+21>>0|0,1,0,1)|0|0|0,0,8)|0;s=D;j=kb(j&255|0,0,16)|0;j=u|ka|j;s=s|D;ka=fa(b+25>>0|0,1,0,0)|0|0;u=fa(b+23>>0|0,1,0,1)|0|0;r=kb(fa(b+24>>0|0,1,0,1)|0|0|0,0,8)|0;la=D;ka=kb(ka&255|0,0,16)|0;ka=r|u|ka;la=la|D;u=kb(ka|0,la|0,5)|0;r=D;q=fa(b+28>>0|0,1,0,0)|0|0;g=fa(b+26>>0|0,1,0,1)|0|0;ja=kb(fa(b+27>>0|0,1,0,1)|0|0|0,0,8)|0;v=D;q=kb(q&255|0,0,16)|0;q=ja|g|q;v=v|D;g=b+31|0;ja=fa(g>>0|0,1,0,0)|0|0;ia=fa(b+29>>0|0,1,0,1)|0|0;ha=kb(fa(b+30>>0|0,1,0,1)|0|0|0,0,8)|0;b=D;ja=kb(ja&255|0,0,16)|0;b=kb(ha|ia|ja|0,b|D|0,2)|0;b=b&33554428;if((b|0)==33554428&0==0&((q|0)==16777215&(v|0)==0)&((ka|0)==16777215&(la|0)==0)&((j|0)==16777215&(s|0)==0)&((y|0)==-1&(w|0)==0)&((z|0)==16777215&(x|0)==0)&((ma|0)==16777215&(na|0)==0)&((n|0)==16777215&(p|0)==0)&((oa|0)==16777215&(pa|0)==0)&(l>>>0>0|(l|0)==0&B>>>0>4294967276)){pa=-1;i=h;return pa|0}ba=kb(n|0,p|0,5)|0;oa=D;pa=kb(z|0,x|0,2)|0;da=D;ca=kb(j|0,s|0,7)|0;ia=D;j=kb(q|0,v|0,4)|0;ja=D;ha=hb(b|0,0,16777216,0)|0;ha=jb(ha|0,D|0,25)|0;ea=D;ma=sb(ha|0,ea|0,19,0)|0;ma=hb(ma|0,D|0,B|0,l|0)|0;$=D;ea=kb(ha|0,ea|0,25)|0;ha=D;la=hb(k|0,m|0,16777216,0)|0;la=jb(la|0,D|0,25)|0;Y=D;oa=hb(ba|0,oa|0,la|0,Y|0)|0;ba=D;Y=kb(la|0,Y|0,25)|0;Y=gb(k|0,m|0,Y|0,D|0)|0;la=D;na=hb(o|0,A|0,16777216,0)|0;na=jb(na|0,D|0,25)|0;_=D;k=hb(pa|0,da|0,na|0,_|0)|0;da=D;_=kb(na|0,_|0,25)|0;na=D;pa=hb(y|0,w|0,16777216,0)|0;pa=jb(pa|0,D|0,25)|0;aa=D;v=hb(ca|0,ia|0,pa|0,aa|0)|0;ia=D;aa=kb(pa|0,aa|0,25)|0;pa=D;l=hb(u|0,r|0,16777216,0)|0;l=jb(l|0,D|0,25)|0;ca=D;ja=hb(j|0,ja|0,l|0,ca|0)|0;j=D;ca=kb(l|0,ca|0,25)|0;l=D;Z=hb(ma|0,$|0,33554432,0)|0;Z=fb(Z|0,D|0,26)|0;ka=D;la=hb(Y|0,la|0,Z|0,ka|0)|0;ka=kb(Z|0,ka|0,26)|0;ka=gb(ma|0,$|0,ka|0,D|0)|0;$=hb(oa|0,ba|0,33554432,0)|0;$=fb($|0,D|0,26)|0;ma=D;Z=hb($|0,ma|0,o|0,A|0)|0;na=gb(Z|0,D|0,_|0,na|0)|0;ma=kb($|0,ma|0,26)|0;ma=gb(oa|0,ba|0,ma|0,D|0)|0;ba=hb(k|0,da|0,33554432,0)|0;ba=fb(ba|0,D|0,26)|0;oa=D;$=hb(ba|0,oa|0,y|0,w|0)|0;pa=gb($|0,D|0,aa|0,pa|0)|0;oa=kb(ba|0,oa|0,26)|0;oa=gb(k|0,da|0,oa|0,D|0)|0;da=hb(v|0,ia|0,33554432,0)|0;da=fb(da|0,D|0,26)|0;k=D;u=hb(da|0,k|0,u|0,r|0)|0;l=gb(u|0,D|0,ca|0,l|0)|0;k=kb(da|0,k|0,26)|0;k=gb(v|0,ia|0,k|0,D|0)|0;ia=hb(ja|0,j|0,33554432,0)|0;ia=fb(ia|0,D|0,26)|0;v=D;u=hb(b|0,0,ia|0,v|0)|0;u=gb(u|0,D|0,ea|0,ha|0)|0;v=kb(ia|0,v|0,26)|0;v=gb(ja|0,j|0,v|0,D|0)|0;j=a+40|0;ga(j|0,ka|0,4,0);ga(a+44|0,la|0,4,0);ga(a+48|0,ma|0,4,0);ga(a+52|0,na|0,4,0);ga(a+56|0,oa|0,4,0);ga(a+60|0,pa|0,4,0);ga(a+64|0,k|0,4,0);ga(a+68|0,l|0,4,0);ga(a+72|0,v|0,4,0);ga(a+76|0,u|0,4,0);u=a+80|0;ga(u|0,1|0,4,0);v=a+84|0;l=v+0|0;k=l+36|0;do{ga(l|0,0|0,4,0);l=l+4|0}while((l|0)<(k|0));Ja(c,j);ya(t,c,240);r=c+4|0;s=c+8|0;k=c+12|0;l=c+16|0;m=c+20|0;n=c+24|0;o=c+28|0;p=c+32|0;q=c+36|0;E=fa(u|0,4,0,0)|0|0;oa=fa(v|0,4,0,0)|0|0;ca=fa(a+88|0,4,0,0)|0|0;I=fa(a+92|0,4,0,0)|0|0;G=fa(a+96|0,4,0,0)|0|0;C=fa(a+100|0,4,0,0)|0|0;B=fa(a+104|0,4,0,0)|0|0;z=fa(a+108|0,4,0,0)|0|0;x=fa(a+112|0,4,0,0)|0|0;v=fa(a+116|0,4,0,0)|0|0;w=(fa(r|0,4,0,0)|0|0)-oa|0;y=(fa(s|0,4,0,0)|0|0)-ca|0;A=(fa(k|0,4,0,0)|0|0)-I|0;b=(fa(l|0,4,0,0)|0|0)-G|0;F=(fa(m|0,4,0,0)|0|0)-C|0;H=(fa(n|0,4,0,0)|0|0)-B|0;V=(fa(o|0,4,0,0)|0|0)-z|0;pa=(fa(p|0,4,0,0)|0|0)-x|0;J=(fa(q|0,4,0,0)|0|0)-v|0;ga(c|0,(fa(c|0,4,0,0)|0|0)-E|0,4,0);ga(r|0,w|0,4,0);ga(s|0,y|0,4,0);ga(k|0,A|0,4,0);ga(l|0,b|0,4,0);ga(m|0,F|0,4,0);ga(n|0,H|0,4,0);ga(o|0,V|0,4,0);ga(p|0,pa|0,4,0);ga(q|0,J|0,4,0);J=t+4|0;pa=t+8|0;V=t+12|0;H=t+16|0;F=t+20|0;b=t+24|0;A=t+28|0;y=t+32|0;w=t+36|0;oa=oa+(fa(J|0,4,0,0)|0|0)|0;ca=ca+(fa(pa|0,4,0,0)|0|0)|0;I=I+(fa(V|0,4,0,0)|0|0)|0;G=G+(fa(H|0,4,0,0)|0|0)|0;C=C+(fa(F|0,4,0,0)|0|0)|0;B=B+(fa(b|0,4,0,0)|0|0)|0;z=z+(fa(A|0,4,0,0)|0|0)|0;x=x+(fa(y|0,4,0,0)|0|0)|0;v=v+(fa(w|0,4,0,0)|0|0)|0;ga(t|0,E+(fa(t|0,4,0,0)|0|0)|0,4,0);ga(J|0,oa|0,4,0);ga(pa|0,ca|0,4,0);ga(V|0,I|0,4,0);ga(H|0,G|0,4,0);ga(F|0,C|0,4,0);ga(b|0,B|0,4,0);ga(A|0,z|0,4,0);ga(y|0,x|0,4,0);ga(w|0,v|0,4,0);Ka(a,c,t);Ja(d,a);ya(d,d,t);v=d+4|0;w=d+8|0;x=d+12|0;y=d+16|0;z=d+20|0;A=d+24|0;B=d+28|0;b=d+32|0;C=d+36|0;F=(fa(v|0,4,0,0)|0|0)-(fa(r|0,4,0,0)|0|0)|0;G=(fa(w|0,4,0,0)|0|0)-(fa(s|0,4,0,0)|0|0)|0;H=(fa(x|0,4,0,0)|0|0)-(fa(k|0,4,0,0)|0|0)|0;I=(fa(y|0,4,0,0)|0|0)-(fa(l|0,4,0,0)|0|0)|0;V=(fa(z|0,4,0,0)|0|0)-(fa(m|0,4,0,0)|0|0)|0;ca=(fa(A|0,4,0,0)|0|0)-(fa(n|0,4,0,0)|0|0)|0;pa=(fa(B|0,4,0,0)|0|0)-(fa(o|0,4,0,0)|0|0)|0;oa=(fa(b|0,4,0,0)|0|0)-(fa(p|0,4,0,0)|0|0)|0;J=(fa(C|0,4,0,0)|0|0)-(fa(q|0,4,0,0)|0|0)|0;ga(e|0,(fa(d|0,4,0,0)|0|0)-(fa(c|0,4,0,0)|0|0)|0,4,0);E=e+4|0;ga(E|0,F|0,4,0);F=e+8|0;ga(F|0,G|0,4,0);G=e+12|0;ga(G|0,H|0,4,0);H=e+16|0;ga(H|0,I|0,4,0);I=e+20|0;ga(I|0,V|0,4,0);V=e+24|0;ga(V|0,ca|0,4,0);ca=e+28|0;ga(ca|0,pa|0,4,0);pa=e+32|0;ga(pa|0,oa|0,4,0);oa=e+36|0;ga(oa|0,J|0,4,0);Oa(f,e);J=f+1|0;K=f+2|0;L=f+3|0;M=f+4|0;N=f+5|0;O=f+6|0;P=f+7|0;Q=f+8|0;R=f+9|0;S=f+10|0;T=f+11|0;U=f+12|0;u=f+13|0;W=f+14|0;X=f+15|0;Y=f+16|0;Z=f+17|0;_=f+18|0;$=f+19|0;aa=f+20|0;ba=f+21|0;t=f+22|0;da=f+23|0;ea=f+24|0;ha=f+25|0;ia=f+26|0;ja=f+27|0;ka=f+28|0;la=f+29|0;ma=f+30|0;na=f+31|0;do{if(!((((fa(J>>0|0,1,0,0)|0|(fa(f>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(L>>0|0,1,0,0)|0)|(fa(M>>0|0,1,0,0)|0)|(fa(N>>0|0,1,0,0)|0)|(fa(O>>0|0,1,0,0)|0)|(fa(P>>0|0,1,0,0)|0)|(fa(Q>>0|0,1,0,0)|0)|(fa(R>>0|0,1,0,0)|0)|(fa(S>>0|0,1,0,0)|0)|(fa(T>>0|0,1,0,0)|0)|(fa(U>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(W>>0|0,1,0,0)|0)|(fa(X>>0|0,1,0,0)|0)|(fa(Y>>0|0,1,0,0)|0)|(fa(Z>>0|0,1,0,0)|0)|(fa(_>>0|0,1,0,0)|0)|(fa($>>0|0,1,0,0)|0)|(fa(aa>>0|0,1,0,0)|0)|(fa(ba>>0|0,1,0,0)|0)|(fa(t>>0|0,1,0,0)|0)|(fa(da>>0|0,1,0,0)|0)|(fa(ea>>0|0,1,0,0)|0)|(fa(ha>>0|0,1,0,0)|0)|(fa(ia>>0|0,1,0,0)|0)|(fa(ja>>0|0,1,0,0)|0)|(fa(ka>>0|0,1,0,0)|0)|(fa(la>>0|0,1,0,0)|0)|(fa(ma>>0|0,1,0,0)|0)|(fa(na>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256)){v=(fa(r|0,4,0,0)|0|0)+(fa(v|0,4,0,0)|0|0)|0;w=(fa(s|0,4,0,0)|0|0)+(fa(w|0,4,0,0)|0|0)|0;x=(fa(k|0,4,0,0)|0|0)+(fa(x|0,4,0,0)|0|0)|0;y=(fa(l|0,4,0,0)|0|0)+(fa(y|0,4,0,0)|0|0)|0;z=(fa(m|0,4,0,0)|0|0)+(fa(z|0,4,0,0)|0|0)|0;A=(fa(n|0,4,0,0)|0|0)+(fa(A|0,4,0,0)|0|0)|0;B=(fa(o|0,4,0,0)|0|0)+(fa(B|0,4,0,0)|0|0)|0;b=(fa(p|0,4,0,0)|0|0)+(fa(b|0,4,0,0)|0|0)|0;C=(fa(q|0,4,0,0)|0|0)+(fa(C|0,4,0,0)|0|0)|0;ga(e|0,(fa(c|0,4,0,0)|0|0)+(fa(d|0,4,0,0)|0|0)|0,4,0);ga(E|0,v|0,4,0);ga(F|0,w|0,4,0);ga(G|0,x|0,4,0);ga(H|0,y|0,4,0);ga(I|0,z|0,4,0);ga(V|0,A|0,4,0);ga(ca|0,B|0,4,0);ga(pa|0,b|0,4,0);ga(oa|0,C|0,4,0);Oa(f,e);if((((fa(J>>0|0,1,0,0)|0|(fa(f>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(L>>0|0,1,0,0)|0)|(fa(M>>0|0,1,0,0)|0)|(fa(N>>0|0,1,0,0)|0)|(fa(O>>0|0,1,0,0)|0)|(fa(P>>0|0,1,0,0)|0)|(fa(Q>>0|0,1,0,0)|0)|(fa(R>>0|0,1,0,0)|0)|(fa(S>>0|0,1,0,0)|0)|(fa(T>>0|0,1,0,0)|0)|(fa(U>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(W>>0|0,1,0,0)|0)|(fa(X>>0|0,1,0,0)|0)|(fa(Y>>0|0,1,0,0)|0)|(fa(Z>>0|0,1,0,0)|0)|(fa(_>>0|0,1,0,0)|0)|(fa($>>0|0,1,0,0)|0)|(fa(aa>>0|0,1,0,0)|0)|(fa(ba>>0|0,1,0,0)|0)|(fa(t>>0|0,1,0,0)|0)|(fa(da>>0|0,1,0,0)|0)|(fa(ea>>0|0,1,0,0)|0)|(fa(ha>>0|0,1,0,0)|0)|(fa(ia>>0|0,1,0,0)|0)|(fa(ja>>0|0,1,0,0)|0)|(fa(ka>>0|0,1,0,0)|0)|(fa(la>>0|0,1,0,0)|0)|(fa(ma>>0|0,1,0,0)|0)|(fa(na>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256){ya(a,a,280);break}else{pa=-1;i=h;return pa|0}}}while(0);Oa(f,a);do{if(((fa(f>>0|0,1,0,0)|0)&1|0)!=((fa(g>>0|0,1,0,1)|0|0)>>>7|0)){Oa(f,a);if((((fa(J>>0|0,1,0,0)|0|(fa(f>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(L>>0|0,1,0,0)|0)|(fa(M>>0|0,1,0,0)|0)|(fa(N>>0|0,1,0,0)|0)|(fa(O>>0|0,1,0,0)|0)|(fa(P>>0|0,1,0,0)|0)|(fa(Q>>0|0,1,0,0)|0)|(fa(R>>0|0,1,0,0)|0)|(fa(S>>0|0,1,0,0)|0)|(fa(T>>0|0,1,0,0)|0)|(fa(U>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(W>>0|0,1,0,0)|0)|(fa(X>>0|0,1,0,0)|0)|(fa(Y>>0|0,1,0,0)|0)|(fa(Z>>0|0,1,0,0)|0)|(fa(_>>0|0,1,0,0)|0)|(fa($>>0|0,1,0,0)|0)|(fa(aa>>0|0,1,0,0)|0)|(fa(ba>>0|0,1,0,0)|0)|(fa(t>>0|0,1,0,0)|0)|(fa(da>>0|0,1,0,0)|0)|(fa(ea>>0|0,1,0,0)|0)|(fa(ha>>0|0,1,0,0)|0)|(fa(ia>>0|0,1,0,0)|0)|(fa(ja>>0|0,1,0,0)|0)|(fa(ka>>0|0,1,0,0)|0)|(fa(la>>0|0,1,0,0)|0)|(fa(ma>>0|0,1,0,0)|0)|(fa(na>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256){pa=-1;i=h;return pa|0}else{Y=a+4|0;_=a+8|0;aa=a+12|0;ca=a+16|0;ea=a+20|0;ia=a+24|0;ka=a+28|0;ma=a+32|0;oa=a+36|0;Z=0-(fa(Y|0,4,0,0)|0|0)|0;$=0-(fa(_|0,4,0,0)|0|0)|0;ba=0-(fa(aa|0,4,0,0)|0|0)|0;da=0-(fa(ca|0,4,0,0)|0|0)|0;ha=0-(fa(ea|0,4,0,0)|0|0)|0;ja=0-(fa(ia|0,4,0,0)|0|0)|0;la=0-(fa(ka|0,4,0,0)|0|0)|0;na=0-(fa(ma|0,4,0,0)|0|0)|0;pa=0-(fa(oa|0,4,0,0)|0|0)|0;ga(a|0,0-(fa(a|0,4,0,0)|0|0)|0,4,0);ga(Y|0,Z|0,4,0);ga(_|0,$|0,4,0);ga(aa|0,ba|0,4,0);ga(ca|0,da|0,4,0);ga(ea|0,ha|0,4,0);ga(ia|0,ja|0,4,0);ga(ka|0,la|0,4,0);ga(ma|0,na|0,4,0);ga(oa|0,pa|0,4,0);break}}}while(0);ya(a+120|0,a,j);pa=0;i=h;return pa|0}function Ja(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,ib=0,jb=0,lb=0,mb=0,nb=0;c=i;eb=fa(b|0,4,0,0)|0|0;xa=fa(b+4|0,4,0,0)|0|0;k=fa(b+8|0,4,0,0)|0|0;oa=fa(b+12|0,4,0,0)|0|0;e=fa(b+16|0,4,0,0)|0|0;jb=fa(b+20|0,4,0,0)|0|0;Z=fa(b+24|0,4,0,0)|0|0;Oa=fa(b+28|0,4,0,0)|0|0;h=fa(b+32|0,4,0,0)|0|0;b=fa(b+36|0,4,0,0)|0|0;m=eb<<1;q=xa<<1;_a=k<<1;f=oa<<1;qa=e<<1;C=jb<<1;n=Z<<1;j=Oa<<1;Na=jb*38|0;ua=Z*19|0;ya=Oa*38|0;ea=h*19|0;nb=b*38|0;ib=((eb|0)<0)<<31>>31;ib=sb(eb|0,ib|0,eb|0,ib|0)|0;eb=D;p=((m|0)<0)<<31>>31;wa=((xa|0)<0)<<31>>31;La=sb(m|0,p|0,xa|0,wa|0)|0;Ka=D;l=((k|0)<0)<<31>>31;Za=sb(k|0,l|0,m|0,p|0)|0;Ya=D;pa=((oa|0)<0)<<31>>31;Xa=sb(oa|0,pa|0,m|0,p|0)|0;Wa=D;E=((e|0)<0)<<31>>31;Ra=sb(e|0,E|0,m|0,p|0)|0;Qa=D;lb=((jb|0)<0)<<31>>31;Ba=sb(jb|0,lb|0,m|0,p|0)|0;Aa=D;g=((Z|0)<0)<<31>>31;ja=sb(Z|0,g|0,m|0,p|0)|0;ia=D;Pa=((Oa|0)<0)<<31>>31;S=sb(Oa|0,Pa|0,m|0,p|0)|0;R=D;B=((h|0)<0)<<31>>31;G=sb(h|0,B|0,m|0,p|0)|0;F=D;r=((b|0)<0)<<31>>31;p=sb(b|0,r|0,m|0,p|0)|0;m=D;o=((q|0)<0)<<31>>31;wa=sb(q|0,o|0,xa|0,wa|0)|0;xa=D;ca=sb(q|0,o|0,k|0,l|0)|0;da=D;Q=((f|0)<0)<<31>>31;Va=sb(f|0,Q|0,q|0,o|0)|0;Ua=D;Fa=sb(e|0,E|0,q|0,o|0)|0;Ea=D;d=((C|0)<0)<<31>>31;la=sb(C|0,d|0,q|0,o|0)|0;ka=D;U=sb(Z|0,g|0,q|0,o|0)|0;T=D;P=((j|0)<0)<<31>>31;I=sb(j|0,P|0,q|0,o|0)|0;H=D;u=sb(h|0,B|0,q|0,o|0)|0;t=D;mb=((nb|0)<0)<<31>>31;o=sb(nb|0,mb|0,q|0,o|0)|0;q=D;Ta=sb(k|0,l|0,k|0,l|0)|0;Sa=D;$a=((_a|0)<0)<<31>>31;Da=sb(_a|0,$a|0,oa|0,pa|0)|0;Ca=D;na=sb(e|0,E|0,_a|0,$a|0)|0;ma=D;Y=sb(jb|0,lb|0,_a|0,$a|0)|0;X=D;O=sb(Z|0,g|0,_a|0,$a|0)|0;N=D;w=sb(Oa|0,Pa|0,_a|0,$a|0)|0;v=D;ha=((ea|0)<0)<<31>>31;$a=sb(ea|0,ha|0,_a|0,$a|0)|0;_a=D;l=sb(nb|0,mb|0,k|0,l|0)|0;k=D;pa=sb(f|0,Q|0,oa|0,pa|0)|0;oa=D;W=sb(f|0,Q|0,e|0,E|0)|0;V=D;K=sb(C|0,d|0,f|0,Q|0)|0;J=D;A=sb(Z|0,g|0,f|0,Q|0)|0;z=D;za=((ya|0)<0)<<31>>31;bb=sb(ya|0,za|0,f|0,Q|0)|0;ab=D;Ha=sb(ea|0,ha|0,f|0,Q|0)|0;Ga=D;Q=sb(nb|0,mb|0,f|0,Q|0)|0;f=D;M=sb(e|0,E|0,e|0,E|0)|0;L=D;ra=((qa|0)<0)<<31>>31;y=sb(qa|0,ra|0,jb|0,lb|0)|0;x=D;va=((ua|0)<0)<<31>>31;db=sb(ua|0,va|0,qa|0,ra|0)|0;cb=D;Ja=sb(ya|0,za|0,e|0,E|0)|0;Ia=D;ra=sb(ea|0,ha|0,qa|0,ra|0)|0;qa=D;E=sb(nb|0,mb|0,e|0,E|0)|0;e=D;lb=sb(Na|0,((Na|0)<0)<<31>>31|0,jb|0,lb|0)|0;jb=D;Na=sb(ua|0,va|0,C|0,d|0)|0;Ma=D;ta=sb(ya|0,za|0,C|0,d|0)|0;sa=D;$=sb(ea|0,ha|0,C|0,d|0)|0;_=D;d=sb(nb|0,mb|0,C|0,d|0)|0;C=D;va=sb(ua|0,va|0,Z|0,g|0)|0;ua=D;ba=sb(ya|0,za|0,Z|0,g|0)|0;aa=D;n=sb(ea|0,ha|0,n|0,((n|0)<0)<<31>>31|0)|0;s=D;g=sb(nb|0,mb|0,Z|0,g|0)|0;Z=D;Pa=sb(ya|0,za|0,Oa|0,Pa|0)|0;Oa=D;za=sb(ea|0,ha|0,j|0,P|0)|0;ya=D;P=sb(nb|0,mb|0,j|0,P|0)|0;j=D;ha=sb(ea|0,ha|0,h|0,B|0)|0;ea=D;B=sb(nb|0,mb|0,h|0,B|0)|0;h=D;r=sb(nb|0,mb|0,b|0,r|0)|0;b=D;eb=hb(lb|0,jb|0,ib|0,eb|0)|0;cb=hb(eb|0,D|0,db|0,cb|0)|0;ab=hb(cb|0,D|0,bb|0,ab|0)|0;_a=hb(ab|0,D|0,$a|0,_a|0)|0;q=hb(_a|0,D|0,o|0,q|0)|0;o=D;xa=hb(Za|0,Ya|0,wa|0,xa|0)|0;wa=D;da=hb(Xa|0,Wa|0,ca|0,da|0)|0;ca=D;Sa=hb(Va|0,Ua|0,Ta|0,Sa|0)|0;Qa=hb(Sa|0,D|0,Ra|0,Qa|0)|0;Oa=hb(Qa|0,D|0,Pa|0,Oa|0)|0;s=hb(Oa|0,D|0,n|0,s|0)|0;C=hb(s|0,D|0,d|0,C|0)|0;d=D;s=hb(q|0,o|0,33554432,0)|0;s=fb(s|0,D|0,26)|0;n=D;Ka=hb(Na|0,Ma|0,La|0,Ka|0)|0;Ia=hb(Ka|0,D|0,Ja|0,Ia|0)|0;Ga=hb(Ia|0,D|0,Ha|0,Ga|0)|0;k=hb(Ga|0,D|0,l|0,k|0)|0;k=hb(k|0,D|0,s|0,n|0)|0;l=D;n=kb(s|0,n|0,26)|0;n=gb(q|0,o|0,n|0,D|0)|0;o=D;q=hb(C|0,d|0,33554432,0)|0;q=fb(q|0,D|0,26)|0;s=D;Ca=hb(Fa|0,Ea|0,Da|0,Ca|0)|0;Aa=hb(Ca|0,D|0,Ba|0,Aa|0)|0;ya=hb(Aa|0,D|0,za|0,ya|0)|0;Z=hb(ya|0,D|0,g|0,Z|0)|0;Z=hb(Z|0,D|0,q|0,s|0)|0;g=D;s=kb(q|0,s|0,26)|0;s=gb(C|0,d|0,s|0,D|0)|0;d=D;C=hb(k|0,l|0,16777216,0)|0;C=fb(C|0,D|0,25)|0;q=D;ua=hb(xa|0,wa|0,va|0,ua|0)|0;sa=hb(ua|0,D|0,ta|0,sa|0)|0;qa=hb(sa|0,D|0,ra|0,qa|0)|0;f=hb(qa|0,D|0,Q|0,f|0)|0;f=hb(f|0,D|0,C|0,q|0)|0;Q=D;q=kb(C|0,q|0,25)|0;q=gb(k|0,l|0,q|0,D|0)|0;l=D;k=hb(Z|0,g|0,16777216,0)|0;k=fb(k|0,D|0,25)|0;C=D;ma=hb(pa|0,oa|0,na|0,ma|0)|0;ka=hb(ma|0,D|0,la|0,ka|0)|0;ia=hb(ka|0,D|0,ja|0,ia|0)|0;ea=hb(ia|0,D|0,ha|0,ea|0)|0;j=hb(ea|0,D|0,P|0,j|0)|0;j=hb(j|0,D|0,k|0,C|0)|0;P=D;C=kb(k|0,C|0,25)|0;C=gb(Z|0,g|0,C|0,D|0)|0;g=D;Z=hb(f|0,Q|0,33554432,0)|0;Z=fb(Z|0,D|0,26)|0;k=D;aa=hb(da|0,ca|0,ba|0,aa|0)|0;_=hb(aa|0,D|0,$|0,_|0)|0;e=hb(_|0,D|0,E|0,e|0)|0;e=hb(e|0,D|0,Z|0,k|0)|0;E=D;k=kb(Z|0,k|0,26)|0;k=gb(f|0,Q|0,k|0,D|0)|0;Q=hb(j|0,P|0,33554432,0)|0;Q=fb(Q|0,D|0,26)|0;f=D;V=hb(Y|0,X|0,W|0,V|0)|0;T=hb(V|0,D|0,U|0,T|0)|0;R=hb(T|0,D|0,S|0,R|0)|0;h=hb(R|0,D|0,B|0,h|0)|0;h=hb(h|0,D|0,Q|0,f|0)|0;B=D;f=kb(Q|0,f|0,26)|0;f=gb(j|0,P|0,f|0,D|0)|0;P=hb(e|0,E|0,16777216,0)|0;P=fb(P|0,D|0,25)|0;j=D;d=hb(P|0,j|0,s|0,d|0)|0;s=D;j=kb(P|0,j|0,25)|0;j=gb(e|0,E|0,j|0,D|0)|0;E=hb(h|0,B|0,16777216,0)|0;E=fb(E|0,D|0,25)|0;e=D;L=hb(O|0,N|0,M|0,L|0)|0;J=hb(L|0,D|0,K|0,J|0)|0;H=hb(J|0,D|0,I|0,H|0)|0;F=hb(H|0,D|0,G|0,F|0)|0;b=hb(F|0,D|0,r|0,b|0)|0;b=hb(b|0,D|0,E|0,e|0)|0;r=D;e=kb(E|0,e|0,25)|0;e=gb(h|0,B|0,e|0,D|0)|0;B=hb(d|0,s|0,33554432,0)|0;B=fb(B|0,D|0,26)|0;h=D;g=hb(C|0,g|0,B|0,h|0)|0;h=kb(B|0,h|0,26)|0;h=gb(d|0,s|0,h|0,D|0)|0;s=hb(b|0,r|0,33554432,0)|0;s=fb(s|0,D|0,26)|0;d=D;x=hb(A|0,z|0,y|0,x|0)|0;v=hb(x|0,D|0,w|0,v|0)|0;t=hb(v|0,D|0,u|0,t|0)|0;m=hb(t|0,D|0,p|0,m|0)|0;m=hb(m|0,D|0,s|0,d|0)|0;p=D;d=kb(s|0,d|0,26)|0;d=gb(b|0,r|0,d|0,D|0)|0;r=hb(m|0,p|0,16777216,0)|0;r=fb(r|0,D|0,25)|0;b=D;s=sb(r|0,b|0,19,0)|0;o=hb(s|0,D|0,n|0,o|0)|0;n=D;b=kb(r|0,b|0,25)|0;b=gb(m|0,p|0,b|0,D|0)|0;p=hb(o|0,n|0,33554432,0)|0;p=fb(p|0,D|0,26)|0;m=D;l=hb(q|0,l|0,p|0,m|0)|0;m=kb(p|0,m|0,26)|0;m=gb(o|0,n|0,m|0,D|0)|0;ga(a|0,m|0,4,0);ga(a+4|0,l|0,4,0);ga(a+8|0,k|0,4,0);ga(a+12|0,j|0,4,0);ga(a+16|0,h|0,4,0);ga(a+20|0,g|0,4,0);ga(a+24|0,f|0,4,0);ga(a+28|0,e|0,4,0);ga(a+32|0,d|0,4,0);ga(a+36|0,b|0,4,0);i=c;return}function Ka(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0;g=i;i=i+208|0;f=g+160|0;e=g+120|0;h=g+80|0;d=g+40|0;j=g;Ja(f,c);ya(f,f,c);Ja(e,f);ya(e,e,c);ya(e,e,b);Ja(h,e);Ja(d,h);Ja(d,d);ya(d,e,d);ya(h,h,d);Ja(h,h);ya(h,d,h);Ja(d,h);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);ya(h,d,h);Ja(d,h);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);ya(d,d,h);Ja(j,d);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);Ja(j,j);ya(d,j,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);ya(h,d,h);Ja(d,h);c=0;do{Ja(d,d);c=c+1|0}while((c|0)!=49);ya(d,d,h);Ja(j,d);c=0;do{Ja(j,j);c=c+1|0}while((c|0)!=99);ya(d,j,d);j=0;do{Ja(d,d);j=j+1|0}while((j|0)!=50);ya(h,d,h);Ja(h,h);Ja(h,h);ya(h,h,e);ya(h,h,f);ya(a,h,b);i=g;return}function La(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,ib=0,jb=0,lb=0,mb=0,nb=0;c=i;eb=fa(b|0,4,0,0)|0|0;Oa=fa(b+4|0,4,0,0)|0|0;k=fa(b+8|0,4,0,0)|0|0;ea=fa(b+12|0,4,0,0)|0|0;e=fa(b+16|0,4,0,0)|0|0;jb=fa(b+20|0,4,0,0)|0|0;y=fa(b+24|0,4,0,0)|0|0;sa=fa(b+28|0,4,0,0)|0|0;h=fa(b+32|0,4,0,0)|0|0;b=fa(b+36|0,4,0,0)|0|0;m=eb<<1;o=Oa<<1;_a=k<<1;f=ea<<1;Ia=e<<1;d=jb<<1;ra=y<<1;j=sa<<1;Za=jb*38|0;Ma=y*19|0;ia=sa*38|0;Y=h*19|0;nb=b*38|0;ib=((eb|0)<0)<<31>>31;ib=sb(eb|0,ib|0,eb|0,ib|0)|0;eb=D;p=((m|0)<0)<<31>>31;Pa=((Oa|0)<0)<<31>>31;Xa=sb(m|0,p|0,Oa|0,Pa|0)|0;Wa=D;l=((k|0)<0)<<31>>31;Ra=sb(k|0,l|0,m|0,p|0)|0;Qa=D;ha=((ea|0)<0)<<31>>31;Ha=sb(ea|0,ha|0,m|0,p|0)|0;Ga=D;v=((e|0)<0)<<31>>31;va=sb(e|0,v|0,m|0,p|0)|0;ua=D;lb=((jb|0)<0)<<31>>31;la=sb(jb|0,lb|0,m|0,p|0)|0;ka=D;g=((y|0)<0)<<31>>31;$=sb(y|0,g|0,m|0,p|0)|0;_=D;ta=((sa|0)<0)<<31>>31;R=sb(sa|0,ta|0,m|0,p|0)|0;Q=D;t=((h|0)<0)<<31>>31;H=sb(h|0,t|0,m|0,p|0)|0;G=D;r=((b|0)<0)<<31>>31;p=sb(b|0,r|0,m|0,p|0)|0;m=D;q=((o|0)<0)<<31>>31;Pa=sb(o|0,q|0,Oa|0,Pa|0)|0;Oa=D;Fa=sb(o|0,q|0,k|0,l|0)|0;Ea=D;x=((f|0)<0)<<31>>31;za=sb(f|0,x|0,o|0,q|0)|0;ya=D;pa=sb(e|0,v|0,o|0,q|0)|0;oa=D;u=((d|0)<0)<<31>>31;ba=sb(d|0,u|0,o|0,q|0)|0;aa=D;T=sb(y|0,g|0,o|0,q|0)|0;S=D;w=((j|0)<0)<<31>>31;J=sb(j|0,w|0,o|0,q|0)|0;I=D;n=sb(h|0,t|0,o|0,q|0)|0;s=D;mb=((nb|0)<0)<<31>>31;q=sb(nb|0,mb|0,o|0,q|0)|0;o=D;xa=sb(k|0,l|0,k|0,l|0)|0;wa=D;$a=((_a|0)<0)<<31>>31;na=sb(_a|0,$a|0,ea|0,ha|0)|0;ma=D;da=sb(e|0,v|0,_a|0,$a|0)|0;ca=D;X=sb(jb|0,lb|0,_a|0,$a|0)|0;W=D;P=sb(y|0,g|0,_a|0,$a|0)|0;O=D;A=sb(sa|0,ta|0,_a|0,$a|0)|0;z=D;Z=((Y|0)<0)<<31>>31;$a=sb(Y|0,Z|0,_a|0,$a|0)|0;_a=D;l=sb(nb|0,mb|0,k|0,l|0)|0;k=D;ha=sb(f|0,x|0,ea|0,ha|0)|0;ea=D;V=sb(f|0,x|0,e|0,v|0)|0;U=D;L=sb(d|0,u|0,f|0,x|0)|0;K=D;F=sb(y|0,g|0,f|0,x|0)|0;E=D;ja=((ia|0)<0)<<31>>31;bb=sb(ia|0,ja|0,f|0,x|0)|0;ab=D;Ta=sb(Y|0,Z|0,f|0,x|0)|0;Sa=D;x=sb(nb|0,mb|0,f|0,x|0)|0;f=D;N=sb(e|0,v|0,e|0,v|0)|0;M=D;Ja=((Ia|0)<0)<<31>>31;C=sb(Ia|0,Ja|0,jb|0,lb|0)|0;B=D;Na=((Ma|0)<0)<<31>>31;db=sb(Ma|0,Na|0,Ia|0,Ja|0)|0;cb=D;Va=sb(ia|0,ja|0,e|0,v|0)|0;Ua=D;Ja=sb(Y|0,Z|0,Ia|0,Ja|0)|0;Ia=D;v=sb(nb|0,mb|0,e|0,v|0)|0;e=D;lb=sb(Za|0,((Za|0)<0)<<31>>31|0,jb|0,lb|0)|0;jb=D;Za=sb(Ma|0,Na|0,d|0,u|0)|0;Ya=D;La=sb(ia|0,ja|0,d|0,u|0)|0;Ka=D;Ba=sb(Y|0,Z|0,d|0,u|0)|0;Aa=D;u=sb(nb|0,mb|0,d|0,u|0)|0;d=D;Na=sb(Ma|0,Na|0,y|0,g|0)|0;Ma=D;Da=sb(ia|0,ja|0,y|0,g|0)|0;Ca=D;ra=sb(Y|0,Z|0,ra|0,((ra|0)<0)<<31>>31|0)|0;qa=D;g=sb(nb|0,mb|0,y|0,g|0)|0;y=D;ta=sb(ia|0,ja|0,sa|0,ta|0)|0;sa=D;ja=sb(Y|0,Z|0,j|0,w|0)|0;ia=D;w=sb(nb|0,mb|0,j|0,w|0)|0;j=D;Z=sb(Y|0,Z|0,h|0,t|0)|0;Y=D;t=sb(nb|0,mb|0,h|0,t|0)|0;h=D;r=sb(nb|0,mb|0,b|0,r|0)|0;b=D;eb=hb(lb|0,jb|0,ib|0,eb|0)|0;cb=hb(eb|0,D|0,db|0,cb|0)|0;ab=hb(cb|0,D|0,bb|0,ab|0)|0;_a=hb(ab|0,D|0,$a|0,_a|0)|0;o=hb(_a|0,D|0,q|0,o|0)|0;q=D;Wa=hb(Za|0,Ya|0,Xa|0,Wa|0)|0;Ua=hb(Wa|0,D|0,Va|0,Ua|0)|0;Sa=hb(Ua|0,D|0,Ta|0,Sa|0)|0;k=hb(Sa|0,D|0,l|0,k|0)|0;l=D;Oa=hb(Ra|0,Qa|0,Pa|0,Oa|0)|0;Ma=hb(Oa|0,D|0,Na|0,Ma|0)|0;Ka=hb(Ma|0,D|0,La|0,Ka|0)|0;Ia=hb(Ka|0,D|0,Ja|0,Ia|0)|0;f=hb(Ia|0,D|0,x|0,f|0)|0;x=D;Ea=hb(Ha|0,Ga|0,Fa|0,Ea|0)|0;Ca=hb(Ea|0,D|0,Da|0,Ca|0)|0;Aa=hb(Ca|0,D|0,Ba|0,Aa|0)|0;e=hb(Aa|0,D|0,v|0,e|0)|0;v=D;wa=hb(za|0,ya|0,xa|0,wa|0)|0;ua=hb(wa|0,D|0,va|0,ua|0)|0;sa=hb(ua|0,D|0,ta|0,sa|0)|0;qa=hb(sa|0,D|0,ra|0,qa|0)|0;d=hb(qa|0,D|0,u|0,d|0)|0;u=D;ma=hb(pa|0,oa|0,na|0,ma|0)|0;ka=hb(ma|0,D|0,la|0,ka|0)|0;ia=hb(ka|0,D|0,ja|0,ia|0)|0;y=hb(ia|0,D|0,g|0,y|0)|0;g=D;ca=hb(ha|0,ea|0,da|0,ca|0)|0;aa=hb(ca|0,D|0,ba|0,aa|0)|0;_=hb(aa|0,D|0,$|0,_|0)|0;Y=hb(_|0,D|0,Z|0,Y|0)|0;j=hb(Y|0,D|0,w|0,j|0)|0;w=D;U=hb(X|0,W|0,V|0,U|0)|0;S=hb(U|0,D|0,T|0,S|0)|0;Q=hb(S|0,D|0,R|0,Q|0)|0;h=hb(Q|0,D|0,t|0,h|0)|0;t=D;M=hb(P|0,O|0,N|0,M|0)|0;K=hb(M|0,D|0,L|0,K|0)|0;I=hb(K|0,D|0,J|0,I|0)|0;G=hb(I|0,D|0,H|0,G|0)|0;b=hb(G|0,D|0,r|0,b|0)|0;r=D;B=hb(F|0,E|0,C|0,B|0)|0;z=hb(B|0,D|0,A|0,z|0)|0;s=hb(z|0,D|0,n|0,s|0)|0;m=hb(s|0,D|0,p|0,m|0)|0;p=D;q=kb(o|0,q|0,1)|0;o=D;l=kb(k|0,l|0,1)|0;k=D;x=kb(f|0,x|0,1)|0;f=D;v=kb(e|0,v|0,1)|0;e=D;u=kb(d|0,u|0,1)|0;d=D;g=kb(y|0,g|0,1)|0;y=D;w=kb(j|0,w|0,1)|0;j=D;t=kb(h|0,t|0,1)|0;h=D;r=kb(b|0,r|0,1)|0;b=D;p=kb(m|0,p|0,1)|0;m=D;s=hb(q|0,o|0,33554432,0)|0;s=fb(s|0,D|0,26)|0;n=D;k=hb(s|0,n|0,l|0,k|0)|0;l=D;n=kb(s|0,n|0,26)|0;n=gb(q|0,o|0,n|0,D|0)|0;o=D;q=hb(u|0,d|0,33554432,0)|0;q=fb(q|0,D|0,26)|0;s=D;y=hb(q|0,s|0,g|0,y|0)|0;g=D;s=kb(q|0,s|0,26)|0;s=gb(u|0,d|0,s|0,D|0)|0;d=D;u=hb(k|0,l|0,16777216,0)|0;u=fb(u|0,D|0,25)|0;q=D;f=hb(u|0,q|0,x|0,f|0)|0;x=D;q=kb(u|0,q|0,25)|0;q=gb(k|0,l|0,q|0,D|0)|0;l=D;k=hb(y|0,g|0,16777216,0)|0;k=fb(k|0,D|0,25)|0;u=D;j=hb(k|0,u|0,w|0,j|0)|0;w=D;u=kb(k|0,u|0,25)|0;u=gb(y|0,g|0,u|0,D|0)|0;g=D;y=hb(f|0,x|0,33554432,0)|0;y=fb(y|0,D|0,26)|0;k=D;e=hb(y|0,k|0,v|0,e|0)|0;v=D;k=kb(y|0,k|0,26)|0;k=gb(f|0,x|0,k|0,D|0)|0;x=hb(j|0,w|0,33554432,0)|0;x=fb(x|0,D|0,26)|0;f=D;h=hb(x|0,f|0,t|0,h|0)|0;t=D;f=kb(x|0,f|0,26)|0;f=gb(j|0,w|0,f|0,D|0)|0;w=hb(e|0,v|0,16777216,0)|0;w=fb(w|0,D|0,25)|0;j=D;d=hb(w|0,j|0,s|0,d|0)|0;s=D;j=kb(w|0,j|0,25)|0;j=gb(e|0,v|0,j|0,D|0)|0;v=hb(h|0,t|0,16777216,0)|0;v=fb(v|0,D|0,25)|0;e=D;b=hb(v|0,e|0,r|0,b|0)|0;r=D;e=kb(v|0,e|0,25)|0;e=gb(h|0,t|0,e|0,D|0)|0;t=hb(d|0,s|0,33554432,0)|0;t=fb(t|0,D|0,26)|0;h=D;g=hb(u|0,g|0,t|0,h|0)|0;h=kb(t|0,h|0,26)|0;h=gb(d|0,s|0,h|0,D|0)|0;s=hb(b|0,r|0,33554432,0)|0;s=fb(s|0,D|0,26)|0;d=D;m=hb(s|0,d|0,p|0,m|0)|0;p=D;d=kb(s|0,d|0,26)|0;d=gb(b|0,r|0,d|0,D|0)|0;r=hb(m|0,p|0,16777216,0)|0;r=fb(r|0,D|0,25)|0;b=D;s=sb(r|0,b|0,19,0)|0;o=hb(s|0,D|0,n|0,o|0)|0;n=D;b=kb(r|0,b|0,25)|0;b=gb(m|0,p|0,b|0,D|0)|0;p=hb(o|0,n|0,33554432,0)|0;p=fb(p|0,D|0,26)|0;m=D;l=hb(q|0,l|0,p|0,m|0)|0;m=kb(p|0,m|0,26)|0;m=gb(o|0,n|0,m|0,D|0)|0;ga(a|0,m|0,4,0);ga(a+4|0,l|0,4,0);ga(a+8|0,k|0,4,0);ga(a+12|0,j|0,4,0);ga(a+16|0,h|0,4,0);ga(a+20|0,g|0,4,0);ga(a+24|0,f|0,4,0);ga(a+28|0,e|0,4,0);ga(a+32|0,d|0,4,0);ga(a+36|0,b|0,4,0);i=c;return}function Ma(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=i;i=i+160|0;d=c+120|0;g=c+80|0;e=c+40|0;f=c;Na(g,b+80|0);ya(e,b,g);ya(f,b+40|0,g);Oa(a,f);Oa(d,e);b=a+31|0;ga(b>>0|0,(fa(b>>0|0,1,0,1)|0|0)^(fa(d>>0|0,1,0,1)|0|0)<<7|0,1,0);i=c;return}function Na(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=i;i=i+160|0;e=f+120|0;c=f+80|0;d=f+40|0;g=f;Ja(e,b);Ja(c,e);Ja(c,c);ya(c,b,c);ya(e,e,c);Ja(d,e);ya(c,c,d);Ja(d,c);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);ya(c,d,c);Ja(d,c);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);ya(d,d,c);Ja(g,d);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);Ja(g,g);ya(d,g,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);Ja(d,d);ya(c,d,c);Ja(d,c);b=0;do{Ja(d,d);b=b+1|0}while((b|0)!=49);ya(d,d,c);Ja(g,d);b=0;do{Ja(g,g);b=b+1|0}while((b|0)!=99);ya(d,g,d);Ja(d,d);g=0;do{Ja(d,d);g=g+1|0}while((g|0)!=49);ya(c,d,c);Ja(c,c);Ja(c,c);Ja(c,c);Ja(c,c);Ja(c,c);ya(a,c,e);i=f;return}function Oa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=fa(b|0,4,0,0)|0|0;j=fa(b+4|0,4,0,0)|0|0;i=fa(b+8|0,4,0,0)|0|0;h=fa(b+12|0,4,0,0)|0|0;g=fa(b+16|0,4,0,0)|0|0;f=fa(b+20|0,4,0,0)|0|0;e=fa(b+24|0,4,0,0)|0|0;d=fa(b+28|0,4,0,0)|0|0;m=fa(b+32|0,4,0,0)|0|0;c=fa(b+36|0,4,0,0)|0|0;k=(((((((((((((c*19|0)+16777216>>25)+k>>26)+j>>25)+i>>26)+h>>25)+g>>26)+f>>25)+e>>26)+d>>25)+m>>26)+c>>25)*19|0)+k|0;l=k>>26;j=l+j|0;l=k-(l<<26)|0;k=j>>25;i=k+i|0;k=j-(k<<25)|0;j=i>>26;h=j+h|0;j=i-(j<<26)|0;i=h>>25;g=i+g|0;i=h-(i<<25)|0;h=g>>26;f=h+f|0;h=g-(h<<26)|0;g=f>>25;e=g+e|0;g=f-(g<<25)|0;f=e>>26;d=f+d|0;f=e-(f<<26)|0;e=d>>25;b=e+m|0;e=d-(e<<25)|0;d=b>>26;c=d+c|0;d=b-(d<<26)|0;b=c&33554431;ga(a>>0|0,l|0,1,0);ga(a+1>>0|0,l>>>8|0,1,0);ga(a+2>>0|0,l>>>16|0,1,0);ga(a+3>>0|0,k<<2|l>>>24|0,1,0);ga(a+4>>0|0,k>>>6|0,1,0);ga(a+5>>0|0,k>>>14|0,1,0);ga(a+6>>0|0,j<<3|k>>>22|0,1,0);ga(a+7>>0|0,j>>>5|0,1,0);ga(a+8>>0|0,j>>>13|0,1,0);ga(a+9>>0|0,i<<5|j>>>21|0,1,0);ga(a+10>>0|0,i>>>3|0,1,0);ga(a+11>>0|0,i>>>11|0,1,0);ga(a+12>>0|0,h<<6|i>>>19|0,1,0);ga(a+13>>0|0,h>>>2|0,1,0);ga(a+14>>0|0,h>>>10|0,1,0);ga(a+15>>0|0,h>>>18|0,1,0);ga(a+16>>0|0,g|0,1,0);ga(a+17>>0|0,g>>>8|0,1,0);ga(a+18>>0|0,g>>>16|0,1,0);ga(a+19>>0|0,f<<1|g>>>24|0,1,0);ga(a+20>>0|0,f>>>7|0,1,0);ga(a+21>>0|0,f>>>15|0,1,0);ga(a+22>>0|0,e<<3|f>>>23|0,1,0);ga(a+23>>0|0,e>>>5|0,1,0);ga(a+24>>0|0,e>>>13|0,1,0);ga(a+25>>0|0,d<<4|e>>>21|0,1,0);ga(a+26>>0|0,d>>>4|0,1,0);ga(a+27>>0|0,d>>>12|0,1,0);ga(a+28>>0|0,d>>>20|b<<6|0,1,0);ga(a+29>>0|0,c>>>2|0,1,0);ga(a+30>>0|0,c>>>10|0,1,0);ga(a+31>>0|0,b>>>18|0,1,0);return}function Pa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;c=i;i=i+592|0;g=c+400|0;d=c+520|0;f=c+240|0;h=c+120|0;e=c;j=0;do{q=fa(b+j>>0|0,1,0,0)|0|0;p=j<<1;ga(d+p>>0|0,q&15|0,1,0);ga(d+(p|1)>>0|0,(q&255)>>>4|0,1,0);j=j+1|0}while((j|0)!=32);b=0;j=0;do{p=d+j|0;q=(fa(p>>0|0,1,0,1)|0|0)+b|0;b=(q<<24)+134217728>>28;ga(p>>0|0,q-(b<<4)|0,1,0);j=j+1|0}while((j|0)!=63);m=d+63|0;ga(m>>0|0,(fa(m>>0|0,1,0,1)|0|0)+b|0,1,0);m=a+0|0;n=m+40|0;do{ga(m|0,0|0,4,0);m=m+4|0}while((m|0)<(n|0));j=a+40|0;ga(j|0,1|0,4,0);k=a+44|0;m=k+0|0;n=m+36|0;do{ga(m|0,0|0,4,0);m=m+4|0}while((m|0)<(n|0));b=a+80|0;ga(b|0,1|0,4,0);l=a+84|0;m=l+0|0;n=m+76|0;do{ga(m|0,0|0,4,0);m=m+4|0}while((m|0)<(n|0));m=f+120|0;n=f+40|0;p=f+80|0;o=a+120|0;q=1;do{Qa(e,(q|0)/2|0,fa(d+q>>0|0,1,0,0)|0|0);Ga(f,a,e);ya(a,f,m);ya(j,n,p);ya(b,p,m);ya(o,f,n);q=q+2|0}while((q|0)<64);y=fa(a+4|0,4,0,0)|0|0;w=fa(a+8|0,4,0,0)|0|0;v=fa(a+12|0,4,0,0)|0|0;u=fa(a+16|0,4,0,0)|0|0;t=fa(a+20|0,4,0,0)|0|0;s=fa(a+24|0,4,0,0)|0|0;r=fa(a+28|0,4,0,0)|0|0;q=fa(a+32|0,4,0,0)|0|0;x=fa(a+36|0,4,0,0)|0|0;ga(g|0,fa(a|0,4,0,0)|0|0,4,0);ga(g+4|0,y|0,4,0);ga(g+8|0,w|0,4,0);ga(g+12|0,v|0,4,0);ga(g+16|0,u|0,4,0);ga(g+20|0,t|0,4,0);ga(g+24|0,s|0,4,0);ga(g+28|0,r|0,4,0);ga(g+32|0,q|0,4,0);ga(g+36|0,x|0,4,0);x=fa(k|0,4,0,0)|0|0;q=fa(a+48|0,4,0,0)|0|0;k=fa(a+52|0,4,0,0)|0|0;r=fa(a+56|0,4,0,0)|0|0;s=fa(a+60|0,4,0,0)|0|0;t=fa(a+64|0,4,0,0)|0|0;u=fa(a+68|0,4,0,0)|0|0;v=fa(a+72|0,4,0,0)|0|0;w=fa(a+76|0,4,0,0)|0|0;ga(g+40|0,fa(j|0,4,0,0)|0|0,4,0);ga(g+44|0,x|0,4,0);ga(g+48|0,q|0,4,0);ga(g+52|0,k|0,4,0);ga(g+56|0,r|0,4,0);ga(g+60|0,s|0,4,0);ga(g+64|0,t|0,4,0);ga(g+68|0,u|0,4,0);ga(g+72|0,v|0,4,0);ga(g+76|0,w|0,4,0);w=fa(l|0,4,0,0)|0|0;v=fa(a+88|0,4,0,0)|0|0;u=fa(a+92|0,4,0,0)|0|0;t=fa(a+96|0,4,0,0)|0|0;s=fa(a+100|0,4,0,0)|0|0;r=fa(a+104|0,4,0,0)|0|0;k=fa(a+108|0,4,0,0)|0|0;l=fa(a+112|0,4,0,0)|0|0;q=fa(a+116|0,4,0,0)|0|0;ga(g+80|0,fa(b|0,4,0,0)|0|0,4,0);ga(g+84|0,w|0,4,0);ga(g+88|0,v|0,4,0);ga(g+92|0,u|0,4,0);ga(g+96|0,t|0,4,0);ga(g+100|0,s|0,4,0);ga(g+104|0,r|0,4,0);ga(g+108|0,k|0,4,0);ga(g+112|0,l|0,4,0);ga(g+116|0,q|0,4,0);Ea(f,g);ya(h,f,m);q=h+40|0;ya(q,n,p);g=h+80|0;ya(g,p,m);Ea(f,h);ya(h,f,m);ya(q,n,p);ya(g,p,m);Ea(f,h);ya(h,f,m);ya(q,n,p);ya(g,p,m);Ea(f,h);ya(a,f,m);ya(j,n,p);ya(b,p,m);ya(o,f,n);g=0;do{Qa(e,(g|0)/2|0,fa(d+g>>0|0,1,0,0)|0|0);Ga(f,a,e);ya(a,f,m);ya(j,n,p);ya(b,p,m);ya(o,f,n);g=g+2|0}while((g|0)<64);i=c;return}function Qa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+128|0;e=d;f=c<<24>>24;f=jb(f|0,((f|0)<0)<<31>>31|0,63)|0;j=c<<24>>24;j=j-((j&0-f)<<1)|0;ga(a|0,1|0,4,0);c=a+4|0;h=c+0|0;g=h+36|0;do{ga(h|0,0|0,4,0);h=h+4|0}while((h|0)<(g|0));k=a+40|0;ga(k|0,1|0,4,0);l=a+44|0;h=l+0|0;g=h+76|0;do{ga(h|0,0|0,4,0);h=h+4|0}while((h|0)<(g|0));r=j&255;q=((r^1)+ -1|0)>>>31;bb(a,360+(b*960|0)|0,q);bb(k,400+(b*960|0)|0,q);j=a+80|0;bb(j,440+(b*960|0)|0,q);q=((r^2)+ -1|0)>>>31;bb(a,480+(b*960|0)|0,q);bb(k,520+(b*960|0)|0,q);bb(j,560+(b*960|0)|0,q);q=((r^3)+ -1|0)>>>31;bb(a,600+(b*960|0)|0,q);bb(k,640+(b*960|0)|0,q);bb(j,680+(b*960|0)|0,q);q=((r^4)+ -1|0)>>>31;bb(a,720+(b*960|0)|0,q);bb(k,760+(b*960|0)|0,q);bb(j,800+(b*960|0)|0,q);q=((r^5)+ -1|0)>>>31;bb(a,840+(b*960|0)|0,q);bb(k,880+(b*960|0)|0,q);bb(j,920+(b*960|0)|0,q);q=((r^6)+ -1|0)>>>31;bb(a,960+(b*960|0)|0,q);bb(k,1e3+(b*960|0)|0,q);bb(j,1040+(b*960|0)|0,q);q=((r^7)+ -1|0)>>>31;bb(a,1080+(b*960|0)|0,q);bb(k,1120+(b*960|0)|0,q);bb(j,1160+(b*960|0)|0,q);r=((r^8)+ -1|0)>>>31;bb(a,1200+(b*960|0)|0,r);bb(k,1240+(b*960|0)|0,r);bb(j,1280+(b*960|0)|0,r);l=fa(l|0,4,0,0)|0|0;r=fa(a+48|0,4,0,0)|0|0;q=fa(a+52|0,4,0,0)|0|0;p=fa(a+56|0,4,0,0)|0|0;o=fa(a+60|0,4,0,0)|0|0;n=fa(a+64|0,4,0,0)|0|0;m=fa(a+68|0,4,0,0)|0|0;b=fa(a+72|0,4,0,0)|0|0;h=fa(a+76|0,4,0,0)|0|0;ga(e|0,fa(k|0,4,0,0)|0|0,4,0);ga(e+4|0,l|0,4,0);ga(e+8|0,r|0,4,0);ga(e+12|0,q|0,4,0);ga(e+16|0,p|0,4,0);ga(e+20|0,o|0,4,0);ga(e+24|0,n|0,4,0);ga(e+28|0,m|0,4,0);ga(e+32|0,b|0,4,0);ga(e+36|0,h|0,4,0);h=e+40|0;c=fa(c|0,4,0,0)|0|0;b=fa(a+8|0,4,0,0)|0|0;m=fa(a+12|0,4,0,0)|0|0;n=fa(a+16|0,4,0,0)|0|0;o=fa(a+20|0,4,0,0)|0|0;p=fa(a+24|0,4,0,0)|0|0;q=fa(a+28|0,4,0,0)|0|0;r=fa(a+32|0,4,0,0)|0|0;l=fa(a+36|0,4,0,0)|0|0;ga(h|0,fa(a|0,4,0,0)|0|0,4,0);ga(e+44|0,c|0,4,0);ga(e+48|0,b|0,4,0);ga(e+52|0,m|0,4,0);ga(e+56|0,n|0,4,0);ga(e+60|0,o|0,4,0);ga(e+64|0,p|0,4,0);ga(e+68|0,q|0,4,0);ga(e+72|0,r|0,4,0);ga(e+76|0,l|0,4,0);l=e+80|0;r=0-(fa(a+84|0,4,0,0)|0|0)|0;q=0-(fa(a+88|0,4,0,0)|0|0)|0;p=0-(fa(a+92|0,4,0,0)|0|0)|0;o=0-(fa(a+96|0,4,0,0)|0|0)|0;n=0-(fa(a+100|0,4,0,0)|0|0)|0;m=0-(fa(a+104|0,4,0,0)|0|0)|0;b=0-(fa(a+108|0,4,0,0)|0|0)|0;c=0-(fa(a+112|0,4,0,0)|0|0)|0;g=0-(fa(a+116|0,4,0,0)|0|0)|0;ga(l|0,0-(fa(j|0,4,0,0)|0|0)|0,4,0);ga(e+84|0,r|0,4,0);ga(e+88|0,q|0,4,0);ga(e+92|0,p|0,4,0);ga(e+96|0,o|0,4,0);ga(e+100|0,n|0,4,0);ga(e+104|0,m|0,4,0);ga(e+108|0,b|0,4,0);ga(e+112|0,c|0,4,0);ga(e+116|0,g|0,4,0);bb(a,e,f);bb(k,h,f);bb(j,l,f);i=d;return}function Ra(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=i;i=i+160|0;d=c+120|0;g=c+80|0;e=c+40|0;f=c;Na(g,b+80|0);ya(e,b,g);ya(f,b+40|0,g);Oa(a,f);Oa(d,e);b=a+31|0;ga(b>>0|0,(fa(b>>0|0,1,0,1)|0|0)^(fa(d>>0|0,1,0,1)|0|0)<<7|0,1,0);i=c;return}function Sa(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,ib=0,lb=0,mb=0,nb=0;b=i;ea=a+1|0;ca=a+2|0;La=fa(ca>>0|0,1,0,0)|0|0;da=fa(a>>0|0,1,0,1)|0|0;W=kb(fa(ea>>0|0,1,0,1)|0|0|0,0,8)|0;xa=D;La=La&255;U=kb(La|0,0,16)|0;aa=a+3|0;ua=kb(fa(aa>>0|0,1,0,1)|0|0|0,0,8)|0;ra=D;$=a+4|0;V=kb(fa($>>0|0,1,0,1)|0|0|0,0,16)|0;ra=ra|D;Z=a+5|0;N=fa(Z>>0|0,1,0,1)|0|0;X=kb(N|0,0,24)|0;ra=jb(ua|La|V|X|0,ra|D|0,5)|0;X=a+6|0;V=a+7|0;La=fa(V>>0|0,1,0,0)|0|0;ua=kb(fa(X>>0|0,1,0,1)|0|0|0,0,8)|0;Ma=D;La=La&255;T=kb(La|0,0,16)|0;Ma=jb(ua|N|T|0,Ma|D|0,2)|0;T=a+8|0;N=kb(fa(T>>0|0,1,0,1)|0|0|0,0,8)|0;ua=D;S=a+9|0;Ia=kb(fa(S>>0|0,1,0,1)|0|0|0,0,16)|0;ua=ua|D;Q=a+10|0;Ua=fa(Q>>0|0,1,0,1)|0|0;O=kb(Ua|0,0,24)|0;ua=jb(N|La|Ia|O|0,ua|D|0,7)|0;O=a+11|0;Ia=kb(fa(O>>0|0,1,0,1)|0|0|0,0,8)|0;La=D;N=a+12|0;H=kb(fa(N>>0|0,1,0,1)|0|0|0,0,16)|0;La=La|D;L=a+13|0;u=fa(L>>0|0,1,0,1)|0|0;J=kb(u|0,0,24)|0;La=jb(Ia|Ua|H|J|0,La|D|0,4)|0;J=a+14|0;H=a+15|0;Ua=fa(H>>0|0,1,0,0)|0|0;Ia=kb(fa(J>>0|0,1,0,1)|0|0|0,0,8)|0;Fa=D;Ua=Ua&255;F=kb(Ua|0,0,16)|0;Fa=jb(Ia|u|F|0,Fa|D|0,1)|0;F=a+16|0;u=kb(fa(F>>0|0,1,0,1)|0|0|0,0,8)|0;Ia=D;E=a+17|0;w=kb(fa(E>>0|0,1,0,1)|0|0|0,0,16)|0;Ia=Ia|D;B=a+18|0;v=fa(B>>0|0,1,0,1)|0|0;z=kb(v|0,0,24)|0;Ia=jb(u|Ua|w|z|0,Ia|D|0,6)|0;z=a+19|0;w=a+20|0;Ua=fa(w>>0|0,1,0,0)|0|0;u=kb(fa(z>>0|0,1,0,1)|0|0|0,0,8)|0;Va=D;Ua=kb(Ua&255|0,0,16)|0;Va=jb(u|v|Ua|0,Va|D|0,3)|0;Ua=D;v=a+21|0;u=a+22|0;s=a+23|0;Sa=fa(s>>0|0,1,0,0)|0|0;cb=fa(v>>0|0,1,0,1)|0|0;db=kb(fa(u>>0|0,1,0,1)|0|0|0,0,8)|0;ab=D;Sa=Sa&255;bb=kb(Sa|0,0,16)|0;q=a+24|0;Aa=kb(fa(q>>0|0,1,0,1)|0|0|0,0,8)|0;la=D;p=a+25|0;j=kb(fa(p>>0|0,1,0,1)|0|0|0,0,16)|0;la=la|D;n=a+26|0;Ja=fa(n>>0|0,1,0,1)|0|0;l=kb(Ja|0,0,24)|0;la=jb(Aa|Sa|j|l|0,la|D|0,5)|0;l=a+27|0;j=a+28|0;Sa=fa(j>>0|0,1,0,0)|0|0;Aa=kb(fa(l>>0|0,1,0,1)|0|0|0,0,8)|0;$a=D;Sa=Sa&255;g=kb(Sa|0,0,16)|0;$a=jb(Aa|Ja|g|0,$a|D|0,2)|0;g=a+29|0;Ja=kb(fa(g>>0|0,1,0,1)|0|0|0,0,8)|0;Aa=D;f=a+30|0;mb=kb(fa(f>>0|0,1,0,1)|0|0|0,0,16)|0;Aa=Aa|D;c=a+31|0;t=fa(c>>0|0,1,0,1)|0|0;ta=kb(t|0,0,24)|0;Aa=jb(Ja|Sa|mb|ta|0,Aa|D|0,7)|0;ta=kb(fa(a+32>>0|0,1,0,1)|0|0|0,0,8)|0;mb=D;Sa=kb(fa(a+33>>0|0,1,0,1)|0|0|0,0,16)|0;mb=mb|D;Ja=fa(a+34>>0|0,1,0,1)|0|0;Ca=kb(Ja|0,0,24)|0;mb=jb(ta|t|Sa|Ca|0,mb|D|0,4)|0;Ca=fa(a+36>>0|0,1,0,0)|0|0;Sa=kb(fa(a+35>>0|0,1,0,1)|0|0|0,0,8)|0;t=D;Ca=Ca&255;ta=kb(Ca|0,0,16)|0;t=jb(Sa|Ja|ta|0,t|D|0,1)|0;ta=kb(fa(a+37>>0|0,1,0,1)|0|0|0,0,8)|0;Ja=D;Sa=kb(fa(a+38>>0|0,1,0,1)|0|0|0,0,16)|0;Ja=Ja|D;wa=fa(a+39>>0|0,1,0,1)|0|0;ha=kb(wa|0,0,24)|0;Ja=jb(ta|Ca|Sa|ha|0,Ja|D|0,6)|0;ha=fa(a+41>>0|0,1,0,0)|0|0;Sa=kb(fa(a+40>>0|0,1,0,1)|0|0|0,0,8)|0;Ca=D;ha=kb(ha&255|0,0,16)|0;Ca=jb(Sa|wa|ha|0,Ca|D|0,3)|0;ha=D;wa=fa(a+44>>0|0,1,0,0)|0|0;Sa=fa(a+42>>0|0,1,0,1)|0|0;ta=kb(fa(a+43>>0|0,1,0,1)|0|0|0,0,8)|0;G=D;wa=wa&255;na=kb(wa|0,0,16)|0;Ga=kb(fa(a+45>>0|0,1,0,1)|0|0|0,0,8)|0;K=D;Oa=kb(fa(a+46>>0|0,1,0,1)|0|0|0,0,16)|0;K=K|D;nb=fa(a+47>>0|0,1,0,1)|0|0;M=kb(nb|0,0,24)|0;K=jb(Ga|wa|Oa|M|0,K|D|0,5)|0;M=fa(a+49>>0|0,1,0,0)|0|0;Oa=kb(fa(a+48>>0|0,1,0,1)|0|0|0,0,8)|0;wa=D;M=M&255;Ga=kb(M|0,0,16)|0;wa=jb(Oa|nb|Ga|0,wa|D|0,2)|0;wa=wa&2097151;Ga=kb(fa(a+50>>0|0,1,0,1)|0|0|0,0,8)|0;nb=D;Oa=kb(fa(a+51>>0|0,1,0,1)|0|0|0,0,16)|0;nb=nb|D;Ka=fa(a+52>>0|0,1,0,1)|0|0;m=kb(Ka|0,0,24)|0;nb=jb(Ga|M|Oa|m|0,nb|D|0,7)|0;nb=nb&2097151;m=kb(fa(a+53>>0|0,1,0,1)|0|0|0,0,8)|0;Oa=D;M=kb(fa(a+54>>0|0,1,0,1)|0|0|0,0,16)|0;Oa=Oa|D;Ga=fa(a+55>>0|0,1,0,1)|0|0;R=kb(Ga|0,0,24)|0;Oa=jb(m|Ka|M|R|0,Oa|D|0,4)|0;Oa=Oa&2097151;R=fa(a+57>>0|0,1,0,0)|0|0;M=kb(fa(a+56>>0|0,1,0,1)|0|0|0,0,8)|0;Ka=D;R=R&255;m=kb(R|0,0,16)|0;Ka=jb(M|Ga|m|0,Ka|D|0,1)|0;Ka=Ka&2097151;m=kb(fa(a+58>>0|0,1,0,1)|0|0|0,0,8)|0;Ga=D;M=kb(fa(a+59>>0|0,1,0,1)|0|0|0,0,16)|0;Ga=Ga|D;ja=fa(a+60>>0|0,1,0,1)|0|0;ia=kb(ja|0,0,24)|0;Ga=jb(m|R|M|ia|0,Ga|D|0,6)|0;Ga=Ga&2097151;ia=kb(fa(a+61>>0|0,1,0,1)|0|0|0,0,8)|0;M=D;R=kb(fa(a+62>>0|0,1,0,1)|0|0|0,0,16)|0;M=M|D;m=kb(fa(a+63>>0|0,1,0,1)|0|0|0,0,24)|0;M=jb(ia|ja|R|m|0,M|D|0,3)|0;m=D;R=sb(M|0,m|0,666643,0)|0;ja=D;ia=sb(M|0,m|0,470296,0)|0;I=D;r=sb(M|0,m|0,654183,0)|0;C=D;P=sb(M|0,m|0,-997805,-1)|0;Y=D;k=sb(M|0,m|0,136657,0)|0;e=D;m=sb(M|0,m|0,-683901,-1)|0;G=hb(m|0,D|0,ta|Sa|na&2031616|0,G|0)|0;na=D;Sa=sb(Ga|0,0,666643,0)|0;ta=D;m=sb(Ga|0,0,470296,0)|0;M=D;Xa=sb(Ga|0,0,654183,0)|0;Ra=D;Ba=sb(Ga|0,0,-997805,-1)|0;_=D;Pa=sb(Ga|0,0,136657,0)|0;Qa=D;Ga=sb(Ga|0,0,-683901,-1)|0;y=D;d=sb(Ka|0,0,666643,0)|0;ba=D;Ha=sb(Ka|0,0,470296,0)|0;va=D;o=sb(Ka|0,0,654183,0)|0;Na=D;eb=sb(Ka|0,0,-997805,-1)|0;Wa=D;ya=sb(Ka|0,0,136657,0)|0;oa=D;Ka=sb(Ka|0,0,-683901,-1)|0;Ja=hb(Ka|0,D|0,Ja&2097151|0,0)|0;Qa=hb(Ja|0,D|0,Pa|0,Qa|0)|0;Y=hb(Qa|0,D|0,P|0,Y|0)|0;P=D;Qa=sb(Oa|0,0,666643,0)|0;Pa=D;Ja=sb(Oa|0,0,470296,0)|0;Ka=D;Ya=sb(Oa|0,0,654183,0)|0;sa=D;Da=sb(Oa|0,0,-997805,-1)|0;ka=D;lb=sb(Oa|0,0,136657,0)|0;ib=D;Oa=sb(Oa|0,0,-683901,-1)|0;h=D;A=sb(nb|0,0,666643,0)|0;x=D;ma=sb(nb|0,0,470296,0)|0;Ta=D;qa=sb(nb|0,0,654183,0)|0;pa=D;_a=sb(nb|0,0,-997805,-1)|0;Za=D;za=sb(nb|0,0,136657,0)|0;Ea=D;nb=sb(nb|0,0,-683901,-1)|0;mb=hb(nb|0,D|0,mb&2097151|0,0)|0;ib=hb(mb|0,D|0,lb|0,ib|0)|0;Wa=hb(ib|0,D|0,eb|0,Wa|0)|0;Ra=hb(Wa|0,D|0,Xa|0,Ra|0)|0;I=hb(Ra|0,D|0,ia|0,I|0)|0;ia=D;Ra=sb(wa|0,0,666643,0)|0;Ia=hb(Ra|0,D|0,Ia&2097151|0,0)|0;Ra=D;Xa=sb(wa|0,0,470296,0)|0;Wa=D;eb=sb(wa|0,0,654183,0)|0;ab=hb(eb|0,D|0,db|cb|bb&2031616|0,ab|0)|0;Ta=hb(ab|0,D|0,ma|0,Ta|0)|0;Pa=hb(Ta|0,D|0,Qa|0,Pa|0)|0;Qa=D;Ta=sb(wa|0,0,-997805,-1)|0;ma=D;ab=sb(wa|0,0,136657,0)|0;$a=hb(ab|0,D|0,$a&2097151|0,0)|0;Za=hb($a|0,D|0,_a|0,Za|0)|0;sa=hb(Za|0,D|0,Ya|0,sa|0)|0;va=hb(sa|0,D|0,Ha|0,va|0)|0;ta=hb(va|0,D|0,Sa|0,ta|0)|0;Sa=D;wa=sb(wa|0,0,-683901,-1)|0;va=D;Ha=hb(Ia|0,Ra|0,1048576,0)|0;Ha=jb(Ha|0,D|0,21)|0;sa=D;Ua=hb(Xa|0,Wa|0,Va|0,Ua|0)|0;Ua=hb(Ua|0,D|0,Ha|0,sa|0)|0;x=hb(Ua|0,D|0,A|0,x|0)|0;A=D;sa=kb(Ha|0,sa|0,21)|0;sa=gb(Ia|0,Ra|0,sa|0,D|0)|0;Ra=D;Ia=hb(Pa|0,Qa|0,1048576,0)|0;Ia=jb(Ia|0,D|0,21)|0;Ha=D;la=hb(Ta|0,ma|0,la&2097151|0,0)|0;pa=hb(la|0,D|0,qa|0,pa|0)|0;Ka=hb(pa|0,D|0,Ja|0,Ka|0)|0;ba=hb(Ka|0,D|0,d|0,ba|0)|0;ba=hb(ba|0,D|0,Ia|0,Ha|0)|0;d=D;Ha=kb(Ia|0,Ha|0,21)|0;Ia=D;Ka=hb(ta|0,Sa|0,1048576,0)|0;Ka=fb(Ka|0,D|0,21)|0;Ja=D;Aa=hb(wa|0,va|0,Aa&2097151|0,0)|0;Ea=hb(Aa|0,D|0,za|0,Ea|0)|0;ka=hb(Ea|0,D|0,Da|0,ka|0)|0;Na=hb(ka|0,D|0,o|0,Na|0)|0;M=hb(Na|0,D|0,m|0,M|0)|0;ja=hb(M|0,D|0,R|0,ja|0)|0;ja=hb(ja|0,D|0,Ka|0,Ja|0)|0;R=D;Ja=kb(Ka|0,Ja|0,21)|0;Ka=D;M=hb(I|0,ia|0,1048576,0)|0;M=fb(M|0,D|0,21)|0;m=D;t=hb(Oa|0,h|0,t&2097151|0,0)|0;oa=hb(t|0,D|0,ya|0,oa|0)|0;_=hb(oa|0,D|0,Ba|0,_|0)|0;C=hb(_|0,D|0,r|0,C|0)|0;C=hb(C|0,D|0,M|0,m|0)|0;r=D;m=kb(M|0,m|0,21)|0;m=gb(I|0,ia|0,m|0,D|0)|0;ia=D;I=hb(Y|0,P|0,1048576,0)|0;I=fb(I|0,D|0,21)|0;M=D;ha=hb(Ga|0,y|0,Ca|0,ha|0)|0;e=hb(ha|0,D|0,k|0,e|0)|0;e=hb(e|0,D|0,I|0,M|0)|0;k=D;M=kb(I|0,M|0,21)|0;M=gb(Y|0,P|0,M|0,D|0)|0;P=D;Y=hb(G|0,na|0,1048576,0)|0;Y=fb(Y|0,D|0,21)|0;I=D;K=hb(Y|0,I|0,K&2097151|0,0)|0;ha=D;I=kb(Y|0,I|0,21)|0;I=gb(G|0,na|0,I|0,D|0)|0;na=D;G=hb(x|0,A|0,1048576,0)|0;G=jb(G|0,D|0,21)|0;Y=D;Ca=kb(G|0,Y|0,21)|0;Ca=gb(x|0,A|0,Ca|0,D|0)|0;A=D;x=hb(ba|0,d|0,1048576,0)|0;x=fb(x|0,D|0,21)|0;y=D;Ga=kb(x|0,y|0,21)|0;Ga=gb(ba|0,d|0,Ga|0,D|0)|0;d=D;ba=hb(ja|0,R|0,1048576,0)|0;ba=fb(ba|0,D|0,21)|0;_=D;ia=hb(m|0,ia|0,ba|0,_|0)|0;m=D;_=kb(ba|0,_|0,21)|0;_=gb(ja|0,R|0,_|0,D|0)|0;R=D;ja=hb(C|0,r|0,1048576,0)|0;ja=fb(ja|0,D|0,21)|0;ba=D;P=hb(ja|0,ba|0,M|0,P|0)|0;M=D;ba=kb(ja|0,ba|0,21)|0;ba=gb(C|0,r|0,ba|0,D|0)|0;r=D;C=hb(e|0,k|0,1048576,0)|0;C=fb(C|0,D|0,21)|0;ja=D;na=hb(C|0,ja|0,I|0,na|0)|0;I=D;ja=kb(C|0,ja|0,21)|0;ja=gb(e|0,k|0,ja|0,D|0)|0;k=D;e=sb(K|0,ha|0,666643,0)|0;Fa=hb(e|0,D|0,Fa&2097151|0,0)|0;e=D;C=sb(K|0,ha|0,470296,0)|0;C=hb(sa|0,Ra|0,C|0,D|0)|0;Ra=D;sa=sb(K|0,ha|0,654183,0)|0;sa=hb(Ca|0,A|0,sa|0,D|0)|0;A=D;Ca=sb(K|0,ha|0,-997805,-1)|0;Ba=D;oa=sb(K|0,ha|0,136657,0)|0;oa=hb(Ga|0,d|0,oa|0,D|0)|0;d=D;ha=sb(K|0,ha|0,-683901,-1)|0;K=D;y=hb(ta|0,Sa|0,x|0,y|0)|0;Ka=gb(y|0,D|0,Ja|0,Ka|0)|0;K=hb(Ka|0,D|0,ha|0,K|0)|0;ha=D;Ka=sb(na|0,I|0,666643,0)|0;Ja=D;y=sb(na|0,I|0,470296,0)|0;x=D;Sa=sb(na|0,I|0,654183,0)|0;Sa=hb(C|0,Ra|0,Sa|0,D|0)|0;Ra=D;C=sb(na|0,I|0,-997805,-1)|0;C=hb(sa|0,A|0,C|0,D|0)|0;A=D;sa=sb(na|0,I|0,136657,0)|0;ta=D;I=sb(na|0,I|0,-683901,-1)|0;I=hb(oa|0,d|0,I|0,D|0)|0;d=D;oa=sb(ja|0,k|0,666643,0)|0;na=D;Ga=sb(ja|0,k|0,470296,0)|0;ya=D;t=sb(ja|0,k|0,654183,0)|0;h=D;Oa=sb(ja|0,k|0,-997805,-1)|0;Na=D;o=sb(ja|0,k|0,136657,0)|0;ka=D;k=sb(ja|0,k|0,-683901,-1)|0;ja=D;Y=hb(Pa|0,Qa|0,G|0,Y|0)|0;Ia=gb(Y|0,D|0,Ha|0,Ia|0)|0;Ba=hb(Ia|0,D|0,Ca|0,Ba|0)|0;ta=hb(Ba|0,D|0,sa|0,ta|0)|0;ja=hb(ta|0,D|0,k|0,ja|0)|0;k=D;ta=sb(P|0,M|0,666643,0)|0;sa=D;Ba=sb(P|0,M|0,470296,0)|0;Ca=D;Ia=sb(P|0,M|0,654183,0)|0;Ha=D;Y=sb(P|0,M|0,-997805,-1)|0;G=D;Qa=sb(P|0,M|0,136657,0)|0;Pa=D;M=sb(P|0,M|0,-683901,-1)|0;P=D;Da=sb(ba|0,r|0,666643,0)|0;Ea=D;za=sb(ba|0,r|0,470296,0)|0;Aa=D;va=sb(ba|0,r|0,654183,0)|0;wa=D;pa=sb(ba|0,r|0,-997805,-1)|0;qa=D;la=sb(ba|0,r|0,136657,0)|0;ma=D;r=sb(ba|0,r|0,-683901,-1)|0;ba=D;Pa=hb(Sa|0,Ra|0,Qa|0,Pa|0)|0;Na=hb(Pa|0,D|0,Oa|0,Na|0)|0;ba=hb(Na|0,D|0,r|0,ba|0)|0;r=D;Na=sb(ia|0,m|0,666643,0)|0;xa=hb(Na|0,D|0,W|da|U&2031616|0,xa|0)|0;U=D;da=sb(ia|0,m|0,470296,0)|0;W=D;Na=sb(ia|0,m|0,654183,0)|0;Ma=hb(Na|0,D|0,Ma&2097151|0,0)|0;sa=hb(Ma|0,D|0,ta|0,sa|0)|0;Aa=hb(sa|0,D|0,za|0,Aa|0)|0;za=D;sa=sb(ia|0,m|0,-997805,-1)|0;ta=D;Ma=sb(ia|0,m|0,136657,0)|0;La=hb(Ma|0,D|0,La&2097151|0,0)|0;Ja=hb(La|0,D|0,Ka|0,Ja|0)|0;Ha=hb(Ja|0,D|0,Ia|0,Ha|0)|0;ya=hb(Ha|0,D|0,Ga|0,ya|0)|0;qa=hb(ya|0,D|0,pa|0,qa|0)|0;pa=D;m=sb(ia|0,m|0,-683901,-1)|0;ia=D;ya=hb(xa|0,U|0,1048576,0)|0;ya=fb(ya|0,D|0,21)|0;Ga=D;ra=hb(da|0,W|0,ra&2097151|0,0)|0;Ea=hb(ra|0,D|0,Da|0,Ea|0)|0;Ea=hb(Ea|0,D|0,ya|0,Ga|0)|0;Da=D;Ga=kb(ya|0,Ga|0,21)|0;Ga=gb(xa|0,U|0,Ga|0,D|0)|0;U=D;xa=hb(Aa|0,za|0,1048576,0)|0;xa=fb(xa|0,D|0,21)|0;ya=D;ua=hb(sa|0,ta|0,ua&2097151|0,0)|0;Ca=hb(ua|0,D|0,Ba|0,Ca|0)|0;na=hb(Ca|0,D|0,oa|0,na|0)|0;wa=hb(na|0,D|0,va|0,wa|0)|0;wa=hb(wa|0,D|0,xa|0,ya|0)|0;va=D;ya=kb(xa|0,ya|0,21)|0;xa=D;na=hb(qa|0,pa|0,1048576,0)|0;na=fb(na|0,D|0,21)|0;oa=D;ia=hb(Fa|0,e|0,m|0,ia|0)|0;x=hb(ia|0,D|0,y|0,x|0)|0;G=hb(x|0,D|0,Y|0,G|0)|0;h=hb(G|0,D|0,t|0,h|0)|0;ma=hb(h|0,D|0,la|0,ma|0)|0;ma=hb(ma|0,D|0,na|0,oa|0)|0;la=D;oa=kb(na|0,oa|0,21)|0;na=D;h=hb(ba|0,r|0,1048576,0)|0;h=fb(h|0,D|0,21)|0;t=D;P=hb(C|0,A|0,M|0,P|0)|0;ka=hb(P|0,D|0,o|0,ka|0)|0;ka=hb(ka|0,D|0,h|0,t|0)|0;o=D;t=kb(h|0,t|0,21)|0;t=gb(ba|0,r|0,t|0,D|0)|0;r=D;ba=hb(ja|0,k|0,1048576,0)|0;ba=fb(ba|0,D|0,21)|0;h=D;d=hb(I|0,d|0,ba|0,h|0)|0;I=D;h=kb(ba|0,h|0,21)|0;h=gb(ja|0,k|0,h|0,D|0)|0;k=D;ja=hb(K|0,ha|0,1048576,0)|0;ja=fb(ja|0,D|0,21)|0;ba=D;R=hb(ja|0,ba|0,_|0,R|0)|0;_=D;ba=kb(ja|0,ba|0,21)|0;ba=gb(K|0,ha|0,ba|0,D|0)|0;ha=D;K=hb(Ea|0,Da|0,1048576,0)|0;K=fb(K|0,D|0,21)|0;ja=D;P=kb(K|0,ja|0,21)|0;M=D;A=hb(wa|0,va|0,1048576,0)|0;A=fb(A|0,D|0,21)|0;C=D;G=kb(A|0,C|0,21)|0;Y=D;x=hb(ma|0,la|0,1048576,0)|0;x=fb(x|0,D|0,21)|0;y=D;r=hb(t|0,r|0,x|0,y|0)|0;t=D;y=kb(x|0,y|0,21)|0;x=D;ia=hb(ka|0,o|0,1048576,0)|0;ia=fb(ia|0,D|0,21)|0;m=D;k=hb(h|0,k|0,ia|0,m|0)|0;h=D;m=kb(ia|0,m|0,21)|0;m=gb(ka|0,o|0,m|0,D|0)|0;o=D;ka=hb(d|0,I|0,1048576,0)|0;ka=fb(ka|0,D|0,21)|0;ia=D;ha=hb(ba|0,ha|0,ka|0,ia|0)|0;ba=D;ia=kb(ka|0,ia|0,21)|0;ia=gb(d|0,I|0,ia|0,D|0)|0;I=D;d=hb(R|0,_|0,1048576,0)|0;d=fb(d|0,D|0,21)|0;ka=D;e=kb(d|0,ka|0,21)|0;e=gb(R|0,_|0,e|0,D|0)|0;_=D;R=sb(d|0,ka|0,666643,0)|0;R=hb(Ga|0,U|0,R|0,D|0)|0;U=D;Ga=sb(d|0,ka|0,470296,0)|0;Fa=D;Ca=sb(d|0,ka|0,654183,0)|0;Ba=D;ua=sb(d|0,ka|0,-997805,-1)|0;ta=D;sa=sb(d|0,ka|0,136657,0)|0;ra=D;ka=sb(d|0,ka|0,-683901,-1)|0;d=D;W=fb(R|0,U|0,21)|0;da=D;Da=hb(Ga|0,Fa|0,Ea|0,Da|0)|0;M=gb(Da|0,D|0,P|0,M|0)|0;M=hb(M|0,D|0,W|0,da|0)|0;P=D;da=kb(W|0,da|0,21)|0;da=gb(R|0,U|0,da|0,D|0)|0;U=D;R=fb(M|0,P|0,21)|0;W=D;za=hb(Ca|0,Ba|0,Aa|0,za|0)|0;xa=gb(za|0,D|0,ya|0,xa|0)|0;ja=hb(xa|0,D|0,K|0,ja|0)|0;ja=hb(ja|0,D|0,R|0,W|0)|0;K=D;W=kb(R|0,W|0,21)|0;W=gb(M|0,P|0,W|0,D|0)|0;P=D;M=fb(ja|0,K|0,21)|0;R=D;ta=hb(wa|0,va|0,ua|0,ta|0)|0;Y=gb(ta|0,D|0,G|0,Y|0)|0;Y=hb(Y|0,D|0,M|0,R|0)|0;G=D;R=kb(M|0,R|0,21)|0;R=gb(ja|0,K|0,R|0,D|0)|0;K=D;ja=fb(Y|0,G|0,21)|0;M=D;pa=hb(sa|0,ra|0,qa|0,pa|0)|0;na=gb(pa|0,D|0,oa|0,na|0)|0;C=hb(na|0,D|0,A|0,C|0)|0;C=hb(C|0,D|0,ja|0,M|0)|0;A=D;M=kb(ja|0,M|0,21)|0;M=gb(Y|0,G|0,M|0,D|0)|0;G=D;Y=fb(C|0,A|0,21)|0;ja=D;d=hb(ma|0,la|0,ka|0,d|0)|0;x=gb(d|0,D|0,y|0,x|0)|0;x=hb(x|0,D|0,Y|0,ja|0)|0;y=D;ja=kb(Y|0,ja|0,21)|0;ja=gb(C|0,A|0,ja|0,D|0)|0;A=D;C=fb(x|0,y|0,21)|0;Y=D;t=hb(r|0,t|0,C|0,Y|0)|0;r=D;Y=kb(C|0,Y|0,21)|0;Y=gb(x|0,y|0,Y|0,D|0)|0;y=D;x=fb(t|0,r|0,21)|0;C=D;o=hb(x|0,C|0,m|0,o|0)|0;m=D;C=kb(x|0,C|0,21)|0;C=gb(t|0,r|0,C|0,D|0)|0;r=D;t=fb(o|0,m|0,21)|0;x=D;h=hb(k|0,h|0,t|0,x|0)|0;k=D;x=kb(t|0,x|0,21)|0;x=gb(o|0,m|0,x|0,D|0)|0;m=D;o=fb(h|0,k|0,21)|0;t=D;I=hb(o|0,t|0,ia|0,I|0)|0;ia=D;t=kb(o|0,t|0,21)|0;t=gb(h|0,k|0,t|0,D|0)|0;k=D;h=fb(I|0,ia|0,21)|0;o=D;ba=hb(ha|0,ba|0,h|0,o|0)|0;ha=D;o=kb(h|0,o|0,21)|0;o=gb(I|0,ia|0,o|0,D|0)|0;ia=D;I=fb(ba|0,ha|0,21)|0;h=D;_=hb(I|0,h|0,e|0,_|0)|0;e=D;h=kb(I|0,h|0,21)|0;h=gb(ba|0,ha|0,h|0,D|0)|0;ha=D;ba=fb(_|0,e|0,21)|0;I=D;d=kb(ba|0,I|0,21)|0;d=gb(_|0,e|0,d|0,D|0)|0;e=D;_=sb(ba|0,I|0,666643,0)|0;U=hb(_|0,D|0,da|0,U|0)|0;da=D;_=sb(ba|0,I|0,470296,0)|0;_=hb(W|0,P|0,_|0,D|0)|0;P=D;W=sb(ba|0,I|0,654183,0)|0;W=hb(R|0,K|0,W|0,D|0)|0;K=D;R=sb(ba|0,I|0,-997805,-1)|0;R=hb(M|0,G|0,R|0,D|0)|0;G=D;M=sb(ba|0,I|0,136657,0)|0;M=hb(ja|0,A|0,M|0,D|0)|0;A=D;I=sb(ba|0,I|0,-683901,-1)|0;I=hb(Y|0,y|0,I|0,D|0)|0;y=D;Y=fb(U|0,da|0,21)|0;ba=D;P=hb(_|0,P|0,Y|0,ba|0)|0;_=D;ba=kb(Y|0,ba|0,21)|0;ba=gb(U|0,da|0,ba|0,D|0)|0;da=D;U=fb(P|0,_|0,21)|0;Y=D;K=hb(W|0,K|0,U|0,Y|0)|0;W=D;Y=kb(U|0,Y|0,21)|0;Y=gb(P|0,_|0,Y|0,D|0)|0;_=D;P=fb(K|0,W|0,21)|0;U=D;G=hb(R|0,G|0,P|0,U|0)|0;R=D;U=kb(P|0,U|0,21)|0;U=gb(K|0,W|0,U|0,D|0)|0;W=D;K=fb(G|0,R|0,21)|0;P=D;A=hb(M|0,A|0,K|0,P|0)|0;M=D;P=kb(K|0,P|0,21)|0;P=gb(G|0,R|0,P|0,D|0)|0;R=D;G=fb(A|0,M|0,21)|0;K=D;y=hb(I|0,y|0,G|0,K|0)|0;I=D;K=kb(G|0,K|0,21)|0;K=gb(A|0,M|0,K|0,D|0)|0;M=D;A=fb(y|0,I|0,21)|0;G=D;r=hb(A|0,G|0,C|0,r|0)|0;C=D;G=kb(A|0,G|0,21)|0;G=gb(y|0,I|0,G|0,D|0)|0;I=D;y=fb(r|0,C|0,21)|0;A=D;m=hb(y|0,A|0,x|0,m|0)|0;x=D;A=kb(y|0,A|0,21)|0;A=gb(r|0,C|0,A|0,D|0)|0;C=D;r=fb(m|0,x|0,21)|0;y=D;k=hb(r|0,y|0,t|0,k|0)|0;t=D;y=kb(r|0,y|0,21)|0;y=gb(m|0,x|0,y|0,D|0)|0;x=D;m=fb(k|0,t|0,21)|0;r=D;ia=hb(m|0,r|0,o|0,ia|0)|0;o=D;r=kb(m|0,r|0,21)|0;r=gb(k|0,t|0,r|0,D|0)|0;t=D;k=fb(ia|0,o|0,21)|0;m=D;ha=hb(k|0,m|0,h|0,ha|0)|0;h=D;m=kb(k|0,m|0,21)|0;m=gb(ia|0,o|0,m|0,D|0)|0;o=D;ia=fb(ha|0,h|0,21)|0;k=D;e=hb(ia|0,k|0,d|0,e|0)|0;d=D;k=kb(ia|0,k|0,21)|0;k=gb(ha|0,h|0,k|0,D|0)|0;h=D;ga(a>>0|0,ba|0,1,0);a=jb(ba|0,da|0,8)|0;ga(ea>>0|0,a|0,1,0);a=jb(ba|0,da|0,16)|0;da=D;ba=kb(Y|0,_|0,5)|0;D|da;ga(ca>>0|0,ba|a|0,1,0);a=jb(Y|0,_|0,3)|0;ga(aa>>0|0,a|0,1,0);a=jb(Y|0,_|0,11)|0;ga($>>0|0,a|0,1,0);a=jb(Y|0,_|0,19)|0;_=D;Y=kb(U|0,W|0,2)|0;D|_;ga(Z>>0|0,Y|a|0,1,0);a=jb(U|0,W|0,6)|0;ga(X>>0|0,a|0,1,0);a=jb(U|0,W|0,14)|0;W=D;U=kb(P|0,R|0,7)|0;D|W;ga(V>>0|0,U|a|0,1,0);a=jb(P|0,R|0,1)|0;ga(T>>0|0,a|0,1,0);a=jb(P|0,R|0,9)|0;ga(S>>0|0,a|0,1,0);a=jb(P|0,R|0,17)|0;R=D;P=kb(K|0,M|0,4)|0;D|R;ga(Q>>0|0,P|a|0,1,0);a=jb(K|0,M|0,4)|0;ga(O>>0|0,a|0,1,0);a=jb(K|0,M|0,12)|0;ga(N>>0|0,a|0,1,0);a=jb(K|0,M|0,20)|0;M=D;K=kb(G|0,I|0,1)|0;D|M;ga(L>>0|0,K|a|0,1,0);a=jb(G|0,I|0,7)|0;ga(J>>0|0,a|0,1,0);a=jb(G|0,I|0,15)|0;I=D;G=kb(A|0,C|0,6)|0;D|I;ga(H>>0|0,G|a|0,1,0);a=jb(A|0,C|0,2)|0;ga(F>>0|0,a|0,1,0);a=jb(A|0,C|0,10)|0;ga(E>>0|0,a|0,1,0);a=jb(A|0,C|0,18)|0;C=D;A=kb(y|0,x|0,3)|0;D|C;ga(B>>0|0,A|a|0,1,0);a=jb(y|0,x|0,5)|0;ga(z>>0|0,a|0,1,0);a=jb(y|0,x|0,13)|0;ga(w>>0|0,a|0,1,0);ga(v>>0|0,r|0,1,0);a=jb(r|0,t|0,8)|0;ga(u>>0|0,a|0,1,0);a=jb(r|0,t|0,16)|0;t=D;r=kb(m|0,o|0,5)|0;D|t;ga(s>>0|0,r|a|0,1,0);a=jb(m|0,o|0,3)|0;ga(q>>0|0,a|0,1,0);a=jb(m|0,o|0,11)|0;ga(p>>0|0,a|0,1,0);a=jb(m|0,o|0,19)|0;o=D;m=kb(k|0,h|0,2)|0;D|o;ga(n>>0|0,m|a|0,1,0);a=jb(k|0,h|0,6)|0;ga(l>>0|0,a|0,1,0);h=jb(k|0,h|0,14)|0;k=D;a=kb(e|0,d|0,7)|0;k|D;ga(j>>0|0,h|a|0,1,0);a=jb(e|0,d|0,1)|0;ga(g>>0|0,a|0,1,0);a=jb(e|0,d|0,9)|0;ga(f>>0|0,a|0,1,0);a=jb(e|0,d|0,17)|0;ga(c>>0|0,a|0,1,0);i=b;return}function Ta(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,za=0,Ba=0,Ca=0,Da=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0;j=i;i=i+1984|0;f=j+1920|0;k=j+640|0;g=j+480|0;h=j+320|0;d=j+160|0;e=j;l=0;m=0;do{Cb=(fa(b+m>>0|0,1,0,1)|0|0)+l|0;Eb=Cb+8>>4;Db=m<<1;ga(f+Db>>0|0,Cb-(Eb<<4)|0,1,0);l=Eb+8>>4;ga(f+(Db|1)>>0|0,Eb-(l<<4)|0,1,0);m=m+1|0}while((m|0)!=31);m=(fa(b+31>>0|0,1,0,1)|0|0)+l|0;p=m+8>>4;ga(f+62>>0|0,m-(p<<4)|0,1,0);ga(f+63>>0|0,p|0,1,0);Aa(k,c);p=g+120|0;m=h+40|0;b=g+40|0;l=g+80|0;n=h+80|0;o=h+120|0;q=0;do{xa(g,c,k+(q*160|0)|0);ya(h,g,p);ya(m,b,l);ya(n,l,p);ya(o,g,b);q=q+1|0;Aa(k+(q*160|0)|0,h)}while((q|0)!=7);v=a+0|0;u=v+40|0;do{ga(v|0,0|0,4,0);v=v+4|0}while((v|0)<(u|0));w=a+40|0;ga(w|0,1|0,4,0);v=a+44|0;u=v+36|0;do{ga(v|0,0|0,4,0);v=v+4|0}while((v|0)<(u|0));x=a+80|0;ga(x|0,1|0,4,0);v=a+84|0;u=v+36|0;do{ga(v|0,0|0,4,0);v=v+4|0}while((v|0)<(u|0));Ca=d+4|0;y=d+40|0;z=d+44|0;A=d+80|0;B=d+84|0;C=k+40|0;D=k+80|0;E=d+120|0;F=k+120|0;G=k+160|0;H=k+200|0;I=k+240|0;J=k+280|0;K=k+320|0;L=k+360|0;M=k+400|0;N=k+440|0;O=k+480|0;P=k+520|0;Q=k+560|0;R=k+600|0;S=k+640|0;T=k+680|0;U=k+720|0;V=k+760|0;W=k+800|0;X=k+840|0;Y=k+880|0;Z=k+920|0;_=k+960|0;$=k+1e3|0;aa=k+1040|0;ba=k+1080|0;ca=k+1120|0;da=k+1160|0;ea=k+1200|0;ha=k+1240|0;ia=d+48|0;ja=d+52|0;ka=d+56|0;la=d+60|0;ma=d+64|0;na=d+68|0;oa=d+72|0;pa=d+76|0;Eb=e+4|0;ra=e+8|0;sa=e+12|0;ta=e+16|0;ua=e+20|0;va=e+24|0;wa=e+28|0;za=e+32|0;Ba=e+36|0;Ma=e+40|0;Da=d+8|0;Fa=d+12|0;Ga=d+16|0;Ha=d+20|0;Ia=d+24|0;Ja=d+28|0;Ka=d+32|0;La=d+36|0;Na=e+44|0;Oa=e+48|0;Pa=e+52|0;Qa=e+56|0;Ra=e+60|0;Sa=e+64|0;Ta=e+68|0;Ua=e+72|0;Va=e+76|0;db=e+80|0;Wa=d+88|0;Xa=d+92|0;Ya=d+96|0;Za=d+100|0;_a=d+104|0;$a=d+108|0;ab=d+112|0;cb=d+116|0;eb=e+84|0;fb=e+88|0;gb=e+92|0;hb=e+96|0;ib=e+100|0;kb=e+104|0;lb=e+108|0;mb=e+112|0;nb=e+116|0;xb=e+120|0;ob=d+124|0;pb=d+128|0;qb=d+132|0;rb=d+136|0;sb=d+140|0;tb=d+144|0;ub=d+148|0;vb=d+152|0;wb=d+156|0;yb=e+124|0;zb=e+128|0;Ab=e+132|0;Bb=e+136|0;Cb=e+140|0;Db=e+144|0;t=e+148|0;r=e+152|0;q=e+156|0;c=63;while(1){qa=fa(f+c>>0|0,1,0,0)|0|0;s=qa<<24>>24;s=jb(s|0,((s|0)<0)<<31>>31|0,63)|0;qa=qa<<24>>24;qa=qa-((qa&0-s)<<1)|0;Ea(g,a);ya(a,g,p);ya(w,b,l);ya(x,l,p);Ea(g,a);ya(a,g,p);ya(w,b,l);ya(x,l,p);Ea(g,a);ya(a,g,p);ya(w,b,l);ya(x,l,p);Ea(g,a);ya(h,g,p);ya(m,b,l);ya(n,l,p);ya(o,g,b);ga(d|0,1|0,4,0);v=Ca+0|0;u=v+36|0;do{ga(v|0,0|0,4,0);v=v+4|0}while((v|0)<(u|0));ga(y|0,1|0,4,0);v=z+0|0;u=v+36|0;do{ga(v|0,0|0,4,0);v=v+4|0}while((v|0)<(u|0));ga(A|0,1|0,4,0);v=B+0|0;u=v+76|0;do{ga(v|0,0|0,4,0);v=v+4|0}while((v|0)<(u|0));qa=qa&255;v=((qa^1)+ -1|0)>>>31;bb(d,k,v);bb(y,C,v);bb(A,D,v);bb(E,F,v);v=((qa^2)+ -1|0)>>>31;bb(d,G,v);bb(y,H,v);bb(A,I,v);bb(E,J,v);v=((qa^3)+ -1|0)>>>31;bb(d,K,v);bb(y,L,v);bb(A,M,v);bb(E,N,v);v=((qa^4)+ -1|0)>>>31;bb(d,O,v);bb(y,P,v);bb(A,Q,v);bb(E,R,v);v=((qa^5)+ -1|0)>>>31;bb(d,S,v);bb(y,T,v);bb(A,U,v);bb(E,V,v);v=((qa^6)+ -1|0)>>>31;bb(d,W,v);bb(y,X,v);bb(A,Y,v);bb(E,Z,v);v=((qa^7)+ -1|0)>>>31;bb(d,_,v);bb(y,$,v);bb(A,aa,v);bb(E,ba,v);qa=((qa^8)+ -1|0)>>>31;bb(d,ca,qa);bb(y,da,qa);bb(A,ea,qa);bb(E,ha,qa);qa=fa(z|0,4,0,0)|0|0;v=fa(ia|0,4,0,0)|0|0;u=fa(ja|0,4,0,0)|0|0;Fb=fa(ka|0,4,0,0)|0|0;Gb=fa(la|0,4,0,0)|0|0;Hb=fa(ma|0,4,0,0)|0|0;Ib=fa(na|0,4,0,0)|0|0;Jb=fa(oa|0,4,0,0)|0|0;Kb=fa(pa|0,4,0,0)|0|0;ga(e|0,fa(y|0,4,0,0)|0|0,4,0);ga(Eb|0,qa|0,4,0);ga(ra|0,v|0,4,0);ga(sa|0,u|0,4,0);ga(ta|0,Fb|0,4,0);ga(ua|0,Gb|0,4,0);ga(va|0,Hb|0,4,0);ga(wa|0,Ib|0,4,0);ga(za|0,Jb|0,4,0);ga(Ba|0,Kb|0,4,0);Kb=fa(Ca|0,4,0,0)|0|0;Jb=fa(Da|0,4,0,0)|0|0;Ib=fa(Fa|0,4,0,0)|0|0;Hb=fa(Ga|0,4,0,0)|0|0;Gb=fa(Ha|0,4,0,0)|0|0;Fb=fa(Ia|0,4,0,0)|0|0;u=fa(Ja|0,4,0,0)|0|0;v=fa(Ka|0,4,0,0)|0|0;qa=fa(La|0,4,0,0)|0|0;ga(Ma|0,fa(d|0,4,0,0)|0|0,4,0);ga(Na|0,Kb|0,4,0);ga(Oa|0,Jb|0,4,0);ga(Pa|0,Ib|0,4,0);ga(Qa|0,Hb|0,4,0);ga(Ra|0,Gb|0,4,0);ga(Sa|0,Fb|0,4,0);ga(Ta|0,u|0,4,0);ga(Ua|0,v|0,4,0);ga(Va|0,qa|0,4,0);qa=fa(B|0,4,0,0)|0|0;v=fa(Wa|0,4,0,0)|0|0;u=fa(Xa|0,4,0,0)|0|0;Fb=fa(Ya|0,4,0,0)|0|0;Gb=fa(Za|0,4,0,0)|0|0;Hb=fa(_a|0,4,0,0)|0|0;Ib=fa($a|0,4,0,0)|0|0;Jb=fa(ab|0,4,0,0)|0|0;Kb=fa(cb|0,4,0,0)|0|0;ga(db|0,fa(A|0,4,0,0)|0|0,4,0);ga(eb|0,qa|0,4,0);ga(fb|0,v|0,4,0);ga(gb|0,u|0,4,0);ga(hb|0,Fb|0,4,0);ga(ib|0,Gb|0,4,0);ga(kb|0,Hb|0,4,0);ga(lb|0,Ib|0,4,0);ga(mb|0,Jb|0,4,0);ga(nb|0,Kb|0,4,0);Kb=0-(fa(ob|0,4,0,0)|0|0)|0;Jb=0-(fa(pb|0,4,0,0)|0|0)|0;Ib=0-(fa(qb|0,4,0,0)|0|0)|0;Hb=0-(fa(rb|0,4,0,0)|0|0)|0;Gb=0-(fa(sb|0,4,0,0)|0|0)|0;Fb=0-(fa(tb|0,4,0,0)|0|0)|0;u=0-(fa(ub|0,4,0,0)|0|0)|0;v=0-(fa(vb|0,4,0,0)|0|0)|0;qa=0-(fa(wb|0,4,0,0)|0|0)|0;ga(xb|0,0-(fa(E|0,4,0,0)|0|0)|0,4,0);ga(yb|0,Kb|0,4,0);ga(zb|0,Jb|0,4,0);ga(Ab|0,Ib|0,4,0);ga(Bb|0,Hb|0,4,0);ga(Cb|0,Gb|0,4,0);ga(Db|0,Fb|0,4,0);ga(t|0,u|0,4,0);ga(r|0,v|0,4,0);ga(q|0,qa|0,4,0);bb(d,e,s);bb(y,Ma,s);bb(A,db,s);bb(E,xb,s);xa(g,h,d);ya(a,g,p);ya(w,b,l);ya(x,l,p);if((c|0)>0){c=c+ -1|0}else{break}}i=j;return}function Ua(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;i=i+2112|0;f=h+1856|0;g=h+1600|0;l=h+320|0;j=h+160|0;k=h;Da(f,b);Da(g,d);za(l,c);c=a+0|0;m=c+40|0;do{ga(c|0,0|0,4,0);c=c+4|0}while((c|0)<(m|0));b=a+40|0;ga(b|0,1|0,4,0);c=a+44|0;m=c+36|0;do{ga(c|0,0|0,4,0);c=c+4|0}while((c|0)<(m|0));d=a+80|0;ga(d|0,1|0,4,0);c=a+84|0;m=c+36|0;do{ga(c|0,0|0,4,0);c=c+4|0}while((c|0)<(m|0));r=255;while(1){if((fa(f+r>>0|0,1,0,0)|0|0)!=0){break}c=r+ -1|0;if((fa(g+r>>0|0,1,0,0)|0|0)!=0){break}if((r|0)>0){r=c}else{r=c;break}}if(!((r|0)>-1)){i=h;return}q=j+120|0;n=k+40|0;p=j+40|0;o=j+80|0;m=k+80|0;c=k+120|0;while(1){Ea(j,a);s=fa(f+r>>0|0,1,0,0)|0|0;if(!(s<<24>>24>0)){if(s<<24>>24<0){ya(k,j,q);ya(n,p,o);ya(m,o,q);ya(c,j,p);Fa(j,k,l+(((s<<24>>24|0)/-2|0)*160|0)|0)}}else{ya(k,j,q);ya(n,p,o);ya(m,o,q);ya(c,j,p);xa(j,k,l+(((s<<24>>24|0)/2|0)*160|0)|0)}s=fa(g+r>>0|0,1,0,0)|0|0;if(!(s<<24>>24>0)){if(s<<24>>24<0){ya(k,j,q);ya(n,p,o);ya(m,o,q);ya(c,j,p);Fa(j,k,e+(((s<<24>>24|0)/-2|0)*160|0)|0)}}else{ya(k,j,q);ya(n,p,o);ya(m,o,q);ya(c,j,p);xa(j,k,e+(((s<<24>>24|0)/2|0)*160|0)|0)}ya(a,j,q);ya(b,p,o);ya(d,o,q);if((r|0)>0){r=r+ -1|0}else{break}}i=h;return}function Va(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=i;i=i+128|0;d=c;Ea(a,b);b=a+120|0;ya(d,a,b);h=d+40|0;g=a+40|0;e=a+80|0;ya(h,g,e);f=d+80|0;ya(f,e,b);Ea(a,d);ya(d,a,b);ya(h,g,e);ya(f,e,b);Ea(a,d);i=c;return}function Wa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ma=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0;e=i;i=i+432|0;c=e+400|0;Ga=e+360|0;Ba=e+320|0;T=e+280|0;O=e+240|0;P=e+200|0;Q=e+160|0;L=e+120|0;M=e+80|0;S=e+40|0;d=e;ia=fa(b>>0|0,1,0,1)|0|0;Ca=kb(fa(b+1>>0|0,1,0,1)|0|0|0,0,8)|0;Da=D;sa=kb(fa(b+2>>0|0,1,0,1)|0|0|0,0,16)|0;Da=Da|D;ra=kb(fa(b+3>>0|0,1,0,1)|0|0|0,0,24)|0;Da=Da|D;Ha=fa(b+6>>0|0,1,0,0)|0|0;Ea=fa(b+4>>0|0,1,0,1)|0|0;ta=kb(fa(b+5>>0|0,1,0,1)|0|0|0,0,8)|0;Fa=D;Ha=kb(Ha&255|0,0,16)|0;Fa=kb(ta|Ea|Ha|0,Fa|D|0,6)|0;Ha=D;Ea=fa(b+9>>0|0,1,0,0)|0|0;ta=fa(b+7>>0|0,1,0,1)|0|0;Aa=kb(fa(b+8>>0|0,1,0,1)|0|0|0,0,8)|0;ma=D;Ea=kb(Ea&255|0,0,16)|0;ma=kb(Aa|ta|Ea|0,ma|D|0,5)|0;Ea=D;ta=fa(b+12>>0|0,1,0,0)|0|0;Aa=fa(b+10>>0|0,1,0,1)|0|0;ka=kb(fa(b+11>>0|0,1,0,1)|0|0|0,0,8)|0;va=D;ta=kb(ta&255|0,0,16)|0;va=kb(ka|Aa|ta|0,va|D|0,3)|0;ta=D;Aa=fa(b+15>>0|0,1,0,0)|0|0;ka=fa(b+13>>0|0,1,0,1)|0|0;W=kb(fa(b+14>>0|0,1,0,1)|0|0|0,0,8)|0;$=D;Aa=kb(Aa&255|0,0,16)|0;$=kb(W|ka|Aa|0,$|D|0,2)|0;Aa=D;ka=fa(b+16>>0|0,1,0,1)|0|0;W=kb(fa(b+17>>0|0,1,0,1)|0|0|0,0,8)|0;pa=D;xa=kb(fa(b+18>>0|0,1,0,1)|0|0|0,0,16)|0;pa=pa|D;qa=kb(fa(b+19>>0|0,1,0,1)|0|0|0,0,24)|0;qa=W|ka|xa|qa;pa=pa|D;xa=fa(b+22>>0|0,1,0,0)|0|0;ka=fa(b+20>>0|0,1,0,1)|0|0;W=kb(fa(b+21>>0|0,1,0,1)|0|0|0,0,8)|0;X=D;xa=kb(xa&255|0,0,16)|0;X=kb(W|ka|xa|0,X|D|0,7)|0;xa=D;ka=fa(b+25>>0|0,1,0,0)|0|0;W=fa(b+23>>0|0,1,0,1)|0|0;Z=kb(fa(b+24>>0|0,1,0,1)|0|0|0,0,8)|0;la=D;ka=kb(ka&255|0,0,16)|0;la=kb(Z|W|ka|0,la|D|0,5)|0;ka=D;W=fa(b+28>>0|0,1,0,0)|0|0;Z=fa(b+26>>0|0,1,0,1)|0|0;wa=kb(fa(b+27>>0|0,1,0,1)|0|0|0,0,8)|0;oa=D;W=kb(W&255|0,0,16)|0;oa=kb(wa|Z|W|0,oa|D|0,4)|0;W=D;Z=fa(b+31>>0|0,1,0,0)|0|0;wa=fa(b+29>>0|0,1,0,1)|0|0;Y=kb(fa(b+30>>0|0,1,0,1)|0|0|0,0,8)|0;_=D;Z=kb(Z&255|0,0,16)|0;_=kb(Y|wa|Z|0,_|D|0,2)|0;Z=D;wa=hb(_|0,Z|0,16777216,0)|0;wa=jb(wa|0,D|0,25)|0;Y=D;U=sb(wa|0,Y|0,19,0)|0;Da=hb(U|0,D|0,Ca|ia|sa|ra|0,Da|0)|0;ra=D;Y=kb(wa|0,Y|0,25)|0;wa=D;sa=hb(Fa|0,Ha|0,16777216,0)|0;sa=jb(sa|0,D|0,25)|0;ia=D;Ea=hb(ma|0,Ea|0,sa|0,ia|0)|0;ma=D;ia=kb(sa|0,ia|0,25)|0;ia=gb(Fa|0,Ha|0,ia|0,D|0)|0;Ha=D;Fa=hb(va|0,ta|0,16777216,0)|0;Fa=jb(Fa|0,D|0,25)|0;sa=D;Aa=hb($|0,Aa|0,Fa|0,sa|0)|0;$=D;sa=kb(Fa|0,sa|0,25)|0;Fa=D;Ca=hb(qa|0,pa|0,16777216,0)|0;Ca=jb(Ca|0,D|0,25)|0;U=D;xa=hb(X|0,xa|0,Ca|0,U|0)|0;X=D;U=kb(Ca|0,U|0,25)|0;Ca=D;za=hb(la|0,ka|0,16777216,0)|0;za=jb(za|0,D|0,25)|0;aa=D;W=hb(oa|0,W|0,za|0,aa|0)|0;oa=D;aa=kb(za|0,aa|0,25)|0;za=D;ja=hb(Da|0,ra|0,33554432,0)|0;ja=fb(ja|0,D|0,26)|0;ha=D;Ha=hb(ia|0,Ha|0,ja|0,ha|0)|0;ha=kb(ja|0,ha|0,26)|0;ha=gb(Da|0,ra|0,ha|0,D|0)|0;ra=hb(Ea|0,ma|0,33554432,0)|0;ra=fb(ra|0,D|0,26)|0;Da=D;ta=hb(ra|0,Da|0,va|0,ta|0)|0;Fa=gb(ta|0,D|0,sa|0,Fa|0)|0;Da=kb(ra|0,Da|0,26)|0;Da=gb(Ea|0,ma|0,Da|0,D|0)|0;ma=hb(Aa|0,$|0,33554432,0)|0;ma=fb(ma|0,D|0,26)|0;Ea=D;pa=hb(ma|0,Ea|0,qa|0,pa|0)|0;Ca=gb(pa|0,D|0,U|0,Ca|0)|0;Ea=kb(ma|0,Ea|0,26)|0;Ea=gb(Aa|0,$|0,Ea|0,D|0)|0;$=hb(xa|0,X|0,33554432,0)|0;$=fb($|0,D|0,26)|0;Aa=D;ka=hb($|0,Aa|0,la|0,ka|0)|0;za=gb(ka|0,D|0,aa|0,za|0)|0;Aa=kb($|0,Aa|0,26)|0;Aa=gb(xa|0,X|0,Aa|0,D|0)|0;X=hb(W|0,oa|0,33554432,0)|0;X=fb(X|0,D|0,26)|0;xa=D;Z=hb(X|0,xa|0,_|0,Z|0)|0;wa=gb(Z|0,D|0,Y|0,wa|0)|0;xa=kb(X|0,xa|0,26)|0;xa=gb(W|0,oa|0,xa|0,D|0)|0;ga(Ga|0,ha|0,4,0);ga(Ga+4|0,Ha|0,4,0);ga(Ga+8|0,Da|0,4,0);ga(Ga+12|0,Fa|0,4,0);ga(Ga+16|0,Ea|0,4,0);ga(Ga+20|0,Ca|0,4,0);ga(Ga+24|0,Aa|0,4,0);ga(Ga+28|0,za|0,4,0);ga(Ga+32|0,xa|0,4,0);ga(Ga+36|0,wa|0,4,0);La(Ba,Ga);wa=T+4|0;ga(wa+0|0,0|0,4,0);ga(wa+4|0,0|0,4,0);ga(wa+8|0,0|0,4,0);ga(wa+12|0,0|0,4,0);ga(wa+16|0,0|0,4,0);ga(wa+20|0,0|0,4,0);ga(wa+24|0,0|0,4,0);ga(wa+28|0,0|0,4,0);xa=fa(Ba+4|0,4,0,0)|0|0;za=fa(Ba+8|0,4,0,0)|0|0;Aa=fa(Ba+12|0,4,0,0)|0|0;Ca=fa(Ba+16|0,4,0,0)|0|0;Ea=fa(Ba+20|0,4,0,0)|0|0;Fa=fa(Ba+24|0,4,0,0)|0|0;Da=fa(Ba+28|0,4,0,0)|0|0;Ha=fa(Ba+32|0,4,0,0)|0|0;ha=fa(Ba+36|0,4,0,0)|0|0;oa=T+8|0;W=T+12|0;X=T+16|0;Y=T+20|0;Z=T+24|0;_=T+28|0;$=T+32|0;aa=T+36|0;ga(T|0,(fa(Ba|0,4,0,0)|0|0)+1|0,4,0);ga(wa|0,xa|0,4,0);ga(oa|0,za|0,4,0);ga(W|0,Aa|0,4,0);ga(X|0,Ca|0,4,0);ga(Y|0,Ea|0,4,0);ga(Z|0,Fa|0,4,0);ga(_|0,Da|0,4,0);ga($|0,Ha|0,4,0);ga(aa|0,ha|0,4,0);Ja(O,T);ya(P,32040,Ba);ha=O+4|0;Ha=O+8|0;Da=O+12|0;Fa=O+16|0;Ea=O+20|0;Ca=O+24|0;Aa=O+28|0;za=O+32|0;xa=O+36|0;ka=P+4|0;la=P+8|0;ma=P+12|0;U=P+16|0;pa=P+20|0;qa=P+24|0;ra=P+28|0;sa=P+32|0;ta=P+36|0;va=(fa(ka|0,4,0,0)|0|0)+(fa(ha|0,4,0,0)|0|0)|0;ja=(fa(la|0,4,0,0)|0|0)+(fa(Ha|0,4,0,0)|0|0)|0;ia=(fa(ma|0,4,0,0)|0|0)+(fa(Da|0,4,0,0)|0|0)|0;ea=(fa(U|0,4,0,0)|0|0)+(fa(Fa|0,4,0,0)|0|0)|0;da=(fa(pa|0,4,0,0)|0|0)+(fa(Ea|0,4,0,0)|0|0)|0;ca=(fa(qa|0,4,0,0)|0|0)+(fa(Ca|0,4,0,0)|0|0)|0;ba=(fa(ra|0,4,0,0)|0|0)+(fa(Aa|0,4,0,0)|0|0)|0;V=(fa(sa|0,4,0,0)|0|0)+(fa(za|0,4,0,0)|0|0)|0;t=(fa(ta|0,4,0,0)|0|0)+(fa(xa|0,4,0,0)|0|0)|0;ga(O|0,(fa(P|0,4,0,0)|0|0)+(fa(O|0,4,0,0)|0|0)|0,4,0);ga(ha|0,va|0,4,0);ga(Ha|0,ja|0,4,0);ga(Da|0,ia|0,4,0);ga(Fa|0,ea|0,4,0);ga(Ea|0,da|0,4,0);ga(Ca|0,ca|0,4,0);ga(Aa|0,ba|0,4,0);ga(za|0,V|0,4,0);ga(xa|0,t|0,4,0);Ka(a,T,O);Ja(P,a);ya(O,P,O);t=(fa(wa|0,4,0,0)|0|0)-(fa(ha|0,4,0,0)|0|0)|0;V=(fa(oa|0,4,0,0)|0|0)-(fa(Ha|0,4,0,0)|0|0)|0;ba=(fa(W|0,4,0,0)|0|0)-(fa(Da|0,4,0,0)|0|0)|0;ca=(fa(X|0,4,0,0)|0|0)-(fa(Fa|0,4,0,0)|0|0)|0;da=(fa(Y|0,4,0,0)|0|0)-(fa(Ea|0,4,0,0)|0|0)|0;ea=(fa(Z|0,4,0,0)|0|0)-(fa(Ca|0,4,0,0)|0|0)|0;ia=(fa(_|0,4,0,0)|0|0)-(fa(Aa|0,4,0,0)|0|0)|0;ja=(fa($|0,4,0,0)|0|0)-(fa(za|0,4,0,0)|0|0)|0;va=(fa(aa|0,4,0,0)|0|0)-(fa(xa|0,4,0,0)|0|0)|0;ga(P|0,(fa(T|0,4,0,0)|0|0)-(fa(O|0,4,0,0)|0|0)|0,4,0);ga(ka|0,t|0,4,0);ga(la|0,V|0,4,0);ga(ma|0,ba|0,4,0);ga(U|0,ca|0,4,0);ga(pa|0,da|0,4,0);ga(qa|0,ea|0,4,0);ga(ra|0,ia|0,4,0);ga(sa|0,ja|0,4,0);ga(ta|0,va|0,4,0);va=fa(32084|0,4,0,0)|0|0;ja=fa(32088|0,4,0,0)|0|0;ia=fa(32092|0,4,0,0)|0|0;ea=fa(32096|0,4,0,0)|0|0;da=fa(32100|0,4,0,0)|0|0;ca=fa(32104|0,4,0,0)|0|0;ba=fa(32108|0,4,0,0)|0|0;V=fa(32112|0,4,0,0)|0|0;t=fa(32116|0,4,0,0)|0|0;ga(Q|0,fa(8020*4|0,4,0,0)|0|0,4,0);ua=Q+4|0;ga(ua|0,va|0,4,0);va=Q+8|0;ga(va|0,ja|0,4,0);ja=Q+12|0;ga(ja|0,ia|0,4,0);ia=Q+16|0;ga(ia|0,ea|0,4,0);ea=Q+20|0;ga(ea|0,da|0,4,0);da=Q+24|0;ga(da|0,ca|0,4,0);ca=Q+28|0;ga(ca|0,ba|0,4,0);ba=Q+32|0;ga(ba|0,V|0,4,0);V=Q+36|0;ga(V|0,t|0,4,0);Oa(c,P);t=c+1|0;J=c+2|0;f=c+3|0;u=c+4|0;g=c+5|0;h=c+6|0;j=c+7|0;k=c+8|0;l=c+9|0;m=c+10|0;n=c+11|0;o=c+12|0;p=c+13|0;q=c+14|0;r=c+15|0;s=c+16|0;K=c+17|0;b=c+18|0;v=c+19|0;w=c+20|0;x=c+21|0;y=c+22|0;z=c+23|0;A=c+24|0;B=c+25|0;C=c+26|0;E=c+27|0;F=c+28|0;G=c+29|0;H=c+30|0;I=c+31|0;do{if(!((((fa(t>>0|0,1,0,0)|0|(fa(c>>0|0,1,0,0)|0)|(fa(J>>0|0,1,0,0)|0)|(fa(f>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(g>>0|0,1,0,0)|0)|(fa(h>>0|0,1,0,0)|0)|(fa(j>>0|0,1,0,0)|0)|(fa(k>>0|0,1,0,0)|0)|(fa(l>>0|0,1,0,0)|0)|(fa(m>>0|0,1,0,0)|0)|(fa(n>>0|0,1,0,0)|0)|(fa(o>>0|0,1,0,0)|0)|(fa(p>>0|0,1,0,0)|0)|(fa(q>>0|0,1,0,0)|0)|(fa(r>>0|0,1,0,0)|0)|(fa(s>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(b>>0|0,1,0,0)|0)|(fa(v>>0|0,1,0,0)|0)|(fa(w>>0|0,1,0,0)|0)|(fa(x>>0|0,1,0,0)|0)|(fa(y>>0|0,1,0,0)|0)|(fa(z>>0|0,1,0,0)|0)|(fa(A>>0|0,1,0,0)|0)|(fa(B>>0|0,1,0,0)|0)|(fa(C>>0|0,1,0,0)|0)|(fa(E>>0|0,1,0,0)|0)|(fa(F>>0|0,1,0,0)|0)|(fa(G>>0|0,1,0,0)|0)|(fa(H>>0|0,1,0,0)|0)|(fa(I>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256)){Va=(fa(ha|0,4,0,0)|0|0)+(fa(wa|0,4,0,0)|0|0)|0;Ua=(fa(Ha|0,4,0,0)|0|0)+(fa(oa|0,4,0,0)|0|0)|0;Ta=(fa(Da|0,4,0,0)|0|0)+(fa(W|0,4,0,0)|0|0)|0;Sa=(fa(Fa|0,4,0,0)|0|0)+(fa(X|0,4,0,0)|0|0)|0;Ra=(fa(Ea|0,4,0,0)|0|0)+(fa(Y|0,4,0,0)|0|0)|0;Qa=(fa(Ca|0,4,0,0)|0|0)+(fa(Z|0,4,0,0)|0|0)|0;Pa=(fa(Aa|0,4,0,0)|0|0)+(fa(_|0,4,0,0)|0|0)|0;Ma=(fa(za|0,4,0,0)|0|0)+(fa($|0,4,0,0)|0|0)|0;Ia=(fa(xa|0,4,0,0)|0|0)+(fa(aa|0,4,0,0)|0|0)|0;ga(P|0,(fa(O|0,4,0,0)|0|0)+(fa(T|0,4,0,0)|0|0)|0,4,0);ga(ka|0,Va|0,4,0);ga(la|0,Ua|0,4,0);ga(ma|0,Ta|0,4,0);ga(U|0,Sa|0,4,0);ga(pa|0,Ra|0,4,0);ga(qa|0,Qa|0,4,0);ga(ra|0,Pa|0,4,0);ga(sa|0,Ma|0,4,0);ga(ta|0,Ia|0,4,0);Oa(c,P);if((((fa(t>>0|0,1,0,0)|0|(fa(c>>0|0,1,0,0)|0)|(fa(J>>0|0,1,0,0)|0)|(fa(f>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(g>>0|0,1,0,0)|0)|(fa(h>>0|0,1,0,0)|0)|(fa(j>>0|0,1,0,0)|0)|(fa(k>>0|0,1,0,0)|0)|(fa(l>>0|0,1,0,0)|0)|(fa(m>>0|0,1,0,0)|0)|(fa(n>>0|0,1,0,0)|0)|(fa(o>>0|0,1,0,0)|0)|(fa(p>>0|0,1,0,0)|0)|(fa(q>>0|0,1,0,0)|0)|(fa(r>>0|0,1,0,0)|0)|(fa(s>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(b>>0|0,1,0,0)|0)|(fa(v>>0|0,1,0,0)|0)|(fa(w>>0|0,1,0,0)|0)|(fa(x>>0|0,1,0,0)|0)|(fa(y>>0|0,1,0,0)|0)|(fa(z>>0|0,1,0,0)|0)|(fa(A>>0|0,1,0,0)|0)|(fa(B>>0|0,1,0,0)|0)|(fa(C>>0|0,1,0,0)|0)|(fa(E>>0|0,1,0,0)|0)|(fa(F>>0|0,1,0,0)|0)|(fa(G>>0|0,1,0,0)|0)|(fa(H>>0|0,1,0,0)|0)|(fa(I>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256){ya(a,a,32120);N=5;break}ya(O,O,280);Ba=fa(Ha|0,4,0,0)|0|0;Da=fa(Da|0,4,0,0)|0|0;Fa=fa(Fa|0,4,0,0)|0|0;Ea=fa(Ea|0,4,0,0)|0|0;Ca=fa(Ca|0,4,0,0)|0|0;Aa=fa(Aa|0,4,0,0)|0|0;za=fa(za|0,4,0,0)|0|0;xa=fa(xa|0,4,0,0)|0|0;Ia=(fa(wa|0,4,0,0)|0|0)-(fa(ha|0,4,0,0)|0|0)|0;Ma=(fa(oa|0,4,0,0)|0|0)-Ba|0;Pa=(fa(W|0,4,0,0)|0|0)-Da|0;Qa=(fa(X|0,4,0,0)|0|0)-Fa|0;Ra=(fa(Y|0,4,0,0)|0|0)-Ea|0;Sa=(fa(Z|0,4,0,0)|0|0)-Ca|0;Ta=(fa(_|0,4,0,0)|0|0)-Aa|0;Ua=(fa($|0,4,0,0)|0|0)-za|0;Va=(fa(aa|0,4,0,0)|0|0)-xa|0;ga(P|0,(fa(T|0,4,0,0)|0|0)-(fa(O|0,4,0,0)|0|0)|0,4,0);ga(ka|0,Ia|0,4,0);ga(la|0,Ma|0,4,0);ga(ma|0,Pa|0,4,0);ga(U|0,Qa|0,4,0);ga(pa|0,Ra|0,4,0);ga(qa|0,Sa|0,4,0);ga(ra|0,Ta|0,4,0);ga(sa|0,Ua|0,4,0);ga(ta|0,Va|0,4,0);Oa(c,P);if((((fa(t>>0|0,1,0,0)|0|(fa(c>>0|0,1,0,0)|0)|(fa(J>>0|0,1,0,0)|0)|(fa(f>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(g>>0|0,1,0,0)|0)|(fa(h>>0|0,1,0,0)|0)|(fa(j>>0|0,1,0,0)|0)|(fa(k>>0|0,1,0,0)|0)|(fa(l>>0|0,1,0,0)|0)|(fa(m>>0|0,1,0,0)|0)|(fa(n>>0|0,1,0,0)|0)|(fa(o>>0|0,1,0,0)|0)|(fa(p>>0|0,1,0,0)|0)|(fa(q>>0|0,1,0,0)|0)|(fa(r>>0|0,1,0,0)|0)|(fa(s>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(b>>0|0,1,0,0)|0)|(fa(v>>0|0,1,0,0)|0)|(fa(w>>0|0,1,0,0)|0)|(fa(x>>0|0,1,0,0)|0)|(fa(y>>0|0,1,0,0)|0)|(fa(z>>0|0,1,0,0)|0)|(fa(A>>0|0,1,0,0)|0)|(fa(B>>0|0,1,0,0)|0)|(fa(C>>0|0,1,0,0)|0)|(fa(E>>0|0,1,0,0)|0)|(fa(F>>0|0,1,0,0)|0)|(fa(G>>0|0,1,0,0)|0)|(fa(H>>0|0,1,0,0)|0)|(fa(I>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256){ya(a,a,32240);R=1;break}Ia=(fa(ha|0,4,0,0)|0|0)+(fa(wa|0,4,0,0)|0|0)|0;Ma=Ba+(fa(oa|0,4,0,0)|0|0)|0;Pa=Da+(fa(W|0,4,0,0)|0|0)|0;Qa=Fa+(fa(X|0,4,0,0)|0|0)|0;Ra=Ea+(fa(Y|0,4,0,0)|0|0)|0;Sa=Ca+(fa(Z|0,4,0,0)|0|0)|0;Ta=Aa+(fa(_|0,4,0,0)|0|0)|0;Ua=za+(fa($|0,4,0,0)|0|0)|0;Va=xa+(fa(aa|0,4,0,0)|0|0)|0;ga(P|0,(fa(O|0,4,0,0)|0|0)+(fa(T|0,4,0,0)|0|0)|0,4,0);ga(ka|0,Ia|0,4,0);ga(la|0,Ma|0,4,0);ga(ma|0,Pa|0,4,0);ga(U|0,Qa|0,4,0);ga(pa|0,Ra|0,4,0);ga(qa|0,Sa|0,4,0);ga(ra|0,Ta|0,4,0);ga(sa|0,Ua|0,4,0);ga(ta|0,Va|0,4,0);Oa(c,P);if((((fa(t>>0|0,1,0,0)|0|(fa(c>>0|0,1,0,0)|0)|(fa(J>>0|0,1,0,0)|0)|(fa(f>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(g>>0|0,1,0,0)|0)|(fa(h>>0|0,1,0,0)|0)|(fa(j>>0|0,1,0,0)|0)|(fa(k>>0|0,1,0,0)|0)|(fa(l>>0|0,1,0,0)|0)|(fa(m>>0|0,1,0,0)|0)|(fa(n>>0|0,1,0,0)|0)|(fa(o>>0|0,1,0,0)|0)|(fa(p>>0|0,1,0,0)|0)|(fa(q>>0|0,1,0,0)|0)|(fa(r>>0|0,1,0,0)|0)|(fa(s>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(b>>0|0,1,0,0)|0)|(fa(v>>0|0,1,0,0)|0)|(fa(w>>0|0,1,0,0)|0)|(fa(x>>0|0,1,0,0)|0)|(fa(y>>0|0,1,0,0)|0)|(fa(z>>0|0,1,0,0)|0)|(fa(A>>0|0,1,0,0)|0)|(fa(B>>0|0,1,0,0)|0)|(fa(C>>0|0,1,0,0)|0)|(fa(E>>0|0,1,0,0)|0)|(fa(F>>0|0,1,0,0)|0)|(fa(G>>0|0,1,0,0)|0)|(fa(H>>0|0,1,0,0)|0)|(fa(I>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256){ya(a,a,32200);R=1;break}else{na(8,48,2107,88)}}else{ya(a,a,32160);N=5}}while(0);if((N|0)==5){ya(a,a,Ga);ya(Q,Q,Ba);R=0}Oa(c,a);do{if(((fa(c>>0|0,1,0,0)|0)&1|0)!=(R|0)){Oa(c,a);if((((fa(t>>0|0,1,0,0)|0|(fa(c>>0|0,1,0,0)|0)|(fa(J>>0|0,1,0,0)|0)|(fa(f>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(g>>0|0,1,0,0)|0)|(fa(h>>0|0,1,0,0)|0)|(fa(j>>0|0,1,0,0)|0)|(fa(k>>0|0,1,0,0)|0)|(fa(l>>0|0,1,0,0)|0)|(fa(m>>0|0,1,0,0)|0)|(fa(n>>0|0,1,0,0)|0)|(fa(o>>0|0,1,0,0)|0)|(fa(p>>0|0,1,0,0)|0)|(fa(q>>0|0,1,0,0)|0)|(fa(r>>0|0,1,0,0)|0)|(fa(s>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(b>>0|0,1,0,0)|0)|(fa(v>>0|0,1,0,0)|0)|(fa(w>>0|0,1,0,0)|0)|(fa(x>>0|0,1,0,0)|0)|(fa(y>>0|0,1,0,0)|0)|(fa(z>>0|0,1,0,0)|0)|(fa(A>>0|0,1,0,0)|0)|(fa(B>>0|0,1,0,0)|0)|(fa(C>>0|0,1,0,0)|0)|(fa(E>>0|0,1,0,0)|0)|(fa(F>>0|0,1,0,0)|0)|(fa(G>>0|0,1,0,0)|0)|(fa(H>>0|0,1,0,0)|0)|(fa(I>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256){na(120,48,2117,88)}else{za=a+4|0;Ba=a+8|0;Da=a+12|0;Fa=a+16|0;Ha=a+20|0;Ma=a+24|0;Qa=a+28|0;Sa=a+32|0;Ua=a+36|0;Aa=0-(fa(za|0,4,0,0)|0|0)|0;Ca=0-(fa(Ba|0,4,0,0)|0|0)|0;Ea=0-(fa(Da|0,4,0,0)|0|0)|0;Ga=0-(fa(Fa|0,4,0,0)|0|0)|0;Ia=0-(fa(Ha|0,4,0,0)|0|0)|0;Pa=0-(fa(Ma|0,4,0,0)|0|0)|0;Ra=0-(fa(Qa|0,4,0,0)|0|0)|0;Ta=0-(fa(Sa|0,4,0,0)|0|0)|0;Va=0-(fa(Ua|0,4,0,0)|0|0)|0;ga(a|0,0-(fa(a|0,4,0,0)|0|0)|0,4,0);ga(za|0,Aa|0,4,0);ga(Ba|0,Ca|0,4,0);ga(Da|0,Ea|0,4,0);ga(Fa|0,Ga|0,4,0);ga(Ha|0,Ia|0,4,0);ga(Ma|0,Pa|0,4,0);ga(Qa|0,Ra|0,4,0);ga(Sa|0,Ta|0,4,0);ga(Ua|0,Va|0,4,0);break}}}while(0);R=a+80|0;Ia=fa(Q|0,4,0,0)|0|0;Pa=fa(ua|0,4,0,0)|0|0;Ra=fa(va|0,4,0,0)|0|0;Ta=fa(ja|0,4,0,0)|0|0;Va=fa(ia|0,4,0,0)|0|0;U=fa(ea|0,4,0,0)|0|0;P=fa(da|0,4,0,0)|0|0;ca=fa(ca|0,4,0,0)|0|0;ba=fa(ba|0,4,0,0)|0|0;V=fa(V|0,4,0,0)|0|0;Ma=fa(T|0,4,0,0)|0|0;Qa=fa(wa|0,4,0,0)|0|0;Sa=fa(oa|0,4,0,0)|0|0;Ua=fa(W|0,4,0,0)|0|0;W=fa(X|0,4,0,0)|0|0;Q=fa(Y|0,4,0,0)|0|0;N=fa(Z|0,4,0,0)|0|0;Z=fa(_|0,4,0,0)|0|0;X=fa($|0,4,0,0)|0|0;T=fa(aa|0,4,0,0)|0|0;ga(R|0,Ma+Ia|0,4,0);ga(a+84|0,Qa+Pa|0,4,0);ga(a+88|0,Sa+Ra|0,4,0);ga(a+92|0,Ua+Ta|0,4,0);ga(a+96|0,W+Va|0,4,0);ga(a+100|0,Q+U|0,4,0);ga(a+104|0,N+P|0,4,0);ga(a+108|0,Z+ca|0,4,0);ga(a+112|0,X+ba|0,4,0);ga(a+116|0,T+V|0,4,0);O=a+40|0;ga(O|0,Ia-Ma|0,4,0);ga(a+44|0,Pa-Qa|0,4,0);ga(a+48|0,Ra-Sa|0,4,0);ga(a+52|0,Ta-Ua|0,4,0);ga(a+56|0,Va-W|0,4,0);ga(a+60|0,U-Q|0,4,0);ga(a+64|0,P-N|0,4,0);ga(a+68|0,ca-Z|0,4,0);ga(a+72|0,ba-X|0,4,0);ga(a+76|0,V-T|0,4,0);ya(a,a,R);Na(S,R);ya(L,a,S);ya(M,O,S);Ja(L,L);Ja(M,M);ya(d,L,M);ya(d,240,d);O=d+4|0;a=d+8|0;R=d+12|0;T=d+16|0;V=d+20|0;X=d+24|0;Z=d+28|0;$=d+32|0;ba=d+36|0;ca=L+4|0;N=(fa(L|0,4,0,0)|0|0)+(fa(d|0,4,0,0)|0|0)-(fa(M|0,4,0,0)|0|0)|0;P=(fa(ca|0,4,0,0)|0|0)+(fa(O|0,4,0,0)|0|0)-(fa(M+4|0,4,0,0)|0|0)|0;Q=(fa(L+8|0,4,0,0)|0|0)+(fa(a|0,4,0,0)|0|0)-(fa(M+8|0,4,0,0)|0|0)|0;S=(fa(L+12|0,4,0,0)|0|0)+(fa(R|0,4,0,0)|0|0)-(fa(M+12|0,4,0,0)|0|0)|0;U=(fa(L+16|0,4,0,0)|0|0)+(fa(T|0,4,0,0)|0|0)-(fa(M+16|0,4,0,0)|0|0)|0;W=(fa(L+20|0,4,0,0)|0|0)+(fa(V|0,4,0,0)|0|0)-(fa(M+20|0,4,0,0)|0|0)|0;Y=(fa(L+24|0,4,0,0)|0|0)+(fa(X|0,4,0,0)|0|0)-(fa(M+24|0,4,0,0)|0|0)|0;_=(fa(L+28|0,4,0,0)|0|0)+(fa(Z|0,4,0,0)|0|0)-(fa(M+28|0,4,0,0)|0|0)|0;aa=(fa(L+32|0,4,0,0)|0|0)+(fa($|0,4,0,0)|0|0)-(fa(M+32|0,4,0,0)|0|0)|0;M=(fa(L+36|0,4,0,0)|0|0)+(fa(ba|0,4,0,0)|0|0)-(fa(M+36|0,4,0,0)|0|0)|0;ga(L|0,1|0,4,0);ca=ca+0|0;L=ca+36|0;do{ga(ca|0,0|0,4,0);ca=ca+4|0}while((ca|0)<(L|0));ga(d|0,N+1|0,4,0);ga(O|0,P|0,4,0);ga(a|0,Q|0,4,0);ga(R|0,S|0,4,0);ga(T|0,U|0,4,0);ga(V|0,W|0,4,0);ga(X|0,Y|0,4,0);ga(Z|0,_|0,4,0);ga($|0,aa|0,4,0);ga(ba|0,M|0,4,0);Oa(c,d);if((((fa(t>>0|0,1,0,0)|0|(fa(c>>0|0,1,0,0)|0)|(fa(J>>0|0,1,0,0)|0)|(fa(f>>0|0,1,0,0)|0)|(fa(u>>0|0,1,0,0)|0)|(fa(g>>0|0,1,0,0)|0)|(fa(h>>0|0,1,0,0)|0)|(fa(j>>0|0,1,0,0)|0)|(fa(k>>0|0,1,0,0)|0)|(fa(l>>0|0,1,0,0)|0)|(fa(m>>0|0,1,0,0)|0)|(fa(n>>0|0,1,0,0)|0)|(fa(o>>0|0,1,0,0)|0)|(fa(p>>0|0,1,0,0)|0)|(fa(q>>0|0,1,0,0)|0)|(fa(r>>0|0,1,0,0)|0)|(fa(s>>0|0,1,0,0)|0)|(fa(K>>0|0,1,0,0)|0)|(fa(b>>0|0,1,0,0)|0)|(fa(v>>0|0,1,0,0)|0)|(fa(w>>0|0,1,0,0)|0)|(fa(x>>0|0,1,0,0)|0)|(fa(y>>0|0,1,0,0)|0)|(fa(z>>0|0,1,0,0)|0)|(fa(A>>0|0,1,0,0)|0)|(fa(B>>0|0,1,0,0)|0)|(fa(C>>0|0,1,0,0)|0)|(fa(E>>0|0,1,0,0)|0)|(fa(F>>0|0,1,0,0)|0)|(fa(G>>0|0,1,0,0)|0)|(fa(H>>0|0,1,0,0)|0)|(fa(I>>0|0,1,0,0)|0))&255)+ -1&-256|0)==-256){i=e;return}else{na(144,48,2137,88)}}function Xa(a){a=a|0;var b=0,c=0;b=i;c=a+0|0;a=c+32|0;do{ga(c>>0|0,0|0,1,0);c=c+1|0}while((c|0)<(a|0));i=b;return}function Ya(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;b=i;ea=a+1|0;ca=a+2|0;xa=fa(ca>>0|0,1,0,0)|0|0;aa=fa(a>>0|0,1,0,1)|0|0;ra=kb(fa(ea>>0|0,1,0,1)|0|0|0,0,8)|0;R=D;xa=xa&255;ya=kb(xa|0,0,16)|0;ya=ra|aa|ya&2031616;aa=a+3|0;ra=kb(fa(aa>>0|0,1,0,1)|0|0|0,0,8)|0;wa=D;$=a+4|0;V=kb(fa($>>0|0,1,0,1)|0|0|0,0,16)|0;wa=wa|D;Z=a+5|0;N=fa(Z>>0|0,1,0,1)|0|0;X=kb(N|0,0,24)|0;wa=jb(ra|xa|V|X|0,wa|D|0,5)|0;X=a+6|0;V=a+7|0;xa=fa(V>>0|0,1,0,0)|0|0;ra=kb(fa(X>>0|0,1,0,1)|0|0|0,0,8)|0;Aa=D;xa=xa&255;T=kb(xa|0,0,16)|0;Aa=jb(ra|N|T|0,Aa|D|0,2)|0;Aa=Aa&2097151;T=a+8|0;N=kb(fa(T>>0|0,1,0,1)|0|0|0,0,8)|0;ra=D;S=a+9|0;sa=kb(fa(S>>0|0,1,0,1)|0|0|0,0,16)|0;ra=ra|D;Q=a+10|0;la=fa(Q>>0|0,1,0,1)|0|0;O=kb(la|0,0,24)|0;ra=jb(N|xa|sa|O|0,ra|D|0,7)|0;O=a+11|0;sa=kb(fa(O>>0|0,1,0,1)|0|0|0,0,8)|0;xa=D;N=a+12|0;H=kb(fa(N>>0|0,1,0,1)|0|0|0,0,16)|0;xa=xa|D;L=a+13|0;u=fa(L>>0|0,1,0,1)|0|0;J=kb(u|0,0,24)|0;xa=jb(sa|la|H|J|0,xa|D|0,4)|0;xa=xa&2097151;J=a+14|0;H=a+15|0;la=fa(H>>0|0,1,0,0)|0|0;sa=kb(fa(J>>0|0,1,0,1)|0|0|0,0,8)|0;pa=D;la=la&255;F=kb(la|0,0,16)|0;pa=jb(sa|u|F|0,pa|D|0,1)|0;F=a+16|0;u=kb(fa(F>>0|0,1,0,1)|0|0|0,0,8)|0;sa=D;E=a+17|0;w=kb(fa(E>>0|0,1,0,1)|0|0|0,0,16)|0;sa=sa|D;B=a+18|0;v=fa(B>>0|0,1,0,1)|0|0;z=kb(v|0,0,24)|0;sa=jb(u|la|w|z|0,sa|D|0,6)|0;sa=sa&2097151;z=a+19|0;w=a+20|0;la=fa(w>>0|0,1,0,0)|0|0;u=kb(fa(z>>0|0,1,0,1)|0|0|0,0,8)|0;o=D;la=kb(la&255|0,0,16)|0;o=jb(u|v|la|0,o|D|0,3)|0;la=D;v=a+21|0;u=a+22|0;s=a+23|0;U=fa(s>>0|0,1,0,0)|0|0;q=fa(v>>0|0,1,0,1)|0|0;_=kb(fa(u>>0|0,1,0,1)|0|0|0,0,8)|0;ma=D;U=U&255;na=kb(U|0,0,16)|0;na=_|q|na&2031616;q=a+24|0;_=kb(fa(q>>0|0,1,0,1)|0|0|0,0,8)|0;da=D;p=a+25|0;j=kb(fa(p>>0|0,1,0,1)|0|0|0,0,16)|0;da=da|D;n=a+26|0;M=fa(n>>0|0,1,0,1)|0|0;l=kb(M|0,0,24)|0;da=jb(_|U|j|l|0,da|D|0,5)|0;l=a+27|0;j=a+28|0;U=fa(j>>0|0,1,0,0)|0|0;_=kb(fa(l>>0|0,1,0,1)|0|0|0,0,8)|0;d=D;U=U&255;g=kb(U|0,0,16)|0;d=jb(_|M|g|0,d|D|0,2)|0;d=d&2097151;g=a+29|0;M=kb(fa(g>>0|0,1,0,1)|0|0|0,0,8)|0;_=D;f=a+30|0;za=kb(fa(f>>0|0,1,0,1)|0|0|0,0,16)|0;_=_|D;c=a+31|0;P=kb(fa(c>>0|0,1,0,1)|0|0|0,0,24)|0;_=jb(M|U|za|P|0,_|D|0,7)|0;P=D;za=hb(ya|0,R|0,1048576,0)|0;za=jb(za|0,D|0,21)|0;U=D;wa=hb(wa&2097151|0,0,za|0,U|0)|0;M=D;U=kb(za|0,U|0,21)|0;U=gb(ya|0,R|0,U|0,D|0)|0;R=D;ya=hb(Aa|0,0,1048576,0)|0;ya=jb(ya|0,D|0,21)|0;za=D;ra=hb(ra&2097151|0,0,ya|0,za|0)|0;Y=D;za=kb(ya|0,za|0,21)|0;ya=D;ta=hb(xa|0,0,1048576,0)|0;ta=jb(ta|0,D|0,21)|0;ua=D;pa=hb(pa&2097151|0,0,ta|0,ua|0)|0;x=D;ua=kb(ta|0,ua|0,21)|0;ta=D;t=hb(sa|0,0,1048576,0)|0;t=jb(t|0,D|0,21)|0;r=D;la=hb(o|0,la|0,t|0,r|0)|0;o=D;r=kb(t|0,r|0,21)|0;t=D;h=hb(na|0,ma|0,1048576,0)|0;h=jb(h|0,D|0,21)|0;k=D;da=hb(da&2097151|0,0,h|0,k|0)|0;I=D;k=kb(h|0,k|0,21)|0;h=D;ba=hb(d|0,0,1048576,0)|0;ba=jb(ba|0,D|0,21)|0;ha=D;P=hb(_|0,P|0,ba|0,ha|0)|0;_=D;ha=kb(ba|0,ha|0,21)|0;ba=D;Ca=hb(wa|0,M|0,1048576,0)|0;Ca=jb(Ca|0,D|0,21)|0;Ba=D;K=kb(Ca|0,Ba|0,21)|0;K=gb(wa|0,M|0,K|0,D|0)|0;M=D;wa=hb(ra|0,Y|0,1048576,0)|0;wa=jb(wa|0,D|0,21)|0;va=D;A=kb(wa|0,va|0,21)|0;A=gb(ra|0,Y|0,A|0,D|0)|0;Y=D;ra=hb(pa|0,x|0,1048576,0)|0;ra=jb(ra|0,D|0,21)|0;qa=D;W=kb(ra|0,qa|0,21)|0;W=gb(pa|0,x|0,W|0,D|0)|0;x=D;pa=hb(la|0,o|0,1048576,0)|0;pa=jb(pa|0,D|0,21)|0;oa=D;m=kb(pa|0,oa|0,21)|0;m=gb(la|0,o|0,m|0,D|0)|0;o=D;la=hb(da|0,I|0,1048576,0)|0;la=jb(la|0,D|0,21)|0;ka=D;ia=kb(la|0,ka|0,21)|0;ia=gb(da|0,I|0,ia|0,D|0)|0;I=D;da=hb(P|0,_|0,1048576,0)|0;da=jb(da|0,D|0,21)|0;y=D;e=kb(da|0,y|0,21)|0;e=gb(P|0,_|0,e|0,D|0)|0;_=D;P=sb(da|0,y|0,666643,0)|0;R=hb(P|0,D|0,U|0,R|0)|0;U=D;P=sb(da|0,y|0,470296,0)|0;P=hb(K|0,M|0,P|0,D|0)|0;M=D;K=sb(da|0,y|0,654183,0)|0;ja=D;G=sb(da|0,y|0,-997805,-1)|0;G=hb(A|0,Y|0,G|0,D|0)|0;Y=D;A=sb(da|0,y|0,136657,0)|0;C=D;y=sb(da|0,y|0,-683901,-1)|0;y=hb(W|0,x|0,y|0,D|0)|0;x=D;W=fb(R|0,U|0,21)|0;da=D;M=hb(P|0,M|0,W|0,da|0)|0;P=D;da=kb(W|0,da|0,21)|0;da=gb(R|0,U|0,da|0,D|0)|0;U=D;R=fb(M|0,P|0,21)|0;W=D;Aa=hb(Ca|0,Ba|0,Aa|0,0)|0;ya=gb(Aa|0,D|0,za|0,ya|0)|0;ja=hb(ya|0,D|0,K|0,ja|0)|0;ja=hb(ja|0,D|0,R|0,W|0)|0;K=D;W=kb(R|0,W|0,21)|0;W=gb(M|0,P|0,W|0,D|0)|0;P=D;M=fb(ja|0,K|0,21)|0;R=D;Y=hb(G|0,Y|0,M|0,R|0)|0;G=D;R=kb(M|0,R|0,21)|0;R=gb(ja|0,K|0,R|0,D|0)|0;K=D;ja=fb(Y|0,G|0,21)|0;M=D;va=hb(xa|0,0,wa|0,va|0)|0;ta=gb(va|0,D|0,ua|0,ta|0)|0;C=hb(ta|0,D|0,A|0,C|0)|0;C=hb(C|0,D|0,ja|0,M|0)|0;A=D;M=kb(ja|0,M|0,21)|0;M=gb(Y|0,G|0,M|0,D|0)|0;G=D;Y=fb(C|0,A|0,21)|0;ja=D;x=hb(y|0,x|0,Y|0,ja|0)|0;y=D;ja=kb(Y|0,ja|0,21)|0;ja=gb(C|0,A|0,ja|0,D|0)|0;A=D;C=fb(x|0,y|0,21)|0;Y=D;qa=hb(sa|0,0,ra|0,qa|0)|0;t=gb(qa|0,D|0,r|0,t|0)|0;t=hb(t|0,D|0,C|0,Y|0)|0;r=D;Y=kb(C|0,Y|0,21)|0;Y=gb(x|0,y|0,Y|0,D|0)|0;y=D;x=fb(t|0,r|0,21)|0;C=D;o=hb(x|0,C|0,m|0,o|0)|0;m=D;C=kb(x|0,C|0,21)|0;C=gb(t|0,r|0,C|0,D|0)|0;r=D;t=fb(o|0,m|0,21)|0;x=D;ma=hb(pa|0,oa|0,na|0,ma|0)|0;h=gb(ma|0,D|0,k|0,h|0)|0;h=hb(h|0,D|0,t|0,x|0)|0;k=D;x=kb(t|0,x|0,21)|0;x=gb(o|0,m|0,x|0,D|0)|0;m=D;o=fb(h|0,k|0,21)|0;t=D;I=hb(o|0,t|0,ia|0,I|0)|0;ia=D;t=kb(o|0,t|0,21)|0;t=gb(h|0,k|0,t|0,D|0)|0;k=D;h=fb(I|0,ia|0,21)|0;o=D;d=hb(la|0,ka|0,d|0,0)|0;ba=gb(d|0,D|0,ha|0,ba|0)|0;ba=hb(ba|0,D|0,h|0,o|0)|0;ha=D;o=kb(h|0,o|0,21)|0;o=gb(I|0,ia|0,o|0,D|0)|0;ia=D;I=fb(ba|0,ha|0,21)|0;h=D;_=hb(I|0,h|0,e|0,_|0)|0;e=D;h=kb(I|0,h|0,21)|0;h=gb(ba|0,ha|0,h|0,D|0)|0;ha=D;ba=fb(_|0,e|0,21)|0;I=D;d=kb(ba|0,I|0,21)|0;d=gb(_|0,e|0,d|0,D|0)|0;e=D;_=sb(ba|0,I|0,666643,0)|0;U=hb(_|0,D|0,da|0,U|0)|0;da=D;_=sb(ba|0,I|0,470296,0)|0;_=hb(W|0,P|0,_|0,D|0)|0;P=D;W=sb(ba|0,I|0,654183,0)|0;W=hb(R|0,K|0,W|0,D|0)|0;K=D;R=sb(ba|0,I|0,-997805,-1)|0;R=hb(M|0,G|0,R|0,D|0)|0;G=D;M=sb(ba|0,I|0,136657,0)|0;M=hb(ja|0,A|0,M|0,D|0)|0;A=D;I=sb(ba|0,I|0,-683901,-1)|0;I=hb(Y|0,y|0,I|0,D|0)|0;y=D;Y=fb(U|0,da|0,21)|0;ba=D;P=hb(_|0,P|0,Y|0,ba|0)|0;_=D;ba=kb(Y|0,ba|0,21)|0;ba=gb(U|0,da|0,ba|0,D|0)|0;da=D;U=fb(P|0,_|0,21)|0;Y=D;K=hb(W|0,K|0,U|0,Y|0)|0;W=D;Y=kb(U|0,Y|0,21)|0;Y=gb(P|0,_|0,Y|0,D|0)|0;_=D;P=fb(K|0,W|0,21)|0;U=D;G=hb(R|0,G|0,P|0,U|0)|0;R=D;U=kb(P|0,U|0,21)|0;U=gb(K|0,W|0,U|0,D|0)|0;W=D;K=fb(G|0,R|0,21)|0;P=D;A=hb(M|0,A|0,K|0,P|0)|0;M=D;P=kb(K|0,P|0,21)|0;P=gb(G|0,R|0,P|0,D|0)|0;R=D;G=fb(A|0,M|0,21)|0;K=D;y=hb(I|0,y|0,G|0,K|0)|0;I=D;K=kb(G|0,K|0,21)|0;K=gb(A|0,M|0,K|0,D|0)|0;M=D;A=fb(y|0,I|0,21)|0;G=D;r=hb(A|0,G|0,C|0,r|0)|0;C=D;G=kb(A|0,G|0,21)|0;G=gb(y|0,I|0,G|0,D|0)|0;I=D;y=fb(r|0,C|0,21)|0;A=D;m=hb(y|0,A|0,x|0,m|0)|0;x=D;A=kb(y|0,A|0,21)|0;A=gb(r|0,C|0,A|0,D|0)|0;C=D;r=fb(m|0,x|0,21)|0;y=D;k=hb(r|0,y|0,t|0,k|0)|0;t=D;y=kb(r|0,y|0,21)|0;y=gb(m|0,x|0,y|0,D|0)|0;x=D;m=fb(k|0,t|0,21)|0;r=D;ia=hb(m|0,r|0,o|0,ia|0)|0;o=D;r=kb(m|0,r|0,21)|0;r=gb(k|0,t|0,r|0,D|0)|0;t=D;k=fb(ia|0,o|0,21)|0;m=D;ha=hb(k|0,m|0,h|0,ha|0)|0;h=D;m=kb(k|0,m|0,21)|0;m=gb(ia|0,o|0,m|0,D|0)|0;o=D;ia=fb(ha|0,h|0,21)|0;k=D;e=hb(ia|0,k|0,d|0,e|0)|0;d=D;k=kb(ia|0,k|0,21)|0;k=gb(ha|0,h|0,k|0,D|0)|0;h=D;ga(a>>0|0,ba|0,1,0);a=jb(ba|0,da|0,8)|0;ga(ea>>0|0,a|0,1,0);a=jb(ba|0,da|0,16)|0;da=D;ba=kb(Y|0,_|0,5)|0;D|da;ga(ca>>0|0,ba|a|0,1,0);a=jb(Y|0,_|0,3)|0;ga(aa>>0|0,a|0,1,0);a=jb(Y|0,_|0,11)|0;ga($>>0|0,a|0,1,0);a=jb(Y|0,_|0,19)|0;_=D;Y=kb(U|0,W|0,2)|0;D|_;ga(Z>>0|0,Y|a|0,1,0);a=jb(U|0,W|0,6)|0;ga(X>>0|0,a|0,1,0);a=jb(U|0,W|0,14)|0;W=D;U=kb(P|0,R|0,7)|0;D|W;ga(V>>0|0,U|a|0,1,0);a=jb(P|0,R|0,1)|0;ga(T>>0|0,a|0,1,0);a=jb(P|0,R|0,9)|0;ga(S>>0|0,a|0,1,0);a=jb(P|0,R|0,17)|0;R=D;P=kb(K|0,M|0,4)|0;D|R;ga(Q>>0|0,P|a|0,1,0);a=jb(K|0,M|0,4)|0;ga(O>>0|0,a|0,1,0);a=jb(K|0,M|0,12)|0;ga(N>>0|0,a|0,1,0);a=jb(K|0,M|0,20)|0;M=D;K=kb(G|0,I|0,1)|0;D|M;ga(L>>0|0,K|a|0,1,0);a=jb(G|0,I|0,7)|0;ga(J>>0|0,a|0,1,0);a=jb(G|0,I|0,15)|0;I=D;G=kb(A|0,C|0,6)|0;D|I;ga(H>>0|0,G|a|0,1,0);a=jb(A|0,C|0,2)|0;ga(F>>0|0,a|0,1,0);a=jb(A|0,C|0,10)|0;ga(E>>0|0,a|0,1,0);a=jb(A|0,C|0,18)|0;C=D;A=kb(y|0,x|0,3)|0;D|C;ga(B>>0|0,A|a|0,1,0);a=jb(y|0,x|0,5)|0;ga(z>>0|0,a|0,1,0);a=jb(y|0,x|0,13)|0;ga(w>>0|0,a|0,1,0);ga(v>>0|0,r|0,1,0);a=jb(r|0,t|0,8)|0;ga(u>>0|0,a|0,1,0);a=jb(r|0,t|0,16)|0;t=D;r=kb(m|0,o|0,5)|0;D|t;ga(s>>0|0,r|a|0,1,0);a=jb(m|0,o|0,3)|0;ga(q>>0|0,a|0,1,0);a=jb(m|0,o|0,11)|0;ga(p>>0|0,a|0,1,0);a=jb(m|0,o|0,19)|0;o=D;m=kb(k|0,h|0,2)|0;D|o;ga(n>>0|0,m|a|0,1,0);a=jb(k|0,h|0,6)|0;ga(l>>0|0,a|0,1,0);h=jb(k|0,h|0,14)|0;k=D;a=kb(e|0,d|0,7)|0;k|D;ga(j>>0|0,h|a|0,1,0);a=jb(e|0,d|0,1)|0;ga(g>>0|0,a|0,1,0);a=jb(e|0,d|0,9)|0;ga(f>>0|0,a|0,1,0);a=jb(e|0,d|0,17)|0;ga(c>>0|0,a|0,1,0);i=b;return}function Za(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=i;$=fa(b+2>>0|0,1,0,0)|0|0;Z=fa(b>>0|0,1,0,1)|0|0;Y=kb(fa(b+1>>0|0,1,0,1)|0|0|0,0,8)|0;W=D;$=$&255;s=kb($|0,0,16)|0;P=kb(fa(b+3>>0|0,1,0,1)|0|0|0,0,8)|0;q=D;V=kb(fa(b+4>>0|0,1,0,1)|0|0|0,0,16)|0;q=q|D;z=fa(b+5>>0|0,1,0,1)|0|0;Q=kb(z|0,0,24)|0;q=jb(P|$|V|Q|0,q|D|0,5)|0;Q=fa(b+7>>0|0,1,0,0)|0|0;V=kb(fa(b+6>>0|0,1,0,1)|0|0|0,0,8)|0;$=D;Q=Q&255;P=kb(Q|0,0,16)|0;$=jb(V|z|P|0,$|D|0,2)|0;P=kb(fa(b+8>>0|0,1,0,1)|0|0|0,0,8)|0;z=D;V=kb(fa(b+9>>0|0,1,0,1)|0|0|0,0,16)|0;z=z|D;k=fa(b+10>>0|0,1,0,1)|0|0;R=kb(k|0,0,24)|0;z=jb(P|Q|V|R|0,z|D|0,7)|0;R=kb(fa(b+11>>0|0,1,0,1)|0|0|0,0,8)|0;V=D;Q=kb(fa(b+12>>0|0,1,0,1)|0|0|0,0,16)|0;V=V|D;P=fa(b+13>>0|0,1,0,1)|0|0;F=kb(P|0,0,24)|0;V=jb(R|k|Q|F|0,V|D|0,4)|0;F=fa(b+15>>0|0,1,0,0)|0|0;Q=kb(fa(b+14>>0|0,1,0,1)|0|0|0,0,8)|0;k=D;F=F&255;R=kb(F|0,0,16)|0;k=jb(Q|P|R|0,k|D|0,1)|0;R=kb(fa(b+16>>0|0,1,0,1)|0|0|0,0,8)|0;P=D;Q=kb(fa(b+17>>0|0,1,0,1)|0|0|0,0,16)|0;P=P|D;H=fa(b+18>>0|0,1,0,1)|0|0;e=kb(H|0,0,24)|0;P=jb(R|F|Q|e|0,P|D|0,6)|0;e=fa(b+20>>0|0,1,0,0)|0|0;Q=kb(fa(b+19>>0|0,1,0,1)|0|0|0,0,8)|0;F=D;e=kb(e&255|0,0,16)|0;F=jb(Q|H|e|0,F|D|0,3)|0;e=D;H=fa(b+23>>0|0,1,0,0)|0|0;Q=fa(b+21>>0|0,1,0,1)|0|0;R=kb(fa(b+22>>0|0,1,0,1)|0|0|0,0,8)|0;J=D;H=H&255;I=kb(H|0,0,16)|0;M=kb(fa(b+24>>0|0,1,0,1)|0|0|0,0,8)|0;o=D;_=kb(fa(b+25>>0|0,1,0,1)|0|0|0,0,16)|0;o=o|D;v=fa(b+26>>0|0,1,0,1)|0|0;p=kb(v|0,0,24)|0;o=jb(M|H|_|p|0,o|D|0,5)|0;p=fa(b+28>>0|0,1,0,0)|0|0;_=kb(fa(b+27>>0|0,1,0,1)|0|0|0,0,8)|0;H=D;p=p&255;M=kb(p|0,0,16)|0;H=jb(_|v|M|0,H|D|0,2)|0;M=kb(fa(b+29>>0|0,1,0,1)|0|0|0,0,8)|0;v=D;_=kb(fa(b+30>>0|0,1,0,1)|0|0|0,0,16)|0;v=v|D;w=kb(fa(b+31>>0|0,1,0,1)|0|0|0,0,24)|0;v=jb(M|p|_|w|0,v|D|0,7)|0;w=D;_=fa(c+2>>0|0,1,0,0)|0|0;p=fa(c>>0|0,1,0,1)|0|0;M=kb(fa(c+1>>0|0,1,0,1)|0|0|0,0,8)|0;t=D;_=_&255;S=kb(_|0,0,16)|0;O=kb(fa(c+3>>0|0,1,0,1)|0|0|0,0,8)|0;T=D;U=kb(fa(c+4>>0|0,1,0,1)|0|0|0,0,16)|0;T=T|D;N=fa(c+5>>0|0,1,0,1)|0|0;f=kb(N|0,0,24)|0;T=jb(O|_|U|f|0,T|D|0,5)|0;f=fa(c+7>>0|0,1,0,0)|0|0;U=kb(fa(c+6>>0|0,1,0,1)|0|0|0,0,8)|0;_=D;f=f&255;O=kb(f|0,0,16)|0;_=jb(U|N|O|0,_|D|0,2)|0;O=kb(fa(c+8>>0|0,1,0,1)|0|0|0,0,8)|0;N=D;U=kb(fa(c+9>>0|0,1,0,1)|0|0|0,0,16)|0;N=N|D;L=fa(c+10>>0|0,1,0,1)|0|0;g=kb(L|0,0,24)|0;N=jb(O|f|U|g|0,N|D|0,7)|0;g=kb(fa(c+11>>0|0,1,0,1)|0|0|0,0,8)|0;U=D;f=kb(fa(c+12>>0|0,1,0,1)|0|0|0,0,16)|0;U=U|D;O=fa(c+13>>0|0,1,0,1)|0|0;A=kb(O|0,0,24)|0;U=jb(g|L|f|A|0,U|D|0,4)|0;A=fa(c+15>>0|0,1,0,0)|0|0;f=kb(fa(c+14>>0|0,1,0,1)|0|0|0,0,8)|0;L=D;A=A&255;g=kb(A|0,0,16)|0;L=jb(f|O|g|0,L|D|0,1)|0;g=kb(fa(c+16>>0|0,1,0,1)|0|0|0,0,8)|0;O=D;f=kb(fa(c+17>>0|0,1,0,1)|0|0|0,0,16)|0;O=O|D;G=fa(c+18>>0|0,1,0,1)|0|0;B=kb(G|0,0,24)|0;O=jb(g|A|f|B|0,O|D|0,6)|0;B=fa(c+20>>0|0,1,0,0)|0|0;f=kb(fa(c+19>>0|0,1,0,1)|0|0|0,0,8)|0;A=D;B=kb(B&255|0,0,16)|0;A=jb(f|G|B|0,A|D|0,3)|0;B=D;G=fa(c+23>>0|0,1,0,0)|0|0;f=fa(c+21>>0|0,1,0,1)|0|0;g=kb(fa(c+22>>0|0,1,0,1)|0|0|0,0,8)|0;h=D;G=G&255;l=kb(G|0,0,16)|0;j=kb(fa(c+24>>0|0,1,0,1)|0|0|0,0,8)|0;y=D;u=kb(fa(c+25>>0|0,1,0,1)|0|0|0,0,16)|0;y=y|D;x=fa(c+26>>0|0,1,0,1)|0|0;K=kb(x|0,0,24)|0;y=jb(j|G|u|K|0,y|D|0,5)|0;K=fa(c+28>>0|0,1,0,0)|0|0;u=kb(fa(c+27>>0|0,1,0,1)|0|0|0,0,8)|0;G=D;K=K&255;j=kb(K|0,0,16)|0;G=jb(u|x|j|0,G|D|0,2)|0;j=kb(fa(c+29>>0|0,1,0,1)|0|0|0,0,8)|0;x=D;u=kb(fa(c+30>>0|0,1,0,1)|0|0|0,0,16)|0;x=x|D;X=kb(fa(c+31>>0|0,1,0,1)|0|0|0,0,24)|0;x=jb(j|K|u|X|0,x|D|0,7)|0;X=D;W=hb(M|p|S&2031616|0,t|0,Y|Z|s&2031616|0,W|0)|0;s=D;$=hb(_&2097151|0,0,$&2097151|0,0)|0;_=D;V=hb(U&2097151|0,0,V&2097151|0,0)|0;U=D;k=hb(L&2097151|0,0,k&2097151|0,0)|0;L=D;P=hb(O&2097151|0,0,P&2097151|0,0)|0;O=D;e=hb(A|0,B|0,F|0,e|0)|0;F=D;J=hb(g|f|l&2031616|0,h|0,R|Q|I&2031616|0,J|0)|0;I=D;H=hb(G&2097151|0,0,H&2097151|0,0)|0;G=D;w=hb(x|0,X|0,v|0,w|0)|0;v=D;X=hb(W|0,s|0,1048576,0)|0;X=jb(X|0,D|0,21)|0;x=D;q=hb(X|0,x|0,q&2097151|0,0)|0;T=hb(q|0,D|0,T&2097151|0,0)|0;q=D;x=kb(X|0,x|0,21)|0;x=gb(W|0,s|0,x|0,D|0)|0;s=D;W=hb($|0,_|0,1048576,0)|0;W=jb(W|0,D|0,21)|0;X=D;z=hb(W|0,X|0,z&2097151|0,0)|0;N=hb(z|0,D|0,N&2097151|0,0)|0;z=D;X=kb(W|0,X|0,21)|0;W=D;Q=hb(V|0,U|0,1048576,0)|0;Q=jb(Q|0,D|0,21)|0;R=D;L=hb(k|0,L|0,Q|0,R|0)|0;k=D;R=kb(Q|0,R|0,21)|0;Q=D;h=hb(P|0,O|0,1048576,0)|0;h=jb(h|0,D|0,21)|0;l=D;F=hb(e|0,F|0,h|0,l|0)|0;e=D;l=kb(h|0,l|0,21)|0;h=D;f=hb(J|0,I|0,1048576,0)|0;f=jb(f|0,D|0,21)|0;g=D;o=hb(f|0,g|0,o&2097151|0,0)|0;y=hb(o|0,D|0,y&2097151|0,0)|0;o=D;g=kb(f|0,g|0,21)|0;f=D;B=hb(H|0,G|0,1048576,0)|0;B=jb(B|0,D|0,21)|0;A=D;v=hb(w|0,v|0,B|0,A|0)|0;w=D;A=kb(B|0,A|0,21)|0;B=D;Z=hb(T|0,q|0,1048576,0)|0;Z=jb(Z|0,D|0,21)|0;Y=D;t=kb(Z|0,Y|0,21)|0;t=gb(T|0,q|0,t|0,D|0)|0;q=D;T=hb(N|0,z|0,1048576,0)|0;T=jb(T|0,D|0,21)|0;S=D;p=kb(T|0,S|0,21)|0;p=gb(N|0,z|0,p|0,D|0)|0;z=D;N=hb(L|0,k|0,1048576,0)|0;N=jb(N|0,D|0,21)|0;M=D;u=kb(N|0,M|0,21)|0;u=gb(L|0,k|0,u|0,D|0)|0;k=D;L=hb(F|0,e|0,1048576,0)|0;L=jb(L|0,D|0,21)|0;K=D;j=kb(L|0,K|0,21)|0;j=gb(F|0,e|0,j|0,D|0)|0;e=D;F=hb(y|0,o|0,1048576,0)|0;F=jb(F|0,D|0,21)|0;b=D;C=kb(F|0,b|0,21)|0;C=gb(y|0,o|0,C|0,D|0)|0;o=D;y=hb(v|0,w|0,1048576,0)|0;y=jb(y|0,D|0,21)|0;m=D;c=kb(y|0,m|0,21)|0;c=gb(v|0,w|0,c|0,D|0)|0;w=D;v=sb(y|0,m|0,666643,0)|0;s=hb(v|0,D|0,x|0,s|0)|0;x=D;v=sb(y|0,m|0,470296,0)|0;v=hb(t|0,q|0,v|0,D|0)|0;q=D;t=sb(y|0,m|0,654183,0)|0;E=D;r=sb(y|0,m|0,-997805,-1)|0;r=hb(p|0,z|0,r|0,D|0)|0;z=D;p=sb(y|0,m|0,136657,0)|0;n=D;m=sb(y|0,m|0,-683901,-1)|0;m=hb(u|0,k|0,m|0,D|0)|0;k=D;u=fb(s|0,x|0,21)|0;y=D;q=hb(v|0,q|0,u|0,y|0)|0;v=D;y=kb(u|0,y|0,21)|0;y=gb(s|0,x|0,y|0,D|0)|0;x=D;s=fb(q|0,v|0,21)|0;u=D;Y=hb($|0,_|0,Z|0,Y|0)|0;W=gb(Y|0,D|0,X|0,W|0)|0;E=hb(W|0,D|0,t|0,E|0)|0;E=hb(E|0,D|0,s|0,u|0)|0;t=D;u=kb(s|0,u|0,21)|0;u=gb(q|0,v|0,u|0,D|0)|0;v=D;q=fb(E|0,t|0,21)|0;s=D;z=hb(r|0,z|0,q|0,s|0)|0;r=D;s=kb(q|0,s|0,21)|0;s=gb(E|0,t|0,s|0,D|0)|0;t=D;E=fb(z|0,r|0,21)|0;q=D;S=hb(V|0,U|0,T|0,S|0)|0;Q=gb(S|0,D|0,R|0,Q|0)|0;n=hb(Q|0,D|0,p|0,n|0)|0;n=hb(n|0,D|0,E|0,q|0)|0;p=D;q=kb(E|0,q|0,21)|0;q=gb(z|0,r|0,q|0,D|0)|0;r=D;z=fb(n|0,p|0,21)|0;E=D;k=hb(m|0,k|0,z|0,E|0)|0;m=D;E=kb(z|0,E|0,21)|0;E=gb(n|0,p|0,E|0,D|0)|0;p=D;n=fb(k|0,m|0,21)|0;z=D;M=hb(P|0,O|0,N|0,M|0)|0;h=gb(M|0,D|0,l|0,h|0)|0;h=hb(h|0,D|0,n|0,z|0)|0;l=D;z=kb(n|0,z|0,21)|0;z=gb(k|0,m|0,z|0,D|0)|0;m=D;k=fb(h|0,l|0,21)|0;n=D;e=hb(k|0,n|0,j|0,e|0)|0;j=D;n=kb(k|0,n|0,21)|0;n=gb(h|0,l|0,n|0,D|0)|0;l=D;h=fb(e|0,j|0,21)|0;k=D;I=hb(L|0,K|0,J|0,I|0)|0;f=gb(I|0,D|0,g|0,f|0)|0;f=hb(f|0,D|0,h|0,k|0)|0;g=D;k=kb(h|0,k|0,21)|0;k=gb(e|0,j|0,k|0,D|0)|0;j=D;e=fb(f|0,g|0,21)|0;h=D;o=hb(e|0,h|0,C|0,o|0)|0;C=D;h=kb(e|0,h|0,21)|0;h=gb(f|0,g|0,h|0,D|0)|0;g=D;f=fb(o|0,C|0,21)|0;e=D;b=hb(H|0,G|0,F|0,b|0)|0;B=gb(b|0,D|0,A|0,B|0)|0;B=hb(B|0,D|0,f|0,e|0)|0;A=D;e=kb(f|0,e|0,21)|0;e=gb(o|0,C|0,e|0,D|0)|0;C=D;o=fb(B|0,A|0,21)|0;f=D;w=hb(o|0,f|0,c|0,w|0)|0;c=D;f=kb(o|0,f|0,21)|0;f=gb(B|0,A|0,f|0,D|0)|0;A=D;B=fb(w|0,c|0,21)|0;o=D;b=kb(B|0,o|0,21)|0;b=gb(w|0,c|0,b|0,D|0)|0;c=D;w=sb(B|0,o|0,666643,0)|0;x=hb(w|0,D|0,y|0,x|0)|0;y=D;w=sb(B|0,o|0,470296,0)|0;w=hb(u|0,v|0,w|0,D|0)|0;v=D;u=sb(B|0,o|0,654183,0)|0;u=hb(s|0,t|0,u|0,D|0)|0;t=D;s=sb(B|0,o|0,-997805,-1)|0;s=hb(q|0,r|0,s|0,D|0)|0;r=D;q=sb(B|0,o|0,136657,0)|0;q=hb(E|0,p|0,q|0,D|0)|0;p=D;o=sb(B|0,o|0,-683901,-1)|0;o=hb(z|0,m|0,o|0,D|0)|0;m=D;z=fb(x|0,y|0,21)|0;B=D;v=hb(w|0,v|0,z|0,B|0)|0;w=D;B=kb(z|0,B|0,21)|0;B=gb(x|0,y|0,B|0,D|0)|0;y=D;x=fb(v|0,w|0,21)|0;z=D;t=hb(u|0,t|0,x|0,z|0)|0;u=D;z=kb(x|0,z|0,21)|0;z=gb(v|0,w|0,z|0,D|0)|0;w=D;v=fb(t|0,u|0,21)|0;x=D;r=hb(s|0,r|0,v|0,x|0)|0;s=D;x=kb(v|0,x|0,21)|0;x=gb(t|0,u|0,x|0,D|0)|0;u=D;t=fb(r|0,s|0,21)|0;v=D;p=hb(q|0,p|0,t|0,v|0)|0;q=D;v=kb(t|0,v|0,21)|0;v=gb(r|0,s|0,v|0,D|0)|0;s=D;r=fb(p|0,q|0,21)|0;t=D;m=hb(o|0,m|0,r|0,t|0)|0;o=D;t=kb(r|0,t|0,21)|0;t=gb(p|0,q|0,t|0,D|0)|0;q=D;p=fb(m|0,o|0,21)|0;r=D;l=hb(p|0,r|0,n|0,l|0)|0;n=D;r=kb(p|0,r|0,21)|0;r=gb(m|0,o|0,r|0,D|0)|0;o=D;m=fb(l|0,n|0,21)|0;p=D;j=hb(m|0,p|0,k|0,j|0)|0;k=D;p=kb(m|0,p|0,21)|0;p=gb(l|0,n|0,p|0,D|0)|0;n=D;l=fb(j|0,k|0,21)|0;m=D;g=hb(l|0,m|0,h|0,g|0)|0;h=D;m=kb(l|0,m|0,21)|0;m=gb(j|0,k|0,m|0,D|0)|0;k=D;j=fb(g|0,h|0,21)|0;l=D;C=hb(j|0,l|0,e|0,C|0)|0;e=D;l=kb(j|0,l|0,21)|0;l=gb(g|0,h|0,l|0,D|0)|0;h=D;g=fb(C|0,e|0,21)|0;j=D;A=hb(g|0,j|0,f|0,A|0)|0;f=D;j=kb(g|0,j|0,21)|0;j=gb(C|0,e|0,j|0,D|0)|0;e=D;C=fb(A|0,f|0,21)|0;g=D;c=hb(C|0,g|0,b|0,c|0)|0;b=D;g=kb(C|0,g|0,21)|0;g=gb(A|0,f|0,g|0,D|0)|0;f=D;ga(a>>0|0,B|0,1,0);A=jb(B|0,y|0,8)|0;ga(a+1>>0|0,A|0,1,0);y=jb(B|0,y|0,16)|0;B=D;A=kb(z|0,w|0,5)|0;D|B;ga(a+2>>0|0,A|y|0,1,0);y=jb(z|0,w|0,3)|0;ga(a+3>>0|0,y|0,1,0);y=jb(z|0,w|0,11)|0;ga(a+4>>0|0,y|0,1,0);w=jb(z|0,w|0,19)|0;z=D;y=kb(x|0,u|0,2)|0;D|z;ga(a+5>>0|0,y|w|0,1,0);w=jb(x|0,u|0,6)|0;ga(a+6>>0|0,w|0,1,0);u=jb(x|0,u|0,14)|0;x=D;w=kb(v|0,s|0,7)|0;D|x;ga(a+7>>0|0,w|u|0,1,0);u=jb(v|0,s|0,1)|0;ga(a+8>>0|0,u|0,1,0);u=jb(v|0,s|0,9)|0;ga(a+9>>0|0,u|0,1,0);s=jb(v|0,s|0,17)|0;v=D;u=kb(t|0,q|0,4)|0;D|v;ga(a+10>>0|0,u|s|0,1,0);s=jb(t|0,q|0,4)|0;ga(a+11>>0|0,s|0,1,0);s=jb(t|0,q|0,12)|0;ga(a+12>>0|0,s|0,1,0);q=jb(t|0,q|0,20)|0;t=D;s=kb(r|0,o|0,1)|0;D|t;ga(a+13>>0|0,s|q|0,1,0);q=jb(r|0,o|0,7)|0;ga(a+14>>0|0,q|0,1,0);o=jb(r|0,o|0,15)|0;r=D;q=kb(p|0,n|0,6)|0;D|r;ga(a+15>>0|0,q|o|0,1,0);o=jb(p|0,n|0,2)|0;ga(a+16>>0|0,o|0,1,0);o=jb(p|0,n|0,10)|0;ga(a+17>>0|0,o|0,1,0);n=jb(p|0,n|0,18)|0;p=D;o=kb(m|0,k|0,3)|0;D|p;ga(a+18>>0|0,o|n|0,1,0);n=jb(m|0,k|0,5)|0;ga(a+19>>0|0,n|0,1,0);k=jb(m|0,k|0,13)|0;ga(a+20>>0|0,k|0,1,0);ga(a+21>>0|0,l|0,1,0);k=jb(l|0,h|0,8)|0;ga(a+22>>0|0,k|0,1,0);h=jb(l|0,h|0,16)|0;l=D;k=kb(j|0,e|0,5)|0;D|l;ga(a+23>>0|0,k|h|0,1,0);h=jb(j|0,e|0,3)|0;ga(a+24>>0|0,h|0,1,0);h=jb(j|0,e|0,11)|0;ga(a+25>>0|0,h|0,1,0);e=jb(j|0,e|0,19)|0;j=D;h=kb(g|0,f|0,2)|0;D|j;ga(a+26>>0|0,h|e|0,1,0);e=jb(g|0,f|0,6)|0;ga(a+27>>0|0,e|0,1,0);f=jb(g|0,f|0,14)|0;g=D;e=kb(c|0,b|0,7)|0;g|D;ga(a+28>>0|0,f|e|0,1,0);e=jb(c|0,b|0,1)|0;ga(a+29>>0|0,e|0,1,0);e=jb(c|0,b|0,9)|0;ga(a+30>>0|0,e|0,1,0);b=jb(c|0,b|0,17)|0;ga(a+31>>0|0,b|0,1,0);i=d;return}function _a(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=i;Y=fa(b+2>>0|0,1,0,0)|0|0;p=fa(b>>0|0,1,0,1)|0|0;M=kb(fa(b+1>>0|0,1,0,1)|0|0|0,0,8)|0;t=D;Y=Y&255;S=kb(Y|0,0,16)|0;O=kb(fa(b+3>>0|0,1,0,1)|0|0|0,0,8)|0;T=D;U=kb(fa(b+4>>0|0,1,0,1)|0|0|0,0,16)|0;T=T|D;N=fa(b+5>>0|0,1,0,1)|0|0;f=kb(N|0,0,24)|0;T=jb(O|Y|U|f|0,T|D|0,5)|0;f=fa(b+7>>0|0,1,0,0)|0|0;U=kb(fa(b+6>>0|0,1,0,1)|0|0|0,0,8)|0;Y=D;f=f&255;O=kb(f|0,0,16)|0;Y=jb(U|N|O|0,Y|D|0,2)|0;O=kb(fa(b+8>>0|0,1,0,1)|0|0|0,0,8)|0;N=D;U=kb(fa(b+9>>0|0,1,0,1)|0|0|0,0,16)|0;N=N|D;L=fa(b+10>>0|0,1,0,1)|0|0;g=kb(L|0,0,24)|0;N=jb(O|f|U|g|0,N|D|0,7)|0;g=kb(fa(b+11>>0|0,1,0,1)|0|0|0,0,8)|0;U=D;f=kb(fa(b+12>>0|0,1,0,1)|0|0|0,0,16)|0;U=U|D;O=fa(b+13>>0|0,1,0,1)|0|0;A=kb(O|0,0,24)|0;U=jb(g|L|f|A|0,U|D|0,4)|0;A=fa(b+15>>0|0,1,0,0)|0|0;f=kb(fa(b+14>>0|0,1,0,1)|0|0|0,0,8)|0;L=D;A=A&255;g=kb(A|0,0,16)|0;L=jb(f|O|g|0,L|D|0,1)|0;g=kb(fa(b+16>>0|0,1,0,1)|0|0|0,0,8)|0;O=D;f=kb(fa(b+17>>0|0,1,0,1)|0|0|0,0,16)|0;O=O|D;Q=fa(b+18>>0|0,1,0,1)|0|0;B=kb(Q|0,0,24)|0;O=jb(g|A|f|B|0,O|D|0,6)|0;B=fa(b+20>>0|0,1,0,0)|0|0;f=kb(fa(b+19>>0|0,1,0,1)|0|0|0,0,8)|0;A=D;B=kb(B&255|0,0,16)|0;A=jb(f|Q|B|0,A|D|0,3)|0;B=D;Q=fa(b+23>>0|0,1,0,0)|0|0;f=fa(b+21>>0|0,1,0,1)|0|0;g=kb(fa(b+22>>0|0,1,0,1)|0|0|0,0,8)|0;h=D;Q=Q&255;l=kb(Q|0,0,16)|0;_=kb(fa(b+24>>0|0,1,0,1)|0|0|0,0,8)|0;y=D;Z=kb(fa(b+25>>0|0,1,0,1)|0|0|0,0,16)|0;y=y|D;x=fa(b+26>>0|0,1,0,1)|0|0;$=kb(x|0,0,24)|0;y=jb(_|Q|Z|$|0,y|D|0,5)|0;$=fa(b+28>>0|0,1,0,0)|0|0;Z=kb(fa(b+27>>0|0,1,0,1)|0|0|0,0,8)|0;Q=D;$=$&255;_=kb($|0,0,16)|0;Q=jb(Z|x|_|0,Q|D|0,2)|0;_=kb(fa(b+29>>0|0,1,0,1)|0|0|0,0,8)|0;x=D;Z=kb(fa(b+30>>0|0,1,0,1)|0|0|0,0,16)|0;x=x|D;X=kb(fa(b+31>>0|0,1,0,1)|0|0|0,0,24)|0;x=jb(_|$|Z|X|0,x|D|0,7)|0;X=D;Z=fa(c+2>>0|0,1,0,0)|0|0;$=fa(c>>0|0,1,0,1)|0|0;_=kb(fa(c+1>>0|0,1,0,1)|0|0|0,0,8)|0;W=D;Z=Z&255;s=kb(Z|0,0,16)|0;P=kb(fa(c+3>>0|0,1,0,1)|0|0|0,0,8)|0;q=D;V=kb(fa(c+4>>0|0,1,0,1)|0|0|0,0,16)|0;q=q|D;z=fa(c+5>>0|0,1,0,1)|0|0;b=kb(z|0,0,24)|0;q=jb(P|Z|V|b|0,q|D|0,5)|0;b=fa(c+7>>0|0,1,0,0)|0|0;V=kb(fa(c+6>>0|0,1,0,1)|0|0|0,0,8)|0;Z=D;b=b&255;P=kb(b|0,0,16)|0;Z=jb(V|z|P|0,Z|D|0,2)|0;P=kb(fa(c+8>>0|0,1,0,1)|0|0|0,0,8)|0;z=D;V=kb(fa(c+9>>0|0,1,0,1)|0|0|0,0,16)|0;z=z|D;k=fa(c+10>>0|0,1,0,1)|0|0;R=kb(k|0,0,24)|0;z=jb(P|b|V|R|0,z|D|0,7)|0;R=kb(fa(c+11>>0|0,1,0,1)|0|0|0,0,8)|0;V=D;b=kb(fa(c+12>>0|0,1,0,1)|0|0|0,0,16)|0;V=V|D;P=fa(c+13>>0|0,1,0,1)|0|0;H=kb(P|0,0,24)|0;V=jb(R|k|b|H|0,V|D|0,4)|0;H=fa(c+15>>0|0,1,0,0)|0|0;b=kb(fa(c+14>>0|0,1,0,1)|0|0|0,0,8)|0;k=D;H=H&255;R=kb(H|0,0,16)|0;k=jb(b|P|R|0,k|D|0,1)|0;R=kb(fa(c+16>>0|0,1,0,1)|0|0|0,0,8)|0;P=D;b=kb(fa(c+17>>0|0,1,0,1)|0|0|0,0,16)|0;P=P|D;F=fa(c+18>>0|0,1,0,1)|0|0;e=kb(F|0,0,24)|0;P=jb(R|H|b|e|0,P|D|0,6)|0;e=fa(c+20>>0|0,1,0,0)|0|0;b=kb(fa(c+19>>0|0,1,0,1)|0|0|0,0,8)|0;H=D;e=kb(e&255|0,0,16)|0;H=jb(b|F|e|0,H|D|0,3)|0;e=D;F=fa(c+23>>0|0,1,0,0)|0|0;b=fa(c+21>>0|0,1,0,1)|0|0;R=kb(fa(c+22>>0|0,1,0,1)|0|0|0,0,8)|0;J=D;F=F&255;I=kb(F|0,0,16)|0;j=kb(fa(c+24>>0|0,1,0,1)|0|0|0,0,8)|0;o=D;u=kb(fa(c+25>>0|0,1,0,1)|0|0|0,0,16)|0;o=o|D;v=fa(c+26>>0|0,1,0,1)|0|0;K=kb(v|0,0,24)|0;o=jb(j|F|u|K|0,o|D|0,5)|0;K=fa(c+28>>0|0,1,0,0)|0|0;u=kb(fa(c+27>>0|0,1,0,1)|0|0|0,0,8)|0;F=D;K=K&255;j=kb(K|0,0,16)|0;F=jb(u|v|j|0,F|D|0,2)|0;j=kb(fa(c+29>>0|0,1,0,1)|0|0|0,0,8)|0;v=D;u=kb(fa(c+30>>0|0,1,0,1)|0|0|0,0,16)|0;v=v|D;w=kb(fa(c+31>>0|0,1,0,1)|0|0|0,0,24)|0;v=jb(j|K|u|w|0,v|D|0,7)|0;w=D;W=gb(M|p|S&2031616|0,t|0,_|$|s&2031616|0,W|0)|0;s=D;q=gb(T&2097151|0,0,q&2097151|0,0)|0;T=D;Z=gb(Y&2097151|0,0,Z&2097151|0,0)|0;Y=D;z=gb(N&2097151|0,0,z&2097151|0,0)|0;N=D;V=gb(U&2097151|0,0,V&2097151|0,0)|0;U=D;k=gb(L&2097151|0,0,k&2097151|0,0)|0;L=D;P=gb(O&2097151|0,0,P&2097151|0,0)|0;O=D;e=gb(A|0,B|0,H|0,e|0)|0;H=D;J=gb(g|f|l&2031616|0,h|0,R|b|I&2031616|0,J|0)|0;I=D;o=gb(y&2097151|0,0,o&2097151|0,0)|0;y=D;F=gb(Q&2097151|0,0,F&2097151|0,0)|0;b=D;w=gb(x|0,X|0,v|0,w|0)|0;v=D;X=hb(W|0,s|0,1048576,0)|0;X=fb(X|0,D|0,21)|0;x=D;T=hb(q|0,T|0,X|0,x|0)|0;q=D;x=kb(X|0,x|0,21)|0;x=gb(W|0,s|0,x|0,D|0)|0;s=D;W=hb(Z|0,Y|0,1048576,0)|0;W=fb(W|0,D|0,21)|0;X=D;N=hb(z|0,N|0,W|0,X|0)|0;z=D;X=kb(W|0,X|0,21)|0;W=D;Q=hb(V|0,U|0,1048576,0)|0;Q=fb(Q|0,D|0,21)|0;R=D;L=hb(k|0,L|0,Q|0,R|0)|0;k=D;R=kb(Q|0,R|0,21)|0;Q=D;h=hb(P|0,O|0,1048576,0)|0;h=fb(h|0,D|0,21)|0;l=D;H=hb(e|0,H|0,h|0,l|0)|0;e=D;l=kb(h|0,l|0,21)|0;h=D;f=hb(J|0,I|0,1048576,0)|0;f=fb(f|0,D|0,21)|0;g=D;y=hb(o|0,y|0,f|0,g|0)|0;o=D;g=kb(f|0,g|0,21)|0;f=D;B=hb(F|0,b|0,1048576,0)|0;B=fb(B|0,D|0,21)|0;A=D;v=hb(w|0,v|0,B|0,A|0)|0;w=D;A=kb(B|0,A|0,21)|0;B=D;$=hb(T|0,q|0,1048576,0)|0;$=fb($|0,D|0,21)|0;_=D;t=kb($|0,_|0,21)|0;t=gb(T|0,q|0,t|0,D|0)|0;q=D;T=hb(N|0,z|0,1048576,0)|0;T=fb(T|0,D|0,21)|0;S=D;p=kb(T|0,S|0,21)|0;p=gb(N|0,z|0,p|0,D|0)|0;z=D;N=hb(L|0,k|0,1048576,0)|0;N=fb(N|0,D|0,21)|0;M=D;u=kb(N|0,M|0,21)|0;u=gb(L|0,k|0,u|0,D|0)|0;k=D;L=hb(H|0,e|0,1048576,0)|0;L=fb(L|0,D|0,21)|0;K=D;j=kb(L|0,K|0,21)|0;j=gb(H|0,e|0,j|0,D|0)|0;e=D;H=hb(y|0,o|0,1048576,0)|0;H=fb(H|0,D|0,21)|0;G=D;C=kb(H|0,G|0,21)|0;C=gb(y|0,o|0,C|0,D|0)|0;o=D;y=hb(v|0,w|0,1048576,0)|0;y=fb(y|0,D|0,21)|0;m=D;c=kb(y|0,m|0,21)|0;c=gb(v|0,w|0,c|0,D|0)|0;w=D;v=sb(y|0,m|0,666643,0)|0;s=hb(v|0,D|0,x|0,s|0)|0;x=D;v=sb(y|0,m|0,470296,0)|0;v=hb(t|0,q|0,v|0,D|0)|0;q=D;t=sb(y|0,m|0,654183,0)|0;E=D;r=sb(y|0,m|0,-997805,-1)|0;r=hb(p|0,z|0,r|0,D|0)|0;z=D;p=sb(y|0,m|0,136657,0)|0;n=D;m=sb(y|0,m|0,-683901,-1)|0;m=hb(u|0,k|0,m|0,D|0)|0;k=D;u=fb(s|0,x|0,21)|0;y=D;q=hb(v|0,q|0,u|0,y|0)|0;v=D;y=kb(u|0,y|0,21)|0;y=gb(s|0,x|0,y|0,D|0)|0;x=D;s=fb(q|0,v|0,21)|0;u=D;Y=hb($|0,_|0,Z|0,Y|0)|0;W=gb(Y|0,D|0,X|0,W|0)|0;E=hb(W|0,D|0,t|0,E|0)|0;E=hb(E|0,D|0,s|0,u|0)|0;t=D;u=kb(s|0,u|0,21)|0;u=gb(q|0,v|0,u|0,D|0)|0;v=D;q=fb(E|0,t|0,21)|0;s=D;z=hb(r|0,z|0,q|0,s|0)|0;r=D;s=kb(q|0,s|0,21)|0;s=gb(E|0,t|0,s|0,D|0)|0;t=D;E=fb(z|0,r|0,21)|0;q=D;S=hb(V|0,U|0,T|0,S|0)|0;Q=gb(S|0,D|0,R|0,Q|0)|0;n=hb(Q|0,D|0,p|0,n|0)|0;n=hb(n|0,D|0,E|0,q|0)|0;p=D;q=kb(E|0,q|0,21)|0;q=gb(z|0,r|0,q|0,D|0)|0;r=D;z=fb(n|0,p|0,21)|0;E=D;k=hb(m|0,k|0,z|0,E|0)|0;m=D;E=kb(z|0,E|0,21)|0;E=gb(n|0,p|0,E|0,D|0)|0;p=D;n=fb(k|0,m|0,21)|0;z=D;M=hb(P|0,O|0,N|0,M|0)|0;h=gb(M|0,D|0,l|0,h|0)|0;h=hb(h|0,D|0,n|0,z|0)|0;l=D;z=kb(n|0,z|0,21)|0;z=gb(k|0,m|0,z|0,D|0)|0;m=D;k=fb(h|0,l|0,21)|0;n=D;e=hb(k|0,n|0,j|0,e|0)|0;j=D;n=kb(k|0,n|0,21)|0;n=gb(h|0,l|0,n|0,D|0)|0;l=D;h=fb(e|0,j|0,21)|0;k=D;I=hb(L|0,K|0,J|0,I|0)|0;f=gb(I|0,D|0,g|0,f|0)|0;f=hb(f|0,D|0,h|0,k|0)|0;g=D;k=kb(h|0,k|0,21)|0;k=gb(e|0,j|0,k|0,D|0)|0;j=D;e=fb(f|0,g|0,21)|0;h=D;o=hb(e|0,h|0,C|0,o|0)|0;C=D;h=kb(e|0,h|0,21)|0;h=gb(f|0,g|0,h|0,D|0)|0;g=D;f=fb(o|0,C|0,21)|0;e=D;b=hb(H|0,G|0,F|0,b|0)|0;B=gb(b|0,D|0,A|0,B|0)|0;B=hb(B|0,D|0,f|0,e|0)|0;A=D;e=kb(f|0,e|0,21)|0;e=gb(o|0,C|0,e|0,D|0)|0;C=D;o=fb(B|0,A|0,21)|0;f=D;w=hb(o|0,f|0,c|0,w|0)|0;c=D;f=kb(o|0,f|0,21)|0;f=gb(B|0,A|0,f|0,D|0)|0;A=D;B=fb(w|0,c|0,21)|0;o=D;b=kb(B|0,o|0,21)|0;b=gb(w|0,c|0,b|0,D|0)|0;c=D;w=sb(B|0,o|0,666643,0)|0;x=hb(w|0,D|0,y|0,x|0)|0;y=D;w=sb(B|0,o|0,470296,0)|0;w=hb(u|0,v|0,w|0,D|0)|0;v=D;u=sb(B|0,o|0,654183,0)|0;u=hb(s|0,t|0,u|0,D|0)|0;t=D;s=sb(B|0,o|0,-997805,-1)|0;s=hb(q|0,r|0,s|0,D|0)|0;r=D;q=sb(B|0,o|0,136657,0)|0;q=hb(E|0,p|0,q|0,D|0)|0;p=D;o=sb(B|0,o|0,-683901,-1)|0;o=hb(z|0,m|0,o|0,D|0)|0;m=D;z=fb(x|0,y|0,21)|0;B=D;v=hb(w|0,v|0,z|0,B|0)|0;w=D;B=kb(z|0,B|0,21)|0;B=gb(x|0,y|0,B|0,D|0)|0;y=D;x=fb(v|0,w|0,21)|0;z=D;t=hb(u|0,t|0,x|0,z|0)|0;u=D;z=kb(x|0,z|0,21)|0;z=gb(v|0,w|0,z|0,D|0)|0;w=D;v=fb(t|0,u|0,21)|0;x=D;r=hb(s|0,r|0,v|0,x|0)|0;s=D;x=kb(v|0,x|0,21)|0;x=gb(t|0,u|0,x|0,D|0)|0;u=D;t=fb(r|0,s|0,21)|0;v=D;p=hb(q|0,p|0,t|0,v|0)|0;q=D;v=kb(t|0,v|0,21)|0;v=gb(r|0,s|0,v|0,D|0)|0;s=D;r=fb(p|0,q|0,21)|0;t=D;m=hb(o|0,m|0,r|0,t|0)|0;o=D;t=kb(r|0,t|0,21)|0;t=gb(p|0,q|0,t|0,D|0)|0;q=D;p=fb(m|0,o|0,21)|0;r=D;l=hb(p|0,r|0,n|0,l|0)|0;n=D;r=kb(p|0,r|0,21)|0;r=gb(m|0,o|0,r|0,D|0)|0;o=D;m=fb(l|0,n|0,21)|0;p=D;j=hb(m|0,p|0,k|0,j|0)|0;k=D;p=kb(m|0,p|0,21)|0;p=gb(l|0,n|0,p|0,D|0)|0;n=D;l=fb(j|0,k|0,21)|0;m=D;g=hb(l|0,m|0,h|0,g|0)|0;h=D;m=kb(l|0,m|0,21)|0;m=gb(j|0,k|0,m|0,D|0)|0;k=D;j=fb(g|0,h|0,21)|0;l=D;C=hb(j|0,l|0,e|0,C|0)|0;e=D;l=kb(j|0,l|0,21)|0;l=gb(g|0,h|0,l|0,D|0)|0;h=D;g=fb(C|0,e|0,21)|0;j=D;A=hb(g|0,j|0,f|0,A|0)|0;f=D;j=kb(g|0,j|0,21)|0;j=gb(C|0,e|0,j|0,D|0)|0;e=D;C=fb(A|0,f|0,21)|0;g=D;c=hb(C|0,g|0,b|0,c|0)|0;b=D;g=kb(C|0,g|0,21)|0;g=gb(A|0,f|0,g|0,D|0)|0;f=D;ga(a>>0|0,B|0,1,0);A=jb(B|0,y|0,8)|0;ga(a+1>>0|0,A|0,1,0);y=jb(B|0,y|0,16)|0;B=D;A=kb(z|0,w|0,5)|0;D|B;ga(a+2>>0|0,A|y|0,1,0);y=jb(z|0,w|0,3)|0;ga(a+3>>0|0,y|0,1,0);y=jb(z|0,w|0,11)|0;ga(a+4>>0|0,y|0,1,0);w=jb(z|0,w|0,19)|0;z=D;y=kb(x|0,u|0,2)|0;D|z;ga(a+5>>0|0,y|w|0,1,0);w=jb(x|0,u|0,6)|0;ga(a+6>>0|0,w|0,1,0);u=jb(x|0,u|0,14)|0;x=D;w=kb(v|0,s|0,7)|0;D|x;ga(a+7>>0|0,w|u|0,1,0);u=jb(v|0,s|0,1)|0;ga(a+8>>0|0,u|0,1,0);u=jb(v|0,s|0,9)|0;ga(a+9>>0|0,u|0,1,0);s=jb(v|0,s|0,17)|0;v=D;u=kb(t|0,q|0,4)|0;D|v;ga(a+10>>0|0,u|s|0,1,0);s=jb(t|0,q|0,4)|0;ga(a+11>>0|0,s|0,1,0);s=jb(t|0,q|0,12)|0;ga(a+12>>0|0,s|0,1,0);q=jb(t|0,q|0,20)|0;t=D;s=kb(r|0,o|0,1)|0;D|t;ga(a+13>>0|0,s|q|0,1,0);q=jb(r|0,o|0,7)|0;ga(a+14>>0|0,q|0,1,0);o=jb(r|0,o|0,15)|0;r=D;q=kb(p|0,n|0,6)|0;D|r;ga(a+15>>0|0,q|o|0,1,0);o=jb(p|0,n|0,2)|0;ga(a+16>>0|0,o|0,1,0);o=jb(p|0,n|0,10)|0;ga(a+17>>0|0,o|0,1,0);n=jb(p|0,n|0,18)|0;p=D;o=kb(m|0,k|0,3)|0;D|p;ga(a+18>>0|0,o|n|0,1,0);n=jb(m|0,k|0,5)|0;ga(a+19>>0|0,n|0,1,0);k=jb(m|0,k|0,13)|0;ga(a+20>>0|0,k|0,1,0);ga(a+21>>0|0,l|0,1,0);k=jb(l|0,h|0,8)|0;ga(a+22>>0|0,k|0,1,0);h=jb(l|0,h|0,16)|0;l=D;k=kb(j|0,e|0,5)|0;D|l;ga(a+23>>0|0,k|h|0,1,0);h=jb(j|0,e|0,3)|0;ga(a+24>>0|0,h|0,1,0);h=jb(j|0,e|0,11)|0;ga(a+25>>0|0,h|0,1,0);e=jb(j|0,e|0,19)|0;j=D;h=kb(g|0,f|0,2)|0;D|j;ga(a+26>>0|0,h|e|0,1,0);e=jb(g|0,f|0,6)|0;ga(a+27>>0|0,e|0,1,0);f=jb(g|0,f|0,14)|0;g=D;e=kb(c|0,b|0,7)|0;g|D;ga(a+28>>0|0,f|e|0,1,0);e=jb(c|0,b|0,1)|0;ga(a+29>>0|0,e|0,1,0);e=jb(c|0,b|0,9)|0;ga(a+30>>0|0,e|0,1,0);b=jb(c|0,b|0,17)|0;ga(a+31>>0|0,b|0,1,0);i=d;return} + + + +function $a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,ib=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0;e=i;q=fa(b+2>>0|0,1,0,0)|0|0;Qa=fa(b>>0|0,1,0,1)|0|0;Ab=kb(fa(b+1>>0|0,1,0,1)|0|0|0,0,8)|0;zb=D;q=q&255;_=kb(q|0,0,16)|0;_=Ab|Qa|_&2031616;Qa=kb(fa(b+3>>0|0,1,0,1)|0|0|0,0,8)|0;Ab=D;o=kb(fa(b+4>>0|0,1,0,1)|0|0|0,0,16)|0;Ab=Ab|D;u=fa(b+5>>0|0,1,0,1)|0|0;Z=kb(u|0,0,24)|0;Ab=jb(Qa|q|o|Z|0,Ab|D|0,5)|0;Ab=Ab&2097151;Z=fa(b+7>>0|0,1,0,0)|0|0;o=kb(fa(b+6>>0|0,1,0,1)|0|0|0,0,8)|0;q=D;Z=Z&255;Qa=kb(Z|0,0,16)|0;q=jb(o|u|Qa|0,q|D|0,2)|0;q=q&2097151;Qa=kb(fa(b+8>>0|0,1,0,1)|0|0|0,0,8)|0;u=D;o=kb(fa(b+9>>0|0,1,0,1)|0|0|0,0,16)|0;u=u|D;j=fa(b+10>>0|0,1,0,1)|0|0;w=kb(j|0,0,24)|0;u=jb(Qa|Z|o|w|0,u|D|0,7)|0;u=u&2097151;w=kb(fa(b+11>>0|0,1,0,1)|0|0|0,0,8)|0;o=D;Z=kb(fa(b+12>>0|0,1,0,1)|0|0|0,0,16)|0;o=o|D;Qa=fa(b+13>>0|0,1,0,1)|0|0;na=kb(Qa|0,0,24)|0;o=jb(w|j|Z|na|0,o|D|0,4)|0;o=o&2097151;na=fa(b+15>>0|0,1,0,0)|0|0;Z=kb(fa(b+14>>0|0,1,0,1)|0|0|0,0,8)|0;j=D;na=na&255;w=kb(na|0,0,16)|0;j=jb(Z|Qa|w|0,j|D|0,1)|0;j=j&2097151;w=kb(fa(b+16>>0|0,1,0,1)|0|0|0,0,8)|0;Qa=D;Z=kb(fa(b+17>>0|0,1,0,1)|0|0|0,0,16)|0;Qa=Qa|D;Ga=fa(b+18>>0|0,1,0,1)|0|0;ya=kb(Ga|0,0,24)|0;Qa=jb(w|na|Z|ya|0,Qa|D|0,6)|0;Qa=Qa&2097151;ya=fa(b+20>>0|0,1,0,0)|0|0;Z=kb(fa(b+19>>0|0,1,0,1)|0|0|0,0,8)|0;na=D;ya=kb(ya&255|0,0,16)|0;na=jb(Z|Ga|ya|0,na|D|0,3)|0;ya=D;Ga=fa(b+23>>0|0,1,0,0)|0|0;Z=fa(b+21>>0|0,1,0,1)|0|0;w=kb(fa(b+22>>0|0,1,0,1)|0|0|0,0,8)|0;qb=D;Ga=Ga&255;Na=kb(Ga|0,0,16)|0;Na=w|Z|Na&2031616;Z=kb(fa(b+24>>0|0,1,0,1)|0|0|0,0,8)|0;w=D;mb=kb(fa(b+25>>0|0,1,0,1)|0|0|0,0,16)|0;w=w|D;x=fa(b+26>>0|0,1,0,1)|0|0;Ua=kb(x|0,0,24)|0;w=jb(Z|Ga|mb|Ua|0,w|D|0,5)|0;w=w&2097151;Ua=fa(b+28>>0|0,1,0,0)|0|0;mb=kb(fa(b+27>>0|0,1,0,1)|0|0|0,0,8)|0;Ga=D;Ua=Ua&255;Z=kb(Ua|0,0,16)|0;Ga=jb(mb|x|Z|0,Ga|D|0,2)|0;Ga=Ga&2097151;Z=kb(fa(b+29>>0|0,1,0,1)|0|0|0,0,8)|0;x=D;mb=kb(fa(b+30>>0|0,1,0,1)|0|0|0,0,16)|0;x=x|D;Ha=kb(fa(b+31>>0|0,1,0,1)|0|0|0,0,24)|0;x=jb(Z|Ua|mb|Ha|0,x|D|0,7)|0;Ha=D;mb=fa(c+2>>0|0,1,0,0)|0|0;Ua=fa(c>>0|0,1,0,1)|0|0;Z=kb(fa(c+1>>0|0,1,0,1)|0|0|0,0,8)|0;Fb=D;mb=mb&255;Eb=kb(mb|0,0,16)|0;Eb=Z|Ua|Eb&2031616;Ua=kb(fa(c+3>>0|0,1,0,1)|0|0|0,0,8)|0;Z=D;la=kb(fa(c+4>>0|0,1,0,1)|0|0|0,0,16)|0;Z=Z|D;r=fa(c+5>>0|0,1,0,1)|0|0;zc=kb(r|0,0,24)|0;Z=jb(Ua|mb|la|zc|0,Z|D|0,5)|0;Z=Z&2097151;zc=fa(c+7>>0|0,1,0,0)|0|0;la=kb(fa(c+6>>0|0,1,0,1)|0|0|0,0,8)|0;mb=D;zc=zc&255;Ua=kb(zc|0,0,16)|0;mb=jb(la|r|Ua|0,mb|D|0,2)|0;mb=mb&2097151;Ua=kb(fa(c+8>>0|0,1,0,1)|0|0|0,0,8)|0;r=D;la=kb(fa(c+9>>0|0,1,0,1)|0|0|0,0,16)|0;r=r|D;t=fa(c+10>>0|0,1,0,1)|0|0;X=kb(t|0,0,24)|0;r=jb(Ua|zc|la|X|0,r|D|0,7)|0;r=r&2097151;X=kb(fa(c+11>>0|0,1,0,1)|0|0|0,0,8)|0;la=D;zc=kb(fa(c+12>>0|0,1,0,1)|0|0|0,0,16)|0;la=la|D;Ua=fa(c+13>>0|0,1,0,1)|0|0;Bc=kb(Ua|0,0,24)|0;la=jb(X|t|zc|Bc|0,la|D|0,4)|0;la=la&2097151;Bc=fa(c+15>>0|0,1,0,0)|0|0;zc=kb(fa(c+14>>0|0,1,0,1)|0|0|0,0,8)|0;t=D;Bc=Bc&255;X=kb(Bc|0,0,16)|0;t=jb(zc|Ua|X|0,t|D|0,1)|0;t=t&2097151;X=kb(fa(c+16>>0|0,1,0,1)|0|0|0,0,8)|0;Ua=D;zc=kb(fa(c+17>>0|0,1,0,1)|0|0|0,0,16)|0;Ua=Ua|D;F=fa(c+18>>0|0,1,0,1)|0|0;A=kb(F|0,0,24)|0;Ua=jb(X|Bc|zc|A|0,Ua|D|0,6)|0;Ua=Ua&2097151;A=fa(c+20>>0|0,1,0,0)|0|0;zc=kb(fa(c+19>>0|0,1,0,1)|0|0|0,0,8)|0;Bc=D;A=kb(A&255|0,0,16)|0;Bc=jb(zc|F|A|0,Bc|D|0,3)|0;A=D;F=fa(c+23>>0|0,1,0,0)|0|0;zc=fa(c+21>>0|0,1,0,1)|0|0;X=kb(fa(c+22>>0|0,1,0,1)|0|0|0,0,8)|0;ob=D;F=F&255;za=kb(F|0,0,16)|0;za=X|zc|za&2031616;zc=kb(fa(c+24>>0|0,1,0,1)|0|0|0,0,8)|0;X=D;Ia=kb(fa(c+25>>0|0,1,0,1)|0|0|0,0,16)|0;X=X|D;Fa=fa(c+26>>0|0,1,0,1)|0|0;qa=kb(Fa|0,0,24)|0;X=jb(zc|F|Ia|qa|0,X|D|0,5)|0;X=X&2097151;qa=fa(c+28>>0|0,1,0,0)|0|0;Ia=kb(fa(c+27>>0|0,1,0,1)|0|0|0,0,8)|0;F=D;qa=qa&255;zc=kb(qa|0,0,16)|0;F=jb(Ia|Fa|zc|0,F|D|0,2)|0;F=F&2097151;zc=kb(fa(c+29>>0|0,1,0,1)|0|0|0,0,8)|0;Fa=D;Ia=kb(fa(c+30>>0|0,1,0,1)|0|0|0,0,16)|0;Fa=Fa|D;ha=kb(fa(c+31>>0|0,1,0,1)|0|0|0,0,24)|0;Fa=jb(zc|qa|Ia|ha|0,Fa|D|0,7)|0;ha=D;Ia=fa(d+2>>0|0,1,0,0)|0|0;qa=fa(d>>0|0,1,0,1)|0|0;zc=kb(fa(d+1>>0|0,1,0,1)|0|0|0,0,8)|0;W=D;Ia=Ia&255;ua=kb(Ia|0,0,16)|0;L=kb(fa(d+3>>0|0,1,0,1)|0|0|0,0,8)|0;Ba=D;wa=kb(fa(d+4>>0|0,1,0,1)|0|0|0,0,16)|0;Ba=Ba|D;pb=fa(d+5>>0|0,1,0,1)|0|0;H=kb(pb|0,0,24)|0;Ba=jb(L|Ia|wa|H|0,Ba|D|0,5)|0;H=fa(d+7>>0|0,1,0,0)|0|0;wa=kb(fa(d+6>>0|0,1,0,1)|0|0|0,0,8)|0;Ia=D;H=H&255;L=kb(H|0,0,16)|0;Ia=jb(wa|pb|L|0,Ia|D|0,2)|0;L=kb(fa(d+8>>0|0,1,0,1)|0|0|0,0,8)|0;pb=D;wa=kb(fa(d+9>>0|0,1,0,1)|0|0|0,0,16)|0;pb=pb|D;R=fa(d+10>>0|0,1,0,1)|0|0;Ib=kb(R|0,0,24)|0;pb=jb(L|H|wa|Ib|0,pb|D|0,7)|0;Ib=kb(fa(d+11>>0|0,1,0,1)|0|0|0,0,8)|0;wa=D;H=kb(fa(d+12>>0|0,1,0,1)|0|0|0,0,16)|0;wa=wa|D;L=fa(d+13>>0|0,1,0,1)|0|0;M=kb(L|0,0,24)|0;wa=jb(Ib|R|H|M|0,wa|D|0,4)|0;M=fa(d+15>>0|0,1,0,0)|0|0;H=kb(fa(d+14>>0|0,1,0,1)|0|0|0,0,8)|0;R=D;M=M&255;Ib=kb(M|0,0,16)|0;R=jb(H|L|Ib|0,R|D|0,1)|0;Ib=kb(fa(d+16>>0|0,1,0,1)|0|0|0,0,8)|0;L=D;H=kb(fa(d+17>>0|0,1,0,1)|0|0|0,0,16)|0;L=L|D;sa=fa(d+18>>0|0,1,0,1)|0|0;B=kb(sa|0,0,24)|0;L=jb(Ib|M|H|B|0,L|D|0,6)|0;B=fa(d+20>>0|0,1,0,0)|0|0;H=kb(fa(d+19>>0|0,1,0,1)|0|0|0,0,8)|0;M=D;B=kb(B&255|0,0,16)|0;M=jb(H|sa|B|0,M|D|0,3)|0;B=D;sa=fa(d+23>>0|0,1,0,0)|0|0;H=fa(d+21>>0|0,1,0,1)|0|0;Ib=kb(fa(d+22>>0|0,1,0,1)|0|0|0,0,8)|0;$a=D;sa=sa&255;Ca=kb(sa|0,0,16)|0;va=kb(fa(d+24>>0|0,1,0,1)|0|0|0,0,8)|0;G=D;Ea=kb(fa(d+25>>0|0,1,0,1)|0|0|0,0,16)|0;G=G|D;yb=fa(d+26>>0|0,1,0,1)|0|0;Ja=kb(yb|0,0,24)|0;G=jb(va|sa|Ea|Ja|0,G|D|0,5)|0;Ja=fa(d+28>>0|0,1,0,0)|0|0;Ea=kb(fa(d+27>>0|0,1,0,1)|0|0|0,0,8)|0;sa=D;Ja=Ja&255;va=kb(Ja|0,0,16)|0;sa=jb(Ea|yb|va|0,sa|D|0,2)|0;va=kb(fa(d+29>>0|0,1,0,1)|0|0|0,0,8)|0;yb=D;Ea=kb(fa(d+30>>0|0,1,0,1)|0|0|0,0,16)|0;yb=yb|D;d=kb(fa(d+31>>0|0,1,0,1)|0|0|0,0,24)|0;yb=jb(va|Ja|Ea|d|0,yb|D|0,7)|0;d=D;Ea=sb(Eb|0,Fb|0,_|0,zb|0)|0;Ea=gb(zc|qa|ua&2031616|0,W|0,Ea|0,D|0)|0;W=D;ua=sb(Z|0,0,_|0,zb|0)|0;qa=D;zc=sb(Eb|0,Fb|0,Ab|0,0)|0;zc=hb(ua|0,qa|0,zc|0,D|0)|0;qa=D;ua=sb(mb|0,0,_|0,zb|0)|0;Ja=D;va=sb(Z|0,0,Ab|0,0)|0;uc=D;ma=sb(Eb|0,Fb|0,q|0,0)|0;ma=hb(va|0,uc|0,ma|0,D|0)|0;Ja=hb(ma|0,D|0,ua|0,Ja|0)|0;Ja=gb(Ia&2097151|0,0,Ja|0,D|0)|0;Ia=D;ua=sb(r|0,0,_|0,zb|0)|0;ma=D;uc=sb(mb|0,0,Ab|0,0)|0;va=D;yc=sb(Z|0,0,q|0,0)|0;xc=D;wc=sb(Eb|0,Fb|0,u|0,0)|0;vc=D;La=sb(la|0,0,_|0,zb|0)|0;xa=D;lc=sb(r|0,0,Ab|0,0)|0;Q=D;nc=sb(mb|0,0,q|0,0)|0;Ka=D;oc=sb(Z|0,0,u|0,0)|0;pc=D;mc=sb(Eb|0,Fb|0,o|0,0)|0;mc=hb(oc|0,pc|0,mc|0,D|0)|0;Ka=hb(mc|0,D|0,nc|0,Ka|0)|0;Q=hb(Ka|0,D|0,lc|0,Q|0)|0;xa=hb(Q|0,D|0,La|0,xa|0)|0;xa=gb(wa&2097151|0,0,xa|0,D|0)|0;wa=D;La=sb(t|0,0,_|0,zb|0)|0;Q=D;lc=sb(la|0,0,Ab|0,0)|0;Ka=D;nc=sb(r|0,0,q|0,0)|0;mc=D;pc=sb(mb|0,0,u|0,0)|0;oc=D;tc=sb(Z|0,0,o|0,0)|0;sc=D;rc=sb(Eb|0,Fb|0,j|0,0)|0;qc=D;N=sb(Ua|0,0,_|0,zb|0)|0;K=D;_b=sb(t|0,0,Ab|0,0)|0;g=D;ac=sb(la|0,0,q|0,0)|0;Zb=D;cc=sb(r|0,0,u|0,0)|0;$b=D;ec=sb(mb|0,0,o|0,0)|0;bc=D;fc=sb(Z|0,0,j|0,0)|0;gc=D;dc=sb(Eb|0,Fb|0,Qa|0,0)|0;dc=hb(fc|0,gc|0,dc|0,D|0)|0;bc=hb(dc|0,D|0,ec|0,bc|0)|0;$b=hb(bc|0,D|0,cc|0,$b|0)|0;Zb=hb($b|0,D|0,ac|0,Zb|0)|0;g=hb(Zb|0,D|0,_b|0,g|0)|0;K=hb(g|0,D|0,N|0,K|0)|0;K=gb(L&2097151|0,0,K|0,D|0)|0;L=D;N=sb(Bc|0,A|0,_|0,zb|0)|0;g=D;_b=sb(Ua|0,0,Ab|0,0)|0;Zb=D;ac=sb(t|0,0,q|0,0)|0;$b=D;cc=sb(la|0,0,u|0,0)|0;bc=D;ec=sb(r|0,0,o|0,0)|0;dc=D;gc=sb(mb|0,0,j|0,0)|0;fc=D;kc=sb(Z|0,0,Qa|0,0)|0;jc=D;ic=sb(Eb|0,Fb|0,na|0,ya|0)|0;hc=D;Da=sb(za|0,ob|0,_|0,zb|0)|0;_a=D;Jb=sb(Bc|0,A|0,Ab|0,0)|0;Kb=D;Lb=sb(Ua|0,0,q|0,0)|0;Mb=D;Nb=sb(t|0,0,u|0,0)|0;Ob=D;Pb=sb(la|0,0,o|0,0)|0;Qb=D;Rb=sb(r|0,0,j|0,0)|0;Sb=D;Tb=sb(mb|0,0,Qa|0,0)|0;Ub=D;Wb=sb(Z|0,0,na|0,ya|0)|0;Xb=D;Yb=sb(Eb|0,Fb|0,Na|0,qb|0)|0;Yb=hb(Wb|0,Xb|0,Yb|0,D|0)|0;Ub=hb(Yb|0,D|0,Tb|0,Ub|0)|0;Sb=hb(Ub|0,D|0,Rb|0,Sb|0)|0;Qb=hb(Sb|0,D|0,Pb|0,Qb|0)|0;Ob=hb(Qb|0,D|0,Nb|0,Ob|0)|0;Mb=hb(Ob|0,D|0,Lb|0,Mb|0)|0;Kb=hb(Mb|0,D|0,Jb|0,Kb|0)|0;_a=hb(Kb|0,D|0,Da|0,_a|0)|0;_a=gb(Ib|H|Ca&2031616|0,$a|0,_a|0,D|0)|0;$a=D;Ca=sb(X|0,0,_|0,zb|0)|0;H=D;Ib=sb(za|0,ob|0,Ab|0,0)|0;Da=D;Kb=sb(Bc|0,A|0,q|0,0)|0;Jb=D;Mb=sb(Ua|0,0,u|0,0)|0;Lb=D;Ob=sb(t|0,0,o|0,0)|0;Nb=D;Qb=sb(la|0,0,j|0,0)|0;Pb=D;Sb=sb(r|0,0,Qa|0,0)|0;Rb=D;Ub=sb(mb|0,0,na|0,ya|0)|0;Tb=D;Yb=sb(Z|0,0,Na|0,qb|0)|0;Xb=D;Wb=sb(Eb|0,Fb|0,w|0,0)|0;Vb=D;Ya=sb(F|0,0,_|0,zb|0)|0;ta=D;pa=sb(X|0,0,Ab|0,0)|0;Za=D;rb=sb(za|0,ob|0,q|0,0)|0;oa=D;ea=sb(Bc|0,A|0,u|0,0)|0;tb=D;Sa=sb(Ua|0,0,o|0,0)|0;l=D;eb=sb(t|0,0,j|0,0)|0;Ta=D;ca=sb(la|0,0,Qa|0,0)|0;ib=D;Wa=sb(r|0,0,na|0,ya|0)|0;da=D;aa=sb(mb|0,0,Na|0,qb|0)|0;Xa=D;Gb=sb(Z|0,0,w|0,0)|0;Hb=D;c=sb(Eb|0,Fb|0,Ga|0,0)|0;c=hb(Gb|0,Hb|0,c|0,D|0)|0;Xa=hb(c|0,D|0,aa|0,Xa|0)|0;da=hb(Xa|0,D|0,Wa|0,da|0)|0;ib=hb(da|0,D|0,ca|0,ib|0)|0;Ta=hb(ib|0,D|0,eb|0,Ta|0)|0;l=hb(Ta|0,D|0,Sa|0,l|0)|0;tb=hb(l|0,D|0,ea|0,tb|0)|0;oa=hb(tb|0,D|0,rb|0,oa|0)|0;Za=hb(oa|0,D|0,pa|0,Za|0)|0;ta=hb(Za|0,D|0,Ya|0,ta|0)|0;ta=gb(sa&2097151|0,0,ta|0,D|0)|0;sa=D;zb=sb(Fa|0,ha|0,_|0,zb|0)|0;_=D;Ya=sb(F|0,0,Ab|0,0)|0;Za=D;pa=sb(X|0,0,q|0,0)|0;oa=D;rb=sb(za|0,ob|0,u|0,0)|0;tb=D;ea=sb(Bc|0,A|0,o|0,0)|0;l=D;Sa=sb(Ua|0,0,j|0,0)|0;Ta=D;eb=sb(t|0,0,Qa|0,0)|0;ib=D;ca=sb(la|0,0,na|0,ya|0)|0;da=D;Wa=sb(r|0,0,Na|0,qb|0)|0;Xa=D;aa=sb(mb|0,0,w|0,0)|0;c=D;Hb=sb(Z|0,0,Ga|0,0)|0;Gb=D;Fb=sb(Eb|0,Fb|0,x|0,Ha|0)|0;Eb=D;Ab=sb(Fa|0,ha|0,Ab|0,0)|0;Bb=D;cb=sb(F|0,0,q|0,0)|0;v=D;ja=sb(X|0,0,u|0,0)|0;db=D;Cb=sb(za|0,ob|0,o|0,0)|0;nb=D;f=sb(Bc|0,A|0,j|0,0)|0;Db=D;vb=sb(Ua|0,0,Qa|0,0)|0;h=D;Ra=sb(t|0,0,na|0,ya|0)|0;ub=D;Pa=sb(la|0,0,Na|0,qb|0)|0;ia=D;Y=sb(r|0,0,w|0,0)|0;Oa=D;y=sb(mb|0,0,Ga|0,0)|0;lb=D;Z=sb(Z|0,0,x|0,Ha|0)|0;Z=hb(y|0,lb|0,Z|0,D|0)|0;Oa=hb(Z|0,D|0,Y|0,Oa|0)|0;ia=hb(Oa|0,D|0,Pa|0,ia|0)|0;ub=hb(ia|0,D|0,Ra|0,ub|0)|0;h=hb(ub|0,D|0,vb|0,h|0)|0;Db=hb(h|0,D|0,f|0,Db|0)|0;nb=hb(Db|0,D|0,Cb|0,nb|0)|0;db=hb(nb|0,D|0,ja|0,db|0)|0;v=hb(db|0,D|0,cb|0,v|0)|0;Bb=hb(v|0,D|0,Ab|0,Bb|0)|0;Ab=D;q=sb(Fa|0,ha|0,q|0,0)|0;v=D;cb=sb(F|0,0,u|0,0)|0;db=D;ja=sb(X|0,0,o|0,0)|0;nb=D;Cb=sb(za|0,ob|0,j|0,0)|0;Db=D;f=sb(Bc|0,A|0,Qa|0,0)|0;h=D;vb=sb(Ua|0,0,na|0,ya|0)|0;ub=D;Ra=sb(t|0,0,Na|0,qb|0)|0;ia=D;Pa=sb(la|0,0,w|0,0)|0;Oa=D;Y=sb(r|0,0,Ga|0,0)|0;Z=D;mb=sb(mb|0,0,x|0,Ha|0)|0;lb=D;u=sb(Fa|0,ha|0,u|0,0)|0;y=D;ab=sb(F|0,0,o|0,0)|0;I=D;n=sb(X|0,0,j|0,0)|0;bb=D;ba=sb(za|0,ob|0,Qa|0,0)|0;$=D;V=sb(Bc|0,A|0,na|0,ya|0)|0;s=D;J=sb(Ua|0,0,Na|0,qb|0)|0;U=D;z=sb(t|0,0,w|0,0)|0;C=D;b=sb(la|0,0,Ga|0,0)|0;p=D;r=sb(r|0,0,x|0,Ha|0)|0;r=hb(b|0,p|0,r|0,D|0)|0;C=hb(r|0,D|0,z|0,C|0)|0;U=hb(C|0,D|0,J|0,U|0)|0;s=hb(U|0,D|0,V|0,s|0)|0;$=hb(s|0,D|0,ba|0,$|0)|0;bb=hb($|0,D|0,n|0,bb|0)|0;I=hb(bb|0,D|0,ab|0,I|0)|0;y=hb(I|0,D|0,u|0,y|0)|0;u=D;o=sb(Fa|0,ha|0,o|0,0)|0;I=D;ab=sb(F|0,0,j|0,0)|0;bb=D;n=sb(X|0,0,Qa|0,0)|0;$=D;ba=sb(za|0,ob|0,na|0,ya|0)|0;s=D;V=sb(Bc|0,A|0,Na|0,qb|0)|0;U=D;J=sb(Ua|0,0,w|0,0)|0;C=D;z=sb(t|0,0,Ga|0,0)|0;r=D;la=sb(la|0,0,x|0,Ha|0)|0;p=D;b=sb(Fa|0,ha|0,j|0,0)|0;j=D;xb=sb(F|0,0,Qa|0,0)|0;ka=D;P=sb(X|0,0,na|0,ya|0)|0;wb=D;m=sb(za|0,ob|0,Na|0,qb|0)|0;O=D;E=sb(Bc|0,A|0,w|0,0)|0;k=D;ra=sb(Ua|0,0,Ga|0,0)|0;Va=D;t=sb(t|0,0,x|0,Ha|0)|0;t=hb(ra|0,Va|0,t|0,D|0)|0;k=hb(t|0,D|0,E|0,k|0)|0;O=hb(k|0,D|0,m|0,O|0)|0;wb=hb(O|0,D|0,P|0,wb|0)|0;ka=hb(wb|0,D|0,xb|0,ka|0)|0;j=hb(ka|0,D|0,b|0,j|0)|0;b=D;Qa=sb(Fa|0,ha|0,Qa|0,0)|0;ka=D;xb=sb(F|0,0,na|0,ya|0)|0;wb=D;P=sb(X|0,0,Na|0,qb|0)|0;O=D;m=sb(za|0,ob|0,w|0,0)|0;k=D;E=sb(Bc|0,A|0,Ga|0,0)|0;t=D;Ua=sb(Ua|0,0,x|0,Ha|0)|0;Va=D;ya=sb(Fa|0,ha|0,na|0,ya|0)|0;na=D;ra=sb(F|0,0,Na|0,qb|0)|0;Aa=D;S=sb(X|0,0,w|0,0)|0;T=D;Ma=sb(za|0,ob|0,Ga|0,0)|0;Ac=D;A=sb(Bc|0,A|0,x|0,Ha|0)|0;A=hb(Ma|0,Ac|0,A|0,D|0)|0;T=hb(A|0,D|0,S|0,T|0)|0;Aa=hb(T|0,D|0,ra|0,Aa|0)|0;na=hb(Aa|0,D|0,ya|0,na|0)|0;ya=D;qb=sb(Fa|0,ha|0,Na|0,qb|0)|0;Na=D;Aa=sb(F|0,0,w|0,0)|0;ra=D;T=sb(X|0,0,Ga|0,0)|0;S=D;ob=sb(za|0,ob|0,x|0,Ha|0)|0;za=D;w=sb(Fa|0,ha|0,w|0,0)|0;A=D;Ac=sb(F|0,0,Ga|0,0)|0;Ma=D;X=sb(X|0,0,x|0,Ha|0)|0;X=hb(Ac|0,Ma|0,X|0,D|0)|0;A=hb(X|0,D|0,w|0,A|0)|0;w=D;Ga=sb(Fa|0,ha|0,Ga|0,0)|0;X=D;F=sb(F|0,0,x|0,Ha|0)|0;Ma=D;Ha=gb(0,0,x|0,Ha|0)|0;Ha=sb(Fa|0,ha|0,Ha|0,D|0)|0;ha=D;Fa=hb(Ea|0,W|0,1048576,0)|0;Fa=fb(Fa|0,D|0,21)|0;x=D;qa=gb(Fa|0,x|0,zc|0,qa|0)|0;Ba=hb(qa|0,D|0,Ba&2097151|0,0)|0;qa=D;x=kb(Fa|0,x|0,21)|0;x=gb(Ea|0,W|0,x|0,D|0)|0;W=D;Ea=hb(Ja|0,Ia|0,1048576,0)|0;Ea=fb(Ea|0,D|0,21)|0;Fa=D;vc=hb(yc|0,xc|0,wc|0,vc|0)|0;va=hb(vc|0,D|0,uc|0,va|0)|0;ma=hb(va|0,D|0,ua|0,ma|0)|0;ma=gb(Ea|0,Fa|0,ma|0,D|0)|0;pb=hb(ma|0,D|0,pb&2097151|0,0)|0;ma=D;Fa=kb(Ea|0,Fa|0,21)|0;Ea=D;ua=hb(xa|0,wa|0,1048576,0)|0;ua=fb(ua|0,D|0,21)|0;va=D;qc=hb(tc|0,sc|0,rc|0,qc|0)|0;oc=hb(qc|0,D|0,pc|0,oc|0)|0;mc=hb(oc|0,D|0,nc|0,mc|0)|0;Ka=hb(mc|0,D|0,lc|0,Ka|0)|0;Q=hb(Ka|0,D|0,La|0,Q|0)|0;Q=gb(R&2097151|0,0,Q|0,D|0)|0;Q=hb(Q|0,D|0,ua|0,va|0)|0;R=D;va=kb(ua|0,va|0,21)|0;ua=D;La=hb(K|0,L|0,1048576,0)|0;La=fb(La|0,D|0,21)|0;Ka=D;hc=hb(kc|0,jc|0,ic|0,hc|0)|0;fc=hb(hc|0,D|0,gc|0,fc|0)|0;dc=hb(fc|0,D|0,ec|0,dc|0)|0;bc=hb(dc|0,D|0,cc|0,bc|0)|0;$b=hb(bc|0,D|0,ac|0,$b|0)|0;Zb=hb($b|0,D|0,_b|0,Zb|0)|0;g=hb(Zb|0,D|0,N|0,g|0)|0;g=gb(M|0,B|0,g|0,D|0)|0;g=hb(g|0,D|0,La|0,Ka|0)|0;B=D;Ka=kb(La|0,Ka|0,21)|0;La=D;M=hb(_a|0,$a|0,1048576,0)|0;M=fb(M|0,D|0,21)|0;N=D;Vb=hb(Yb|0,Xb|0,Wb|0,Vb|0)|0;Tb=hb(Vb|0,D|0,Ub|0,Tb|0)|0;Rb=hb(Tb|0,D|0,Sb|0,Rb|0)|0;Pb=hb(Rb|0,D|0,Qb|0,Pb|0)|0;Nb=hb(Pb|0,D|0,Ob|0,Nb|0)|0;Lb=hb(Nb|0,D|0,Mb|0,Lb|0)|0;Jb=hb(Lb|0,D|0,Kb|0,Jb|0)|0;Da=hb(Jb|0,D|0,Ib|0,Da|0)|0;H=hb(Da|0,D|0,Ca|0,H|0)|0;H=gb(M|0,N|0,H|0,D|0)|0;G=hb(H|0,D|0,G&2097151|0,0)|0;H=D;N=kb(M|0,N|0,21)|0;M=D;Ca=hb(ta|0,sa|0,1048576,0)|0;Ca=fb(Ca|0,D|0,21)|0;Da=D;Eb=hb(Hb|0,Gb|0,Fb|0,Eb|0)|0;c=hb(Eb|0,D|0,aa|0,c|0)|0;Xa=hb(c|0,D|0,Wa|0,Xa|0)|0;da=hb(Xa|0,D|0,ca|0,da|0)|0;ib=hb(da|0,D|0,eb|0,ib|0)|0;Ta=hb(ib|0,D|0,Sa|0,Ta|0)|0;l=hb(Ta|0,D|0,ea|0,l|0)|0;tb=hb(l|0,D|0,rb|0,tb|0)|0;oa=hb(tb|0,D|0,pa|0,oa|0)|0;Za=hb(oa|0,D|0,Ya|0,Za|0)|0;_=hb(Za|0,D|0,zb|0,_|0)|0;_=gb(yb|0,d|0,_|0,D|0)|0;_=hb(_|0,D|0,Ca|0,Da|0)|0;d=D;Da=kb(Ca|0,Da|0,21)|0;Ca=D;yb=gb(1048576,0,Bb|0,Ab|0)|0;yb=fb(yb|0,D|0,21)|0;zb=D;lb=hb(Y|0,Z|0,mb|0,lb|0)|0;Oa=hb(lb|0,D|0,Pa|0,Oa|0)|0;ia=hb(Oa|0,D|0,Ra|0,ia|0)|0;ub=hb(ia|0,D|0,vb|0,ub|0)|0;h=hb(ub|0,D|0,f|0,h|0)|0;Db=hb(h|0,D|0,Cb|0,Db|0)|0;nb=hb(Db|0,D|0,ja|0,nb|0)|0;db=hb(nb|0,D|0,cb|0,db|0)|0;v=hb(db|0,D|0,q|0,v|0)|0;v=gb(yb|0,zb|0,v|0,D|0)|0;q=D;zb=kb(yb|0,zb|0,21)|0;yb=D;db=gb(1048576,0,y|0,u|0)|0;db=fb(db|0,D|0,21)|0;cb=D;p=hb(z|0,r|0,la|0,p|0)|0;C=hb(p|0,D|0,J|0,C|0)|0;U=hb(C|0,D|0,V|0,U|0)|0;s=hb(U|0,D|0,ba|0,s|0)|0;$=hb(s|0,D|0,n|0,$|0)|0;bb=hb($|0,D|0,ab|0,bb|0)|0;I=hb(bb|0,D|0,o|0,I|0)|0;I=gb(db|0,cb|0,I|0,D|0)|0;o=D;cb=kb(db|0,cb|0,21)|0;db=D;bb=gb(1048576,0,j|0,b|0)|0;bb=fb(bb|0,D|0,21)|0;ab=D;Va=hb(E|0,t|0,Ua|0,Va|0)|0;k=hb(Va|0,D|0,m|0,k|0)|0;O=hb(k|0,D|0,P|0,O|0)|0;wb=hb(O|0,D|0,xb|0,wb|0)|0;ka=hb(wb|0,D|0,Qa|0,ka|0)|0;ka=gb(bb|0,ab|0,ka|0,D|0)|0;Qa=D;ab=kb(bb|0,ab|0,21)|0;bb=D;wb=gb(1048576,0,na|0,ya|0)|0;wb=fb(wb|0,D|0,21)|0;xb=D;za=hb(T|0,S|0,ob|0,za|0)|0;ra=hb(za|0,D|0,Aa|0,ra|0)|0;Na=hb(ra|0,D|0,qb|0,Na|0)|0;Na=gb(wb|0,xb|0,Na|0,D|0)|0;qb=D;xb=kb(wb|0,xb|0,21)|0;ya=hb(xb|0,D|0,na|0,ya|0)|0;na=D;xb=gb(1048576,0,A|0,w|0)|0;xb=fb(xb|0,D|0,21)|0;wb=D;Ma=hb(Ga|0,X|0,F|0,Ma|0)|0;Ma=gb(xb|0,wb|0,Ma|0,D|0)|0;F=D;wb=kb(xb|0,wb|0,21)|0;w=hb(wb|0,D|0,A|0,w|0)|0;A=D;wb=hb(Ha|0,ha|0,1048576,0)|0;wb=fb(wb|0,D|0,21)|0;xb=D;X=kb(wb|0,xb|0,21)|0;X=gb(Ha|0,ha|0,X|0,D|0)|0;ha=D;Ha=hb(Ba|0,qa|0,1048576,0)|0;Ha=fb(Ha|0,D|0,21)|0;Ga=D;ra=kb(Ha|0,Ga|0,21)|0;ra=gb(Ba|0,qa|0,ra|0,D|0)|0;qa=D;Ba=hb(pb|0,ma|0,1048576,0)|0;Ba=fb(Ba|0,D|0,21)|0;Aa=D;za=kb(Ba|0,Aa|0,21)|0;za=gb(pb|0,ma|0,za|0,D|0)|0;ma=D;pb=hb(Q|0,R|0,1048576,0)|0;pb=fb(pb|0,D|0,21)|0;ob=D;S=kb(pb|0,ob|0,21)|0;T=D;O=hb(g|0,B|0,1048576,0)|0;O=fb(O|0,D|0,21)|0;P=D;k=kb(O|0,P|0,21)|0;m=D;Va=hb(G|0,H|0,1048576,0)|0;Va=fb(Va|0,D|0,21)|0;Ua=D;t=kb(Va|0,Ua|0,21)|0;E=D;$=hb(_|0,d|0,1048576,0)|0;$=fb($|0,D|0,21)|0;n=D;s=kb($|0,n|0,21)|0;ba=D;U=hb(v|0,q|0,1048576,0)|0;U=fb(U|0,D|0,21)|0;V=D;C=kb(U|0,V|0,21)|0;J=D;p=hb(I|0,o|0,1048576,0)|0;p=fb(p|0,D|0,21)|0;la=D;r=kb(p|0,la|0,21)|0;z=D;nb=hb(ka|0,Qa|0,1048576,0)|0;nb=fb(nb|0,D|0,21)|0;ja=D;na=gb(nb|0,ja|0,ya|0,na|0)|0;ya=D;ja=kb(nb|0,ja|0,21)|0;ja=gb(ka|0,Qa|0,ja|0,D|0)|0;Qa=D;ka=hb(Na|0,qb|0,1048576,0)|0;ka=fb(ka|0,D|0,21)|0;nb=D;A=gb(ka|0,nb|0,w|0,A|0)|0;w=D;nb=kb(ka|0,nb|0,21)|0;nb=gb(Na|0,qb|0,nb|0,D|0)|0;qb=D;Na=hb(Ma|0,F|0,1048576,0)|0;Na=fb(Na|0,D|0,21)|0;ka=D;ha=hb(Na|0,ka|0,X|0,ha|0)|0;X=D;ka=kb(Na|0,ka|0,21)|0;ka=gb(Ma|0,F|0,ka|0,D|0)|0;F=D;Ma=sb(wb|0,xb|0,666643,0)|0;Na=D;Db=sb(wb|0,xb|0,470296,0)|0;Cb=D;h=sb(wb|0,xb|0,654183,0)|0;f=D;ub=sb(wb|0,xb|0,-997805,-1)|0;vb=D;ia=sb(wb|0,xb|0,136657,0)|0;Ra=D;xb=sb(wb|0,xb|0,-683901,-1)|0;b=gb(xb|0,D|0,j|0,b|0)|0;bb=gb(b|0,D|0,ab|0,bb|0)|0;la=hb(bb|0,D|0,p|0,la|0)|0;p=D;bb=sb(ha|0,X|0,666643,0)|0;ab=D;b=sb(ha|0,X|0,470296,0)|0;j=D;xb=sb(ha|0,X|0,654183,0)|0;wb=D;Oa=sb(ha|0,X|0,-997805,-1)|0;Pa=D;lb=sb(ha|0,X|0,136657,0)|0;mb=D;X=sb(ha|0,X|0,-683901,-1)|0;ha=D;Z=sb(ka|0,F|0,666643,0)|0;Y=D;Za=sb(ka|0,F|0,470296,0)|0;Ya=D;oa=sb(ka|0,F|0,654183,0)|0;pa=D;tb=sb(ka|0,F|0,-997805,-1)|0;rb=D;l=sb(ka|0,F|0,136657,0)|0;ea=D;F=sb(ka|0,F|0,-683901,-1)|0;ka=D;u=gb(ub|0,vb|0,y|0,u|0)|0;db=gb(u|0,D|0,cb|0,db|0)|0;V=hb(db|0,D|0,U|0,V|0)|0;mb=hb(V|0,D|0,lb|0,mb|0)|0;ka=hb(mb|0,D|0,F|0,ka|0)|0;F=D;mb=sb(A|0,w|0,666643,0)|0;lb=D;V=sb(A|0,w|0,470296,0)|0;U=D;db=sb(A|0,w|0,654183,0)|0;cb=D;u=sb(A|0,w|0,-997805,-1)|0;y=D;vb=sb(A|0,w|0,136657,0)|0;ub=D;w=sb(A|0,w|0,-683901,-1)|0;A=D;Ta=sb(nb|0,qb|0,666643,0)|0;Sa=D;ib=sb(nb|0,qb|0,470296,0)|0;eb=D;da=sb(nb|0,qb|0,654183,0)|0;ca=D;Xa=sb(nb|0,qb|0,-997805,-1)|0;Wa=D;c=sb(nb|0,qb|0,136657,0)|0;aa=D;qb=sb(nb|0,qb|0,-683901,-1)|0;nb=D;Ab=gb(Db|0,Cb|0,Bb|0,Ab|0)|0;yb=gb(Ab|0,D|0,zb|0,yb|0)|0;wb=hb(yb|0,D|0,xb|0,wb|0)|0;ub=hb(wb|0,D|0,vb|0,ub|0)|0;rb=hb(ub|0,D|0,tb|0,rb|0)|0;nb=hb(rb|0,D|0,qb|0,nb|0)|0;n=hb(nb|0,D|0,$|0,n|0)|0;$=D;nb=sb(na|0,ya|0,666643,0)|0;nb=hb(pb|0,ob|0,nb|0,D|0)|0;L=hb(nb|0,D|0,K|0,L|0)|0;La=gb(L|0,D|0,Ka|0,La|0)|0;Ka=D;L=sb(na|0,ya|0,470296,0)|0;K=D;nb=sb(na|0,ya|0,654183,0)|0;lb=hb(nb|0,D|0,mb|0,lb|0)|0;eb=hb(lb|0,D|0,ib|0,eb|0)|0;$a=hb(eb|0,D|0,_a|0,$a|0)|0;P=hb($a|0,D|0,O|0,P|0)|0;M=gb(P|0,D|0,N|0,M|0)|0;N=D;P=sb(na|0,ya|0,-997805,-1)|0;O=D;$a=sb(na|0,ya|0,136657,0)|0;_a=D;ab=hb(db|0,cb|0,bb|0,ab|0)|0;_a=hb(ab|0,D|0,$a|0,_a|0)|0;Ya=hb(_a|0,D|0,Za|0,Ya|0)|0;Wa=hb(Ya|0,D|0,Xa|0,Wa|0)|0;Ua=hb(Wa|0,D|0,Va|0,Ua|0)|0;sa=hb(Ua|0,D|0,ta|0,sa|0)|0;Ca=gb(sa|0,D|0,Da|0,Ca|0)|0;Da=D;ya=sb(na|0,ya|0,-683901,-1)|0;na=D;sa=hb(La|0,Ka|0,1048576,0)|0;sa=fb(sa|0,D|0,21)|0;ta=D;K=hb(Ta|0,Sa|0,L|0,K|0)|0;B=hb(K|0,D|0,g|0,B|0)|0;m=gb(B|0,D|0,k|0,m|0)|0;m=hb(m|0,D|0,sa|0,ta|0)|0;k=D;ta=kb(sa|0,ta|0,21)|0;sa=D;B=hb(M|0,N|0,1048576,0)|0;B=fb(B|0,D|0,21)|0;g=D;U=hb(P|0,O|0,V|0,U|0)|0;Y=hb(U|0,D|0,Z|0,Y|0)|0;ca=hb(Y|0,D|0,da|0,ca|0)|0;H=hb(ca|0,D|0,G|0,H|0)|0;H=hb(H|0,D|0,B|0,g|0)|0;E=gb(H|0,D|0,t|0,E|0)|0;t=D;g=kb(B|0,g|0,21)|0;B=D;H=hb(Ca|0,Da|0,1048576,0)|0;H=fb(H|0,D|0,21)|0;G=D;Na=hb(b|0,j|0,Ma|0,Na|0)|0;y=hb(Na|0,D|0,u|0,y|0)|0;na=hb(y|0,D|0,ya|0,na|0)|0;pa=hb(na|0,D|0,oa|0,pa|0)|0;aa=hb(pa|0,D|0,c|0,aa|0)|0;d=hb(aa|0,D|0,_|0,d|0)|0;d=hb(d|0,D|0,H|0,G|0)|0;ba=gb(d|0,D|0,s|0,ba|0)|0;s=D;G=kb(H|0,G|0,21)|0;H=D;d=hb(n|0,$|0,1048576,0)|0;d=fb(d|0,D|0,21)|0;_=D;f=hb(v|0,q|0,h|0,f|0)|0;J=gb(f|0,D|0,C|0,J|0)|0;Pa=hb(J|0,D|0,Oa|0,Pa|0)|0;A=hb(Pa|0,D|0,w|0,A|0)|0;ea=hb(A|0,D|0,l|0,ea|0)|0;ea=hb(ea|0,D|0,d|0,_|0)|0;l=D;_=kb(d|0,_|0,21)|0;_=gb(n|0,$|0,_|0,D|0)|0;$=D;n=hb(ka|0,F|0,1048576,0)|0;n=fb(n|0,D|0,21)|0;d=D;Ra=hb(I|0,o|0,ia|0,Ra|0)|0;z=gb(Ra|0,D|0,r|0,z|0)|0;ha=hb(z|0,D|0,X|0,ha|0)|0;ha=hb(ha|0,D|0,n|0,d|0)|0;X=D;d=kb(n|0,d|0,21)|0;d=gb(ka|0,F|0,d|0,D|0)|0;F=D;ka=hb(la|0,p|0,1048576,0)|0;ka=fb(ka|0,D|0,21)|0;n=D;Qa=hb(ka|0,n|0,ja|0,Qa|0)|0;ja=D;n=kb(ka|0,n|0,21)|0;n=gb(la|0,p|0,n|0,D|0)|0;p=D;la=hb(m|0,k|0,1048576,0)|0;la=fb(la|0,D|0,21)|0;ka=D;z=kb(la|0,ka|0,21)|0;r=D;Ra=hb(E|0,t|0,1048576,0)|0;Ra=fb(Ra|0,D|0,21)|0;ia=D;o=kb(Ra|0,ia|0,21)|0;I=D;A=hb(ba|0,s|0,1048576,0)|0;A=fb(A|0,D|0,21)|0;w=D;$=hb(_|0,$|0,A|0,w|0)|0;_=D;w=kb(A|0,w|0,21)|0;w=gb(ba|0,s|0,w|0,D|0)|0;s=D;ba=hb(ea|0,l|0,1048576,0)|0;ba=fb(ba|0,D|0,21)|0;A=D;F=hb(ba|0,A|0,d|0,F|0)|0;d=D;A=kb(ba|0,A|0,21)|0;A=gb(ea|0,l|0,A|0,D|0)|0;l=D;ea=hb(ha|0,X|0,1048576,0)|0;ea=fb(ea|0,D|0,21)|0;ba=D;p=hb(ea|0,ba|0,n|0,p|0)|0;n=D;ba=kb(ea|0,ba|0,21)|0;ba=gb(ha|0,X|0,ba|0,D|0)|0;X=D;ha=sb(Qa|0,ja|0,666643,0)|0;ea=D;Pa=sb(Qa|0,ja|0,470296,0)|0;Oa=D;J=sb(Qa|0,ja|0,654183,0)|0;C=D;f=sb(Qa|0,ja|0,-997805,-1)|0;h=D;q=sb(Qa|0,ja|0,136657,0)|0;v=D;ja=sb(Qa|0,ja|0,-683901,-1)|0;ja=hb(Ra|0,ia|0,ja|0,D|0)|0;Da=hb(ja|0,D|0,Ca|0,Da|0)|0;H=gb(Da|0,D|0,G|0,H|0)|0;G=D;Da=sb(p|0,n|0,666643,0)|0;Ca=D;ja=sb(p|0,n|0,470296,0)|0;ia=D;Ra=sb(p|0,n|0,654183,0)|0;Qa=D;aa=sb(p|0,n|0,-997805,-1)|0;c=D;pa=sb(p|0,n|0,136657,0)|0;oa=D;n=sb(p|0,n|0,-683901,-1)|0;p=D;na=sb(ba|0,X|0,666643,0)|0;na=hb(za|0,ma|0,na|0,D|0)|0;ma=D;za=sb(ba|0,X|0,470296,0)|0;ya=D;y=sb(ba|0,X|0,654183,0)|0;u=D;Na=sb(ba|0,X|0,-997805,-1)|0;Ma=D;j=sb(ba|0,X|0,136657,0)|0;b=D;X=sb(ba|0,X|0,-683901,-1)|0;ba=D;h=hb(pa|0,oa|0,f|0,h|0)|0;ba=hb(h|0,D|0,X|0,ba|0)|0;N=hb(ba|0,D|0,M|0,N|0)|0;ka=hb(N|0,D|0,la|0,ka|0)|0;B=gb(ka|0,D|0,g|0,B|0)|0;g=D;ka=sb(F|0,d|0,666643,0)|0;la=D;N=sb(F|0,d|0,470296,0)|0;M=D;ba=sb(F|0,d|0,654183,0)|0;X=D;h=sb(F|0,d|0,-997805,-1)|0;f=D;oa=sb(F|0,d|0,136657,0)|0;pa=D;d=sb(F|0,d|0,-683901,-1)|0;F=D;ca=sb(A|0,l|0,666643,0)|0;da=D;Y=sb(A|0,l|0,470296,0)|0;Z=D;U=sb(A|0,l|0,654183,0)|0;V=D;O=sb(A|0,l|0,-997805,-1)|0;P=D;K=sb(A|0,l|0,136657,0)|0;L=D;l=sb(A|0,l|0,-683901,-1)|0;A=D;Oa=hb(Ra|0,Qa|0,Pa|0,Oa|0)|0;Ma=hb(Oa|0,D|0,Na|0,Ma|0)|0;Ka=hb(Ma|0,D|0,La|0,Ka|0)|0;sa=gb(Ka|0,D|0,ta|0,sa|0)|0;pa=hb(sa|0,D|0,oa|0,pa|0)|0;A=hb(pa|0,D|0,l|0,A|0)|0;l=D;pa=sb($|0,_|0,666643,0)|0;W=hb(pa|0,D|0,x|0,W|0)|0;x=D;pa=sb($|0,_|0,470296,0)|0;oa=D;sa=sb($|0,_|0,654183,0)|0;ta=D;Ga=hb(Ja|0,Ia|0,Ha|0,Ga|0)|0;Ea=gb(Ga|0,D|0,Fa|0,Ea|0)|0;ta=hb(Ea|0,D|0,sa|0,ta|0)|0;la=hb(ta|0,D|0,ka|0,la|0)|0;Z=hb(la|0,D|0,Y|0,Z|0)|0;Y=D;la=sb($|0,_|0,-997805,-1)|0;ka=D;ta=sb($|0,_|0,136657,0)|0;sa=D;Aa=hb(Da|0,Ca|0,Ba|0,Aa|0)|0;ya=hb(Aa|0,D|0,za|0,ya|0)|0;wa=hb(ya|0,D|0,xa|0,wa|0)|0;ua=gb(wa|0,D|0,va|0,ua|0)|0;sa=hb(ua|0,D|0,ta|0,sa|0)|0;X=hb(sa|0,D|0,ba|0,X|0)|0;P=hb(X|0,D|0,O|0,P|0)|0;O=D;_=sb($|0,_|0,-683901,-1)|0;$=D;X=hb(W|0,x|0,1048576,0)|0;X=fb(X|0,D|0,21)|0;ba=D;oa=hb(ra|0,qa|0,pa|0,oa|0)|0;da=hb(oa|0,D|0,ca|0,da|0)|0;da=hb(da|0,D|0,X|0,ba|0)|0;ca=D;ba=kb(X|0,ba|0,21)|0;ba=gb(W|0,x|0,ba|0,D|0)|0;x=D;W=hb(Z|0,Y|0,1048576,0)|0;W=fb(W|0,D|0,21)|0;X=D;ka=hb(na|0,ma|0,la|0,ka|0)|0;M=hb(ka|0,D|0,N|0,M|0)|0;V=hb(M|0,D|0,U|0,V|0)|0;V=hb(V|0,D|0,W|0,X|0)|0;U=D;X=kb(W|0,X|0,21)|0;W=D;M=hb(P|0,O|0,1048576,0)|0;M=fb(M|0,D|0,21)|0;N=D;ea=hb(ja|0,ia|0,ha|0,ea|0)|0;u=hb(ea|0,D|0,y|0,u|0)|0;R=hb(u|0,D|0,Q|0,R|0)|0;T=gb(R|0,D|0,S|0,T|0)|0;$=hb(T|0,D|0,_|0,$|0)|0;f=hb($|0,D|0,h|0,f|0)|0;L=hb(f|0,D|0,K|0,L|0)|0;L=hb(L|0,D|0,M|0,N|0)|0;K=D;N=kb(M|0,N|0,21)|0;M=D;f=hb(A|0,l|0,1048576,0)|0;f=fb(f|0,D|0,21)|0;h=D;C=hb(aa|0,c|0,J|0,C|0)|0;b=hb(C|0,D|0,j|0,b|0)|0;k=hb(b|0,D|0,m|0,k|0)|0;r=gb(k|0,D|0,z|0,r|0)|0;F=hb(r|0,D|0,d|0,F|0)|0;F=hb(F|0,D|0,f|0,h|0)|0;d=D;h=kb(f|0,h|0,21)|0;h=gb(A|0,l|0,h|0,D|0)|0;l=D;A=hb(B|0,g|0,1048576,0)|0;A=fb(A|0,D|0,21)|0;f=D;v=hb(n|0,p|0,q|0,v|0)|0;t=hb(v|0,D|0,E|0,t|0)|0;t=hb(t|0,D|0,A|0,f|0)|0;I=gb(t|0,D|0,o|0,I|0)|0;o=D;f=kb(A|0,f|0,21)|0;f=gb(B|0,g|0,f|0,D|0)|0;g=D;B=hb(H|0,G|0,1048576,0)|0;B=fb(B|0,D|0,21)|0;A=D;s=hb(w|0,s|0,B|0,A|0)|0;w=D;A=kb(B|0,A|0,21)|0;B=D;t=hb(da|0,ca|0,1048576,0)|0;t=fb(t|0,D|0,21)|0;E=D;v=kb(t|0,E|0,21)|0;q=D;p=hb(V|0,U|0,1048576,0)|0;p=fb(p|0,D|0,21)|0;n=D;r=kb(p|0,n|0,21)|0;z=D;k=hb(L|0,K|0,1048576,0)|0;k=fb(k|0,D|0,21)|0;m=D;l=hb(h|0,l|0,k|0,m|0)|0;h=D;m=kb(k|0,m|0,21)|0;k=D;b=hb(F|0,d|0,1048576,0)|0;b=fb(b|0,D|0,21)|0;j=D;g=hb(f|0,g|0,b|0,j|0)|0;f=D;j=kb(b|0,j|0,21)|0;j=gb(F|0,d|0,j|0,D|0)|0;d=D;F=hb(I|0,o|0,1048576,0)|0;F=fb(F|0,D|0,21)|0;b=D;C=kb(F|0,b|0,21)|0;C=gb(I|0,o|0,C|0,D|0)|0;o=D;I=hb(s|0,w|0,1048576,0)|0;I=fb(I|0,D|0,21)|0;J=D;c=kb(I|0,J|0,21)|0;c=gb(s|0,w|0,c|0,D|0)|0;w=D;s=sb(I|0,J|0,666643,0)|0;s=hb(ba|0,x|0,s|0,D|0)|0;x=D;ba=sb(I|0,J|0,470296,0)|0;aa=D;$=sb(I|0,J|0,654183,0)|0;_=D;T=sb(I|0,J|0,-997805,-1)|0;S=D;R=sb(I|0,J|0,136657,0)|0;Q=D;J=sb(I|0,J|0,-683901,-1)|0;I=D;u=fb(s|0,x|0,21)|0;y=D;aa=hb(da|0,ca|0,ba|0,aa|0)|0;q=gb(aa|0,D|0,v|0,q|0)|0;q=hb(q|0,D|0,u|0,y|0)|0;v=D;y=kb(u|0,y|0,21)|0;y=gb(s|0,x|0,y|0,D|0)|0;x=D;s=fb(q|0,v|0,21)|0;u=D;Y=hb($|0,_|0,Z|0,Y|0)|0;W=gb(Y|0,D|0,X|0,W|0)|0;E=hb(W|0,D|0,t|0,E|0)|0;E=hb(E|0,D|0,s|0,u|0)|0;t=D;u=kb(s|0,u|0,21)|0;u=gb(q|0,v|0,u|0,D|0)|0;v=D;q=fb(E|0,t|0,21)|0;s=D;S=hb(V|0,U|0,T|0,S|0)|0;z=gb(S|0,D|0,r|0,z|0)|0;z=hb(z|0,D|0,q|0,s|0)|0;r=D;s=kb(q|0,s|0,21)|0;s=gb(E|0,t|0,s|0,D|0)|0;t=D;E=fb(z|0,r|0,21)|0;q=D;O=hb(R|0,Q|0,P|0,O|0)|0;M=gb(O|0,D|0,N|0,M|0)|0;n=hb(M|0,D|0,p|0,n|0)|0;n=hb(n|0,D|0,E|0,q|0)|0;p=D;q=kb(E|0,q|0,21)|0;q=gb(z|0,r|0,q|0,D|0)|0;r=D;z=fb(n|0,p|0,21)|0;E=D;I=hb(L|0,K|0,J|0,I|0)|0;k=gb(I|0,D|0,m|0,k|0)|0;k=hb(k|0,D|0,z|0,E|0)|0;m=D;E=kb(z|0,E|0,21)|0;E=gb(n|0,p|0,E|0,D|0)|0;p=D;n=fb(k|0,m|0,21)|0;z=D;h=hb(l|0,h|0,n|0,z|0)|0;l=D;z=kb(n|0,z|0,21)|0;z=gb(k|0,m|0,z|0,D|0)|0;m=D;k=fb(h|0,l|0,21)|0;n=D;d=hb(k|0,n|0,j|0,d|0)|0;j=D;n=kb(k|0,n|0,21)|0;n=gb(h|0,l|0,n|0,D|0)|0;l=D;h=fb(d|0,j|0,21)|0;k=D;f=hb(g|0,f|0,h|0,k|0)|0;g=D;k=kb(h|0,k|0,21)|0;k=gb(d|0,j|0,k|0,D|0)|0;j=D;d=fb(f|0,g|0,21)|0;h=D;o=hb(d|0,h|0,C|0,o|0)|0;C=D;h=kb(d|0,h|0,21)|0;h=gb(f|0,g|0,h|0,D|0)|0;g=D;f=fb(o|0,C|0,21)|0;d=D;b=hb(H|0,G|0,F|0,b|0)|0;B=gb(b|0,D|0,A|0,B|0)|0;B=hb(B|0,D|0,f|0,d|0)|0;A=D;d=kb(f|0,d|0,21)|0;d=gb(o|0,C|0,d|0,D|0)|0;C=D;o=fb(B|0,A|0,21)|0;f=D;w=hb(o|0,f|0,c|0,w|0)|0;c=D;f=kb(o|0,f|0,21)|0;f=gb(B|0,A|0,f|0,D|0)|0;A=D;B=fb(w|0,c|0,21)|0;o=D;b=kb(B|0,o|0,21)|0;b=gb(w|0,c|0,b|0,D|0)|0;c=D;w=sb(B|0,o|0,666643,0)|0;x=hb(w|0,D|0,y|0,x|0)|0;y=D;w=sb(B|0,o|0,470296,0)|0;w=hb(u|0,v|0,w|0,D|0)|0;v=D;u=sb(B|0,o|0,654183,0)|0;u=hb(s|0,t|0,u|0,D|0)|0;t=D;s=sb(B|0,o|0,-997805,-1)|0;s=hb(q|0,r|0,s|0,D|0)|0;r=D;q=sb(B|0,o|0,136657,0)|0;q=hb(E|0,p|0,q|0,D|0)|0;p=D;o=sb(B|0,o|0,-683901,-1)|0;o=hb(z|0,m|0,o|0,D|0)|0;m=D;z=fb(x|0,y|0,21)|0;B=D;v=hb(w|0,v|0,z|0,B|0)|0;w=D;B=kb(z|0,B|0,21)|0;B=gb(x|0,y|0,B|0,D|0)|0;y=D;x=fb(v|0,w|0,21)|0;z=D;t=hb(u|0,t|0,x|0,z|0)|0;u=D;z=kb(x|0,z|0,21)|0;z=gb(v|0,w|0,z|0,D|0)|0;w=D;v=fb(t|0,u|0,21)|0;x=D;r=hb(s|0,r|0,v|0,x|0)|0;s=D;x=kb(v|0,x|0,21)|0;x=gb(t|0,u|0,x|0,D|0)|0;u=D;t=fb(r|0,s|0,21)|0;v=D;p=hb(q|0,p|0,t|0,v|0)|0;q=D;v=kb(t|0,v|0,21)|0;v=gb(r|0,s|0,v|0,D|0)|0;s=D;r=fb(p|0,q|0,21)|0;t=D;m=hb(o|0,m|0,r|0,t|0)|0;o=D;t=kb(r|0,t|0,21)|0;t=gb(p|0,q|0,t|0,D|0)|0;q=D;p=fb(m|0,o|0,21)|0;r=D;l=hb(p|0,r|0,n|0,l|0)|0;n=D;r=kb(p|0,r|0,21)|0;r=gb(m|0,o|0,r|0,D|0)|0;o=D;m=fb(l|0,n|0,21)|0;p=D;j=hb(m|0,p|0,k|0,j|0)|0;k=D;p=kb(m|0,p|0,21)|0;p=gb(l|0,n|0,p|0,D|0)|0;n=D;l=fb(j|0,k|0,21)|0;m=D;g=hb(l|0,m|0,h|0,g|0)|0;h=D;m=kb(l|0,m|0,21)|0;m=gb(j|0,k|0,m|0,D|0)|0;k=D;j=fb(g|0,h|0,21)|0;l=D;C=hb(j|0,l|0,d|0,C|0)|0;d=D;l=kb(j|0,l|0,21)|0;l=gb(g|0,h|0,l|0,D|0)|0;h=D;g=fb(C|0,d|0,21)|0;j=D;A=hb(g|0,j|0,f|0,A|0)|0;f=D;j=kb(g|0,j|0,21)|0;j=gb(C|0,d|0,j|0,D|0)|0;d=D;C=fb(A|0,f|0,21)|0;g=D;c=hb(C|0,g|0,b|0,c|0)|0;b=D;g=kb(C|0,g|0,21)|0;g=gb(A|0,f|0,g|0,D|0)|0;f=D;ga(a>>0|0,B|0,1,0);A=jb(B|0,y|0,8)|0;ga(a+1>>0|0,A|0,1,0);y=jb(B|0,y|0,16)|0;B=D;A=kb(z|0,w|0,5)|0;D|B;ga(a+2>>0|0,A|y|0,1,0);y=jb(z|0,w|0,3)|0;ga(a+3>>0|0,y|0,1,0);y=jb(z|0,w|0,11)|0;ga(a+4>>0|0,y|0,1,0);w=jb(z|0,w|0,19)|0;z=D;y=kb(x|0,u|0,2)|0;D|z;ga(a+5>>0|0,y|w|0,1,0);w=jb(x|0,u|0,6)|0;ga(a+6>>0|0,w|0,1,0);u=jb(x|0,u|0,14)|0;x=D;w=kb(v|0,s|0,7)|0;D|x;ga(a+7>>0|0,w|u|0,1,0);u=jb(v|0,s|0,1)|0;ga(a+8>>0|0,u|0,1,0);u=jb(v|0,s|0,9)|0;ga(a+9>>0|0,u|0,1,0);s=jb(v|0,s|0,17)|0;v=D;u=kb(t|0,q|0,4)|0;D|v;ga(a+10>>0|0,u|s|0,1,0);s=jb(t|0,q|0,4)|0;ga(a+11>>0|0,s|0,1,0);s=jb(t|0,q|0,12)|0;ga(a+12>>0|0,s|0,1,0);q=jb(t|0,q|0,20)|0;t=D;s=kb(r|0,o|0,1)|0;D|t;ga(a+13>>0|0,s|q|0,1,0);q=jb(r|0,o|0,7)|0;ga(a+14>>0|0,q|0,1,0);o=jb(r|0,o|0,15)|0;r=D;q=kb(p|0,n|0,6)|0;D|r;ga(a+15>>0|0,q|o|0,1,0);o=jb(p|0,n|0,2)|0;ga(a+16>>0|0,o|0,1,0);o=jb(p|0,n|0,10)|0;ga(a+17>>0|0,o|0,1,0);n=jb(p|0,n|0,18)|0;p=D;o=kb(m|0,k|0,3)|0;D|p;ga(a+18>>0|0,o|n|0,1,0);n=jb(m|0,k|0,5)|0;ga(a+19>>0|0,n|0,1,0);k=jb(m|0,k|0,13)|0;ga(a+20>>0|0,k|0,1,0);ga(a+21>>0|0,l|0,1,0);k=jb(l|0,h|0,8)|0;ga(a+22>>0|0,k|0,1,0);h=jb(l|0,h|0,16)|0;l=D;k=kb(j|0,d|0,5)|0;D|l;ga(a+23>>0|0,k|h|0,1,0);h=jb(j|0,d|0,3)|0;ga(a+24>>0|0,h|0,1,0);h=jb(j|0,d|0,11)|0;ga(a+25>>0|0,h|0,1,0);d=jb(j|0,d|0,19)|0;j=D;h=kb(g|0,f|0,2)|0;D|j;ga(a+26>>0|0,h|d|0,1,0);d=jb(g|0,f|0,6)|0;ga(a+27>>0|0,d|0,1,0);f=jb(g|0,f|0,14)|0;g=D;d=kb(c|0,b|0,7)|0;g|D;ga(a+28>>0|0,f|d|0,1,0);d=jb(c|0,b|0,1)|0;ga(a+29>>0|0,d|0,1,0);d=jb(c|0,b|0,9)|0;ga(a+30>>0|0,d|0,1,0);b=jb(c|0,b|0,17)|0;ga(a+31>>0|0,b|0,1,0);i=e;return}function ab(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;b=i;c=fa(a>>0|0,1,0,1)|0|0;Q=kb(fa(a+1>>0|0,1,0,1)|0|0|0,0,8)|0;P=D;O=kb(fa(a+2>>0|0,1,0,1)|0|0|0,0,16)|0;P=P|D;J=kb(fa(a+3>>0|0,1,0,1)|0|0|0,0,24)|0;P=P|D;K=fa(a+4>>0|0,1,0,1)|0|0;N=kb(fa(a+5>>0|0,1,0,1)|0|0|0,0,8)|0;M=D;L=kb(fa(a+6>>0|0,1,0,1)|0|0|0,0,16)|0;M=M|D;E=kb(fa(a+7>>0|0,1,0,1)|0|0|0,0,24)|0;M=M|D;F=fa(a+8>>0|0,1,0,1)|0|0;I=kb(fa(a+9>>0|0,1,0,1)|0|0|0,0,8)|0;H=D;G=kb(fa(a+10>>0|0,1,0,1)|0|0|0,0,16)|0;H=H|D;y=kb(fa(a+11>>0|0,1,0,1)|0|0|0,0,24)|0;H=H|D;z=fa(a+12>>0|0,1,0,1)|0|0;C=kb(fa(a+13>>0|0,1,0,1)|0|0|0,0,8)|0;B=D;A=kb(fa(a+14>>0|0,1,0,1)|0|0|0,0,16)|0;B=B|D;t=kb(fa(a+15>>0|0,1,0,1)|0|0|0,0,24)|0;B=B|D;w=fa(a+16>>0|0,1,0,1)|0|0;x=kb(fa(a+17>>0|0,1,0,1)|0|0|0,0,8)|0;o=D;v=kb(fa(a+18>>0|0,1,0,1)|0|0|0,0,16)|0;o=o|D;u=kb(fa(a+19>>0|0,1,0,1)|0|0|0,0,24)|0;o=o|D;r=fa(a+20>>0|0,1,0,1)|0|0;s=kb(fa(a+21>>0|0,1,0,1)|0|0|0,0,8)|0;j=D;q=kb(fa(a+22>>0|0,1,0,1)|0|0|0,0,16)|0;j=j|D;p=kb(fa(a+23>>0|0,1,0,1)|0|0|0,0,24)|0;j=j|D;m=fa(a+24>>0|0,1,0,1)|0|0;n=kb(fa(a+25>>0|0,1,0,1)|0|0|0,0,8)|0;d=D;l=kb(fa(a+26>>0|0,1,0,1)|0|0|0,0,16)|0;d=d|D;k=kb(fa(a+27>>0|0,1,0,1)|0|0|0,0,24)|0;d=d|D;e=fa(a+28>>0|0,1,0,1)|0|0;h=kb(fa(a+29>>0|0,1,0,1)|0|0|0,0,8)|0;g=D;f=kb(fa(a+30>>0|0,1,0,1)|0|0|0,0,16)|0;g=g|D;a=kb(fa(a+31>>0|0,1,0,1)|0|0|0,0,24)|0;g=g|D;P=gb(1559614444,0,Q|c|O|J|0,P|0)|0;J=D;O=fb(P|0,J|0,63)|0;c=D;J=gb(0,0,P|0,J|0)|0;J=jb(J|0,D|0,63)|0;J=hb(O|0,c|0,J|0,D|0)|0;c=D;M=gb(1477600026,0,N|K|L|E|0,M|0)|0;E=D;L=fb(M|0,E|0,63)|0;K=D;E=gb(0,0,M|0,E|0)|0;E=fb(E|0,D|0,63)|0;E=gb(L|0,K|0,E|0,D|0)|0;E=kb(E|0,D|0,1)|0;E=hb(J|0,c|0,E|0,D|0)|0;c=D;H=gb(-1560830762,0,I|F|G|y|0,H|0)|0;y=D;G=fb(H|0,y|0,63)|0;F=D;y=gb(0,0,H|0,y|0)|0;y=fb(y|0,D|0,63)|0;y=gb(G|0,F|0,y|0,D|0)|0;y=kb(y|0,D|0,2)|0;y=hb(E|0,c|0,y|0,D|0)|0;c=D;B=gb(350157278,0,C|z|A|t|0,B|0)|0;t=D;A=fb(B|0,t|0,63)|0;z=D;t=gb(0,0,B|0,t|0)|0;t=fb(t|0,D|0,63)|0;t=gb(A|0,z|0,t|0,D|0)|0;t=kb(t|0,D|0,3)|0;t=hb(y|0,c|0,t|0,D|0)|0;c=D;o=gb(0,0,x|w|v|u|0,o|0)|0;o=fb(o|0,D|0,63)|0;o=kb(o|0,D|0,4)|0;o=hb(t|0,c|0,o|0,D|0)|0;c=D;j=gb(0,0,s|r|q|p|0,j|0)|0;j=fb(j|0,D|0,63)|0;j=kb(j|0,D|0,5)|0;j=hb(o|0,c|0,j|0,D|0)|0;c=D;d=gb(0,0,n|m|l|k|0,d|0)|0;d=fb(d|0,D|0,63)|0;d=kb(d|0,D|0,6)|0;d=hb(j|0,c|0,d|0,D|0)|0;c=D;g=gb(268435456,0,h|e|f|a|0,g|0)|0;a=D;f=fb(g|0,a|0,63)|0;e=D;a=gb(0,0,g|0,a|0)|0;a=fb(a|0,D|0,63)|0;a=gb(f|0,e|0,a|0,D|0)|0;a=kb(a|0,D|0,7)|0;a=hb(d|0,c|0,a|0,D|0)|0;a=jb(a|0,D|0,8)|0;i=b;return a|0}function bb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;v=fa(a|0,4,0,0)|0|0;u=a+4|0;t=fa(u|0,4,0,0)|0|0;s=a+8|0;r=fa(s|0,4,0,0)|0|0;q=a+12|0;p=fa(q|0,4,0,0)|0|0;o=a+16|0;d=fa(o|0,4,0,0)|0|0;m=a+20|0;l=fa(m|0,4,0,0)|0|0;k=a+24|0;j=fa(k|0,4,0,0)|0|0;i=a+28|0;h=fa(i|0,4,0,0)|0|0;g=a+32|0;f=fa(g|0,4,0,0)|0|0;e=a+36|0;n=fa(e|0,4,0,0)|0|0;w=0-c|0;if((c+ -1&~c|c+ -2&w|0)==-1){E=((fa(b+4|0,4,0,0)|0)^t)&w;D=((fa(b+8|0,4,0,0)|0)^r)&w;C=((fa(b+12|0,4,0,0)|0)^p)&w;B=((fa(b+16|0,4,0,0)|0)^d)&w;A=((fa(b+20|0,4,0,0)|0)^l)&w;z=((fa(b+24|0,4,0,0)|0)^j)&w;y=((fa(b+28|0,4,0,0)|0)^h)&w;x=((fa(b+32|0,4,0,0)|0)^f)&w;c=((fa(b+36|0,4,0,0)|0)^n)&w;ga(a|0,((fa(b|0,4,0,0)|0)^v)&w^v|0,4,0);ga(u|0,E^t|0,4,0);ga(s|0,D^r|0,4,0);ga(q|0,C^p|0,4,0);ga(o|0,B^d|0,4,0);ga(m|0,A^l|0,4,0);ga(k|0,z^j|0,4,0);ga(i|0,y^h|0,4,0);ga(g|0,x^f|0,4,0);ga(e|0,c^n|0,4,0);return}else{na(168,48,177,232)}}function cb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=i;i=i+48|0;c=k;if((b|0)<=0){i=k;return}e=a+8|0;n=a;l=fa(n|0,4,0,0)|0|0;n=fa(n+4|0,4,0,0)|0|0;d=0;do{s=a+40|0;r=a+80|0;q=a+120|0;m=a+160|0;o=(fa(s+4|0,4,0,0)|0)^n^(fa(r+4|0,4,0,0)|0)^(fa(q+4|0,4,0,0)|0)^(fa(m+4|0,4,0,0)|0);g=c;ga(g|0,(fa(s|0,4,0,0)|0)^l^(fa(r|0,4,0,0)|0)^(fa(q|0,4,0,0)|0)^(fa(m|0,4,0,0)|0)|0,4,0);ga(g+4|0,o|0,4,0);o=e;g=a+48|0;m=a+88|0;q=a+128|0;r=a+168|0;s=(fa(g+4|0,4,0,0)|0)^(fa(o+4|0,4,0,0)|0)^(fa(m+4|0,4,0,0)|0)^(fa(q+4|0,4,0,0)|0)^(fa(r+4|0,4,0,0)|0);f=c+8|0;h=f;ga(h|0,(fa(g|0,4,0,0)|0)^(fa(o|0,4,0,0)|0)^(fa(m|0,4,0,0)|0)^(fa(q|0,4,0,0)|0)^(fa(r|0,4,0,0)|0)|0,4,0);ga(h+4|0,s|0,4,0);s=a+16|0;h=a+56|0;r=a+96|0;q=a+136|0;m=a+176|0;o=(fa(h+4|0,4,0,0)|0)^(fa(s+4|0,4,0,0)|0)^(fa(r+4|0,4,0,0)|0)^(fa(q+4|0,4,0,0)|0)^(fa(m+4|0,4,0,0)|0);g=c+16|0;j=g;ga(j|0,(fa(h|0,4,0,0)|0)^(fa(s|0,4,0,0)|0)^(fa(r|0,4,0,0)|0)^(fa(q|0,4,0,0)|0)^(fa(m|0,4,0,0)|0)|0,4,0);ga(j+4|0,o|0,4,0);o=a+24|0;j=a+64|0;m=a+104|0;q=a+144|0;r=a+184|0;s=(fa(j+4|0,4,0,0)|0)^(fa(o+4|0,4,0,0)|0)^(fa(m+4|0,4,0,0)|0)^(fa(q+4|0,4,0,0)|0)^(fa(r+4|0,4,0,0)|0);h=c+24|0;t=h;ga(t|0,(fa(j|0,4,0,0)|0)^(fa(o|0,4,0,0)|0)^(fa(m|0,4,0,0)|0)^(fa(q|0,4,0,0)|0)^(fa(r|0,4,0,0)|0)|0,4,0);ga(t+4|0,s|0,4,0);s=a+32|0;t=a+72|0;r=a+112|0;q=a+152|0;m=a+192|0;o=(fa(t+4|0,4,0,0)|0)^(fa(s+4|0,4,0,0)|0)^(fa(r+4|0,4,0,0)|0)^(fa(q+4|0,4,0,0)|0)^(fa(m+4|0,4,0,0)|0);j=c+32|0;p=j;ga(p|0,(fa(t|0,4,0,0)|0)^(fa(s|0,4,0,0)|0)^(fa(r|0,4,0,0)|0)^(fa(q|0,4,0,0)|0)^(fa(m|0,4,0,0)|0)|0,4,0);ga(p+4|0,o|0,4,0);o=0;while(1){t=c+(((o+4|0)%5|0)<<3)|0;q=fa(t|0,4,0,0)|0|0;t=fa(t+4|0,4,0,0)|0|0;m=o+1|0;r=c+(((m|0)==5?0:m)<<3)|0;u=fa(r|0,4,0,0)|0|0;r=fa(r+4|0,4,0,0)|0|0;p=kb(u|0,r|0,1)|0;s=D;r=jb(u|0,r|0,63)|0;q=(p|r)^q;t=(s|D)^t;s=a+(o<<3)|0;ga(s|0,q^l|0,4,0);ga(s+4|0,t^n|0,4,0);s=a+(o+5<<3)|0;r=s;p=t^(fa(r+4|0,4,0,0)|0);ga(s|0,q^(fa(r|0,4,0,0)|0)|0,4,0);ga(s+4|0,p|0,4,0);p=a+(o+10<<3)|0;s=p;r=t^(fa(s+4|0,4,0,0)|0);ga(p|0,q^(fa(s|0,4,0,0)|0)|0,4,0);ga(p+4|0,r|0,4,0);r=a+(o+15<<3)|0;p=r;s=t^(fa(p+4|0,4,0,0)|0);ga(r|0,q^(fa(p|0,4,0,0)|0)|0,4,0);ga(r+4|0,s|0,4,0);s=a+(o+20<<3)|0;r=s;t=t^(fa(r+4|0,4,0,0)|0);ga(s|0,q^(fa(r|0,4,0,0)|0)|0,4,0);ga(s+4|0,t|0,4,0);if((m|0)==5){break}n=a+(m<<3)|0;l=fa(n|0,4,0,0)|0|0;n=fa(n+4|0,4,0,0)|0|0;o=m}m=e;n=fa(m|0,4,0,0)|0|0;m=fa(m+4|0,4,0,0)|0|0;l=0;do{t=a+((fa(32568+(l<<2)|0,4,0,0)|0)<<3)|0;r=t;p=n;n=fa(r|0,4,0,0)|0|0;q=m;m=fa(r+4|0,4,0,0)|0|0;r=fa(32472+(l<<2)|0,4,0,0)|0|0;s=kb(p|0,q|0,r|0)|0;u=D;r=jb(p|0,q|0,64-r|0)|0;ga(t|0,r|s|0,4,0);ga(t+4|0,D|u|0,4,0);l=l+1|0}while((l|0)!=24);o=c;ga(o|0,n|0,4,0);ga(o+4|0,m|0,4,0);o=0;p=0;while(1){m=c+0|0;n=a+(o*5<<3)+0|0;l=m+40|0;do{ga(m|0,fa(n|0,4,0,0)|0|0,4,0);m=m+4|0;n=n+4|0}while((m|0)<(l|0));n=f;r=fa(n|0,4,0,0)|0|0;n=fa(n+4|0,4,0,0)|0|0;t=g;s=fa(t|0,4,0,0)|0|0;t=fa(t+4|0,4,0,0)|0|0;q=a+(p<<3)|0;m=q;u=(fa(m+4|0,4,0,0)|0)^t&~n;ga(q|0,(fa(m|0,4,0,0)|0)^s&~r|0,4,0);ga(q+4|0,u|0,4,0);u=h;q=fa(u|0,4,0,0)|0|0;u=fa(u+4|0,4,0,0)|0|0;m=a+(p+1<<3)|0;l=m;t=(fa(l+4|0,4,0,0)|0)^u&~t;ga(m|0,(fa(l|0,4,0,0)|0)^q&~s|0,4,0);ga(m+4|0,t|0,4,0);t=j;m=fa(t|0,4,0,0)|0|0;t=fa(t+4|0,4,0,0)|0|0;s=a+(p+2<<3)|0;l=s;u=(fa(l+4|0,4,0,0)|0)^t&~u;ga(s|0,(fa(l|0,4,0,0)|0)^m&~q|0,4,0);ga(s+4|0,u|0,4,0);u=c;s=fa(u|0,4,0,0)|0|0;u=fa(u+4|0,4,0,0)|0|0;q=a+(p+3<<3)|0;l=q;t=(fa(l+4|0,4,0,0)|0)^u&~t;ga(q|0,(fa(l|0,4,0,0)|0)^s&~m|0,4,0);ga(q+4|0,t|0,4,0);t=a+(p+4<<3)|0;q=t;u=(fa(q+4|0,4,0,0)|0)^n&~u;ga(t|0,(fa(q|0,4,0,0)|0)^r&~s|0,4,0);ga(t+4|0,u|0,4,0);o=o+1|0;if((o|0)==5){break}else{p=p+5|0}}n=32280+(d<<3)|0;u=a;l=(fa(u|0,4,0,0)|0)^(fa(n|0,4,0,0)|0);n=(fa(u+4|0,4,0,0)|0)^(fa(n+4|0,4,0,0)|0);u=a;ga(u|0,l|0,4,0);ga(u+4|0,n|0,4,0);d=d+1|0}while((d|0)!=(b|0));i=k;return}function db(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+352|0;g=e;f=e+200|0;if((d|0)==200){j=136}else{j=200-(d<<1)|0}h=(j|0)/8|0;ib(g|0,0,200)|0;a:do{if((j|0)<=(b|0)){if((j|0)<=7){while(1){cb(g,24);b=b-j|0;a=a+j|0;if((b|0)<(j|0)){break a}}}do{k=0;do{n=a+(k<<3)|0;m=g+(k<<3)|0;o=m;l=(fa(o+4|0,4,0,0)|0)^(fa(n+4|0,4,0,0)|0);ga(m|0,(fa(o|0,4,0,0)|0)^(fa(n|0,4,0,0)|0)|0,4,0);ga(m+4|0,l|0,4,0);k=k+1|0}while((k|0)<(h|0));cb(g,24);b=b-j|0;a=a+j|0}while((b|0)>=(j|0))}}while(0);mb(f|0,a|0,b|0)|0;o=b+1|0;ga(f+b>>0|0,1|0,1,0);ib(f+o|0,0,j-o|0)|0;o=f+(j+ -1)|0;ga(o>>0|0,fa(o>>0|0,1,0,1)|0|0|128|0,1,0);if((j|0)<=7){cb(g,24);mb(c|0,g|0,d|0)|0;i=e;return 0}j=0;do{m=f+(j<<3)|0;n=g+(j<<3)|0;l=n;o=(fa(l+4|0,4,0,0)|0)^(fa(m+4|0,4,0,0)|0);ga(n|0,(fa(l|0,4,0,0)|0)^(fa(m|0,4,0,0)|0)|0,4,0);ga(n+4|0,o|0,4,0);j=j+1|0}while((j|0)<(h|0));cb(g,24);mb(c|0,g|0,d|0)|0;i=e;return 0}function eb(){}function fb(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>c;return a>>>c|(b&(1<>c-32|0}function gb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;b=b-d-(c>>>0>a>>>0|0)>>>0;return(D=b,a-c>>>0|0)|0}function hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return(D=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;g=a&3;f=b|b<<8|b<<16|b<<24;e=d&~3;if(g){g=a+4-g|0;while((a|0)<(g|0)){ga(a|0,b|0,1,0)|0;a=a+1|0}}while((a|0)<(e|0)){ga(a|0,f|0,4,0)|0;a=a+4|0}}while((a|0)<(d|0)){ga(a|0,b|0,1,0)|0;a=a+1|0}return a-c|0}function jb(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<>>c-32|0}function kb(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<>>32-c;return a<=4096)return la(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if((c|0)==0)return d|0;ga(a|0,fa(b|0,1,0,0)|0,1,0)|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){ga(a|0,fa(b|0,4,0,0)|0,4,0)|0;a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){ga(a|0,fa(b|0,1,0,0)|0,1,0)|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function nb(a){a=a|0;var b=0;b=fa(n+(a>>>24)|0,1,0,0)|0;if((b|0)<8)return b|0;b=fa(n+(a>>16&255)|0,1,0,0)|0;if((b|0)<8)return b+8|0;b=fa(n+(a>>8&255)|0,1,0,0)|0;if((b|0)<8)return b+16|0;return(fa(n+(a&255)|0,1,0,0)|0)+24|0}function ob(a){a=a|0;var b=0;b=fa(m+(a&255)|0,1,0,0)|0;if((b|0)<8)return b|0;b=fa(m+(a>>8&255)|0,1,0,0)|0;if((b|0)<8)return b+8|0;b=fa(m+(a>>16&255)|0,1,0,0)|0;if((b|0)<8)return b+16|0;return(fa(m+(a>>>24)|0,1,0,0)|0)+24|0}function pb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;d=b&65535;c=$(d,f)|0;e=a>>>16;d=(c>>>16)+($(d,e)|0)|0;b=b>>>16;a=$(b,f)|0;return(D=(d>>>16)+($(b,e)|0)+(((d&65535)+a|0)>>>16)|0,d+a<<16|c&65535|0)|0}function qb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=gb(j^a,i^b,j,i)|0;g=D;b=f^j;a=e^i;a=gb((vb(h,g,gb(f^c,e^d,f,e)|0,D,0)|0)^b,D^a,b,a)|0;return a|0}function rb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+8|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=d>>31|((d|0)<0?-1:0)<<1;j=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;b=gb(g^a,f^b,g,f)|0;a=D;vb(b,a,gb(k^c,j^d,k,j)|0,D,h)|0;a=gb((fa(h|0,4,0,0)|0)^g,(fa(h+4|0,4,0,0)|0)^f,g,f)|0;b=D;i=e;return(D=b,a)|0}function sb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;a=pb(e,f)|0;c=D;return(D=($(b,f)|0)+($(d,e)|0)+c|c&0,a|0|0)|0}function tb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=vb(a,b,c,d,0)|0;return a|0}function ub(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=i;i=i+8|0;e=f|0;vb(a,b,c,d,e)|0;i=f;return(D=fa(e+4|0,4,0,0)|0|0,fa(e|0,4,0,0)|0|0)|0}function vb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=a;i=b;h=i;k=c;f=d;j=f;if((h|0)==0){f=(e|0)!=0;if((j|0)==0){if(f){ga(e|0,(g>>>0)%(k>>>0)|0,4,0);ga(e+4|0,0|0,4,0)}j=0;l=(g>>>0)/(k>>>0)>>>0;return(D=j,l)|0}else{if(!f){k=0;l=0;return(D=k,l)|0}ga(e|0,a|0|0,4,0);ga(e+4|0,b&0|0,4,0);k=0;l=0;return(D=k,l)|0}}l=(j|0)==0;do{if((k|0)!=0){if(!l){j=(nb(j|0)|0)-(nb(h|0)|0)|0;if(j>>>0<=31){l=j+1|0;k=31-j|0;a=j-31>>31;i=l;b=g>>>(l>>>0)&a|h<>>(l>>>0)&a;j=0;k=g<>31;n=k-32|0;a=n>>31;i=k;b=l-1>>31&h>>>(n>>>0)|(h<>>(k>>>0))&a;a=a&h>>>(k>>>0);j=g<>>(n>>>0))&m|g<>31;break}if((e|0)!=0){ga(e|0,j&g|0,4,0);ga(e+4|0,0|0,4,0)}if((k|0)==1){n=i|b&0;o=a|0|0;return(D=n,o)|0}else{o=ob(k|0)|0;n=h>>>(o>>>0)|0;o=h<<32-o|g>>>(o>>>0)|0;return(D=n,o)|0}}else{if(l){if((e|0)!=0){ga(e|0,(h>>>0)%(k>>>0)|0,4,0);ga(e+4|0,0|0,4,0)}n=0;o=(h>>>0)/(k>>>0)>>>0;return(D=n,o)|0}if((g|0)==0){if((e|0)!=0){ga(e|0,0|0,4,0);ga(e+4|0,(h>>>0)%(j>>>0)|0,4,0)}n=0;o=(h>>>0)/(j>>>0)>>>0;return(D=n,o)|0}k=j-1|0;if((k&j|0)==0){if((e|0)!=0){ga(e|0,a|0|0,4,0);ga(e+4|0,k&h|b&0|0,4,0)}n=0;o=h>>>((ob(j|0)|0)>>>0);return(D=n,o)|0}j=(nb(j|0)|0)-(nb(h|0)|0)|0;if(j>>>0<=30){a=j+1|0;k=31-j|0;i=a;b=h<>>(a>>>0);a=h>>>(a>>>0);j=0;k=g<>>31|k<<1;j=h|j<<1;l=b<<1|l>>>31|0;m=b>>>31|a<<1|0;gb(d,c,l,m)|0;o=D;n=o>>31|((o|0)<0?-1:0)<<1;h=n&1;b=gb(l,m,n&g,(((o|0)<0?-1:0)>>31|((o|0)<0?-1:0)<<1)&f)|0;a=D;i=i-1|0}while((i|0)!=0);f=k;d=0}g=0;if((e|0)!=0){ga(e|0,b|0,4,0);ga(e+4|0,a|0,4,0)}n=(j|0)>>>31|(f|g)<<1|(g<<1|j>>>31)&0|d;o=(j<<1|0>>>31)&-2|h;return(D=n,o)|0} + + + + +// EMSCRIPTEN_END_FUNCS +return{_strlen:lb,_ge_mul8:Va,_keccak:db,_ge_scalarmult:Ta,_ge_fromfe_frombytes_vartime:Wa,_sc_mulsub:$a,_sc_reduce32:Ya,_bitshift64Lshr:jb,_bitshift64Shl:kb,_sc_add:Za,_bitshift64Ashr:fb,_memset:ib,_i64Add:hb,_memcpy:mb,_ge_double_scalarmult_base_vartime:Ca,_ge_p3_tobytes:Ma,_ge_double_scalarmult_precomp_vartime:Ua,_i64Subtract:gb,_ge_scalarmult_base:Pa,_ge_p1p1_to_p3:Ba,_ge_p1p1_to_p2:Ha,_ge_dsm_precomp:za,_ge_frombytes_vartime:Ia,_ge_tobytes:Ra,_sc_0:Xa,_sc_sub:_a,_sc_reduce:Sa,_ge_p3_to_cached:Aa,_sc_check:ab,_ge_add:xa,runPostSets:eb,stackAlloc:pa,stackSave:qa,stackRestore:ra,setThrew:sa,setTempRet0:va,getTempRet0:wa} +// EMSCRIPTEN_END_ASM + +})({"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array},{"abort":abort,"assert":assert,"asmPrintInt":asmPrintInt,"asmPrintFloat":asmPrintFloat,"min":Math_min,"SAFE_HEAP_LOAD":SAFE_HEAP_LOAD,"SAFE_HEAP_STORE":SAFE_HEAP_STORE,"SAFE_FT_MASK":SAFE_FT_MASK,"_free":_free,"___setErrNo":___setErrNo,"_malloc":_malloc,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_fflush":_fflush,"___assert_fail":___assert_fail,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"cttz_i8":cttz_i8,"ctlz_i8":ctlz_i8,"NaN":NaN,"Infinity":Infinity},buffer);var _strlen=Module["_strlen"]=asm["_strlen"];var _ge_mul8=Module["_ge_mul8"]=asm["_ge_mul8"];var _keccak=Module["_keccak"]=asm["_keccak"];var _ge_scalarmult=Module["_ge_scalarmult"]=asm["_ge_scalarmult"];var _ge_fromfe_frombytes_vartime=Module["_ge_fromfe_frombytes_vartime"]=asm["_ge_fromfe_frombytes_vartime"];var _sc_mulsub=Module["_sc_mulsub"]=asm["_sc_mulsub"];var _sc_reduce32=Module["_sc_reduce32"]=asm["_sc_reduce32"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _sc_add=Module["_sc_add"]=asm["_sc_add"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _memset=Module["_memset"]=asm["_memset"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _ge_double_scalarmult_base_vartime=Module["_ge_double_scalarmult_base_vartime"]=asm["_ge_double_scalarmult_base_vartime"];var _ge_p3_tobytes=Module["_ge_p3_tobytes"]=asm["_ge_p3_tobytes"];var _ge_double_scalarmult_precomp_vartime=Module["_ge_double_scalarmult_precomp_vartime"]=asm["_ge_double_scalarmult_precomp_vartime"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _ge_scalarmult_base=Module["_ge_scalarmult_base"]=asm["_ge_scalarmult_base"];var _ge_p1p1_to_p3=Module["_ge_p1p1_to_p3"]=asm["_ge_p1p1_to_p3"];var _ge_p1p1_to_p2=Module["_ge_p1p1_to_p2"]=asm["_ge_p1p1_to_p2"];var _ge_dsm_precomp=Module["_ge_dsm_precomp"]=asm["_ge_dsm_precomp"];var _ge_frombytes_vartime=Module["_ge_frombytes_vartime"]=asm["_ge_frombytes_vartime"];var _ge_tobytes=Module["_ge_tobytes"]=asm["_ge_tobytes"];var _sc_0=Module["_sc_0"]=asm["_sc_0"];var _sc_sub=Module["_sc_sub"]=asm["_sc_sub"];var _sc_reduce=Module["_sc_reduce"]=asm["_sc_reduce"];var _ge_p3_to_cached=Module["_ge_p3_to_cached"]=asm["_ge_p3_to_cached"];var _sc_check=Module["_sc_check"]=asm["_sc_check"];var _ge_add=Module["_ge_add"]=asm["_ge_add"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];var i64Math=(function(){var goog={math:{}};goog.math.Long=(function(low,high){this.low_=low|0;this.high_=high|0});goog.math.Long.IntCache_={};goog.math.Long.fromInt=(function(value){if(-128<=value&&value<128){var cachedObj=goog.math.Long.IntCache_[value];if(cachedObj){return cachedObj}}var obj=new goog.math.Long(value|0,value<0?-1:0);if(-128<=value&&value<128){goog.math.Long.IntCache_[value]=obj}return obj});goog.math.Long.fromNumber=(function(value){if(isNaN(value)||!isFinite(value)){return goog.math.Long.ZERO}else if(value<=-goog.math.Long.TWO_PWR_63_DBL_){return goog.math.Long.MIN_VALUE}else if(value+1>=goog.math.Long.TWO_PWR_63_DBL_){return goog.math.Long.MAX_VALUE}else if(value<0){return goog.math.Long.fromNumber(-value).negate()}else{return new goog.math.Long(value%goog.math.Long.TWO_PWR_32_DBL_|0,value/goog.math.Long.TWO_PWR_32_DBL_|0)}});goog.math.Long.fromBits=(function(lowBits,highBits){return new goog.math.Long(lowBits,highBits)});goog.math.Long.fromString=(function(str,opt_radix){if(str.length==0){throw Error("number format error: empty string")}var radix=opt_radix||10;if(radix<2||36=0){throw Error('number format error: interior "-" character: '+str)}var radixToPower=goog.math.Long.fromNumber(Math.pow(radix,8));var result=goog.math.Long.ZERO;for(var i=0;i=0?this.low_:goog.math.Long.TWO_PWR_32_DBL_+this.low_});goog.math.Long.prototype.getNumBitsAbs=(function(){if(this.isNegative()){if(this.equals(goog.math.Long.MIN_VALUE)){return 64}else{return this.negate().getNumBitsAbs()}}else{var val=this.high_!=0?this.high_:this.low_;for(var bit=31;bit>0;bit--){if((val&1<0});goog.math.Long.prototype.greaterThanOrEqual=(function(other){return this.compare(other)>=0});goog.math.Long.prototype.compare=(function(other){if(this.equals(other)){return 0}var thisNeg=this.isNegative();var otherNeg=other.isNegative();if(thisNeg&&!otherNeg){return-1}if(!thisNeg&&otherNeg){return 1}if(this.subtract(other).isNegative()){return-1}else{return 1}});goog.math.Long.prototype.negate=(function(){if(this.equals(goog.math.Long.MIN_VALUE)){return goog.math.Long.MIN_VALUE}else{return this.not().add(goog.math.Long.ONE)}});goog.math.Long.prototype.add=(function(other){var a48=this.high_>>>16;var a32=this.high_&65535;var a16=this.low_>>>16;var a00=this.low_&65535;var b48=other.high_>>>16;var b32=other.high_&65535;var b16=other.low_>>>16;var b00=other.low_&65535;var c48=0,c32=0,c16=0,c00=0;c00+=a00+b00;c16+=c00>>>16;c00&=65535;c16+=a16+b16;c32+=c16>>>16;c16&=65535;c32+=a32+b32;c48+=c32>>>16;c32&=65535;c48+=a48+b48;c48&=65535;return goog.math.Long.fromBits(c16<<16|c00,c48<<16|c32)});goog.math.Long.prototype.subtract=(function(other){return this.add(other.negate())});goog.math.Long.prototype.multiply=(function(other){if(this.isZero()){return goog.math.Long.ZERO}else if(other.isZero()){return goog.math.Long.ZERO}if(this.equals(goog.math.Long.MIN_VALUE)){return other.isOdd()?goog.math.Long.MIN_VALUE:goog.math.Long.ZERO}else if(other.equals(goog.math.Long.MIN_VALUE)){return this.isOdd()?goog.math.Long.MIN_VALUE:goog.math.Long.ZERO}if(this.isNegative()){if(other.isNegative()){return this.negate().multiply(other.negate())}else{return this.negate().multiply(other).negate()}}else if(other.isNegative()){return this.multiply(other.negate()).negate()}if(this.lessThan(goog.math.Long.TWO_PWR_24_)&&other.lessThan(goog.math.Long.TWO_PWR_24_)){return goog.math.Long.fromNumber(this.toNumber()*other.toNumber())}var a48=this.high_>>>16;var a32=this.high_&65535;var a16=this.low_>>>16;var a00=this.low_&65535;var b48=other.high_>>>16;var b32=other.high_&65535;var b16=other.low_>>>16;var b00=other.low_&65535;var c48=0,c32=0,c16=0,c00=0;c00+=a00*b00;c16+=c00>>>16;c00&=65535;c16+=a16*b00;c32+=c16>>>16;c16&=65535;c16+=a00*b16;c32+=c16>>>16;c16&=65535;c32+=a32*b00;c48+=c32>>>16;c32&=65535;c32+=a16*b16;c48+=c32>>>16;c32&=65535;c32+=a00*b32;c48+=c32>>>16;c32&=65535;c48+=a48*b00+a32*b16+a16*b32+a00*b48;c48&=65535;return goog.math.Long.fromBits(c16<<16|c00,c48<<16|c32)});goog.math.Long.prototype.div=(function(other){if(other.isZero()){throw Error("division by zero")}else if(this.isZero()){return goog.math.Long.ZERO}if(this.equals(goog.math.Long.MIN_VALUE)){if(other.equals(goog.math.Long.ONE)||other.equals(goog.math.Long.NEG_ONE)){return goog.math.Long.MIN_VALUE}else if(other.equals(goog.math.Long.MIN_VALUE)){return goog.math.Long.ONE}else{var halfThis=this.shiftRight(1);var approx=halfThis.div(other).shiftLeft(1);if(approx.equals(goog.math.Long.ZERO)){return other.isNegative()?goog.math.Long.ONE:goog.math.Long.NEG_ONE}else{var rem=this.subtract(other.multiply(approx));var result=approx.add(rem.div(other));return result}}}else if(other.equals(goog.math.Long.MIN_VALUE)){return goog.math.Long.ZERO}if(this.isNegative()){if(other.isNegative()){return this.negate().div(other.negate())}else{return this.negate().div(other).negate()}}else if(other.isNegative()){return this.div(other.negate()).negate()}var res=goog.math.Long.ZERO;var rem=this;while(rem.greaterThanOrEqual(other)){var approx=Math.max(1,Math.floor(rem.toNumber()/other.toNumber()));var log2=Math.ceil(Math.log(approx)/Math.LN2);var delta=log2<=48?1:Math.pow(2,log2-48);var approxRes=goog.math.Long.fromNumber(approx);var approxRem=approxRes.multiply(other);while(approxRem.isNegative()||approxRem.greaterThan(rem)){approx-=delta;approxRes=goog.math.Long.fromNumber(approx);approxRem=approxRes.multiply(other)}if(approxRes.isZero()){approxRes=goog.math.Long.ONE}res=res.add(approxRes);rem=rem.subtract(approxRem)}return res});goog.math.Long.prototype.modulo=(function(other){return this.subtract(this.div(other).multiply(other))});goog.math.Long.prototype.not=(function(){return goog.math.Long.fromBits(~this.low_,~this.high_)});goog.math.Long.prototype.and=(function(other){return goog.math.Long.fromBits(this.low_&other.low_,this.high_&other.high_)});goog.math.Long.prototype.or=(function(other){return goog.math.Long.fromBits(this.low_|other.low_,this.high_|other.high_)});goog.math.Long.prototype.xor=(function(other){return goog.math.Long.fromBits(this.low_^other.low_,this.high_^other.high_)});goog.math.Long.prototype.shiftLeft=(function(numBits){numBits&=63;if(numBits==0){return this}else{var low=this.low_;if(numBits<32){var high=this.high_;return goog.math.Long.fromBits(low<>>32-numBits)}else{return goog.math.Long.fromBits(0,low<>>numBits|high<<32-numBits,high>>numBits)}else{return goog.math.Long.fromBits(high>>numBits-32,high>=0?0:-1)}}});goog.math.Long.prototype.shiftRightUnsigned=(function(numBits){numBits&=63;if(numBits==0){return this}else{var high=this.high_;if(numBits<32){var low=this.low_;return goog.math.Long.fromBits(low>>>numBits|high<<32-numBits,high>>>numBits)}else if(numBits==32){return goog.math.Long.fromBits(high,0)}else{return goog.math.Long.fromBits(high>>>numBits-32,0)}}});var navigator={appName:"Modern Browser"};var dbits;var canary=0xdeadbeefcafe;var j_lm=(canary&16777215)==15715070;function BigInteger(a,b,c){if(a!=null)if("number"==typeof a)this.fromNumber(a,b,c);else if(b==null&&"string"!=typeof a)this.fromString(a,256);else this.fromString(a,b)}function nbi(){return new BigInteger(null)}function am1(i,x,w,j,c,n){while(--n>=0){var v=x*this[i++]+w[j]+c;c=Math.floor(v/67108864);w[j++]=v&67108863}return c}function am2(i,x,w,j,c,n){var xl=x&32767,xh=x>>15;while(--n>=0){var l=this[i]&32767;var h=this[i++]>>15;var m=xh*l+h*xl;l=xl*l+((m&32767)<<15)+w[j]+(c&1073741823);c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);w[j++]=l&1073741823}return c}function am3(i,x,w,j,c,n){var xl=x&16383,xh=x>>14;while(--n>=0){var l=this[i]&16383;var h=this[i++]>>14;var m=xh*l+h*xl;l=xl*l+((m&16383)<<14)+w[j]+c;c=(l>>28)+(m>>14)+xh*h;w[j++]=l&268435455}return c}if(j_lm&&navigator.appName=="Microsoft Internet Explorer"){BigInteger.prototype.am=am2;dbits=30}else if(j_lm&&navigator.appName!="Netscape"){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=(1<=0;--i)r[i]=this[i];r.t=this.t;r.s=this.s}function bnpFromInt(x){this.t=1;this.s=x<0?-1:0;if(x>0)this[0]=x;else if(x<-1)this[0]=x+DV;else this.t=0}function nbv(i){var r=nbi();r.fromInt(i);return r}function bnpFromString(s,b){var k;if(b==16)k=4;else if(b==8)k=3;else if(b==256)k=8;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else{this.fromRadix(s,b);return}this.t=0;this.s=0;var i=s.length,mi=false,sh=0;while(--i>=0){var x=k==8?s[i]&255:intAt(s,i);if(x<0){if(s.charAt(i)=="-")mi=true;continue}mi=false;if(sh==0)this[this.t++]=x;else if(sh+k>this.DB){this[this.t-1]|=(x&(1<>this.DB-sh}else this[this.t-1]|=x<=this.DB)sh-=this.DB}if(k==8&&(s[0]&128)!=0){this.s=-1;if(sh>0)this[this.t-1]|=(1<0&&this[this.t-1]==c)--this.t}function bnToString(b){if(this.s<0)return"-"+this.negate().toString(b);var k;if(b==16)k=4;else if(b==8)k=3;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else return this.toRadix(b);var km=(1<0){if(p>p)>0){m=true;r=int2char(d)}while(i>=0){if(p>(p+=this.DB-k)}else{d=this[i]>>(p-=k)&km;if(p<=0){p+=this.DB;--i}}if(d>0)m=true;if(m)r+=int2char(d)}}return m?r:"0"}function bnNegate(){var r=nbi();BigInteger.ZERO.subTo(this,r);return r}function bnAbs(){return this.s<0?this.negate():this}function bnCompareTo(a){var r=this.s-a.s;if(r!=0)return r;var i=this.t;r=i-a.t;if(r!=0)return this.s<0?-r:r;while(--i>=0)if((r=this[i]-a[i])!=0)return r;return 0}function nbits(x){var r=1,t;if((t=x>>>16)!=0){x=t;r+=16}if((t=x>>8)!=0){x=t;r+=8}if((t=x>>4)!=0){x=t;r+=4}if((t=x>>2)!=0){x=t;r+=2}if((t=x>>1)!=0){x=t;r+=1}return r}function bnBitLength(){if(this.t<=0)return 0;return this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)}function bnpDLShiftTo(n,r){var i;for(i=this.t-1;i>=0;--i)r[i+n]=this[i];for(i=n-1;i>=0;--i)r[i]=0;r.t=this.t+n;r.s=this.s}function bnpDRShiftTo(n,r){for(var i=n;i=0;--i){r[i+ds+1]=this[i]>>cbs|c;c=(this[i]&bm)<=0;--i)r[i]=0;r[ds]=c;r.t=this.t+ds+1;r.s=this.s;r.clamp()}function bnpRShiftTo(n,r){r.s=this.s;var ds=Math.floor(n/this.DB);if(ds>=this.t){r.t=0;return}var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<>bs;for(var i=ds+1;i>bs}if(bs>0)r[this.t-ds-1]|=(this.s&bm)<>=this.DB}if(a.t>=this.DB}c+=this.s}else{c+=this.s;while(i>=this.DB}c-=a.s}r.s=c<0?-1:0;if(c<-1)r[i++]=this.DV+c;else if(c>0)r[i++]=c;r.t=i;r.clamp()}function bnpMultiplyTo(a,r){var x=this.abs(),y=a.abs();var i=x.t;r.t=i+y.t;while(--i>=0)r[i]=0;for(i=0;i=0)r[i]=0;for(i=0;i=x.DV){r[i+x.t]-=x.DV;r[i+x.t+1]=1}}if(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.clamp()}function bnpDivRemTo(m,q,r){var pm=m.abs();if(pm.t<=0)return;var pt=this.abs();if(pt.t0){pm.lShiftTo(nsh,y);pt.lShiftTo(nsh,r)}else{pm.copyTo(y);pt.copyTo(r)}var ys=y.t;var y0=y[ys-1];if(y0==0)return;var yt=y0*(1<1?y[ys-2]>>this.F2:0);var d1=this.FV/yt,d2=(1<=0){r[r.t++]=1;r.subTo(t,r)}BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(y.t=0){var qd=r[--i]==y0?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);if((r[i]+=y.am(0,qd,r,j,0,ys))0)r.rShiftTo(nsh,r);if(ts<0)BigInteger.ZERO.subTo(r,r)}function bnMod(a){var r=nbi();this.abs().divRemTo(a,null,r);if(this.s<0&&r.compareTo(BigInteger.ZERO)>0)a.subTo(r,r);return r}function Classic(m){this.m=m}function cConvert(x){if(x.s<0||x.compareTo(this.m)>=0)return x.mod(this.m);else return x}function cRevert(x){return x}function cReduce(x){x.divRemTo(this.m,null,x)}function cMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}function cSqrTo(x,r){x.squareTo(r);this.reduce(r)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1)return 0;var x=this[0];if((x&1)==0)return 0;var y=x&3;y=y*(2-(x&15)*y)&15;y=y*(2-(x&255)*y)&255;y=y*(2-((x&65535)*y&65535))&65535;y=y*(2-x*y%this.DV)%this.DV;return y>0?this.DV-y:-y}function Montgomery(m){this.m=m;this.mp=m.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<0)this.m.subTo(r,r);return r}function montRevert(x){var r=nbi();x.copyTo(r);this.reduce(r);return r}function montReduce(x){while(x.t<=this.mt2)x[x.t++]=0;for(var i=0;i>15)*this.mpl&this.um)<<15)&x.DM;j=i+this.m.t;x[j]+=this.m.am(0,u0,x,i,0,this.m.t);while(x[j]>=x.DV){x[j]-=x.DV;x[++j]++}}x.clamp();x.drShiftTo(this.m.t,x);if(x.compareTo(this.m)>=0)x.subTo(this.m,x)}function montSqrTo(x,r){x.squareTo(r);this.reduce(r)}function montMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return(this.t>0?this[0]&1:this.s)==0}function bnpExp(e,z){if(e>4294967295||e<1)return BigInteger.ONE;var r=nbi(),r2=nbi(),g=z.convert(this),i=nbits(e)-1;g.copyTo(r);while(--i>=0){z.sqrTo(r,r2);if((e&1<0)z.mulTo(r2,g,r);else{var t=r;r=r2;r2=t}}return z.revert(r)}function bnModPowInt(e,m){var z;if(e<256||m.isEven())z=new Classic(m);else z=new Montgomery(m);return this.exp(e,z)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function bnpFromRadix(s,b){this.fromInt(0);if(b==null)b=10;var cs=this.chunkSize(b);var d=Math.pow(b,cs),mi=false,j=0,w=0;for(var i=0;i=cs){this.dMultiply(d);this.dAddOffset(w,0);j=0;w=0}}if(j>0){this.dMultiply(Math.pow(b,j));this.dAddOffset(w,0)}if(mi)BigInteger.ZERO.subTo(this,this)}function bnpChunkSize(r){return Math.floor(Math.LN2*this.DB/Math.log(r))}function bnSigNum(){if(this.s<0)return-1;else if(this.t<=0||this.t==1&&this[0]<=0)return 0;else return 1}function bnpDMultiply(n){this[this.t]=this.am(0,n-1,this,0,0,this.t);++this.t;this.clamp()}function bnpDAddOffset(n,w){if(n==0)return;while(this.t<=w)this[this.t++]=0;this[w]+=n;while(this[w]>=this.DV){this[w]-=this.DV;if(++w>=this.t)this[this.t++]=0;++this[w]}}function bnpToRadix(b){if(b==null)b=10;if(this.signum()==0||b<2||b>36)return"0";var cs=this.chunkSize(b);var a=Math.pow(b,cs);var d=nbv(a),y=nbi(),z=nbi(),r="";this.divRemTo(d,y,z);while(y.signum()>0){r=(a+z.intValue()).toString(b).substr(1)+r;y.divRemTo(d,y,z)}return z.intValue().toString(b)+r}function bnIntValue(){if(this.s<0){if(this.t==1)return this[0]-this.DV;else if(this.t==0)return-1}else if(this.t==1)return this[0];else if(this.t==0)return 0;return(this[1]&(1<<32-this.DB)-1)<>=this.DB}if(a.t>=this.DB}c+=this.s}else{c+=this.s;while(i>=this.DB}c+=a.s}r.s=c<0?-1:0;if(c>0)r[i++]=c;else if(c<-1)r[i++]=this.DV+c;r.t=i;r.clamp()}BigInteger.prototype.fromRadix=bnpFromRadix;BigInteger.prototype.chunkSize=bnpChunkSize;BigInteger.prototype.signum=bnSigNum;BigInteger.prototype.dMultiply=bnpDMultiply;BigInteger.prototype.dAddOffset=bnpDAddOffset;BigInteger.prototype.toRadix=bnpToRadix;BigInteger.prototype.intValue=bnIntValue;BigInteger.prototype.addTo=bnpAddTo;var Wrapper={abs:(function(l,h){var x=new goog.math.Long(l,h);var ret;if(x.isNegative()){ret=x.negate()}else{ret=x}HEAP32[tempDoublePtr>>2]=ret.low_;HEAP32[tempDoublePtr+4>>2]=ret.high_}),ensureTemps:(function(){if(Wrapper.ensuredTemps)return;Wrapper.ensuredTemps=true;Wrapper.two32=new BigInteger;Wrapper.two32.fromString("4294967296",10);Wrapper.two64=new BigInteger;Wrapper.two64.fromString("18446744073709551616",10);Wrapper.temp1=new BigInteger;Wrapper.temp2=new BigInteger}),lh2bignum:(function(l,h){var a=new BigInteger;a.fromString(h.toString(),10);var b=new BigInteger;a.multiplyTo(Wrapper.two32,b);var c=new BigInteger;c.fromString(l.toString(),10);var d=new BigInteger;c.addTo(b,d);return d}),stringify:(function(l,h,unsigned){var ret=(new goog.math.Long(l,h)).toString();if(unsigned&&ret[0]=="-"){Wrapper.ensureTemps();var bignum=new BigInteger;bignum.fromString(ret,10);ret=new BigInteger;Wrapper.two64.addTo(bignum,ret);ret=ret.toString(10)}return ret}),fromString:(function(str,base,min,max,unsigned){Wrapper.ensureTemps();var bignum=new BigInteger;bignum.fromString(str,base);var bigmin=new BigInteger;bigmin.fromString(min,10);var bigmax=new BigInteger;bigmax.fromString(max,10);if(unsigned&&bignum.compareTo(BigInteger.ZERO)<0){var temp=new BigInteger;bignum.addTo(Wrapper.two64,temp);bignum=temp}var error=false;if(bignum.compareTo(bigmin)<0){bignum=bigmin;error=true}else if(bignum.compareTo(bigmax)>0){bignum=bigmax;error=true}var ret=goog.math.Long.fromString(bignum.toString());HEAP32[tempDoublePtr>>2]=ret.low_;HEAP32[tempDoublePtr+4>>2]=ret.high_;if(error)throw"range error"})};return Wrapper})();if(memoryInitializer){if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,STATIC_BASE)}else{addRunDependency("memory initializer");Browser.asyncLoad(memoryInitializer,(function(data){HEAPU8.set(data,STATIC_BASE);removeRunDependency("memory initializer")}),(function(data){throw"could not load memory initializer "+memoryInitializer}))}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"]&&shouldRunNow)run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){Module.printErr("run() called, but dependencies remain, so not running");return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(ENVIRONMENT_IS_WEB&&preloadStartTime!==null){Module.printErr("pre-main prep time: "+(Date.now()-preloadStartTime)+" ms")}if(Module["_main"]&&shouldRunNow){Module["callMain"](args)}postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status){if(Module["noExitRuntime"]){return}ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;function abort(text){if(text){Module.print(text);Module.printErr(text)}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";throw"abort() at "+stackTrace()+extra}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() + + + + diff --git a/static/assets/js/lib/biginteger.js b/static/assets/js/lib/biginteger.js new file mode 100644 index 0000000..b90c2fd --- /dev/null +++ b/static/assets/js/lib/biginteger.js @@ -0,0 +1,1609 @@ +/* + JavaScript BigInteger library version 0.9 + http://silentmatt.com/biginteger/ + + Copyright (c) 2009 Matthew Crumley + Copyright (c) 2010,2011 by John Tobey + Licensed under the MIT license. + + Support for arbitrary internal representation base was added by + Vitaly Magerya. + */ + +/* + File: biginteger.js + + Exports: + + + */ +var JSBigInt = (function () { + "use strict"; + /* + Class: BigInteger + An arbitrarily-large integer. + + objects should be considered immutable. None of the "built-in" + methods modify *this* or their arguments. All properties should be + considered private. + + All the methods of instances can be called "statically". The + static versions are convenient if you don't already have a + object. + + As an example, these calls are equivalent. + + > BigInteger(4).multiply(5); // returns BigInteger(20); + > BigInteger.multiply(4, 5); // returns BigInteger(20); + + > var a = 42; + > var a = BigInteger.toJSValue("0b101010"); // Not completely useless... + */ + + var CONSTRUCT = {}; // Unique token to call "private" version of constructor + + /* + Constructor: BigInteger() + Convert a value to a . + + Although is the constructor for objects, it is + best not to call it as a constructor. If *n* is a object, it is + simply returned as-is. Otherwise, is equivalent to + without a radix argument. + + > var n0 = BigInteger(); // Same as + > var n1 = BigInteger("123"); // Create a new with value 123 + > var n2 = BigInteger(123); // Create a new with value 123 + > var n3 = BigInteger(n2); // Return n2, unchanged + + The constructor form only takes an array and a sign. *n* must be an + array of numbers in little-endian order, where each digit is between 0 + and BigInteger.base. The second parameter sets the sign: -1 for + negative, +1 for positive, or 0 for zero. The array is *not copied and + may be modified*. If the array contains only zeros, the sign parameter + is ignored and is forced to zero. + + > new BigInteger([5], -1): create a new BigInteger with value -5 + + Parameters: + + n - Value to convert to a . + + Returns: + + A value. + + See Also: + + , + */ + function BigInteger(n, s, token) { + if (token !== CONSTRUCT) { + if (n instanceof BigInteger) { + return n; + } else if (typeof n === "undefined") { + return ZERO; + } + return BigInteger.parse(n); + } + + n = n || []; // Provide the nullary constructor for subclasses. + while (n.length && !n[n.length - 1]) { + --n.length; + } + this._d = n; + this._s = n.length ? (s || 1) : 0; + } + + BigInteger._construct = function (n, s) { + return new BigInteger(n, s, CONSTRUCT); + }; + + // Base-10 speedup hacks in parse, toString, exp10 and log functions + // require base to be a power of 10. 10^7 is the largest such power + // that won't cause a precision loss when digits are multiplied. + var BigInteger_base = 10000000; + var BigInteger_base_log10 = 7; + + BigInteger.base = BigInteger_base; + BigInteger.base_log10 = BigInteger_base_log10; + + var ZERO = new BigInteger([], 0, CONSTRUCT); + // Constant: ZERO + // 0. + BigInteger.ZERO = ZERO; + + var ONE = new BigInteger([1], 1, CONSTRUCT); + // Constant: ONE + // 1. + BigInteger.ONE = ONE; + + var M_ONE = new BigInteger(ONE._d, -1, CONSTRUCT); + // Constant: M_ONE + // -1. + BigInteger.M_ONE = M_ONE; + + // Constant: _0 + // Shortcut for . + BigInteger._0 = ZERO; + + // Constant: _1 + // Shortcut for . + BigInteger._1 = ONE; + + /* + Constant: small + Array of from 0 to 36. + + These are used internally for parsing, but useful when you need a "small" + . + + See Also: + + , , <_0>, <_1> + */ + BigInteger.small = [ + ZERO, + ONE, + /* Assuming BigInteger_base > 36 */ + new BigInteger([2], 1, CONSTRUCT), + new BigInteger([3], 1, CONSTRUCT), + new BigInteger([4], 1, CONSTRUCT), + new BigInteger([5], 1, CONSTRUCT), + new BigInteger([6], 1, CONSTRUCT), + new BigInteger([7], 1, CONSTRUCT), + new BigInteger([8], 1, CONSTRUCT), + new BigInteger([9], 1, CONSTRUCT), + new BigInteger([10], 1, CONSTRUCT), + new BigInteger([11], 1, CONSTRUCT), + new BigInteger([12], 1, CONSTRUCT), + new BigInteger([13], 1, CONSTRUCT), + new BigInteger([14], 1, CONSTRUCT), + new BigInteger([15], 1, CONSTRUCT), + new BigInteger([16], 1, CONSTRUCT), + new BigInteger([17], 1, CONSTRUCT), + new BigInteger([18], 1, CONSTRUCT), + new BigInteger([19], 1, CONSTRUCT), + new BigInteger([20], 1, CONSTRUCT), + new BigInteger([21], 1, CONSTRUCT), + new BigInteger([22], 1, CONSTRUCT), + new BigInteger([23], 1, CONSTRUCT), + new BigInteger([24], 1, CONSTRUCT), + new BigInteger([25], 1, CONSTRUCT), + new BigInteger([26], 1, CONSTRUCT), + new BigInteger([27], 1, CONSTRUCT), + new BigInteger([28], 1, CONSTRUCT), + new BigInteger([29], 1, CONSTRUCT), + new BigInteger([30], 1, CONSTRUCT), + new BigInteger([31], 1, CONSTRUCT), + new BigInteger([32], 1, CONSTRUCT), + new BigInteger([33], 1, CONSTRUCT), + new BigInteger([34], 1, CONSTRUCT), + new BigInteger([35], 1, CONSTRUCT), + new BigInteger([36], 1, CONSTRUCT) + ]; + + // Used for parsing/radix conversion + BigInteger.digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); + + /* + Method: toString + Convert a to a string. + + When *base* is greater than 10, letters are upper case. + + Parameters: + + base - Optional base to represent the number in (default is base 10). + Must be between 2 and 36 inclusive, or an Error will be thrown. + + Returns: + + The string representation of the . + */ + BigInteger.prototype.toString = function (base) { + base = +base || 10; + if (base < 2 || base > 36) { + throw new Error("illegal radix " + base + "."); + } + if (this._s === 0) { + return "0"; + } + if (base === 10) { + var str = this._s < 0 ? "-" : ""; + str += this._d[this._d.length - 1].toString(); + for (var i = this._d.length - 2; i >= 0; i--) { + var group = this._d[i].toString(); + while (group.length < BigInteger_base_log10) group = '0' + group; + str += group; + } + return str; + } else { + var numerals = BigInteger.digits; + base = BigInteger.small[base]; + var sign = this._s; + + var n = this.abs(); + var digits = []; + var digit; + + while (n._s !== 0) { + var divmod = n.divRem(base); + n = divmod[0]; + digit = divmod[1]; + // TODO: This could be changed to unshift instead of reversing at the end. + // Benchmark both to compare speeds. + digits.push(numerals[digit.valueOf()]); + } + return (sign < 0 ? "-" : "") + digits.reverse().join(""); + } + }; + + // Verify strings for parsing + BigInteger.radixRegex = [ + /^$/, + /^$/, + /^[01]*$/, + /^[012]*$/, + /^[0-3]*$/, + /^[0-4]*$/, + /^[0-5]*$/, + /^[0-6]*$/, + /^[0-7]*$/, + /^[0-8]*$/, + /^[0-9]*$/, + /^[0-9aA]*$/, + /^[0-9abAB]*$/, + /^[0-9abcABC]*$/, + /^[0-9a-dA-D]*$/, + /^[0-9a-eA-E]*$/, + /^[0-9a-fA-F]*$/, + /^[0-9a-gA-G]*$/, + /^[0-9a-hA-H]*$/, + /^[0-9a-iA-I]*$/, + /^[0-9a-jA-J]*$/, + /^[0-9a-kA-K]*$/, + /^[0-9a-lA-L]*$/, + /^[0-9a-mA-M]*$/, + /^[0-9a-nA-N]*$/, + /^[0-9a-oA-O]*$/, + /^[0-9a-pA-P]*$/, + /^[0-9a-qA-Q]*$/, + /^[0-9a-rA-R]*$/, + /^[0-9a-sA-S]*$/, + /^[0-9a-tA-T]*$/, + /^[0-9a-uA-U]*$/, + /^[0-9a-vA-V]*$/, + /^[0-9a-wA-W]*$/, + /^[0-9a-xA-X]*$/, + /^[0-9a-yA-Y]*$/, + /^[0-9a-zA-Z]*$/ + ]; + + /* + Function: parse + Parse a string into a . + + *base* is optional but, if provided, must be from 2 to 36 inclusive. If + *base* is not provided, it will be guessed based on the leading characters + of *s* as follows: + + - "0x" or "0X": *base* = 16 + - "0c" or "0C": *base* = 8 + - "0b" or "0B": *base* = 2 + - else: *base* = 10 + + If no base is provided, or *base* is 10, the number can be in exponential + form. For example, these are all valid: + + > BigInteger.parse("1e9"); // Same as "1000000000" + > BigInteger.parse("1.234*10^3"); // Same as 1234 + > BigInteger.parse("56789 * 10 ** -2"); // Same as 567 + + If any characters fall outside the range defined by the radix, an exception + will be thrown. + + Parameters: + + s - The string to parse. + base - Optional radix (default is to guess based on *s*). + + Returns: + + a instance. + */ + BigInteger.parse = function (s, base) { + // Expands a number in exponential form to decimal form. + // expandExponential("-13.441*10^5") === "1344100"; + // expandExponential("1.12300e-1") === "0.112300"; + // expandExponential(1000000000000000000000000000000) === "1000000000000000000000000000000"; + function expandExponential(str) { + str = str.replace(/\s*[*xX]\s*10\s*(\^|\*\*)\s*/, "e"); + + return str.replace(/^([+\-])?(\d+)\.?(\d*)[eE]([+\-]?\d+)$/, function (x, s, n, f, c) { + c = +c; + var l = c < 0; + var i = n.length + c; + x = (l ? n : f).length; + c = ((c = Math.abs(c)) >= x ? c - x + l : 0); + var z = (new Array(c + 1)).join("0"); + var r = n + f; + return (s || "") + (l ? r = z + r : r += z).substr(0, i += l ? z.length : 0) + (i < r.length ? "." + r.substr(i) : ""); + }); + } + + s = s.toString(); + if (typeof base === "undefined" || +base === 10) { + s = expandExponential(s); + } + + var prefixRE; + if (typeof base === "undefined") { + prefixRE = '0[xcb]'; + } else if (base == 16) { + prefixRE = '0x'; + } else if (base == 8) { + prefixRE = '0c'; + } else if (base == 2) { + prefixRE = '0b'; + } else { + prefixRE = ''; + } + var parts = new RegExp('^([+\\-]?)(' + prefixRE + ')?([0-9a-z]*)(?:\\.\\d*)?$', 'i').exec(s); + if (parts) { + var sign = parts[1] || "+"; + var baseSection = parts[2] || ""; + var digits = parts[3] || ""; + + if (typeof base === "undefined") { + // Guess base + if (baseSection === "0x" || baseSection === "0X") { // Hex + base = 16; + } else if (baseSection === "0c" || baseSection === "0C") { // Octal + base = 8; + } else if (baseSection === "0b" || baseSection === "0B") { // Binary + base = 2; + } else { + base = 10; + } + } else if (base < 2 || base > 36) { + throw new Error("Illegal radix " + base + "."); + } + + base = +base; + + // Check for digits outside the range + if (!(BigInteger.radixRegex[base].test(digits))) { + throw new Error("Bad digit for radix " + base); + } + + // Strip leading zeros, and convert to array + digits = digits.replace(/^0+/, "").split(""); + if (digits.length === 0) { + return ZERO; + } + + // Get the sign (we know it's not zero) + sign = (sign === "-") ? -1 : 1; + + // Optimize 10 + if (base == 10) { + var d = []; + while (digits.length >= BigInteger_base_log10) { + d.push(parseInt(digits.splice(digits.length - BigInteger.base_log10, BigInteger.base_log10).join(''), 10)); + } + d.push(parseInt(digits.join(''), 10)); + return new BigInteger(d, sign, CONSTRUCT); + } + + // Do the conversion + var d = ZERO; + base = BigInteger.small[base]; + var small = BigInteger.small; + for (var i = 0; i < digits.length; i++) { + d = d.multiply(base).add(small[parseInt(digits[i], 36)]); + } + return new BigInteger(d._d, sign, CONSTRUCT); + } else { + throw new Error("Invalid BigInteger format: " + s); + } + }; + + /* + Function: add + Add two . + + Parameters: + + n - The number to add to *this*. Will be converted to a . + + Returns: + + The numbers added together. + + See Also: + + , , , + */ + BigInteger.prototype.add = function (n) { + if (this._s === 0) { + return BigInteger(n); + } + + n = BigInteger(n); + if (n._s === 0) { + return this; + } + if (this._s !== n._s) { + n = n.negate(); + return this.subtract(n); + } + + var a = this._d; + var b = n._d; + var al = a.length; + var bl = b.length; + var sum = new Array(Math.max(al, bl) + 1); + var size = Math.min(al, bl); + var carry = 0; + var digit; + + for (var i = 0; i < size; i++) { + digit = a[i] + b[i] + carry; + sum[i] = digit % BigInteger_base; + carry = (digit / BigInteger_base) | 0; + } + if (bl > al) { + a = b; + al = bl; + } + for (i = size; carry && i < al; i++) { + digit = a[i] + carry; + sum[i] = digit % BigInteger_base; + carry = (digit / BigInteger_base) | 0; + } + if (carry) { + sum[i] = carry; + } + + for (; i < al; i++) { + sum[i] = a[i]; + } + + return new BigInteger(sum, this._s, CONSTRUCT); + }; + + /* + Function: negate + Get the additive inverse of a . + + Returns: + + A with the same magnatude, but with the opposite sign. + + See Also: + + + */ + BigInteger.prototype.negate = function () { + return new BigInteger(this._d, (-this._s) | 0, CONSTRUCT); + }; + + /* + Function: abs + Get the absolute value of a . + + Returns: + + A with the same magnatude, but always positive (or zero). + + See Also: + + + */ + BigInteger.prototype.abs = function () { + return (this._s < 0) ? this.negate() : this; + }; + + /* + Function: subtract + Subtract two . + + Parameters: + + n - The number to subtract from *this*. Will be converted to a . + + Returns: + + The *n* subtracted from *this*. + + See Also: + + , , , + */ + BigInteger.prototype.subtract = function (n) { + if (this._s === 0) { + return BigInteger(n).negate(); + } + + n = BigInteger(n); + if (n._s === 0) { + return this; + } + if (this._s !== n._s) { + n = n.negate(); + return this.add(n); + } + + var m = this; + // negative - negative => -|a| - -|b| => -|a| + |b| => |b| - |a| + if (this._s < 0) { + m = new BigInteger(n._d, 1, CONSTRUCT); + n = new BigInteger(this._d, 1, CONSTRUCT); + } + + // Both are positive => a - b + var sign = m.compareAbs(n); + if (sign === 0) { + return ZERO; + } else if (sign < 0) { + // swap m and n + var t = n; + n = m; + m = t; + } + + // a > b + var a = m._d; + var b = n._d; + var al = a.length; + var bl = b.length; + var diff = new Array(al); // al >= bl since a > b + var borrow = 0; + var i; + var digit; + + for (i = 0; i < bl; i++) { + digit = a[i] - borrow - b[i]; + if (digit < 0) { + digit += BigInteger_base; + borrow = 1; + } else { + borrow = 0; + } + diff[i] = digit; + } + for (i = bl; i < al; i++) { + digit = a[i] - borrow; + if (digit < 0) { + digit += BigInteger_base; + } else { + diff[i++] = digit; + break; + } + diff[i] = digit; + } + for (; i < al; i++) { + diff[i] = a[i]; + } + + return new BigInteger(diff, sign, CONSTRUCT); + }; + + (function () { + function addOne(n, sign) { + var a = n._d; + var sum = a.slice(); + var carry = true; + var i = 0; + + while (true) { + var digit = (a[i] || 0) + 1; + sum[i] = digit % BigInteger_base; + if (digit <= BigInteger_base - 1) { + break; + } + ++i; + } + + return new BigInteger(sum, sign, CONSTRUCT); + } + + function subtractOne(n, sign) { + var a = n._d; + var sum = a.slice(); + var borrow = true; + var i = 0; + + while (true) { + var digit = (a[i] || 0) - 1; + if (digit < 0) { + sum[i] = digit + BigInteger_base; + } else { + sum[i] = digit; + break; + } + ++i; + } + + return new BigInteger(sum, sign, CONSTRUCT); + } + + /* + Function: next + Get the next (add one). + + Returns: + + *this* + 1. + + See Also: + + , + */ + BigInteger.prototype.next = function () { + switch (this._s) { + case 0: + return ONE; + case -1: + return subtractOne(this, -1); + // case 1: + default: + return addOne(this, 1); + } + }; + + /* + Function: prev + Get the previous (subtract one). + + Returns: + + *this* - 1. + + See Also: + + , + */ + BigInteger.prototype.prev = function () { + switch (this._s) { + case 0: + return M_ONE; + case -1: + return addOne(this, -1); + // case 1: + default: + return subtractOne(this, 1); + } + }; + })(); + + /* + Function: compareAbs + Compare the absolute value of two . + + Calling is faster than calling twice, then . + + Parameters: + + n - The number to compare to *this*. Will be converted to a . + + Returns: + + -1, 0, or +1 if *|this|* is less than, equal to, or greater than *|n|*. + + See Also: + + , + */ + BigInteger.prototype.compareAbs = function (n) { + if (this === n) { + return 0; + } + + if (!(n instanceof BigInteger)) { + if (!isFinite(n)) { + return (isNaN(n) ? n : -1); + } + n = BigInteger(n); + } + + if (this._s === 0) { + return (n._s !== 0) ? -1 : 0; + } + if (n._s === 0) { + return 1; + } + + var l = this._d.length; + var nl = n._d.length; + if (l < nl) { + return -1; + } else if (l > nl) { + return 1; + } + + var a = this._d; + var b = n._d; + for (var i = l - 1; i >= 0; i--) { + if (a[i] !== b[i]) { + return a[i] < b[i] ? -1 : 1; + } + } + + return 0; + }; + + /* + Function: compare + Compare two . + + Parameters: + + n - The number to compare to *this*. Will be converted to a . + + Returns: + + -1, 0, or +1 if *this* is less than, equal to, or greater than *n*. + + See Also: + + , , , + */ + BigInteger.prototype.compare = function (n) { + if (this === n) { + return 0; + } + + n = BigInteger(n); + + if (this._s === 0) { + return -n._s; + } + + if (this._s === n._s) { // both positive or both negative + var cmp = this.compareAbs(n); + return cmp * this._s; + } else { + return this._s; + } + }; + + /* + Function: isUnit + Return true iff *this* is either 1 or -1. + + Returns: + + true if *this* compares equal to or . + + See Also: + + , , , , , + , + */ + BigInteger.prototype.isUnit = function () { + return this === ONE || + this === M_ONE || + (this._d.length === 1 && this._d[0] === 1); + }; + + /* + Function: multiply + Multiply two . + + Parameters: + + n - The number to multiply *this* by. Will be converted to a + . + + Returns: + + The numbers multiplied together. + + See Also: + + , , , + */ + BigInteger.prototype.multiply = function (n) { + // TODO: Consider adding Karatsuba multiplication for large numbers + if (this._s === 0) { + return ZERO; + } + + n = BigInteger(n); + if (n._s === 0) { + return ZERO; + } + if (this.isUnit()) { + if (this._s < 0) { + return n.negate(); + } + return n; + } + if (n.isUnit()) { + if (n._s < 0) { + return this.negate(); + } + return this; + } + if (this === n) { + return this.square(); + } + + var r = (this._d.length >= n._d.length); + var a = (r ? this : n)._d; // a will be longer than b + var b = (r ? n : this)._d; + var al = a.length; + var bl = b.length; + + var pl = al + bl; + var partial = new Array(pl); + var i; + for (i = 0; i < pl; i++) { + partial[i] = 0; + } + + for (i = 0; i < bl; i++) { + var carry = 0; + var bi = b[i]; + var jlimit = al + i; + var digit; + for (var j = i; j < jlimit; j++) { + digit = partial[j] + bi * a[j - i] + carry; + carry = (digit / BigInteger_base) | 0; + partial[j] = (digit % BigInteger_base) | 0; + } + if (carry) { + digit = partial[j] + carry; + carry = (digit / BigInteger_base) | 0; + partial[j] = digit % BigInteger_base; + } + } + return new BigInteger(partial, this._s * n._s, CONSTRUCT); + }; + + // Multiply a BigInteger by a single-digit native number + // Assumes that this and n are >= 0 + // This is not really intended to be used outside the library itself + BigInteger.prototype.multiplySingleDigit = function (n) { + if (n === 0 || this._s === 0) { + return ZERO; + } + if (n === 1) { + return this; + } + + var digit; + if (this._d.length === 1) { + digit = this._d[0] * n; + if (digit >= BigInteger_base) { + return new BigInteger([(digit % BigInteger_base) | 0, + (digit / BigInteger_base) | 0], 1, CONSTRUCT); + } + return new BigInteger([digit], 1, CONSTRUCT); + } + + if (n === 2) { + return this.add(this); + } + if (this.isUnit()) { + return new BigInteger([n], 1, CONSTRUCT); + } + + var a = this._d; + var al = a.length; + + var pl = al + 1; + var partial = new Array(pl); + for (var i = 0; i < pl; i++) { + partial[i] = 0; + } + + var carry = 0; + for (var j = 0; j < al; j++) { + digit = n * a[j] + carry; + carry = (digit / BigInteger_base) | 0; + partial[j] = (digit % BigInteger_base) | 0; + } + if (carry) { + partial[j] = carry; + } + + return new BigInteger(partial, 1, CONSTRUCT); + }; + + /* + Function: square + Multiply a by itself. + + This is slightly faster than regular multiplication, since it removes the + duplicated multiplcations. + + Returns: + + > this.multiply(this) + + See Also: + + */ + BigInteger.prototype.square = function () { + // Normally, squaring a 10-digit number would take 100 multiplications. + // Of these 10 are unique diagonals, of the remaining 90 (100-10), 45 are repeated. + // This procedure saves (N*(N-1))/2 multiplications, (e.g., 45 of 100 multiplies). + // Based on code by Gary Darby, Intellitech Systems Inc., www.DelphiForFun.org + + if (this._s === 0) { + return ZERO; + } + if (this.isUnit()) { + return ONE; + } + + var digits = this._d; + var length = digits.length; + var imult1 = new Array(length + length + 1); + var product, carry, k; + var i; + + // Calculate diagonal + for (i = 0; i < length; i++) { + k = i * 2; + product = digits[i] * digits[i]; + carry = (product / BigInteger_base) | 0; + imult1[k] = product % BigInteger_base; + imult1[k + 1] = carry; + } + + // Calculate repeating part + for (i = 0; i < length; i++) { + carry = 0; + k = i * 2 + 1; + for (var j = i + 1; j < length; j++, k++) { + product = digits[j] * digits[i] * 2 + imult1[k] + carry; + carry = (product / BigInteger_base) | 0; + imult1[k] = product % BigInteger_base; + } + k = length + i; + var digit = carry + imult1[k]; + carry = (digit / BigInteger_base) | 0; + imult1[k] = digit % BigInteger_base; + imult1[k + 1] += carry; + } + + return new BigInteger(imult1, 1, CONSTRUCT); + }; + + /* + Function: quotient + Divide two and truncate towards zero. + + throws an exception if *n* is zero. + + Parameters: + + n - The number to divide *this* by. Will be converted to a . + + Returns: + + The *this* / *n*, truncated to an integer. + + See Also: + + , , , , + */ + BigInteger.prototype.quotient = function (n) { + return this.divRem(n)[0]; + }; + + /* + Function: divide + Deprecated synonym for . + */ + BigInteger.prototype.divide = BigInteger.prototype.quotient; + + /* + Function: remainder + Calculate the remainder of two . + + throws an exception if *n* is zero. + + Parameters: + + n - The remainder after *this* is divided *this* by *n*. Will be + converted to a . + + Returns: + + *this* % *n*. + + See Also: + + , + */ + BigInteger.prototype.remainder = function (n) { + return this.divRem(n)[1]; + }; + + /* + Function: divRem + Calculate the integer quotient and remainder of two . + + throws an exception if *n* is zero. + + Parameters: + + n - The number to divide *this* by. Will be converted to a . + + Returns: + + A two-element array containing the quotient and the remainder. + + > a.divRem(b) + + is exactly equivalent to + + > [a.quotient(b), a.remainder(b)] + + except it is faster, because they are calculated at the same time. + + See Also: + + , + */ + BigInteger.prototype.divRem = function (n) { + n = BigInteger(n); + if (n._s === 0) { + throw new Error("Divide by zero"); + } + if (this._s === 0) { + return [ZERO, ZERO]; + } + if (n._d.length === 1) { + return this.divRemSmall(n._s * n._d[0]); + } + + // Test for easy cases -- |n1| <= |n2| + switch (this.compareAbs(n)) { + case 0: // n1 == n2 + return [this._s === n._s ? ONE : M_ONE, ZERO]; + case -1: // |n1| < |n2| + return [ZERO, this]; + } + + var sign = this._s * n._s; + var a = n.abs(); + var b_digits = this._d; + var b_index = b_digits.length; + var digits = n._d.length; + var quot = []; + var guess; + + var part = new BigInteger([], 0, CONSTRUCT); + part._s = 1; + + while (b_index) { + part._d.unshift(b_digits[--b_index]); + + if (part.compareAbs(n) < 0) { + quot.push(0); + continue; + } + if (part._s === 0) { + guess = 0; + } else { + var xlen = part._d.length, + ylen = a._d.length; + var highx = part._d[xlen - 1] * BigInteger_base + part._d[xlen - 2]; + var highy = a._d[ylen - 1] * BigInteger_base + a._d[ylen - 2]; + if (part._d.length > a._d.length) { + // The length of part._d can either match a._d length, + // or exceed it by one. + highx = (highx + 1) * BigInteger_base; + } + guess = Math.ceil(highx / highy); + } + do { + var check = a.multiplySingleDigit(guess); + if (check.compareAbs(part) <= 0) { + break; + } + guess--; + } while (guess); + + quot.push(guess); + if (!guess) { + continue; + } + var diff = part.subtract(check); + part._d = diff._d.slice(); + if (part._d.length === 0) { + part._s = 0; + } + } + + return [new BigInteger(quot.reverse(), sign, CONSTRUCT), + new BigInteger(part._d, this._s, CONSTRUCT)]; + }; + + // Throws an exception if n is outside of (-BigInteger.base, -1] or + // [1, BigInteger.base). It's not necessary to call this, since the + // other division functions will call it if they are able to. + BigInteger.prototype.divRemSmall = function (n) { + var r; + n = +n; + if (n === 0) { + throw new Error("Divide by zero"); + } + + var n_s = n < 0 ? -1 : 1; + var sign = this._s * n_s; + n = Math.abs(n); + + if (n < 1 || n >= BigInteger_base) { + throw new Error("Argument out of range"); + } + + if (this._s === 0) { + return [ZERO, ZERO]; + } + + if (n === 1 || n === -1) { + return [(sign === 1) ? this.abs() : new BigInteger(this._d, sign, CONSTRUCT), ZERO]; + } + + // 2 <= n < BigInteger_base + + // divide a single digit by a single digit + if (this._d.length === 1) { + var q = new BigInteger([(this._d[0] / n) | 0], 1, CONSTRUCT); + r = new BigInteger([(this._d[0] % n) | 0], 1, CONSTRUCT); + if (sign < 0) { + q = q.negate(); + } + if (this._s < 0) { + r = r.negate(); + } + return [q, r]; + } + + var digits = this._d.slice(); + var quot = new Array(digits.length); + var part = 0; + var diff = 0; + var i = 0; + var guess; + + while (digits.length) { + part = part * BigInteger_base + digits[digits.length - 1]; + if (part < n) { + quot[i++] = 0; + digits.pop(); + diff = BigInteger_base * diff + part; + continue; + } + if (part === 0) { + guess = 0; + } else { + guess = (part / n) | 0; + } + + var check = n * guess; + diff = part - check; + quot[i++] = guess; + if (!guess) { + digits.pop(); + continue; + } + + digits.pop(); + part = diff; + } + + r = new BigInteger([diff], 1, CONSTRUCT); + if (this._s < 0) { + r = r.negate(); + } + return [new BigInteger(quot.reverse(), sign, CONSTRUCT), r]; + }; + + /* + Function: isEven + Return true iff *this* is divisible by two. + + Note that is even. + + Returns: + + true if *this* is even, false otherwise. + + See Also: + + + */ + BigInteger.prototype.isEven = function () { + var digits = this._d; + return this._s === 0 || digits.length === 0 || (digits[0] % 2) === 0; + }; + + /* + Function: isOdd + Return true iff *this* is not divisible by two. + + Returns: + + true if *this* is odd, false otherwise. + + See Also: + + + */ + BigInteger.prototype.isOdd = function () { + return !this.isEven(); + }; + + /* + Function: sign + Get the sign of a . + + Returns: + + * -1 if *this* < 0 + * 0 if *this* == 0 + * +1 if *this* > 0 + + See Also: + + , , , , + */ + BigInteger.prototype.sign = function () { + return this._s; + }; + + /* + Function: isPositive + Return true iff *this* > 0. + + Returns: + + true if *this*.compare() == 1. + + See Also: + + , , , , , + */ + BigInteger.prototype.isPositive = function () { + return this._s > 0; + }; + + /* + Function: isNegative + Return true iff *this* < 0. + + Returns: + + true if *this*.compare() == -1. + + See Also: + + , , , , , + */ + BigInteger.prototype.isNegative = function () { + return this._s < 0; + }; + + /* + Function: isZero + Return true iff *this* == 0. + + Returns: + + true if *this*.compare() == 0. + + See Also: + + , , , , + */ + BigInteger.prototype.isZero = function () { + return this._s === 0; + }; + + /* + Function: exp10 + Multiply a by a power of 10. + + This is equivalent to, but faster than + + > if (n >= 0) { + > return this.multiply(BigInteger("1e" + n)); + > } + > else { // n <= 0 + > return this.quotient(BigInteger("1e" + -n)); + > } + + Parameters: + + n - The power of 10 to multiply *this* by. *n* is converted to a + javascipt number and must be no greater than + (0x7FFFFFFF), or an exception will be thrown. + + Returns: + + *this* * (10 ** *n*), truncated to an integer if necessary. + + See Also: + + , + */ + BigInteger.prototype.exp10 = function (n) { + n = +n; + if (n === 0) { + return this; + } + if (Math.abs(n) > Number(MAX_EXP)) { + throw new Error("exponent too large in BigInteger.exp10"); + } + if (n > 0) { + var k = new BigInteger(this._d.slice(), this._s, CONSTRUCT); + + for (; n >= BigInteger_base_log10; n -= BigInteger_base_log10) { + k._d.unshift(0); + } + if (n == 0) + return k; + k._s = 1; + k = k.multiplySingleDigit(Math.pow(10, n)); + return (this._s < 0 ? k.negate() : k); + } else if (-n >= this._d.length * BigInteger_base_log10) { + return ZERO; + } else { + var k = new BigInteger(this._d.slice(), this._s, CONSTRUCT); + + for (n = -n; n >= BigInteger_base_log10; n -= BigInteger_base_log10) { + k._d.shift(); + } + return (n == 0) ? k : k.divRemSmall(Math.pow(10, n))[0]; + } + }; + + /* + Function: pow + Raise a to a power. + + In this implementation, 0**0 is 1. + + Parameters: + + n - The exponent to raise *this* by. *n* must be no greater than + (0x7FFFFFFF), or an exception will be thrown. + + Returns: + + *this* raised to the *nth* power. + + See Also: + + + */ + BigInteger.prototype.pow = function (n) { + if (this.isUnit()) { + if (this._s > 0) { + return this; + } else { + return BigInteger(n).isOdd() ? this : this.negate(); + } + } + + n = BigInteger(n); + if (n._s === 0) { + return ONE; + } else if (n._s < 0) { + if (this._s === 0) { + throw new Error("Divide by zero"); + } else { + return ZERO; + } + } + if (this._s === 0) { + return ZERO; + } + if (n.isUnit()) { + return this; + } + + if (n.compareAbs(MAX_EXP) > 0) { + throw new Error("exponent too large in BigInteger.pow"); + } + var x = this; + var aux = ONE; + var two = BigInteger.small[2]; + + while (n.isPositive()) { + if (n.isOdd()) { + aux = aux.multiply(x); + if (n.isUnit()) { + return aux; + } + } + x = x.square(); + n = n.quotient(two); + } + + return aux; + }; + + /* + Function: modPow + Raise a to a power (mod m). + + Because it is reduced by a modulus, is not limited by + like . + + Parameters: + + exponent - The exponent to raise *this* by. Must be positive. + modulus - The modulus. + + Returns: + + *this* ^ *exponent* (mod *modulus*). + + See Also: + + , + */ + BigInteger.prototype.modPow = function (exponent, modulus) { + var result = ONE; + var base = this; + + while (exponent.isPositive()) { + if (exponent.isOdd()) { + result = result.multiply(base).remainder(modulus); + } + + exponent = exponent.quotient(BigInteger.small[2]); + if (exponent.isPositive()) { + base = base.square().remainder(modulus); + } + } + + return result; + }; + + /* + Function: log + Get the natural logarithm of a as a native JavaScript number. + + This is equivalent to + + > Math.log(this.toJSValue()) + + but handles values outside of the native number range. + + Returns: + + log( *this* ) + + See Also: + + + */ + BigInteger.prototype.log = function () { + switch (this._s) { + case 0: + return -Infinity; + case -1: + return NaN; + default: // Fall through. + } + + var l = this._d.length; + + if (l * BigInteger_base_log10 < 30) { + return Math.log(this.valueOf()); + } + + var N = Math.ceil(30 / BigInteger_base_log10); + var firstNdigits = this._d.slice(l - N); + return Math.log((new BigInteger(firstNdigits, 1, CONSTRUCT)).valueOf()) + (l - N) * Math.log(BigInteger_base); + }; + + /* + Function: valueOf + Convert a to a native JavaScript integer. + + This is called automatically by JavaScipt to convert a to a + native value. + + Returns: + + > parseInt(this.toString(), 10) + + See Also: + + , + */ + BigInteger.prototype.valueOf = function () { + return parseInt(this.toString(), 10); + }; + + /* + Function: toJSValue + Convert a to a native JavaScript integer. + + This is the same as valueOf, but more explicitly named. + + Returns: + + > parseInt(this.toString(), 10) + + See Also: + + , + */ + BigInteger.prototype.toJSValue = function () { + return parseInt(this.toString(), 10); + }; + + + /* + Function: lowVal + Author: Lucas Jones + */ + BigInteger.prototype.lowVal = function () { + return this._d[0] || 0; + }; + + var MAX_EXP = BigInteger(0x7FFFFFFF); + // Constant: MAX_EXP + // The largest exponent allowed in and (0x7FFFFFFF or 2147483647). + BigInteger.MAX_EXP = MAX_EXP; + + (function () { + function makeUnary(fn) { + return function (a) { + return fn.call(BigInteger(a)); + }; + } + + function makeBinary(fn) { + return function (a, b) { + return fn.call(BigInteger(a), BigInteger(b)); + }; + } + + function makeTrinary(fn) { + return function (a, b, c) { + return fn.call(BigInteger(a), BigInteger(b), BigInteger(c)); + }; + } + + (function () { + var i, fn; + var unary = "toJSValue,isEven,isOdd,sign,isZero,isNegative,abs,isUnit,square,negate,isPositive,toString,next,prev,log".split(","); + var binary = "compare,remainder,divRem,subtract,add,quotient,divide,multiply,pow,compareAbs".split(","); + var trinary = ["modPow"]; + + for (i = 0; i < unary.length; i++) { + fn = unary[i]; + BigInteger[fn] = makeUnary(BigInteger.prototype[fn]); + } + + for (i = 0; i < binary.length; i++) { + fn = binary[i]; + BigInteger[fn] = makeBinary(BigInteger.prototype[fn]); + } + + for (i = 0; i < trinary.length; i++) { + fn = trinary[i]; + BigInteger[fn] = makeTrinary(BigInteger.prototype[fn]); + } + + BigInteger.exp10 = function (x, n) { + return BigInteger(x).exp10(n); + }; + })(); + })(); + + return BigInteger; +})(); \ No newline at end of file diff --git a/static/assets/js/mnemonic.js b/static/assets/js/mnemonic.js new file mode 100644 index 0000000..a742e70 --- /dev/null +++ b/static/assets/js/mnemonic.js @@ -0,0 +1,1194 @@ +/* + mnemonic.js : Converts between 4-byte aligned strings and a human-readable + sequence of words. Uses 1626 common words taken from wikipedia article: + http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists/Contemporary_poetry + Originally written in python special for Electrum (lightweight Bitcoin client). + This version has been reimplemented in javascript and placed in public domain. + */ +var mn_default_wordset = 'english'; + +function mn_get_checksum_index(words, prefix_len) { + var trimmed_words = ""; + for (var i = 0; i < words.length; i++) { + trimmed_words += words[i].slice(0, prefix_len); + } + var checksum = crc32.run(trimmed_words); + var index = checksum % words.length; + return index; +} + +function mn_encode(str, wordset_name) { + 'use strict'; + wordset_name = wordset_name || mn_default_wordset; + var wordset = mn_words[wordset_name]; + var out = []; + var n = wordset.words.length; + for (var j = 0; j < str.length; j += 8) { + str = str.slice(0, j) + mn_swap_endian_4byte(str.slice(j, j + 8)) + str.slice(j + 8); + } + for (var i = 0; i < str.length; i += 8) { + var x = parseInt(str.substr(i, 8), 16); + var w1 = (x % n); + var w2 = (Math.floor(x / n) + w1) % n; + var w3 = (Math.floor(Math.floor(x / n) / n) + w2) % n; + out = out.concat([wordset.words[w1], wordset.words[w2], wordset.words[w3]]); + } + if (wordset.prefix_len > 0) { + out.push(out[mn_get_checksum_index(out, wordset.prefix_len)]); + } + return out.join(' '); +} + +function mn_swap_endian_4byte(str) { + 'use strict'; + if (str.length !== 8) throw 'Invalid input length: ' + str.length; + return str.slice(6, 8) + str.slice(4, 6) + str.slice(2, 4) + str.slice(0, 2); +} + +function mn_decode(str, wordset_name) { + 'use strict'; + wordset_name = wordset_name || mn_default_wordset; + var wordset = mn_words[wordset_name]; + var out = ''; + var n = wordset.words.length; + var wlist = str.split(' '); + var checksum_word = ''; + if (wlist.length < 12) throw "Invalid number of words"; + if ((wordset.prefix_len === 0 && (wlist.length % 3 !== 0)) || + (wordset.prefix_len > 0 && (wlist.length % 3 === 2))) throw "invalid number of words"; + if (wordset.prefix_len > 0 && (wlist.length % 3 === 0)) throw "missing checksum"; + if (wordset.prefix_len > 0) { + // Pop checksum from mnemonic + checksum_word = wlist.pop(); + } + // Decode mnemonic + for (var i = 0; i < wlist.length; i += 3) { + var w1, w2, w3; + if (wordset.prefix_len === 0) { + w1 = wordset.words.indexOf(wlist[i]); + w2 = wordset.words.indexOf(wlist[i + 1]); + w3 = wordset.words.indexOf(wlist[i + 2]); + } else { + w1 = wordset.trunc_words.indexOf(wlist[i].slice(0, wordset.prefix_len)); + w2 = wordset.trunc_words.indexOf(wlist[i + 1].slice(0, wordset.prefix_len)); + w3 = wordset.trunc_words.indexOf(wlist[i + 2].slice(0, wordset.prefix_len)); + } + if (w1 === -1 || w2 === -1 || w3 === -1) { + throw "invalid word in mnemonic"; + } + var x = w1 + n * (((n - w1) + w2) % n) + n * n * (((n - w2) + w3) % n); + if (x % n != w1) throw 'Failed to decode mnemonic'; + out += mn_swap_endian_4byte(('0000000' + x.toString(16)).slice(-8)); + } + // Verify checksum + if (wordset.prefix_len > 0) { + var index = mn_get_checksum_index(wlist, wordset.prefix_len); + var expected_checksum_word = wlist[index]; + if (expected_checksum_word.slice(0, wordset.prefix_len) !== checksum_word.slice(0, wordset.prefix_len)) { + throw "invalid checksum"; + } + } + return out; +} + +function mn_random(bits) { + 'use strict'; + if (bits % 32 !== 0) throw "Invalid number of bits: " + bits; + var array = new Uint32Array(bits / 32); + if (!window.crypto) throw "Crypto api not supported!"; + var i = 0; + + function arr_is_zero() { + for (var j = 0; j < bits / 32; ++j) { + if (array[j] !== 0) return false; + } + return true; + } + + do { + window.crypto.getRandomValues(array); + ++i; + } while (i < 5 && arr_is_zero()); + if (arr_is_zero()) { + throw "Failed to generate crypto random!"; + } + // Convert to hex + var out = ''; + for (var j = 0; j < bits / 32; ++j) { + out += ('0000000' + array[j].toString(16)).slice(-8); + } + return out; +} + +var mn_words = { + 'electrum': { + prefix_len: 0, + words: [ + "like", "just", "love", "know", "never", "want", "time", "out", "there", + "make", "look", "eye", "down", "only", "think", "heart", "back", "then", + "into", "about", "more", "away", "still", "them", "take", "thing", "even", + "through", "long", "always", "world", "too", "friend", "tell", "try", + "hand", "thought", "over", "here", "other", "need", "smile", "again", + "much", "cry", "been", "night", "ever", "little", "said", "end", "some", + "those", "around", "mind", "people", "girl", "leave", "dream", "left", + "turn", "myself", "give", "nothing", "really", "off", "before", + "something", "find", "walk", "wish", "good", "once", "place", "ask", + "stop", "keep", "watch", "seem", "everything", "wait", "got", "yet", + "made", "remember", "start", "alone", "run", "hope", "maybe", "believe", + "body", "hate", "after", "close", "talk", "stand", "own", "each", "hurt", + "help", "home", "god", "soul", "new", "many", "two", "inside", "should", + "true", "first", "fear", "mean", "better", "play", "another", "gone", + "change", "use", "wonder", "someone", "hair", "cold", "open", "best", + "any", "behind", "happen", "water", "dark", "laugh", "stay", "forever", + "name", "work", "show", "sky", "break", "came", "deep", "door", "put", + "black", "together", "upon", "happy", "such", "great", "white", "matter", + "fill", "past", "please", "burn", "cause", "enough", "touch", "moment", + "soon", "voice", "scream", "anything", "stare", "sound", "red", "everyone", + "hide", "kiss", "truth", "death", "beautiful", "mine", "blood", "broken", + "very", "pass", "next", "forget", "tree", "wrong", "air", "mother", + "understand", "lip", "hit", "wall", "memory", "sleep", "free", "high", + "realize", "school", "might", "skin", "sweet", "perfect", "blue", "kill", + "breath", "dance", "against", "fly", "between", "grow", "strong", "under", + "listen", "bring", "sometimes", "speak", "pull", "person", "become", + "family", "begin", "ground", "real", "small", "father", "sure", "feet", + "rest", "young", "finally", "land", "across", "today", "different", "guy", + "line", "fire", "reason", "reach", "second", "slowly", "write", "eat", + "smell", "mouth", "step", "learn", "three", "floor", "promise", "breathe", + "darkness", "push", "earth", "guess", "save", "song", "above", "along", + "both", "color", "house", "almost", "sorry", "anymore", "brother", "okay", + "dear", "game", "fade", "already", "apart", "warm", "beauty", "heard", + "notice", "question", "shine", "began", "piece", "whole", "shadow", + "secret", "street", "within", "finger", "point", "morning", "whisper", + "child", "moon", "green", "story", "glass", "kid", "silence", "since", + "soft", "yourself", "empty", "shall", "angel", "answer", "baby", "bright", + "dad", "path", "worry", "hour", "drop", "follow", "power", "war", "half", + "flow", "heaven", "act", "chance", "fact", "least", "tired", "children", + "near", "quite", "afraid", "rise", "sea", "taste", "window", "cover", + "nice", "trust", "lot", "sad", "cool", "force", "peace", "return", "blind", + "easy", "ready", "roll", "rose", "drive", "held", "music", "beneath", + "hang", "mom", "paint", "emotion", "quiet", "clear", "cloud", "few", + "pretty", "bird", "outside", "paper", "picture", "front", "rock", "simple", + "anyone", "meant", "reality", "road", "sense", "waste", "bit", "leaf", + "thank", "happiness", "meet", "men", "smoke", "truly", "decide", "self", + "age", "book", "form", "alive", "carry", "escape", "damn", "instead", + "able", "ice", "minute", "throw", "catch", "leg", "ring", "course", + "goodbye", "lead", "poem", "sick", "corner", "desire", "known", "problem", + "remind", "shoulder", "suppose", "toward", "wave", "drink", "jump", + "woman", "pretend", "sister", "week", "human", "joy", "crack", "grey", + "pray", "surprise", "dry", "knee", "less", "search", "bleed", "caught", + "clean", "embrace", "future", "king", "son", "sorrow", "chest", "hug", + "remain", "sat", "worth", "blow", "daddy", "final", "parent", "tight", + "also", "create", "lonely", "safe", "cross", "dress", "evil", "silent", + "bone", "fate", "perhaps", "anger", "class", "scar", "snow", "tiny", + "tonight", "continue", "control", "dog", "edge", "mirror", "month", + "suddenly", "comfort", "given", "loud", "quickly", "gaze", "plan", "rush", + "stone", "town", "battle", "ignore", "spirit", "stood", "stupid", "yours", + "brown", "build", "dust", "hey", "kept", "pay", "phone", "twist", + "although", "ball", "beyond", "hidden", "nose", "taken", "fail", "float", + "pure", "somehow", "wash", "wrap", "angry", "cheek", "creature", + "forgotten", "heat", "rip", "single", "space", "special", "weak", + "whatever", "yell", "anyway", "blame", "job", "choose", "country", "curse", + "drift", "echo", "figure", "grew", "laughter", "neck", "suffer", "worse", + "yeah", "disappear", "foot", "forward", "knife", "mess", "somewhere", + "stomach", "storm", "beg", "idea", "lift", "offer", "breeze", "field", + "five", "often", "simply", "stuck", "win", "allow", "confuse", "enjoy", + "except", "flower", "seek", "strength", "calm", "grin", "gun", "heavy", + "hill", "large", "ocean", "shoe", "sigh", "straight", "summer", "tongue", + "accept", "crazy", "everyday", "exist", "grass", "mistake", "sent", "shut", + "surround", "table", "ache", "brain", "destroy", "heal", "nature", "shout", + "sign", "stain", "choice", "doubt", "glance", "glow", "mountain", "queen", + "stranger", "throat", "tomorrow", "city", "either", "fish", "flame", + "rather", "shape", "spin", "spread", "ash", "distance", "finish", "image", + "imagine", "important", "nobody", "shatter", "warmth", "became", "feed", + "flesh", "funny", "lust", "shirt", "trouble", "yellow", "attention", + "bare", "bite", "money", "protect", "amaze", "appear", "born", "choke", + "completely", "daughter", "fresh", "friendship", "gentle", "probably", + "six", "deserve", "expect", "grab", "middle", "nightmare", "river", + "thousand", "weight", "worst", "wound", "barely", "bottle", "cream", + "regret", "relationship", "stick", "test", "crush", "endless", "fault", + "itself", "rule", "spill", "art", "circle", "join", "kick", "mask", + "master", "passion", "quick", "raise", "smooth", "unless", "wander", + "actually", "broke", "chair", "deal", "favorite", "gift", "note", "number", + "sweat", "box", "chill", "clothes", "lady", "mark", "park", "poor", + "sadness", "tie", "animal", "belong", "brush", "consume", "dawn", "forest", + "innocent", "pen", "pride", "stream", "thick", "clay", "complete", "count", + "draw", "faith", "press", "silver", "struggle", "surface", "taught", + "teach", "wet", "bless", "chase", "climb", "enter", "letter", "melt", + "metal", "movie", "stretch", "swing", "vision", "wife", "beside", "crash", + "forgot", "guide", "haunt", "joke", "knock", "plant", "pour", "prove", + "reveal", "steal", "stuff", "trip", "wood", "wrist", "bother", "bottom", + "crawl", "crowd", "fix", "forgive", "frown", "grace", "loose", "lucky", + "party", "release", "surely", "survive", "teacher", "gently", "grip", + "speed", "suicide", "travel", "treat", "vein", "written", "cage", "chain", + "conversation", "date", "enemy", "however", "interest", "million", "page", + "pink", "proud", "sway", "themselves", "winter", "church", "cruel", "cup", + "demon", "experience", "freedom", "pair", "pop", "purpose", "respect", + "shoot", "softly", "state", "strange", "bar", "birth", "curl", "dirt", + "excuse", "lord", "lovely", "monster", "order", "pack", "pants", "pool", + "scene", "seven", "shame", "slide", "ugly", "among", "blade", "blonde", + "closet", "creek", "deny", "drug", "eternity", "gain", "grade", "handle", + "key", "linger", "pale", "prepare", "swallow", "swim", "tremble", "wheel", + "won", "cast", "cigarette", "claim", "college", "direction", "dirty", + "gather", "ghost", "hundred", "loss", "lung", "orange", "present", "swear", + "swirl", "twice", "wild", "bitter", "blanket", "doctor", "everywhere", + "flash", "grown", "knowledge", "numb", "pressure", "radio", "repeat", + "ruin", "spend", "unknown", "buy", "clock", "devil", "early", "false", + "fantasy", "pound", "precious", "refuse", "sheet", "teeth", "welcome", + "add", "ahead", "block", "bury", "caress", "content", "depth", "despite", + "distant", "marry", "purple", "threw", "whenever", "bomb", "dull", + "easily", "grasp", "hospital", "innocence", "normal", "receive", "reply", + "rhyme", "shade", "someday", "sword", "toe", "visit", "asleep", "bought", + "center", "consider", "flat", "hero", "history", "ink", "insane", "muscle", + "mystery", "pocket", "reflection", "shove", "silently", "smart", "soldier", + "spot", "stress", "train", "type", "view", "whether", "bus", "energy", + "explain", "holy", "hunger", "inch", "magic", "mix", "noise", "nowhere", + "prayer", "presence", "shock", "snap", "spider", "study", "thunder", + "trail", "admit", "agree", "bag", "bang", "bound", "butterfly", "cute", + "exactly", "explode", "familiar", "fold", "further", "pierce", "reflect", + "scent", "selfish", "sharp", "sink", "spring", "stumble", "universe", + "weep", "women", "wonderful", "action", "ancient", "attempt", "avoid", + "birthday", "branch", "chocolate", "core", "depress", "drunk", + "especially", "focus", "fruit", "honest", "match", "palm", "perfectly", + "pillow", "pity", "poison", "roar", "shift", "slightly", "thump", "truck", + "tune", "twenty", "unable", "wipe", "wrote", "coat", "constant", "dinner", + "drove", "egg", "eternal", "flight", "flood", "frame", "freak", "gasp", + "glad", "hollow", "motion", "peer", "plastic", "root", "screen", "season", + "sting", "strike", "team", "unlike", "victim", "volume", "warn", "weird", + "attack", "await", "awake", "built", "charm", "crave", "despair", "fought", + "grant", "grief", "horse", "limit", "message", "ripple", "sanity", + "scatter", "serve", "split", "string", "trick", "annoy", "blur", "boat", + "brave", "clearly", "cling", "connect", "fist", "forth", "imagination", + "iron", "jock", "judge", "lesson", "milk", "misery", "nail", "naked", + "ourselves", "poet", "possible", "princess", "sail", "size", "snake", + "society", "stroke", "torture", "toss", "trace", "wise", "bloom", "bullet", + "cell", "check", "cost", "darling", "during", "footstep", "fragile", + "hallway", "hardly", "horizon", "invisible", "journey", "midnight", "mud", + "nod", "pause", "relax", "shiver", "sudden", "value", "youth", "abuse", + "admire", "blink", "breast", "bruise", "constantly", "couple", "creep", + "curve", "difference", "dumb", "emptiness", "gotta", "honor", "plain", + "planet", "recall", "rub", "ship", "slam", "soar", "somebody", "tightly", + "weather", "adore", "approach", "bond", "bread", "burst", "candle", + "coffee", "cousin", "crime", "desert", "flutter", "frozen", "grand", + "heel", "hello", "language", "level", "movement", "pleasure", "powerful", + "random", "rhythm", "settle", "silly", "slap", "sort", "spoken", "steel", + "threaten", "tumble", "upset", "aside", "awkward", "bee", "blank", "board", + "button", "card", "carefully", "complain", "crap", "deeply", "discover", + "drag", "dread", "effort", "entire", "fairy", "giant", "gotten", "greet", + "illusion", "jeans", "leap", "liquid", "march", "mend", "nervous", "nine", + "replace", "rope", "spine", "stole", "terror", "accident", "apple", + "balance", "boom", "childhood", "collect", "demand", "depression", + "eventually", "faint", "glare", "goal", "group", "honey", "kitchen", + "laid", "limb", "machine", "mere", "mold", "murder", "nerve", "painful", + "poetry", "prince", "rabbit", "shelter", "shore", "shower", "soothe", + "stair", "steady", "sunlight", "tangle", "tease", "treasure", "uncle", + "begun", "bliss", "canvas", "cheer", "claw", "clutch", "commit", "crimson", + "crystal", "delight", "doll", "existence", "express", "fog", "football", + "gay", "goose", "guard", "hatred", "illuminate", "mass", "math", "mourn", + "rich", "rough", "skip", "stir", "student", "style", "support", "thorn", + "tough", "yard", "yearn", "yesterday", "advice", "appreciate", "autumn", + "bank", "beam", "bowl", "capture", "carve", "collapse", "confusion", + "creation", "dove", "feather", "girlfriend", "glory", "government", + "harsh", "hop", "inner", "loser", "moonlight", "neighbor", "neither", + "peach", "pig", "praise", "screw", "shield", "shimmer", "sneak", "stab", + "subject", "throughout", "thrown", "tower", "twirl", "wow", "army", + "arrive", "bathroom", "bump", "cease", "cookie", "couch", "courage", "dim", + "guilt", "howl", "hum", "husband", "insult", "led", "lunch", "mock", + "mostly", "natural", "nearly", "needle", "nerd", "peaceful", "perfection", + "pile", "price", "remove", "roam", "sanctuary", "serious", "shiny", + "shook", "sob", "stolen", "tap", "vain", "void", "warrior", "wrinkle", + "affection", "apologize", "blossom", "bounce", "bridge", "cheap", + "crumble", "decision", "descend", "desperately", "dig", "dot", "flip", + "frighten", "heartbeat", "huge", "lazy", "lick", "odd", "opinion", + "process", "puzzle", "quietly", "retreat", "score", "sentence", "separate", + "situation", "skill", "soak", "square", "stray", "taint", "task", "tide", + "underneath", "veil", "whistle", "anywhere", "bedroom", "bid", "bloody", + "burden", "careful", "compare", "concern", "curtain", "decay", "defeat", + "describe", "double", "dreamer", "driver", "dwell", "evening", "flare", + "flicker", "grandma", "guitar", "harm", "horrible", "hungry", "indeed", + "lace", "melody", "monkey", "nation", "object", "obviously", "rainbow", + "salt", "scratch", "shown", "shy", "stage", "stun", "third", "tickle", + "useless", "weakness", "worship", "worthless", "afternoon", "beard", + "boyfriend", "bubble", "busy", "certain", "chin", "concrete", "desk", + "diamond", "doom", "drawn", "due", "felicity", "freeze", "frost", "garden", + "glide", "harmony", "hopefully", "hunt", "jealous", "lightning", "mama", + "mercy", "peel", "physical", "position", "pulse", "punch", "quit", "rant", + "respond", "salty", "sane", "satisfy", "savior", "sheep", "slept", + "social", "sport", "tuck", "utter", "valley", "wolf", "aim", "alas", + "alter", "arrow", "awaken", "beaten", "belief", "brand", "ceiling", + "cheese", "clue", "confidence", "connection", "daily", "disguise", "eager", + "erase", "essence", "everytime", "expression", "fan", "flag", "flirt", + "foul", "fur", "giggle", "glorious", "ignorance", "law", "lifeless", + "measure", "mighty", "muse", "north", "opposite", "paradise", "patience", + "patient", "pencil", "petal", "plate", "ponder", "possibly", "practice", + "slice", "spell", "stock", "strife", "strip", "suffocate", "suit", + "tender", "tool", "trade", "velvet", "verse", "waist", "witch", "aunt", + "bench", "bold", "cap", "certainly", "click", "companion", "creator", + "dart", "delicate", "determine", "dish", "dragon", "drama", "drum", "dude", + "everybody", "feast", "forehead", "former", "fright", "fully", "gas", + "hook", "hurl", "invite", "juice", "manage", "moral", "possess", "raw", + "rebel", "royal", "scale", "scary", "several", "slight", "stubborn", + "swell", "talent", "tea", "terrible", "thread", "torment", "trickle", + "usually", "vast", "violence", "weave", "acid", "agony", "ashamed", "awe", + "belly", "blend", "blush", "character", "cheat", "common", "company", + "coward", "creak", "danger", "deadly", "defense", "define", "depend", + "desperate", "destination", "dew", "duck", "dusty", "embarrass", "engine", + "example", "explore", "foe", "freely", "frustrate", "generation", "glove", + "guilty", "health", "hurry", "idiot", "impossible", "inhale", "jaw", + "kingdom", "mention", "mist", "moan", "mumble", "mutter", "observe", "ode", + "pathetic", "pattern", "pie", "prefer", "puff", "rape", "rare", "revenge", + "rude", "scrape", "spiral", "squeeze", "strain", "sunset", "suspend", + "sympathy", "thigh", "throne", "total", "unseen", "weapon", "weary" + ] + }, + 'english': { + prefix_len: 3, + words: [ + "abbey", "abducts", "ability", "ablaze", "abnormal", "abort", "abrasive", "absorb", + "abyss", "academy", "aces", "aching", "acidic", "acoustic", "acquire", "across", + "actress", "acumen", "adapt", "addicted", "adept", "adhesive", "adjust", "adopt", + "adrenalin", "adult", "adventure", "aerial", "afar", "affair", "afield", "afloat", + "afoot", "afraid", "after", "against", "agenda", "aggravate", "agile", "aglow", + "agnostic", "agony", "agreed", "ahead", "aided", "ailments", "aimless", "airport", + "aisle", "ajar", "akin", "alarms", "album", "alchemy", "alerts", "algebra", + "alkaline", "alley", "almost", "aloof", "alpine", "already", "also", "altitude", + "alumni", "always", "amaze", "ambush", "amended", "amidst", "ammo", "amnesty", + "among", "amply", "amused", "anchor", "android", "anecdote", "angled", "ankle", + "annoyed", "answers", "antics", "anvil", "anxiety", "anybody", "apart", "apex", + "aphid", "aplomb", "apology", "apply", "apricot", "aptitude", "aquarium", "arbitrary", + "archer", "ardent", "arena", "argue", "arises", "army", "around", "arrow", + "arsenic", "artistic", "ascend", "ashtray", "aside", "asked", "asleep", "aspire", + "assorted", "asylum", "athlete", "atlas", "atom", "atrium", "attire", "auburn", + "auctions", "audio", "august", "aunt", "austere", "autumn", "avatar", "avidly", + "avoid", "awakened", "awesome", "awful", "awkward", "awning", "awoken", "axes", + "axis", "axle", "aztec", "azure", "baby", "bacon", "badge", "baffles", + "bagpipe", "bailed", "bakery", "balding", "bamboo", "banjo", "baptism", "basin", + "batch", "bawled", "bays", "because", "beer", "befit", "begun", "behind", + "being", "below", "bemused", "benches", "berries", "bested", "betting", "bevel", + "beware", "beyond", "bias", "bicycle", "bids", "bifocals", "biggest", "bikini", + "bimonthly", "binocular", "biology", "biplane", "birth", "biscuit", "bite", "biweekly", + "blender", "blip", "bluntly", "boat", "bobsled", "bodies", "bogeys", "boil", + "boldly", "bomb", "border", "boss", "both", "bounced", "bovine", "bowling", + "boxes", "boyfriend", "broken", "brunt", "bubble", "buckets", "budget", "buffet", + "bugs", "building", "bulb", "bumper", "bunch", "business", "butter", "buying", + "buzzer", "bygones", "byline", "bypass", "cabin", "cactus", "cadets", "cafe", + "cage", "cajun", "cake", "calamity", "camp", "candy", "casket", "catch", + "cause", "cavernous", "cease", "cedar", "ceiling", "cell", "cement", "cent", + "certain", "chlorine", "chrome", "cider", "cigar", "cinema", "circle", "cistern", + "citadel", "civilian", "claim", "click", "clue", "coal", "cobra", "cocoa", + "code", "coexist", "coffee", "cogs", "cohesive", "coils", "colony", "comb", + "cool", "copy", "corrode", "costume", "cottage", "cousin", "cowl", "criminal", + "cube", "cucumber", "cuddled", "cuffs", "cuisine", "cunning", "cupcake", "custom", + "cycling", "cylinder", "cynical", "dabbing", "dads", "daft", "dagger", "daily", + "damp", "dangerous", "dapper", "darted", "dash", "dating", "dauntless", "dawn", + "daytime", "dazed", "debut", "decay", "dedicated", "deepest", "deftly", "degrees", + "dehydrate", "deity", "dejected", "delayed", "demonstrate", "dented", "deodorant", "depth", + "desk", "devoid", "dewdrop", "dexterity", "dialect", "dice", "diet", "different", + "digit", "dilute", "dime", "dinner", "diode", "diplomat", "directed", "distance", + "ditch", "divers", "dizzy", "doctor", "dodge", "does", "dogs", "doing", + "dolphin", "domestic", "donuts", "doorway", "dormant", "dosage", "dotted", "double", + "dove", "down", "dozen", "dreams", "drinks", "drowning", "drunk", "drying", + "dual", "dubbed", "duckling", "dude", "duets", "duke", "dullness", "dummy", + "dunes", "duplex", "duration", "dusted", "duties", "dwarf", "dwelt", "dwindling", + "dying", "dynamite", "dyslexic", "each", "eagle", "earth", "easy", "eating", + "eavesdrop", "eccentric", "echo", "eclipse", "economics", "ecstatic", "eden", "edgy", + "edited", "educated", "eels", "efficient", "eggs", "egotistic", "eight", "either", + "eject", "elapse", "elbow", "eldest", "eleven", "elite", "elope", "else", + "eluded", "emails", "ember", "emerge", "emit", "emotion", "empty", "emulate", + "energy", "enforce", "enhanced", "enigma", "enjoy", "enlist", "enmity", "enough", + "enraged", "ensign", "entrance", "envy", "epoxy", "equip", "erase", "erected", + "erosion", "error", "eskimos", "espionage", "essential", "estate", "etched", "eternal", + "ethics", "etiquette", "evaluate", "evenings", "evicted", "evolved", "examine", "excess", + "exhale", "exit", "exotic", "exquisite", "extra", "exult", "fabrics", "factual", + "fading", "fainted", "faked", "fall", "family", "fancy", "farming", "fatal", + "faulty", "fawns", "faxed", "fazed", "feast", "february", "federal", "feel", + "feline", "females", "fences", "ferry", "festival", "fetches", "fever", "fewest", + "fiat", "fibula", "fictional", "fidget", "fierce", "fifteen", "fight", "films", + "firm", "fishing", "fitting", "five", "fixate", "fizzle", "fleet", "flippant", + "flying", "foamy", "focus", "foes", "foggy", "foiled", "folding", "fonts", + "foolish", "fossil", "fountain", "fowls", "foxes", "foyer", "framed", "friendly", + "frown", "fruit", "frying", "fudge", "fuel", "fugitive", "fully", "fuming", + "fungal", "furnished", "fuselage", "future", "fuzzy", "gables", "gadget", "gags", + "gained", "galaxy", "gambit", "gang", "gasp", "gather", "gauze", "gave", + "gawk", "gaze", "gearbox", "gecko", "geek", "gels", "gemstone", "general", + "geometry", "germs", "gesture", "getting", "geyser", "ghetto", "ghost", "giant", + "giddy", "gifts", "gigantic", "gills", "gimmick", "ginger", "girth", "giving", + "glass", "gleeful", "glide", "gnaw", "gnome", "goat", "goblet", "godfather", + "goes", "goggles", "going", "goldfish", "gone", "goodbye", "gopher", "gorilla", + "gossip", "gotten", "gourmet", "governing", "gown", "greater", "grunt", "guarded", + "guest", "guide", "gulp", "gumball", "guru", "gusts", "gutter", "guys", + "gymnast", "gypsy", "gyrate", "habitat", "hacksaw", "haggled", "hairy", "hamburger", + "happens", "hashing", "hatchet", "haunted", "having", "hawk", "haystack", "hazard", + "hectare", "hedgehog", "heels", "hefty", "height", "hemlock", "hence", "heron", + "hesitate", "hexagon", "hickory", "hiding", "highway", "hijack", "hiker", "hills", + "himself", "hinder", "hippo", "hire", "history", "hitched", "hive", "hoax", + "hobby", "hockey", "hoisting", "hold", "honked", "hookup", "hope", "hornet", + "hospital", "hotel", "hounded", "hover", "howls", "hubcaps", "huddle", "huge", + "hull", "humid", "hunter", "hurried", "husband", "huts", "hybrid", "hydrogen", + "hyper", "iceberg", "icing", "icon", "identity", "idiom", "idled", "idols", + "igloo", "ignore", "iguana", "illness", "imagine", "imbalance", "imitate", "impel", + "inactive", "inbound", "incur", "industrial", "inexact", "inflamed", "ingested", "initiate", + "injury", "inkling", "incline", "inmate", "innocent", "inorganic", "input", "inquest", + "inroads", "insult", "intended", "inundate", "invoke", "inwardly", "ionic", "irate", + "iris", "irony", "irritate", "island", "isolated", "issued", "italics", "itches", + "items", "itinerary", "itself", "ivory", "jabbed", "jackets", "jaded", "jagged", + "jailed", "jamming", "january", "jargon", "jaunt", "javelin", "jaws", "jazz", + "jeans", "jeers", "jellyfish", "jeopardy", "jerseys", "jester", "jetting", "jewels", + "jigsaw", "jingle", "jittery", "jive", "jobs", "jockey", "jogger", "joining", + "joking", "jolted", "jostle", "journal", "joyous", "jubilee", "judge", "juggled", + "juicy", "jukebox", "july", "jump", "junk", "jury", "justice", "juvenile", + "kangaroo", "karate", "keep", "kennel", "kept", "kernels", "kettle", "keyboard", + "kickoff", "kidneys", "king", "kiosk", "kisses", "kitchens", "kiwi", "knapsack", + "knee", "knife", "knowledge", "knuckle", "koala", "laboratory", "ladder", "lagoon", + "lair", "lakes", "lamb", "language", "laptop", "large", "last", "later", + "launching", "lava", "lawsuit", "layout", "lazy", "lectures", "ledge", "leech", + "left", "legion", "leisure", "lemon", "lending", "leopard", "lesson", "lettuce", + "lexicon", "liar", "library", "licks", "lids", "lied", "lifestyle", "light", + "likewise", "lilac", "limits", "linen", "lion", "lipstick", "liquid", "listen", + "lively", "loaded", "lobster", "locker", "lodge", "lofty", "logic", "loincloth", + "long", "looking", "lopped", "lordship", "losing", "lottery", "loudly", "love", + "lower", "loyal", "lucky", "luggage", "lukewarm", "lullaby", "lumber", "lunar", + "lurk", "lush", "luxury", "lymph", "lynx", "lyrics", "macro", "madness", + "magically", "mailed", "major", "makeup", "malady", "mammal", "maps", "masterful", + "match", "maul", "maverick", "maximum", "mayor", "maze", "meant", "mechanic", + "medicate", "meeting", "megabyte", "melting", "memoir", "menu", "merger", "mesh", + "metro", "mews", "mice", "midst", "mighty", "mime", "mirror", "misery", + "mittens", "mixture", "moat", "mobile", "mocked", "mohawk", "moisture", "molten", + "moment", "money", "moon", "mops", "morsel", "mostly", "motherly", "mouth", + "movement", "mowing", "much", "muddy", "muffin", "mugged", "mullet", "mumble", + "mundane", "muppet", "mural", "musical", "muzzle", "myriad", "mystery", "myth", + "nabbing", "nagged", "nail", "names", "nanny", "napkin", "narrate", "nasty", + "natural", "nautical", "navy", "nearby", "necklace", "needed", "negative", "neither", + "neon", "nephew", "nerves", "nestle", "network", "neutral", "never", "newt", + "nexus", "nibs", "niche", "niece", "nifty", "nightly", "nimbly", "nineteen", + "nirvana", "nitrogen", "nobody", "nocturnal", "nodes", "noises", "nomad", "noodles", + "northern", "nostril", "noted", "nouns", "novelty", "nowhere", "nozzle", "nuance", + "nucleus", "nudged", "nugget", "nuisance", "null", "number", "nuns", "nurse", + "nutshell", "nylon", "oaks", "oars", "oasis", "oatmeal", "obedient", "object", + "obliged", "obnoxious", "observant", "obtains", "obvious", "occur", "ocean", "october", + "odds", "odometer", "offend", "often", "oilfield", "ointment", "okay", "older", + "olive", "olympics", "omega", "omission", "omnibus", "onboard", "oncoming", "oneself", + "ongoing", "onion", "online", "onslaught", "onto", "onward", "oozed", "opacity", + "opened", "opposite", "optical", "opus", "orange", "orbit", "orchid", "orders", + "organs", "origin", "ornament", "orphans", "oscar", "ostrich", "otherwise", "otter", + "ouch", "ought", "ounce", "launchpad", "oust", "outbreak", "oval", "oven", + "owed", "owls", "owner", "oxidant", "oxygen", "oyster", "ozone", "pact", + "paddles", "pager", "pairing", "palace", "pamphlet", "pancakes", "paper", "paradise", + "pastry", "patio", "pause", "pavements", "pawnshop", "payment", "peaches", "pebbles", + "peculiar", "pedantic", "peeled", "pegs", "pelican", "pencil", "people", "pepper", + "perfect", "pests", "petals", "phase", "pheasants", "phone", "phrases", "physics", + "piano", "picked", "pierce", "pigment", "piloted", "pimple", "pinched", "pioneer", + "pipeline", "pirate", "pistons", "pitched", "pivot", "pixels", "pizza", "playful", + "pledge", "pliers", "plotting", "plus", "plywood", "poaching", "pockets", "podcast", + "poetry", "point", "poker", "polar", "ponies", "pool", "popular", "portents", + "possible", "potato", "pouch", "poverty", "powder", "pram", "present", "pride", + "problems", "pruned", "prying", "psychic", "public", "puck", "puddle", "puffin", + "pulp", "pumpkins", "punch", "puppy", "purged", "push", "putty", "puzzled", + "pylons", "pyramid", "python", "queen", "quick", "quote", "rabbits", "racetrack", + "radar", "rafts", "rage", "railway", "raking", "rally", "ramped", "randomly", + "rapid", "rarest", "rash", "rated", "ravine", "rays", "razor", "react", + "rebel", "recipe", "reduce", "reef", "refer", "regular", "reheat", "reinvest", + "rejoices", "rekindle", "relic", "remedy", "renting", "reorder", "repent", "request", + "reruns", "rest", "return", "reunion", "revamp", "rewind", "rhino", "rhythm", + "ribbon", "richly", "ridges", "rift", "rigid", "rims", "ringing", "riots", + "ripped", "rising", "ritual", "river", "roared", "robot", "rockets", "rodent", + "rogue", "roles", "romance", "roomy", "roped", "roster", "rotate", "rounded", + "rover", "rowboat", "royal", "ruby", "rudely", "ruffled", "rugged", "ruined", + "ruling", "rumble", "runway", "rural", "rustled", "ruthless", "sabotage", "sack", + "sadness", "safety", "saga", "sailor", "sake", "salads", "sample", "sanity", + "sapling", "sarcasm", "sash", "satin", "saucepan", "saved", "sawmill", "saxophone", + "sayings", "scamper", "scenic", "school", "science", "scoop", "scrub", "scuba", + "seasons", "second", "sedan", "seeded", "segments", "seismic", "selfish", "semifinal", + "sensible", "september", "sequence", "serving", "session", "setup", "seventh", "sewage", + "shackles", "shelter", "shipped", "shocking", "shrugged", "shuffled", "shyness", "siblings", + "sickness", "sidekick", "sieve", "sifting", "sighting", "silk", "simplest", "sincerely", + "sipped", "siren", "situated", "sixteen", "sizes", "skater", "skew", "skirting", + "skulls", "skydive", "slackens", "sleepless", "slid", "slower", "slug", "smash", + "smelting", "smidgen", "smog", "smuggled", "snake", "sneeze", "sniff", "snout", + "snug", "soapy", "sober", "soccer", "soda", "software", "soggy", "soil", + "solved", "somewhere", "sonic", "soothe", "soprano", "sorry", "southern", "sovereign", + "sowed", "soya", "space", "speedy", "sphere", "spiders", "splendid", "spout", + "sprig", "spud", "spying", "square", "stacking", "stellar", "stick", "stockpile", + "strained", "stunning", "stylishly", "subtly", "succeed", "suddenly", "suede", "suffice", + "sugar", "suitcase", "sulking", "summon", "sunken", "superior", "surfer", "sushi", + "suture", "swagger", "swept", "swiftly", "sword", "swung", "syllabus", "symptoms", + "syndrome", "syringe", "system", "taboo", "tacit", "tadpoles", "tagged", "tail", + "taken", "talent", "tamper", "tanks", "tapestry", "tarnished", "tasked", "tattoo", + "taunts", "tavern", "tawny", "taxi", "teardrop", "technical", "tedious", "teeming", + "tell", "template", "tender", "tepid", "tequila", "terminal", "testing", "tether", + "textbook", "thaw", "theatrics", "thirsty", "thorn", "threaten", "thumbs", "thwart", + "ticket", "tidy", "tiers", "tiger", "tilt", "timber", "tinted", "tipsy", + "tirade", "tissue", "titans", "toaster", "tobacco", "today", "toenail", "toffee", + "together", "toilet", "token", "tolerant", "tomorrow", "tonic", "toolbox", "topic", + "torch", "tossed", "total", "touchy", "towel", "toxic", "toyed", "trash", + "trendy", "tribal", "trolling", "truth", "trying", "tsunami", "tubes", "tucks", + "tudor", "tuesday", "tufts", "tugs", "tuition", "tulips", "tumbling", "tunnel", + "turnip", "tusks", "tutor", "tuxedo", "twang", "tweezers", "twice", "twofold", + "tycoon", "typist", "tyrant", "ugly", "ulcers", "ultimate", "umbrella", "umpire", + "unafraid", "unbending", "uncle", "under", "uneven", "unfit", "ungainly", "unhappy", + "union", "unjustly", "unknown", "unlikely", "unmask", "unnoticed", "unopened", "unplugs", + "unquoted", "unrest", "unsafe", "until", "unusual", "unveil", "unwind", "unzip", + "upbeat", "upcoming", "update", "upgrade", "uphill", "upkeep", "upload", "upon", + "upper", "upright", "upstairs", "uptight", "upwards", "urban", "urchins", "urgent", + "usage", "useful", "usher", "using", "usual", "utensils", "utility", "utmost", + "utopia", "uttered", "vacation", "vague", "vain", "value", "vampire", "vane", + "vapidly", "vary", "vastness", "vats", "vaults", "vector", "veered", "vegan", + "vehicle", "vein", "velvet", "venomous", "verification", "vessel", "veteran", "vexed", + "vials", "vibrate", "victim", "video", "viewpoint", "vigilant", "viking", "village", + "vinegar", "violin", "vipers", "virtual", "visited", "vitals", "vivid", "vixen", + "vocal", "vogue", "voice", "volcano", "vortex", "voted", "voucher", "vowels", + "voyage", "vulture", "wade", "waffle", "wagtail", "waist", "waking", "wallets", + "wanted", "warped", "washing", "water", "waveform", "waxing", "wayside", "weavers", + "website", "wedge", "weekday", "weird", "welders", "went", "wept", "were", + "western", "wetsuit", "whale", "when", "whipped", "whole", "wickets", "width", + "wield", "wife", "wiggle", "wildly", "winter", "wipeout", "wiring", "wise", + "withdrawn", "wives", "wizard", "wobbly", "woes", "woken", "wolf", "womanly", + "wonders", "woozy", "worry", "wounded", "woven", "wrap", "wrist", "wrong", + "yacht", "yahoo", "yanks", "yard", "yawning", "yearbook", "yellow", "yesterday", + "yeti", "yields", "yodel", "yoga", "younger", "yoyo", "zapped", "zeal", + "zebra", "zero", "zesty", "zigzags", "zinger", "zippers", "zodiac", "zombie", + "zones", "zoom" + ] + }, + 'spanish': { + prefix_len: 4, + words: [ + "ábaco", "abdomen", "abeja", "abierto", "abogado", "abono", "aborto", "abrazo", + "abrir", "abuelo", "abuso", "acabar", "academia", "acceso", "acción", "aceite", + "acelga", "acento", "aceptar", "ácido", "aclarar", "acné", "acoger", "acoso", + "activo", "acto", "actriz", "actuar", "acudir", "acuerdo", "acusar", "adicto", + "admitir", "adoptar", "adorno", "aduana", "adulto", "aéreo", "afectar", "afición", + "afinar", "afirmar", "ágil", "agitar", "agonía", "agosto", "agotar", "agregar", + "agrio", "agua", "agudo", "águila", "aguja", "ahogo", "ahorro", "aire", + "aislar", "ajedrez", "ajeno", "ajuste", "alacrán", "alambre", "alarma", "alba", + "álbum", "alcalde", "aldea", "alegre", "alejar", "alerta", "aleta", "alfiler", + "alga", "algodón", "aliado", "aliento", "alivio", "alma", "almeja", "almíbar", + "altar", "alteza", "altivo", "alto", "altura", "alumno", "alzar", "amable", + "amante", "amapola", "amargo", "amasar", "ámbar", "ámbito", "ameno", "amigo", + "amistad", "amor", "amparo", "amplio", "ancho", "anciano", "ancla", "andar", + "andén", "anemia", "ángulo", "anillo", "ánimo", "anís", "anotar", "antena", + "antiguo", "antojo", "anual", "anular", "anuncio", "añadir", "añejo", "año", + "apagar", "aparato", "apetito", "apio", "aplicar", "apodo", "aporte", "apoyo", + "aprender", "aprobar", "apuesta", "apuro", "arado", "araña", "arar", "árbitro", + "árbol", "arbusto", "archivo", "arco", "arder", "ardilla", "arduo", "área", + "árido", "aries", "armonía", "arnés", "aroma", "arpa", "arpón", "arreglo", + "arroz", "arruga", "arte", "artista", "asa", "asado", "asalto", "ascenso", + "asegurar", "aseo", "asesor", "asiento", "asilo", "asistir", "asno", "asombro", + "áspero", "astilla", "astro", "astuto", "asumir", "asunto", "atajo", "ataque", + "atar", "atento", "ateo", "ático", "atleta", "átomo", "atraer", "atroz", + "atún", "audaz", "audio", "auge", "aula", "aumento", "ausente", "autor", + "aval", "avance", "avaro", "ave", "avellana", "avena", "avestruz", "avión", + "aviso", "ayer", "ayuda", "ayuno", "azafrán", "azar", "azote", "azúcar", + "azufre", "azul", "baba", "babor", "bache", "bahía", "baile", "bajar", + "balanza", "balcón", "balde", "bambú", "banco", "banda", "baño", "barba", + "barco", "barniz", "barro", "báscula", "bastón", "basura", "batalla", "batería", + "batir", "batuta", "baúl", "bazar", "bebé", "bebida", "bello", "besar", + "beso", "bestia", "bicho", "bien", "bingo", "blanco", "bloque", "blusa", + "boa", "bobina", "bobo", "boca", "bocina", "boda", "bodega", "boina", + "bola", "bolero", "bolsa", "bomba", "bondad", "bonito", "bono", "bonsái", + "borde", "borrar", "bosque", "bote", "botín", "bóveda", "bozal", "bravo", + "brazo", "brecha", "breve", "brillo", "brinco", "brisa", "broca", "broma", + "bronce", "brote", "bruja", "brusco", "bruto", "buceo", "bucle", "bueno", + "buey", "bufanda", "bufón", "búho", "buitre", "bulto", "burbuja", "burla", + "burro", "buscar", "butaca", "buzón", "caballo", "cabeza", "cabina", "cabra", + "cacao", "cadáver", "cadena", "caer", "café", "caída", "caimán", "caja", + "cajón", "cal", "calamar", "calcio", "caldo", "calidad", "calle", "calma", + "calor", "calvo", "cama", "cambio", "camello", "camino", "campo", "cáncer", + "candil", "canela", "canguro", "canica", "canto", "caña", "cañón", "caoba", + "caos", "capaz", "capitán", "capote", "captar", "capucha", "cara", "carbón", + "cárcel", "careta", "carga", "cariño", "carne", "carpeta", "carro", "carta", + "casa", "casco", "casero", "caspa", "castor", "catorce", "catre", "caudal", + "causa", "cazo", "cebolla", "ceder", "cedro", "celda", "célebre", "celoso", + "célula", "cemento", "ceniza", "centro", "cerca", "cerdo", "cereza", "cero", + "cerrar", "certeza", "césped", "cetro", "chacal", "chaleco", "champú", "chancla", + "chapa", "charla", "chico", "chiste", "chivo", "choque", "choza", "chuleta", + "chupar", "ciclón", "ciego", "cielo", "cien", "cierto", "cifra", "cigarro", + "cima", "cinco", "cine", "cinta", "ciprés", "circo", "ciruela", "cisne", + "cita", "ciudad", "clamor", "clan", "claro", "clase", "clave", "cliente", + "clima", "clínica", "cobre", "cocción", "cochino", "cocina", "coco", "código", + "codo", "cofre", "coger", "cohete", "cojín", "cojo", "cola", "colcha", + "colegio", "colgar", "colina", "collar", "colmo", "columna", "combate", "comer", + "comida", "cómodo", "compra", "conde", "conejo", "conga", "conocer", "consejo", + "contar", "copa", "copia", "corazón", "corbata", "corcho", "cordón", "corona", + "correr", "coser", "cosmos", "costa", "cráneo", "cráter", "crear", "crecer", + "creído", "crema", "cría", "crimen", "cripta", "crisis", "cromo", "crónica", + "croqueta", "crudo", "cruz", "cuadro", "cuarto", "cuatro", "cubo", "cubrir", + "cuchara", "cuello", "cuento", "cuerda", "cuesta", "cueva", "cuidar", "culebra", + "culpa", "culto", "cumbre", "cumplir", "cuna", "cuneta", "cuota", "cupón", + "cúpula", "curar", "curioso", "curso", "curva", "cutis", "dama", "danza", + "dar", "dardo", "dátil", "deber", "débil", "década", "decir", "dedo", + "defensa", "definir", "dejar", "delfín", "delgado", "delito", "demora", "denso", + "dental", "deporte", "derecho", "derrota", "desayuno", "deseo", "desfile", "desnudo", + "destino", "desvío", "detalle", "detener", "deuda", "día", "diablo", "diadema", + "diamante", "diana", "diario", "dibujo", "dictar", "diente", "dieta", "diez", + "difícil", "digno", "dilema", "diluir", "dinero", "directo", "dirigir", "disco", + "diseño", "disfraz", "diva", "divino", "doble", "doce", "dolor", "domingo", + "don", "donar", "dorado", "dormir", "dorso", "dos", "dosis", "dragón", + "droga", "ducha", "duda", "duelo", "dueño", "dulce", "dúo", "duque", + "durar", "dureza", "duro", "ébano", "ebrio", "echar", "eco", "ecuador", + "edad", "edición", "edificio", "editor", "educar", "efecto", "eficaz", "eje", + "ejemplo", "elefante", "elegir", "elemento", "elevar", "elipse", "élite", "elixir", + "elogio", "eludir", "embudo", "emitir", "emoción", "empate", "empeño", "empleo", + "empresa", "enano", "encargo", "enchufe", "encía", "enemigo", "enero", "enfado", + "enfermo", "engaño", "enigma", "enlace", "enorme", "enredo", "ensayo", "enseñar", + "entero", "entrar", "envase", "envío", "época", "equipo", "erizo", "escala", + "escena", "escolar", "escribir", "escudo", "esencia", "esfera", "esfuerzo", "espada", + "espejo", "espía", "esposa", "espuma", "esquí", "estar", "este", "estilo", + "estufa", "etapa", "eterno", "ética", "etnia", "evadir", "evaluar", "evento", + "evitar", "exacto", "examen", "exceso", "excusa", "exento", "exigir", "exilio", + "existir", "éxito", "experto", "explicar", "exponer", "extremo", "fábrica", "fábula", + "fachada", "fácil", "factor", "faena", "faja", "falda", "fallo", "falso", + "faltar", "fama", "familia", "famoso", "faraón", "farmacia", "farol", "farsa", + "fase", "fatiga", "fauna", "favor", "fax", "febrero", "fecha", "feliz", + "feo", "feria", "feroz", "fértil", "fervor", "festín", "fiable", "fianza", + "fiar", "fibra", "ficción", "ficha", "fideo", "fiebre", "fiel", "fiera", + "fiesta", "figura", "fijar", "fijo", "fila", "filete", "filial", "filtro", + "fin", "finca", "fingir", "finito", "firma", "flaco", "flauta", "flecha", + "flor", "flota", "fluir", "flujo", "flúor", "fobia", "foca", "fogata", + "fogón", "folio", "folleto", "fondo", "forma", "forro", "fortuna", "forzar", + "fosa", "foto", "fracaso", "frágil", "franja", "frase", "fraude", "freír", + "freno", "fresa", "frío", "frito", "fruta", "fuego", "fuente", "fuerza", + "fuga", "fumar", "función", "funda", "furgón", "furia", "fusil", "fútbol", + "futuro", "gacela", "gafas", "gaita", "gajo", "gala", "galería", "gallo", + "gamba", "ganar", "gancho", "ganga", "ganso", "garaje", "garza", "gasolina", + "gastar", "gato", "gavilán", "gemelo", "gemir", "gen", "género", "genio", + "gente", "geranio", "gerente", "germen", "gesto", "gigante", "gimnasio", "girar", + "giro", "glaciar", "globo", "gloria", "gol", "golfo", "goloso", "golpe", + "goma", "gordo", "gorila", "gorra", "gota", "goteo", "gozar", "grada", + "gráfico", "grano", "grasa", "gratis", "grave", "grieta", "grillo", "gripe", + "gris", "grito", "grosor", "grúa", "grueso", "grumo", "grupo", "guante", + "guapo", "guardia", "guerra", "guía", "guiño", "guion", "guiso", "guitarra", + "gusano", "gustar", "haber", "hábil", "hablar", "hacer", "hacha", "hada", + "hallar", "hamaca", "harina", "haz", "hazaña", "hebilla", "hebra", "hecho", + "helado", "helio", "hembra", "herir", "hermano", "héroe", "hervir", "hielo", + "hierro", "hígado", "higiene", "hijo", "himno", "historia", "hocico", "hogar", + "hoguera", "hoja", "hombre", "hongo", "honor", "honra", "hora", "hormiga", + "horno", "hostil", "hoyo", "hueco", "huelga", "huerta", "hueso", "huevo", + "huida", "huir", "humano", "húmedo", "humilde", "humo", "hundir", "huracán", + "hurto", "icono", "ideal", "idioma", "ídolo", "iglesia", "iglú", "igual", + "ilegal", "ilusión", "imagen", "imán", "imitar", "impar", "imperio", "imponer", + "impulso", "incapaz", "índice", "inerte", "infiel", "informe", "ingenio", "inicio", + "inmenso", "inmune", "innato", "insecto", "instante", "interés", "íntimo", "intuir", + "inútil", "invierno", "ira", "iris", "ironía", "isla", "islote", "jabalí", + "jabón", "jamón", "jarabe", "jardín", "jarra", "jaula", "jazmín", "jefe", + "jeringa", "jinete", "jornada", "joroba", "joven", "joya", "juerga", "jueves", + "juez", "jugador", "jugo", "juguete", "juicio", "junco", "jungla", "junio", + "juntar", "júpiter", "jurar", "justo", "juvenil", "juzgar", "kilo", "koala", + "labio", "lacio", "lacra", "lado", "ladrón", "lagarto", "lágrima", "laguna", + "laico", "lamer", "lámina", "lámpara", "lana", "lancha", "langosta", "lanza", + "lápiz", "largo", "larva", "lástima", "lata", "látex", "latir", "laurel", + "lavar", "lazo", "leal", "lección", "leche", "lector", "leer", "legión", + "legumbre", "lejano", "lengua", "lento", "leña", "león", "leopardo", "lesión", + "letal", "letra", "leve", "leyenda", "libertad", "libro", "licor", "líder", + "lidiar", "lienzo", "liga", "ligero", "lima", "límite", "limón", "limpio", + "lince", "lindo", "línea", "lingote", "lino", "linterna", "líquido", "liso", + "lista", "litera", "litio", "litro", "llaga", "llama", "llanto", "llave", + "llegar", "llenar", "llevar", "llorar", "llover", "lluvia", "lobo", "loción", + "loco", "locura", "lógica", "logro", "lombriz", "lomo", "lonja", "lote", + "lucha", "lucir", "lugar", "lujo", "luna", "lunes", "lupa", "lustro", + "luto", "luz", "maceta", "macho", "madera", "madre", "maduro", "maestro", + "mafia", "magia", "mago", "maíz", "maldad", "maleta", "malla", "malo", + "mamá", "mambo", "mamut", "manco", "mando", "manejar", "manga", "maniquí", + "manjar", "mano", "manso", "manta", "mañana", "mapa", "máquina", "mar", + "marco", "marea", "marfil", "margen", "marido", "mármol", "marrón", "martes", + "marzo", "masa", "máscara", "masivo", "matar", "materia", "matiz", "matriz", + "máximo", "mayor", "mazorca", "mecha", "medalla", "medio", "médula", "mejilla", + "mejor", "melena", "melón", "memoria", "menor", "mensaje", "mente", "menú", + "mercado", "merengue", "mérito", "mes", "mesón", "meta", "meter", "método", + "metro", "mezcla", "miedo", "miel", "miembro", "miga", "mil", "milagro", + "militar", "millón", "mimo", "mina", "minero", "mínimo", "minuto", "miope", + "mirar", "misa", "miseria", "misil", "mismo", "mitad", "mito", "mochila", + "moción", "moda", "modelo", "moho", "mojar", "molde", "moler", "molino", + "momento", "momia", "monarca", "moneda", "monja", "monto", "moño", "morada", + "morder", "moreno", "morir", "morro", "morsa", "mortal", "mosca", "mostrar", + "motivo", "mover", "móvil", "mozo", "mucho", "mudar", "mueble", "muela", + "muerte", "muestra", "mugre", "mujer", "mula", "muleta", "multa", "mundo", + "muñeca", "mural", "muro", "músculo", "museo", "musgo", "música", "muslo", + "nácar", "nación", "nadar", "naipe", "naranja", "nariz", "narrar", "nasal", + "natal", "nativo", "natural", "náusea", "naval", "nave", "navidad", "necio", + "néctar", "negar", "negocio", "negro", "neón", "nervio", "neto", "neutro", + "nevar", "nevera", "nicho", "nido", "niebla", "nieto", "niñez", "niño", + "nítido", "nivel", "nobleza", "noche", "nómina", "noria", "norma", "norte", + "nota", "noticia", "novato", "novela", "novio", "nube", "nuca", "núcleo", + "nudillo", "nudo", "nuera", "nueve", "nuez", "nulo", "número", "nutria", + "oasis", "obeso", "obispo", "objeto", "obra", "obrero", "observar", "obtener", + "obvio", "oca", "ocaso", "océano", "ochenta", "ocho", "ocio", "ocre", + "octavo", "octubre", "oculto", "ocupar", "ocurrir", "odiar", "odio", "odisea", + "oeste", "ofensa", "oferta", "oficio", "ofrecer", "ogro", "oído", "oír", + "ojo", "ola", "oleada", "olfato", "olivo", "olla", "olmo", "olor", + "olvido", "ombligo", "onda", "onza", "opaco", "opción", "ópera", "opinar", + "oponer", "optar", "óptica", "opuesto", "oración", "orador", "oral", "órbita", + "orca", "orden", "oreja", "órgano", "orgía", "orgullo", "oriente", "origen", + "orilla", "oro", "orquesta", "oruga", "osadía", "oscuro", "osezno", "oso", + "ostra", "otoño", "otro", "oveja", "óvulo", "óxido", "oxígeno", "oyente", + "ozono", "pacto", "padre", "paella", "página", "pago", "país", "pájaro", + "palabra", "palco", "paleta", "pálido", "palma", "paloma", "palpar", "pan", + "panal", "pánico", "pantera", "pañuelo", "papá", "papel", "papilla", "paquete", + "parar", "parcela", "pared", "parir", "paro", "párpado", "parque", "párrafo", + "parte", "pasar", "paseo", "pasión", "paso", "pasta", "pata", "patio", + "patria", "pausa", "pauta", "pavo", "payaso", "peatón", "pecado", "pecera", + "pecho", "pedal", "pedir", "pegar", "peine", "pelar", "peldaño", "pelea", + "peligro", "pellejo", "pelo", "peluca", "pena", "pensar", "peñón", "peón", + "peor", "pepino", "pequeño", "pera", "percha", "perder", "pereza", "perfil", + "perico", "perla", "permiso", "perro", "persona", "pesa", "pesca", "pésimo", + "pestaña", "pétalo", "petróleo", "pez", "pezuña", "picar", "pichón", "pie", + "piedra", "pierna", "pieza", "pijama", "pilar", "piloto", "pimienta", "pino", + "pintor", "pinza", "piña", "piojo", "pipa", "pirata", "pisar", "piscina", + "piso", "pista", "pitón", "pizca", "placa", "plan", "plata", "playa", + "plaza", "pleito", "pleno", "plomo", "pluma", "plural", "pobre", "poco", + "poder", "podio", "poema", "poesía", "poeta", "polen", "policía", "pollo", + "polvo", "pomada", "pomelo", "pomo", "pompa", "poner", "porción", "portal", + "posada", "poseer", "posible", "poste", "potencia", "potro", "pozo", "prado", + "precoz", "pregunta", "premio", "prensa", "preso", "previo", "primo", "príncipe", + "prisión", "privar", "proa", "probar", "proceso", "producto", "proeza", "profesor", + "programa", "prole", "promesa", "pronto", "propio", "próximo", "prueba", "público", + "puchero", "pudor", "pueblo", "puerta", "puesto", "pulga", "pulir", "pulmón", + "pulpo", "pulso", "puma", "punto", "puñal", "puño", "pupa", "pupila", + "puré", "quedar", "queja", "quemar", "querer", "queso", "quieto", "química", + "quince", "quitar", "rábano", "rabia", "rabo", "ración", "radical", "raíz", + "rama", "rampa", "rancho", "rango", "rapaz", "rápido", "rapto", "rasgo", + "raspa", "rato", "rayo", "raza", "razón", "reacción", "realidad", "rebaño", + "rebote", "recaer", "receta", "rechazo", "recoger", "recreo", "recto", "recurso", + "red", "redondo", "reducir", "reflejo", "reforma", "refrán", "refugio", "regalo", + "regir", "regla", "regreso", "rehén", "reino", "reír", "reja", "relato", + "relevo", "relieve", "relleno", "reloj", "remar", "remedio", "remo", "rencor", + "rendir", "renta", "reparto", "repetir", "reposo", "reptil", "res", "rescate", + "resina", "respeto", "resto", "resumen", "retiro", "retorno", "retrato", "reunir", + "revés", "revista", "rey", "rezar", "rico", "riego", "rienda", "riesgo", + "rifa", "rígido", "rigor", "rincón", "riñón", "río", "riqueza", "risa", + "ritmo", "rito" + ] + }, + 'portuguese': { + prefix_len: 3, + words: [ + "abaular", "abdominal", "abeto", "abissinio", "abjeto", "ablucao", "abnegar", "abotoar", + "abrutalhar", "absurdo", "abutre", "acautelar", "accessorios", "acetona", "achocolatado", "acirrar", + "acne", "acovardar", "acrostico", "actinomicete", "acustico", "adaptavel", "adeus", "adivinho", + "adjunto", "admoestar", "adnominal", "adotivo", "adquirir", "adriatico", "adsorcao", "adutora", + "advogar", "aerossol", "afazeres", "afetuoso", "afixo", "afluir", "afortunar", "afrouxar", + "aftosa", "afunilar", "agentes", "agito", "aglutinar", "aiatola", "aimore", "aino", + "aipo", "airoso", "ajeitar", "ajoelhar", "ajudante", "ajuste", "alazao", "albumina", + "alcunha", "alegria", "alexandre", "alforriar", "alguns", "alhures", "alivio", "almoxarife", + "alotropico", "alpiste", "alquimista", "alsaciano", "altura", "aluviao", "alvura", "amazonico", + "ambulatorio", "ametodico", "amizades", "amniotico", "amovivel", "amurada", "anatomico", "ancorar", + "anexo", "anfora", "aniversario", "anjo", "anotar", "ansioso", "anturio", "anuviar", + "anverso", "anzol", "aonde", "apaziguar", "apito", "aplicavel", "apoteotico", "aprimorar", + "aprumo", "apto", "apuros", "aquoso", "arauto", "arbusto", "arduo", "aresta", + "arfar", "arguto", "aritmetico", "arlequim", "armisticio", "aromatizar", "arpoar", "arquivo", + "arrumar", "arsenio", "arturiano", "aruaque", "arvores", "asbesto", "ascorbico", "aspirina", + "asqueroso", "assustar", "astuto", "atazanar", "ativo", "atletismo", "atmosferico", "atormentar", + "atroz", "aturdir", "audivel", "auferir", "augusto", "aula", "aumento", "aurora", + "autuar", "avatar", "avexar", "avizinhar", "avolumar", "avulso", "axiomatico", "azerbaijano", + "azimute", "azoto", "azulejo", "bacteriologista", "badulaque", "baforada", "baixote", "bajular", + "balzaquiana", "bambuzal", "banzo", "baoba", "baqueta", "barulho", "bastonete", "batuta", + "bauxita", "bavaro", "bazuca", "bcrepuscular", "beato", "beduino", "begonia", "behaviorista", + "beisebol", "belzebu", "bemol", "benzido", "beocio", "bequer", "berro", "besuntar", + "betume", "bexiga", "bezerro", "biatlon", "biboca", "bicuspide", "bidirecional", "bienio", + "bifurcar", "bigorna", "bijuteria", "bimotor", "binormal", "bioxido", "bipolarizacao", "biquini", + "birutice", "bisturi", "bituca", "biunivoco", "bivalve", "bizarro", "blasfemo", "blenorreia", + "blindar", "bloqueio", "blusao", "boazuda", "bofete", "bojudo", "bolso", "bombordo", + "bonzo", "botina", "boquiaberto", "bostoniano", "botulismo", "bourbon", "bovino", "boximane", + "bravura", "brevidade", "britar", "broxar", "bruno", "bruxuleio", "bubonico", "bucolico", + "buda", "budista", "bueiro", "buffer", "bugre", "bujao", "bumerangue", "burundines", + "busto", "butique", "buzios", "caatinga", "cabuqui", "cacunda", "cafuzo", "cajueiro", + "camurca", "canudo", "caquizeiro", "carvoeiro", "casulo", "catuaba", "cauterizar", "cebolinha", + "cedula", "ceifeiro", "celulose", "cerzir", "cesto", "cetro", "ceus", "cevar", + "chavena", "cheroqui", "chita", "chovido", "chuvoso", "ciatico", "cibernetico", "cicuta", + "cidreira", "cientistas", "cifrar", "cigarro", "cilio", "cimo", "cinzento", "cioso", + "cipriota", "cirurgico", "cisto", "citrico", "ciumento", "civismo", "clavicula", "clero", + "clitoris", "cluster", "coaxial", "cobrir", "cocota", "codorniz", "coexistir", "cogumelo", + "coito", "colusao", "compaixao", "comutativo", "contentamento", "convulsivo", "coordenativa", "coquetel", + "correto", "corvo", "costureiro", "cotovia", "covil", "cozinheiro", "cretino", "cristo", + "crivo", "crotalo", "cruzes", "cubo", "cucuia", "cueiro", "cuidar", "cujo", + "cultural", "cunilingua", "cupula", "curvo", "custoso", "cutucar", "czarismo", "dablio", + "dacota", "dados", "daguerreotipo", "daiquiri", "daltonismo", "damista", "dantesco", "daquilo", + "darwinista", "dasein", "dativo", "deao", "debutantes", "decurso", "deduzir", "defunto", + "degustar", "dejeto", "deltoide", "demover", "denunciar", "deputado", "deque", "dervixe", + "desvirtuar", "deturpar", "deuteronomio", "devoto", "dextrose", "dezoito", "diatribe", "dicotomico", + "didatico", "dietista", "difuso", "digressao", "diluvio", "diminuto", "dinheiro", "dinossauro", + "dioxido", "diplomatico", "dique", "dirimivel", "disturbio", "diurno", "divulgar", "dizivel", + "doar", "dobro", "docura", "dodoi", "doer", "dogue", "doloso", "domo", + "donzela", "doping", "dorsal", "dossie", "dote", "doutro", "doze", "dravidico", + "dreno", "driver", "dropes", "druso", "dubnio", "ducto", "dueto", "dulija", + "dundum", "duodeno", "duquesa", "durou", "duvidoso", "duzia", "ebano", "ebrio", + "eburneo", "echarpe", "eclusa", "ecossistema", "ectoplasma", "ecumenismo", "eczema", "eden", + "editorial", "edredom", "edulcorar", "efetuar", "efigie", "efluvio", "egiptologo", "egresso", + "egua", "einsteiniano", "eira", "eivar", "eixos", "ejetar", "elastomero", "eldorado", + "elixir", "elmo", "eloquente", "elucidativo", "emaranhar", "embutir", "emerito", "emfa", + "emitir", "emotivo", "empuxo", "emulsao", "enamorar", "encurvar", "enduro", "enevoar", + "enfurnar", "enguico", "enho", "enigmista", "enlutar", "enormidade", "enpreendimento", "enquanto", + "enriquecer", "enrugar", "entusiastico", "enunciar", "envolvimento", "enxuto", "enzimatico", "eolico", + "epiteto", "epoxi", "epura", "equivoco", "erario", "erbio", "ereto", "erguido", + "erisipela", "ermo", "erotizar", "erros", "erupcao", "ervilha", "esburacar", "escutar", + "esfuziante", "esguio", "esloveno", "esmurrar", "esoterismo", "esperanca", "espirito", "espurio", + "essencialmente", "esturricar", "esvoacar", "etario", "eterno", "etiquetar", "etnologo", "etos", + "etrusco", "euclidiano", "euforico", "eugenico", "eunuco", "europio", "eustaquio", "eutanasia", + "evasivo", "eventualidade", "evitavel", "evoluir", "exaustor", "excursionista", "exercito", "exfoliado", + "exito", "exotico", "expurgo", "exsudar", "extrusora", "exumar", "fabuloso", "facultativo", + "fado", "fagulha", "faixas", "fajuto", "faltoso", "famoso", "fanzine", "fapesp", + "faquir", "fartura", "fastio", "faturista", "fausto", "favorito", "faxineira", "fazer", + "fealdade", "febril", "fecundo", "fedorento", "feerico", "feixe", "felicidade", "felipe", + "feltro", "femur", "fenotipo", "fervura", "festivo", "feto", "feudo", "fevereiro", + "fezinha", "fiasco", "fibra", "ficticio", "fiduciario", "fiesp", "fifa", "figurino", + "fijiano", "filtro", "finura", "fiorde", "fiquei", "firula", "fissurar", "fitoteca", + "fivela", "fixo", "flavio", "flexor", "flibusteiro", "flotilha", "fluxograma", "fobos", + "foco", "fofura", "foguista", "foie", "foliculo", "fominha", "fonte", "forum", + "fosso", "fotossintese", "foxtrote", "fraudulento", "frevo", "frivolo", "frouxo", "frutose", + "fuba", "fucsia", "fugitivo", "fuinha", "fujao", "fulustreco", "fumo", "funileiro", + "furunculo", "fustigar", "futurologo", "fuxico", "fuzue", "gabriel", "gado", "gaelico", + "gafieira", "gaguejo", "gaivota", "gajo", "galvanoplastico", "gamo", "ganso", "garrucha", + "gastronomo", "gatuno", "gaussiano", "gaviao", "gaxeta", "gazeteiro", "gear", "geiser", + "geminiano", "generoso", "genuino", "geossinclinal", "gerundio", "gestual", "getulista", "gibi", + "gigolo", "gilete", "ginseng", "giroscopio", "glaucio", "glacial", "gleba", "glifo", + "glote", "glutonia", "gnostico", "goela", "gogo", "goitaca", "golpista", "gomo", + "gonzo", "gorro", "gostou", "goticula", "gourmet", "governo", "gozo", "graxo", + "grevista", "grito", "grotesco", "gruta", "guaxinim", "gude", "gueto", "guizo", + "guloso", "gume", "guru", "gustativo", "gustavo", "gutural", "habitue", "haitiano", + "halterofilista", "hamburguer", "hanseniase", "happening", "harpista", "hastear", "haveres", "hebreu", + "hectometro", "hedonista", "hegira", "helena", "helminto", "hemorroidas", "henrique", "heptassilabo", + "hertziano", "hesitar", "heterossexual", "heuristico", "hexagono", "hiato", "hibrido", "hidrostatico", + "hieroglifo", "hifenizar", "higienizar", "hilario", "himen", "hino", "hippie", "hirsuto", + "historiografia", "hitlerista", "hodometro", "hoje", "holograma", "homus", "honroso", "hoquei", + "horto", "hostilizar", "hotentote", "huguenote", "humilde", "huno", "hurra", "hutu", + "iaia", "ialorixa", "iambico", "iansa", "iaque", "iara", "iatista", "iberico", + "ibis", "icar", "iceberg", "icosagono", "idade", "ideologo", "idiotice", "idoso", + "iemenita", "iene", "igarape", "iglu", "ignorar", "igreja", "iguaria", "iidiche", + "ilativo", "iletrado", "ilharga", "ilimitado", "ilogismo", "ilustrissimo", "imaturo", "imbuzeiro", + "imerso", "imitavel", "imovel", "imputar", "imutavel", "inaveriguavel", "incutir", "induzir", + "inextricavel", "infusao", "ingua", "inhame", "iniquo", "injusto", "inning", "inoxidavel", + "inquisitorial", "insustentavel", "intumescimento", "inutilizavel", "invulneravel", "inzoneiro", "iodo", "iogurte", + "ioio", "ionosfera", "ioruba", "iota", "ipsilon", "irascivel", "iris", "irlandes", + "irmaos", "iroques", "irrupcao", "isca", "isento", "islandes", "isotopo", "isqueiro", + "israelita", "isso", "isto", "iterbio", "itinerario", "itrio", "iuane", "iugoslavo", + "jabuticabeira", "jacutinga", "jade", "jagunco", "jainista", "jaleco", "jambo", "jantarada", + "japones", "jaqueta", "jarro", "jasmim", "jato", "jaula", "javel", "jazz", + "jegue", "jeitoso", "jejum", "jenipapo", "jeova", "jequitiba", "jersei", "jesus", + "jetom", "jiboia", "jihad", "jilo", "jingle", "jipe", "jocoso", "joelho", + "joguete", "joio", "jojoba", "jorro", "jota", "joule", "joviano", "jubiloso", + "judoca", "jugular", "juizo", "jujuba", "juliano", "jumento", "junto", "jururu", + "justo", "juta", "juventude", "labutar", "laguna", "laico", "lajota", "lanterninha", + "lapso", "laquear", "lastro", "lauto", "lavrar", "laxativo", "lazer", "leasing", + "lebre", "lecionar", "ledo", "leguminoso", "leitura", "lele", "lemure", "lento", + "leonardo", "leopardo", "lepton", "leque", "leste", "letreiro", "leucocito", "levitico", + "lexicologo", "lhama", "lhufas", "liame", "licoroso", "lidocaina", "liliputiano", "limusine", + "linotipo", "lipoproteina", "liquidos", "lirismo", "lisura", "liturgico", "livros", "lixo", + "lobulo", "locutor", "lodo", "logro", "lojista", "lombriga", "lontra", "loop", + "loquaz", "lorota", "losango", "lotus", "louvor", "luar", "lubrificavel", "lucros", + "lugubre", "luis", "luminoso", "luneta", "lustroso", "luto", "luvas", "luxuriante", + "luzeiro", "maduro", "maestro", "mafioso", "magro", "maiuscula", "majoritario", "malvisto", + "mamute", "manutencao", "mapoteca", "maquinista", "marzipa", "masturbar", "matuto", "mausoleu", + "mavioso", "maxixe", "mazurca", "meandro", "mecha", "medusa", "mefistofelico", "megera", + "meirinho", "melro", "memorizar", "menu", "mequetrefe", "mertiolate", "mestria", "metroviario", + "mexilhao", "mezanino", "miau", "microssegundo", "midia", "migratorio", "mimosa", "minuto", + "miosotis", "mirtilo", "misturar", "mitzvah", "miudos", "mixuruca", "mnemonico", "moagem", + "mobilizar", "modulo", "moer", "mofo", "mogno", "moita", "molusco", "monumento", + "moqueca", "morubixaba", "mostruario", "motriz", "mouse", "movivel", "mozarela", "muarra", + "muculmano", "mudo", "mugir", "muitos", "mumunha", "munir", "muon", "muquira", + "murros", "musselina", "nacoes", "nado", "naftalina", "nago", "naipe", "naja", + "nalgum", "namoro", "nanquim", "napolitano", "naquilo", "nascimento", "nautilo", "navios", + "nazista", "nebuloso", "nectarina", "nefrologo", "negus", "nelore", "nenufar", "nepotismo", + "nervura", "neste", "netuno", "neutron", "nevoeiro", "newtoniano", "nexo", "nhenhenhem", + "nhoque", "nigeriano", "niilista", "ninho", "niobio", "niponico", "niquelar", "nirvana", + "nisto", "nitroglicerina", "nivoso", "nobreza", "nocivo", "noel", "nogueira", "noivo", + "nojo", "nominativo", "nonuplo", "noruegues", "nostalgico", "noturno", "nouveau", "nuanca", + "nublar", "nucleotideo", "nudista", "nulo", "numismatico", "nunquinha", "nupcias", "nutritivo", + "nuvens", "oasis", "obcecar", "obeso", "obituario", "objetos", "oblongo", "obnoxio", + "obrigatorio", "obstruir", "obtuso", "obus", "obvio", "ocaso", "occipital", "oceanografo", + "ocioso", "oclusivo", "ocorrer", "ocre", "octogono", "odalisca", "odisseia", "odorifico", + "oersted", "oeste", "ofertar", "ofidio", "oftalmologo", "ogiva", "ogum", "oigale", + "oitavo", "oitocentos", "ojeriza", "olaria", "oleoso", "olfato", "olhos", "oliveira", + "olmo", "olor", "olvidavel", "ombudsman", "omeleteira", "omitir", "omoplata", "onanismo", + "ondular", "oneroso", "onomatopeico", "ontologico", "onus", "onze", "opalescente", "opcional", + "operistico", "opio", "oposto", "oprobrio", "optometrista", "opusculo", "oratorio", "orbital", + "orcar", "orfao", "orixa", "orla", "ornitologo", "orquidea", "ortorrombico", "orvalho", + "osculo", "osmotico", "ossudo", "ostrogodo", "otario", "otite", "ouro", "ousar", + "outubro", "ouvir", "ovario", "overnight", "oviparo", "ovni", "ovoviviparo", "ovulo", + "oxala", "oxente", "oxiuro", "oxossi", "ozonizar", "paciente", "pactuar", "padronizar", + "paete", "pagodeiro", "paixao", "pajem", "paludismo", "pampas", "panturrilha", "papudo", + "paquistanes", "pastoso", "patua", "paulo", "pauzinhos", "pavoroso", "paxa", "pazes", + "peao", "pecuniario", "pedunculo", "pegaso", "peixinho", "pejorativo", "pelvis", "penuria", + "pequno", "petunia", "pezada", "piauiense", "pictorico", "pierro", "pigmeu", "pijama", + "pilulas", "pimpolho", "pintura", "piorar", "pipocar", "piqueteiro", "pirulito", "pistoleiro", + "pituitaria", "pivotar", "pixote", "pizzaria", "plistoceno", "plotar", "pluviometrico", "pneumonico", + "poco", "podridao", "poetisa", "pogrom", "pois", "polvorosa", "pomposo", "ponderado", + "pontudo", "populoso", "poquer", "porvir", "posudo", "potro", "pouso", "povoar", + "prazo", "prezar", "privilegios", "proximo", "prussiano", "pseudopode", "psoriase", "pterossauros", + "ptialina", "ptolemaico", "pudor", "pueril", "pufe", "pugilista", "puir", "pujante", + "pulverizar", "pumba", "punk", "purulento", "pustula", "putsch", "puxe", "quatrocentos", + "quetzal", "quixotesco", "quotizavel", "rabujice", "racista", "radonio", "rafia", "ragu", + "rajado", "ralo", "rampeiro", "ranzinza", "raptor", "raquitismo", "raro", "rasurar", + "ratoeira", "ravioli", "razoavel", "reavivar", "rebuscar", "recusavel", "reduzivel", "reexposicao", + "refutavel", "regurgitar", "reivindicavel", "rejuvenescimento", "relva", "remuneravel", "renunciar", "reorientar", + "repuxo", "requisito", "resumo", "returno", "reutilizar", "revolvido", "rezonear", "riacho", + "ribossomo", "ricota", "ridiculo", "rifle", "rigoroso", "rijo", "rimel", "rins", + "rios", "riqueza", "riquixa", "rissole", "ritualistico", "rivalizar", "rixa", "robusto", + "rococo", "rodoviario", "roer", "rogo", "rojao", "rolo", "rompimento", "ronronar", + "roqueiro", "rorqual", "rosto", "rotundo", "rouxinol", "roxo", "royal", "ruas", + "rucula", "rudimentos", "ruela", "rufo", "rugoso", "ruivo", "rule", "rumoroso", + "runico", "ruptura", "rural", "rustico", "rutilar", "saariano", "sabujo", "sacudir", + "sadomasoquista", "safra", "sagui", "sais", "samurai", "santuario", "sapo", "saquear", + "sartriano", "saturno", "saude", "sauva", "saveiro", "saxofonista", "sazonal", "scherzo", + "script", "seara", "seborreia", "secura", "seduzir", "sefardim", "seguro", "seja", + "selvas", "sempre", "senzala", "sepultura", "sequoia", "sestercio", "setuplo", "seus", + "seviciar", "sezonismo", "shalom", "siames", "sibilante", "sicrano", "sidra", "sifilitico", + "signos", "silvo", "simultaneo", "sinusite", "sionista", "sirio", "sisudo", "situar", + "sivan", "slide", "slogan", "soar", "sobrio", "socratico", "sodomizar", "soerguer", + "software", "sogro", "soja", "solver", "somente", "sonso", "sopro", "soquete", + "sorveteiro", "sossego", "soturno", "sousafone", "sovinice", "sozinho", "suavizar", "subverter", + "sucursal", "sudoriparo", "sufragio", "sugestoes", "suite", "sujo", "sultao", "sumula", + "suntuoso", "suor", "supurar", "suruba", "susto", "suturar", "suvenir", "tabuleta", + "taco", "tadjique", "tafeta", "tagarelice", "taitiano", "talvez", "tampouco", "tanzaniano", + "taoista", "tapume", "taquion", "tarugo", "tascar", "tatuar", "tautologico", "tavola", + "taxionomista", "tchecoslovaco", "teatrologo", "tectonismo", "tedioso", "teflon", "tegumento", "teixo", + "telurio", "temporas", "tenue", "teosofico", "tepido", "tequila", "terrorista", "testosterona", + "tetrico", "teutonico", "teve", "texugo", "tiara", "tibia", "tiete", "tifoide", + "tigresa", "tijolo", "tilintar", "timpano", "tintureiro", "tiquete", "tiroteio", "tisico", + "titulos", "tive", "toar", "toboga", "tofu", "togoles", "toicinho", "tolueno", + "tomografo", "tontura", "toponimo", "toquio", "torvelinho", "tostar", "toto", "touro", + "toxina", "trazer", "trezentos", "trivialidade", "trovoar", "truta", "tuaregue", "tubular", + "tucano", "tudo", "tufo", "tuiste", "tulipa", "tumultuoso", "tunisino", "tupiniquim", + "turvo", "tutu", "ucraniano", "udenista", "ufanista", "ufologo", "ugaritico", "uiste", + "uivo", "ulceroso", "ulema", "ultravioleta", "umbilical", "umero", "umido", "umlaut", + "unanimidade", "unesco", "ungulado", "unheiro", "univoco", "untuoso", "urano", "urbano", + "urdir", "uretra", "urgente", "urinol", "urna", "urologo", "urro", "ursulina", + "urtiga", "urupe", "usavel", "usbeque", "usei", "usineiro", "usurpar", "utero", + "utilizar", "utopico", "uvular", "uxoricidio", "vacuo", "vadio", "vaguear", "vaivem", + "valvula", "vampiro", "vantajoso", "vaporoso", "vaquinha", "varziano", "vasto", "vaticinio", + "vaudeville", "vazio", "veado", "vedico", "veemente", "vegetativo", "veio", "veja", + "veludo", "venusiano", "verdade", "verve", "vestuario", "vetusto", "vexatorio", "vezes", + "viavel", "vibratorio", "victor", "vicunha", "vidros", "vietnamita", "vigoroso", "vilipendiar", + "vime", "vintem", "violoncelo", "viquingue", "virus", "visualizar", "vituperio", "viuvo", + "vivo", "vizir", "voar", "vociferar", "vodu", "vogar", "voile", "volver", + "vomito", "vontade", "vortice", "vosso", "voto", "vovozinha", "voyeuse", "vozes", + "vulva", "vupt", "western", "xadrez", "xale", "xampu", "xango", "xarope", + "xaual", "xavante", "xaxim", "xenonio", "xepa", "xerox", "xicara", "xifopago", + "xiita", "xilogravura", "xinxim", "xistoso", "xixi", "xodo", "xogum", "xucro", + "zabumba", "zagueiro", "zambiano", "zanzar", "zarpar", "zebu", "zefiro", "zeloso", + "zenite", "zumbi" + ] + }, + 'japanese': { + prefix_len: 4, + words: [ + "あいこくしん", "あいさつ", "あいだ", "あおぞら", "あかちゃん", "あきる", "あけがた", "あける", + "あこがれる", "あさい", "あさひ", "あしあと", "あじわう", "あずかる", "あずき", "あそぶ", + "あたえる", "あたためる", "あたりまえ", "あたる", "あつい", "あつかう", "あっしゅく", "あつまり", + "あつめる", "あてな", "あてはまる", "あひる", "あぶら", "あぶる", "あふれる", "あまい", + "あまど", "あまやかす", "あまり", "あみもの", "あめりか", "あやまる", "あゆむ", "あらいぐま", + "あらし", "あらすじ", "あらためる", "あらゆる", "あらわす", "ありがとう", "あわせる", "あわてる", + "あんい", "あんがい", "あんこ", "あんぜん", "あんてい", "あんない", "あんまり", "いいだす", + "いおん", "いがい", "いがく", "いきおい", "いきなり", "いきもの", "いきる", "いくじ", + "いくぶん", "いけばな", "いけん", "いこう", "いこく", "いこつ", "いさましい", "いさん", + "いしき", "いじゅう", "いじょう", "いじわる", "いずみ", "いずれ", "いせい", "いせえび", + "いせかい", "いせき", "いぜん", "いそうろう", "いそがしい", "いだい", "いだく", "いたずら", + "いたみ", "いたりあ", "いちおう", "いちじ", "いちど", "いちば", "いちぶ", "いちりゅう", + "いつか", "いっしゅん", "いっせい", "いっそう", "いったん", "いっち", "いってい", "いっぽう", + "いてざ", "いてん", "いどう", "いとこ", "いない", "いなか", "いねむり", "いのち", + "いのる", "いはつ", "いばる", "いはん", "いびき", "いひん", "いふく", "いへん", + "いほう", "いみん", "いもうと", "いもたれ", "いもり", "いやがる", "いやす", "いよかん", + "いよく", "いらい", "いらすと", "いりぐち", "いりょう", "いれい", "いれもの", "いれる", + "いろえんぴつ", "いわい", "いわう", "いわかん", "いわば", "いわゆる", "いんげんまめ", "いんさつ", + "いんしょう", "いんよう", "うえき", "うえる", "うおざ", "うがい", "うかぶ", "うかべる", + "うきわ", "うくらいな", "うくれれ", "うけたまわる", "うけつけ", "うけとる", "うけもつ", "うける", + "うごかす", "うごく", "うこん", "うさぎ", "うしなう", "うしろがみ", "うすい", "うすぎ", + "うすぐらい", "うすめる", "うせつ", "うちあわせ", "うちがわ", "うちき", "うちゅう", "うっかり", + "うつくしい", "うったえる", "うつる", "うどん", "うなぎ", "うなじ", "うなずく", "うなる", + "うねる", "うのう", "うぶげ", "うぶごえ", "うまれる", "うめる", "うもう", "うやまう", + "うよく", "うらがえす", "うらぐち", "うらない", "うりあげ", "うりきれ", "うるさい", "うれしい", + "うれゆき", "うれる", "うろこ", "うわき", "うわさ", "うんこう", "うんちん", "うんてん", + "うんどう", "えいえん", "えいが", "えいきょう", "えいご", "えいせい", "えいぶん", "えいよう", + "えいわ", "えおり", "えがお", "えがく", "えきたい", "えくせる", "えしゃく", "えすて", + "えつらん", "えのぐ", "えほうまき", "えほん", "えまき", "えもじ", "えもの", "えらい", + "えらぶ", "えりあ", "えんえん", "えんかい", "えんぎ", "えんげき", "えんしゅう", "えんぜつ", + "えんそく", "えんちょう", "えんとつ", "おいかける", "おいこす", "おいしい", "おいつく", "おうえん", + "おうさま", "おうじ", "おうせつ", "おうたい", "おうふく", "おうべい", "おうよう", "おえる", + "おおい", "おおう", "おおどおり", "おおや", "おおよそ", "おかえり", "おかず", "おがむ", + "おかわり", "おぎなう", "おきる", "おくさま", "おくじょう", "おくりがな", "おくる", "おくれる", + "おこす", "おこなう", "おこる", "おさえる", "おさない", "おさめる", "おしいれ", "おしえる", + "おじぎ", "おじさん", "おしゃれ", "おそらく", "おそわる", "おたがい", "おたく", "おだやか", + "おちつく", "おっと", "おつり", "おでかけ", "おとしもの", "おとなしい", "おどり", "おどろかす", + "おばさん", "おまいり", "おめでとう", "おもいで", "おもう", "おもたい", "おもちゃ", "おやつ", + "おやゆび", "およぼす", "おらんだ", "おろす", "おんがく", "おんけい", "おんしゃ", "おんせん", + "おんだん", "おんちゅう", "おんどけい", "かあつ", "かいが", "がいき", "がいけん", "がいこう", + "かいさつ", "かいしゃ", "かいすいよく", "かいぜん", "かいぞうど", "かいつう", "かいてん", "かいとう", + "かいふく", "がいへき", "かいほう", "かいよう", "がいらい", "かいわ", "かえる", "かおり", + "かかえる", "かがく", "かがし", "かがみ", "かくご", "かくとく", "かざる", "がぞう", + "かたい", "かたち", "がちょう", "がっきゅう", "がっこう", "がっさん", "がっしょう", "かなざわし", + "かのう", "がはく", "かぶか", "かほう", "かほご", "かまう", "かまぼこ", "かめれおん", + "かゆい", "かようび", "からい", "かるい", "かろう", "かわく", "かわら", "がんか", + "かんけい", "かんこう", "かんしゃ", "かんそう", "かんたん", "かんち", "がんばる", "きあい", + "きあつ", "きいろ", "ぎいん", "きうい", "きうん", "きえる", "きおう", "きおく", + "きおち", "きおん", "きかい", "きかく", "きかんしゃ", "ききて", "きくばり", "きくらげ", + "きけんせい", "きこう", "きこえる", "きこく", "きさい", "きさく", "きさま", "きさらぎ", + "ぎじかがく", "ぎしき", "ぎじたいけん", "ぎじにってい", "ぎじゅつしゃ", "きすう", "きせい", "きせき", + "きせつ", "きそう", "きぞく", "きぞん", "きたえる", "きちょう", "きつえん", "ぎっちり", + "きつつき", "きつね", "きてい", "きどう", "きどく", "きない", "きなが", "きなこ", + "きぬごし", "きねん", "きのう", "きのした", "きはく", "きびしい", "きひん", "きふく", + "きぶん", "きぼう", "きほん", "きまる", "きみつ", "きむずかしい", "きめる", "きもだめし", + "きもち", "きもの", "きゃく", "きやく", "ぎゅうにく", "きよう", "きょうりゅう", "きらい", + "きらく", "きりん", "きれい", "きれつ", "きろく", "ぎろん", "きわめる", "ぎんいろ", + "きんかくじ", "きんじょ", "きんようび", "ぐあい", "くいず", "くうかん", "くうき", "くうぐん", + "くうこう", "ぐうせい", "くうそう", "ぐうたら", "くうふく", "くうぼ", "くかん", "くきょう", + "くげん", "ぐこう", "くさい", "くさき", "くさばな", "くさる", "くしゃみ", "くしょう", + "くすのき", "くすりゆび", "くせげ", "くせん", "ぐたいてき", "くださる", "くたびれる", "くちこみ", + "くちさき", "くつした", "ぐっすり", "くつろぐ", "くとうてん", "くどく", "くなん", "くねくね", + "くのう", "くふう", "くみあわせ", "くみたてる", "くめる", "くやくしょ", "くらす", "くらべる", + "くるま", "くれる", "くろう", "くわしい", "ぐんかん", "ぐんしょく", "ぐんたい", "ぐんて", + "けあな", "けいかく", "けいけん", "けいこ", "けいさつ", "げいじゅつ", "けいたい", "げいのうじん", + "けいれき", "けいろ", "けおとす", "けおりもの", "げきか", "げきげん", "げきだん", "げきちん", + "げきとつ", "げきは", "げきやく", "げこう", "げこくじょう", "げざい", "けさき", "げざん", + "けしき", "けしごむ", "けしょう", "げすと", "けたば", "けちゃっぷ", "けちらす", "けつあつ", + "けつい", "けつえき", "けっこん", "けつじょ", "けっせき", "けってい", "けつまつ", "げつようび", + "げつれい", "けつろん", "げどく", "けとばす", "けとる", "けなげ", "けなす", "けなみ", + "けぬき", "げねつ", "けねん", "けはい", "げひん", "けぶかい", "げぼく", "けまり", + "けみかる", "けむし", "けむり", "けもの", "けらい", "けろけろ", "けわしい", "けんい", + "けんえつ", "けんお", "けんか", "げんき", "けんげん", "けんこう", "けんさく", "けんしゅう", + "けんすう", "げんそう", "けんちく", "けんてい", "けんとう", "けんない", "けんにん", "げんぶつ", + "けんま", "けんみん", "けんめい", "けんらん", "けんり", "こあくま", "こいぬ", "こいびと", + "ごうい", "こうえん", "こうおん", "こうかん", "ごうきゅう", "ごうけい", "こうこう", "こうさい", + "こうじ", "こうすい", "ごうせい", "こうそく", "こうたい", "こうちゃ", "こうつう", "こうてい", + "こうどう", "こうない", "こうはい", "ごうほう", "ごうまん", "こうもく", "こうりつ", "こえる", + "こおり", "ごかい", "ごがつ", "ごかん", "こくご", "こくさい", "こくとう", "こくない", + "こくはく", "こぐま", "こけい", "こける", "ここのか", "こころ", "こさめ", "こしつ", + "こすう", "こせい", "こせき", "こぜん", "こそだて", "こたい", "こたえる", "こたつ", + "こちょう", "こっか", "こつこつ", "こつばん", "こつぶ", "こてい", "こてん", "ことがら", + "ことし", "ことば", "ことり", "こなごな", "こねこね", "このまま", "このみ", "このよ", + "ごはん", "こひつじ", "こふう", "こふん", "こぼれる", "ごまあぶら", "こまかい", "ごますり", + "こまつな", "こまる", "こむぎこ", "こもじ", "こもち", "こもの", "こもん", "こやく", + "こやま", "こゆう", "こゆび", "こよい", "こよう", "こりる", "これくしょん", "ころっけ", + "こわもて", "こわれる", "こんいん", "こんかい", "こんき", "こんしゅう", "こんすい", "こんだて", + "こんとん", "こんなん", "こんびに", "こんぽん", "こんまけ", "こんや", "こんれい", "こんわく", + "ざいえき", "さいかい", "さいきん", "ざいげん", "ざいこ", "さいしょ", "さいせい", "ざいたく", + "ざいちゅう", "さいてき", "ざいりょう", "さうな", "さかいし", "さがす", "さかな", "さかみち", + "さがる", "さぎょう", "さくし", "さくひん", "さくら", "さこく", "さこつ", "さずかる", + "ざせき", "さたん", "さつえい", "ざつおん", "ざっか", "ざつがく", "さっきょく", "ざっし", + "さつじん", "ざっそう", "さつたば", "さつまいも", "さてい", "さといも", "さとう", "さとおや", + "さとし", "さとる", "さのう", "さばく", "さびしい", "さべつ", "さほう", "さほど", + "さます", "さみしい", "さみだれ", "さむけ", "さめる", "さやえんどう", "さゆう", "さよう", + "さよく", "さらだ", "ざるそば", "さわやか", "さわる", "さんいん", "さんか", "さんきゃく", + "さんこう", "さんさい", "ざんしょ", "さんすう", "さんせい", "さんそ", "さんち", "さんま", + "さんみ", "さんらん", "しあい", "しあげ", "しあさって", "しあわせ", "しいく", "しいん", + "しうち", "しえい", "しおけ", "しかい", "しかく", "じかん", "しごと", "しすう", + "じだい", "したうけ", "したぎ", "したて", "したみ", "しちょう", "しちりん", "しっかり", + "しつじ", "しつもん", "してい", "してき", "してつ", "じてん", "じどう", "しなぎれ", + "しなもの", "しなん", "しねま", "しねん", "しのぐ", "しのぶ", "しはい", "しばかり", + "しはつ", "しはらい", "しはん", "しひょう", "しふく", "じぶん", "しへい", "しほう", + "しほん", "しまう", "しまる", "しみん", "しむける", "じむしょ", "しめい", "しめる", + "しもん", "しゃいん", "しゃうん", "しゃおん", "じゃがいも", "しやくしょ", "しゃくほう", "しゃけん", + "しゃこ", "しゃざい", "しゃしん", "しゃせん", "しゃそう", "しゃたい", "しゃちょう", "しゃっきん", + "じゃま", "しゃりん", "しゃれい", "じゆう", "じゅうしょ", "しゅくはく", "じゅしん", "しゅっせき", + "しゅみ", "しゅらば", "じゅんばん", "しょうかい", "しょくたく", "しょっけん", "しょどう", "しょもつ", + "しらせる", "しらべる", "しんか", "しんこう", "じんじゃ", "しんせいじ", "しんちく", "しんりん", + "すあげ", "すあし", "すあな", "ずあん", "すいえい", "すいか", "すいとう", "ずいぶん", + "すいようび", "すうがく", "すうじつ", "すうせん", "すおどり", "すきま", "すくう", "すくない", + "すける", "すごい", "すこし", "ずさん", "すずしい", "すすむ", "すすめる", "すっかり", + "ずっしり", "ずっと", "すてき", "すてる", "すねる", "すのこ", "すはだ", "すばらしい", + "ずひょう", "ずぶぬれ", "すぶり", "すふれ", "すべて", "すべる", "ずほう", "すぼん", + "すまい", "すめし", "すもう", "すやき", "すらすら", "するめ", "すれちがう", "すろっと", + "すわる", "すんぜん", "すんぽう", "せあぶら", "せいかつ", "せいげん", "せいじ", "せいよう", + "せおう", "せかいかん", "せきにん", "せきむ", "せきゆ", "せきらんうん", "せけん", "せこう", + "せすじ", "せたい", "せたけ", "せっかく", "せっきゃく", "ぜっく", "せっけん", "せっこつ", + "せっさたくま", "せつぞく", "せつだん", "せつでん", "せっぱん", "せつび", "せつぶん", "せつめい", + "せつりつ", "せなか", "せのび", "せはば", "せびろ", "せぼね", "せまい", "せまる", + "せめる", "せもたれ", "せりふ", "ぜんあく", "せんい", "せんえい", "せんか", "せんきょ", + "せんく", "せんげん", "ぜんご", "せんさい", "せんしゅ", "せんすい", "せんせい", "せんぞ", + "せんたく", "せんちょう", "せんてい", "せんとう", "せんぬき", "せんねん", "せんぱい", "ぜんぶ", + "ぜんぽう", "せんむ", "せんめんじょ", "せんもん", "せんやく", "せんゆう", "せんよう", "ぜんら", + "ぜんりゃく", "せんれい", "せんろ", "そあく", "そいとげる", "そいね", "そうがんきょう", "そうき", + "そうご", "そうしん", "そうだん", "そうなん", "そうび", "そうめん", "そうり", "そえもの", + "そえん", "そがい", "そげき", "そこう", "そこそこ", "そざい", "そしな", "そせい", + "そせん", "そそぐ", "そだてる", "そつう", "そつえん", "そっかん", "そつぎょう", "そっけつ", + "そっこう", "そっせん", "そっと", "そとがわ", "そとづら", "そなえる", "そなた", "そふぼ", + "そぼく", "そぼろ", "そまつ", "そまる", "そむく", "そむりえ", "そめる", "そもそも", + "そよかぜ", "そらまめ", "そろう", "そんかい", "そんけい", "そんざい", "そんしつ", "そんぞく", + "そんちょう", "ぞんび", "ぞんぶん", "そんみん", "たあい", "たいいん", "たいうん", "たいえき", + "たいおう", "だいがく", "たいき", "たいぐう", "たいけん", "たいこ", "たいざい", "だいじょうぶ", + "だいすき", "たいせつ", "たいそう", "だいたい", "たいちょう", "たいてい", "だいどころ", "たいない", + "たいねつ", "たいのう", "たいはん", "だいひょう", "たいふう", "たいへん", "たいほ", "たいまつばな", + "たいみんぐ", "たいむ", "たいめん", "たいやき", "たいよう", "たいら", "たいりょく", "たいる", + "たいわん", "たうえ", "たえる", "たおす", "たおる", "たおれる", "たかい", "たかね", + "たきび", "たくさん", "たこく", "たこやき", "たさい", "たしざん", "だじゃれ", "たすける", + "たずさわる", "たそがれ", "たたかう", "たたく", "ただしい", "たたみ", "たちばな", "だっかい", + "だっきゃく", "だっこ", "だっしゅつ", "だったい", "たてる", "たとえる", "たなばた", "たにん", + "たぬき", "たのしみ", "たはつ", "たぶん", "たべる", "たぼう", "たまご", "たまる", + "だむる", "ためいき", "ためす", "ためる", "たもつ", "たやすい", "たよる", "たらす", + "たりきほんがん", "たりょう", "たりる", "たると", "たれる", "たれんと", "たろっと", "たわむれる", + "だんあつ", "たんい", "たんおん", "たんか", "たんき", "たんけん", "たんご", "たんさん", + "たんじょうび", "だんせい", "たんそく", "たんたい", "だんち", "たんてい", "たんとう", "だんな", + "たんにん", "だんねつ", "たんのう", "たんぴん", "だんぼう", "たんまつ", "たんめい", "だんれつ", + "だんろ", "だんわ", "ちあい", "ちあん", "ちいき", "ちいさい", "ちえん", "ちかい", + "ちから", "ちきゅう", "ちきん", "ちけいず", "ちけん", "ちこく", "ちさい", "ちしき", + "ちしりょう", "ちせい", "ちそう", "ちたい", "ちたん", "ちちおや", "ちつじょ", "ちてき", + "ちてん", "ちぬき", "ちぬり", "ちのう", "ちひょう", "ちへいせん", "ちほう", "ちまた", + "ちみつ", "ちみどろ", "ちめいど", "ちゃんこなべ", "ちゅうい", "ちゆりょく", "ちょうし", "ちょさくけん", + "ちらし", "ちらみ", "ちりがみ", "ちりょう", "ちるど", "ちわわ", "ちんたい", "ちんもく", + "ついか", "ついたち", "つうか", "つうじょう", "つうはん", "つうわ", "つかう", "つかれる", + "つくね", "つくる", "つけね", "つける", "つごう", "つたえる", "つづく", "つつじ", + "つつむ", "つとめる", "つながる", "つなみ", "つねづね", "つのる", "つぶす", "つまらない", + "つまる", "つみき", "つめたい", "つもり", "つもる", "つよい", "つるぼ", "つるみく", + "つわもの", "つわり", "てあし", "てあて", "てあみ", "ていおん", "ていか", "ていき", + "ていけい", "ていこく", "ていさつ", "ていし", "ていせい", "ていたい", "ていど", "ていねい", + "ていひょう", "ていへん", "ていぼう", "てうち", "ておくれ", "てきとう", "てくび", "でこぼこ", + "てさぎょう", "てさげ", "てすり", "てそう", "てちがい", "てちょう", "てつがく", "てつづき", + "でっぱ", "てつぼう", "てつや", "でぬかえ", "てぬき", "てぬぐい", "てのひら", "てはい", + "てぶくろ", "てふだ", "てほどき", "てほん", "てまえ", "てまきずし", "てみじか", "てみやげ", + "てらす", "てれび", "てわけ", "てわたし", "でんあつ", "てんいん", "てんかい", "てんき", + "てんぐ", "てんけん", "てんごく", "てんさい", "てんし", "てんすう", "でんち", "てんてき", + "てんとう", "てんない", "てんぷら", "てんぼうだい", "てんめつ", "てんらんかい", "でんりょく", "でんわ", + "どあい", "といれ", "どうかん", "とうきゅう", "どうぐ", "とうし", "とうむぎ", "とおい", + "とおか", "とおく", "とおす", "とおる", "とかい", "とかす", "ときおり", "ときどき", + "とくい", "とくしゅう", "とくてん", "とくに", "とくべつ", "とけい", "とける", "とこや", + "とさか", "としょかん", "とそう", "とたん", "とちゅう", "とっきゅう", "とっくん", "とつぜん", + "とつにゅう", "とどける", "ととのえる", "とない", "となえる", "となり", "とのさま", "とばす", + "どぶがわ", "とほう", "とまる", "とめる", "ともだち", "ともる", "どようび", "とらえる", + "とんかつ", "どんぶり", "ないかく", "ないこう", "ないしょ", "ないす", "ないせん", "ないそう", + "なおす", "ながい", "なくす", "なげる", "なこうど", "なさけ", "なたでここ", "なっとう", + "なつやすみ", "ななおし", "なにごと", "なにもの", "なにわ", "なのか", "なふだ", "なまいき", + "なまえ", "なまみ", "なみだ", "なめらか", "なめる", "なやむ", "ならう", "ならび", + "ならぶ", "なれる", "なわとび", "なわばり", "にあう", "にいがた", "にうけ", "におい", + "にかい", "にがて", "にきび", "にくしみ", "にくまん", "にげる", "にさんかたんそ", "にしき", + "にせもの", "にちじょう", "にちようび", "にっか", "にっき", "にっけい", "にっこう", "にっさん", + "にっしょく", "にっすう", "にっせき", "にってい", "になう", "にほん", "にまめ", "にもつ", + "にやり", "にゅういん", "にりんしゃ", "にわとり", "にんい", "にんか", "にんき", "にんげん", + "にんしき", "にんずう", "にんそう", "にんたい", "にんち", "にんてい", "にんにく", "にんぷ", + "にんまり", "にんむ", "にんめい", "にんよう", "ぬいくぎ", "ぬかす", "ぬぐいとる", "ぬぐう", + "ぬくもり", "ぬすむ", "ぬまえび", "ぬめり", "ぬらす", "ぬんちゃく", "ねあげ", "ねいき", + "ねいる", "ねいろ", "ねぐせ", "ねくたい", "ねくら", "ねこぜ", "ねこむ", "ねさげ", + "ねすごす", "ねそべる", "ねだん", "ねつい", "ねっしん", "ねつぞう", "ねったいぎょ", "ねぶそく", + "ねふだ", "ねぼう", "ねほりはほり", "ねまき", "ねまわし", "ねみみ", "ねむい", "ねむたい", + "ねもと", "ねらう", "ねわざ", "ねんいり", "ねんおし", "ねんかん", "ねんきん", "ねんぐ", + "ねんざ", "ねんし", "ねんちゃく", "ねんど", "ねんぴ", "ねんぶつ", "ねんまつ", "ねんりょう", + "ねんれい", "のいず", "のおづま", "のがす", "のきなみ", "のこぎり", "のこす", "のこる", + "のせる", "のぞく", "のぞむ", "のたまう", "のちほど", "のっく", "のばす", "のはら", + "のべる", "のぼる", "のみもの", "のやま", "のらいぬ", "のらねこ", "のりもの", "のりゆき", + "のれん", "のんき", "ばあい", "はあく", "ばあさん", "ばいか", "ばいく", "はいけん", + "はいご", "はいしん", "はいすい", "はいせん", "はいそう", "はいち", "ばいばい", "はいれつ", + "はえる", "はおる", "はかい", "ばかり", "はかる", "はくしゅ", "はけん", "はこぶ", + "はさみ", "はさん", "はしご", "ばしょ", "はしる", "はせる", "ぱそこん", "はそん", + "はたん", "はちみつ", "はつおん", "はっかく", "はづき", "はっきり", "はっくつ", "はっけん", + "はっこう", "はっさん", "はっしん", "はったつ", "はっちゅう", "はってん", "はっぴょう", "はっぽう", + "はなす", "はなび", "はにかむ", "はぶらし", "はみがき", "はむかう", "はめつ", "はやい", + "はやし", "はらう", "はろうぃん", "はわい", "はんい", "はんえい", "はんおん", "はんかく", + "はんきょう", "ばんぐみ", "はんこ", "はんしゃ", "はんすう", "はんだん", "ぱんち", "ぱんつ", + "はんてい", "はんとし", "はんのう", "はんぱ", "はんぶん", "はんぺん", "はんぼうき", "はんめい", + "はんらん", "はんろん", "ひいき", "ひうん", "ひえる", "ひかく", "ひかり", "ひかる", + "ひかん", "ひくい", "ひけつ", "ひこうき", "ひこく", "ひさい", "ひさしぶり", "ひさん", + "びじゅつかん", "ひしょ" + ] + } +}; + +(function() { + 'use strict'; + for (var i in mn_words) { + if (mn_words.hasOwnProperty(i)) { + if (mn_words[i].prefix_len === 0) { + continue; + } + mn_words[i].trunc_words = []; + for (var j = 0; j < mn_words[i].words.length; ++j) { + mn_words[i].trunc_words.push(mn_words[i].words[j].slice(0, mn_words[i].prefix_len)); + } + } + } +})(); \ No newline at end of file diff --git a/static/css/Octicons LICENSE b/static/css/Octicons LICENSE new file mode 100755 index 0000000..05ab2c8 --- /dev/null +++ b/static/css/Octicons LICENSE @@ -0,0 +1,7 @@ +(c) 2012-2014 GitHub + +Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL) +Applies to all font files + +Code License: MIT (http://choosealicense.com/licenses/mit/) +Applies to all other files diff --git a/static/css/bootstrap.min.css b/static/css/bootstrap.min.css new file mode 100755 index 0000000..80eabc6 --- /dev/null +++ b/static/css/bootstrap.min.css @@ -0,0 +1,14 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=7acaf9e459baeeb64c10) + * Config saved to config.json and https://gist.github.com/7acaf9e459baeeb64c10 + *//*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.clearfix:before,.clearfix:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed} \ No newline at end of file diff --git a/static/css/documentation.css b/static/css/documentation.css new file mode 100644 index 0000000..f9b130b --- /dev/null +++ b/static/css/documentation.css @@ -0,0 +1,1989 @@ +@import 'octicons.css'; + +/*------------------------------------------------------------------------------ + Global Documentation Styles +------------------------------------------------------------------------------*/ + +body { + font: 13px/1.4em "Helvetica Neue", arial,freesans,clean,sans-serif; + background-color: #fff; + color: #393939; +} + +p { + margin: 1em 0; +} + +h1 { + font-size: 20px; + padding: .5em 0; + margin: 2em 0 1em; + font-weight: normal; +} + +body:not(.enterprise) .enterprise-only { + display: none; +} +body.dev-mode .enterprise-only { + border: 3px solid red; +} +body.dev-mode .not-enterprise { + border: 3px dashed blue; +} +body.dev-mode.enterprise .not-enterprise { + display: none; +} + +.content h1 { + font-weight: 300; + -webkit-backface-visibility: hidden; + font-size: 36px; + margin: 0em 0 0.5em; + position: relative; + line-height: 30px; +} + +.header-anchor { + position: absolute; + left: -32px; + top: 0; + opacity: 0; + padding: 0 5px 0 10px; + height: 100%; + width: 20px; + font: normal normal 16px/20px; + color: #000; + -webkit-font-smoothing: antialiased; + color: #333; + + -webkit-transition: opacity 0.3s ease-in-out 0s; + -moz-transition: opacity 0.3s ease-in-out 0s; + transition: opacity 0.3s ease-in-out 0s; +} + +h1 .header-anchor { + line-height: 55px; +} + +.content h1:hover .header-anchor, .content h2:hover .header-anchor, .content h3:hover .header-anchor, .content h4:hover .header-anchor, .header-anchor:hover { + opacity: 1; + text-decoration: none; +} + +.header-anchor:before { + content:'\f0c1'; + font-family: 'FontAwesome'; + font-size: 16px; +} + +h2 { + font-size: 22px; + color: #333; + margin: 2em auto 1em; + position: relative; + font-weight: 300; +} + +.library-list h1 { + margin: 20px 0 20px; + padding: 20px 0 20px; +} + +.library-list h2 { + margin-bottom: -17px; + margin-left: 0px; + font-size: 16px; + max-width: 190px; +} + +.library-list ul { + margin-bottom: 40px; + list-style: none; +} + +.library-list ul li { + padding-left: 200px; + padding-right: 200px; + font-size: 14px; +} + +.change h2, .sidebar-shell h2 { + margin: 1.2em 0 1em; +} + +.change > .title { + line-height: 1.4em; + margin: 1.2em 0 0px; + padding-left: 0; + font-size: 30px; +} + +h2 span.step { + color: #666; +} + +h3 { + font-size: 14px; + color: #333; + margin: 1.5em 0 .5em; + position: relative; +} + +h4 { + margin: 1em 0; + position: relative; +} + +h5 { + font-size: 13px; +} + +h6 { + font-size: 13px; + color: #666; +} + +a { + color: #4183C4; + text-decoration: none; +} + +a:hover, +a:active { + text-decoration:underline; +} + +blockquote { + margin:0 -5px; + padding: 0px 20px; +} + +dt { + font-weight: bold; +} + +dd { + padding-left: 1em; + margin-bottom: 1em; +} + +dd + dd { + margin-bottom: 0; +} + +a img { + border: 0px; +} + +.button, .button-secondary { + background-color: #297fc7; + color: #fff; + font-size: 16px; + padding: 15px; + border-radius: 5px; +} + +.button:hover { + text-decoration: none; + background-color: #3088d0; +} + +.button-secondary { + background-color: #738797; + font-size: 15px; + padding: 12px; + -webkit-backface-visibility: hidden; +} + +.button-secondary:hover { + text-decoration: none; + background-color: #7e909e; +} + +.rss-subscribe { + display: block; + padding: 15px 14px 16px 47px; + background: url(/images/feed-icon.png) 10px center no-repeat; + color: #444; + font-size: 13px; + text-decoration: none; +} + +.rss-subscribe:hover { + background-color: #f4f4f7; + text-decoration: none; +} + +.facebook-subscribe { + display: block; + padding: 15px 14px 16px 47px; + background: url(/images/facebook-icon.png) 10px center no-repeat; + color: #444; + font-size: 13px; + text-decoration: none; +} + +.facebook-subscribe:hover { + background-color: #f4f4f7; + text-decoration: none; +} + +.twitter-subscribe { + display: block; + padding: 15px 14px 16px 47px; + background: url(/images/twitter-icon.png) 10px center no-repeat; + color: #444; + font-size: 13px; + text-decoration: none; +} + +.twitter-subscribe:hover { + background-color: #f4f4f7; + text-decoration: none; +} + +/********************/ +/* Form elements */ +/********************/ + +label, input, button, select, textarea { + font-size: 14px; + line-height: 1.4 +} + +label { + display: block; + margin-bottom: 5px; + font-weight: bold; + cursor: pointer +} + +label.error { + font-size: 13px; + font-weight: normal; + cursor: auto; + color: #c44 +} + +label small { + font-weight: normal; + color: #999 +} + +select, textarea, input[type="text"], input[type="password"], input[type="datetime"], +input[type="datetime-local"], input[type="date"], input[type="month"], +input[type="time"], input[type="week"], input[type="number"], input[type="email"], +input[type="url"], input[type="search"], input[type="tel"], input[type="color"], +.uneditable-input { + display: inline-block; + width: 100%; + height: 36px; + padding: 7px 9px; + margin-bottom: 10px; + font-size: 14px; + line-height: 1.4; + color: #333; + border-radius: 4px; + vertical-align: middle; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +input, .uneditable-input { + width: 206px +} + +textarea { + height: auto +} + +textarea, input[type="text"], input[type="password"], input[type="datetime"], +input[type="datetime-local"], input[type="date"], input[type="month"], +input[type="time"], input[type="week"], input[type="number"], input[type="email"], +input[type="url"], input[type="search"], input[type="tel"], input[type="color"], +.uneditable-input { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + transition: border linear .2s, box-shadow linear .2s +} + +textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, .uneditable-input:focus { + border-color: rgba(66, 129, 202, 0.7); + outline: 0; + outline: thin dotted \9; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(66, 129, 202, 0.3) +} + +input[type="radio"], input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal +} + +input[type="file"], input[type="image"], input[type="submit"], +input[type="reset"], input[type="button"], input[type="radio"], +input[type="checkbox"] { + width: auto +} + +select, input[type="file"] { + height: 36px; + line-height: 36px +} + +select { + border: 1px solid #ccc; + background-color: #fff +} + +select[multiple], select[size] { + height: auto +} + +.form-field-error { + color: #bd2c00; + font-size: 13px; + text-shadow: 0 1px 1px #FFF +} + +.radio, .checkbox { + min-height: 20px; + margin-bottom: 10px; + padding-left: 20px; + font-weight: normal +} + +.radio input[type="radio"], .checkbox input[type="checkbox"] { + float: left; + margin-top: 3px; + margin-left: -20px +} + +.checkbox-btn { + display: inline-block; + padding: 7px 12px; + font-weight: normal; + background-color: #f9f9f9; + background-image: -moz-linear-gradient(#fff, #f9f9f9); + background-image: -webkit-linear-gradient(#fff, #f9f9f9); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='white', endColorstr='#f9f9f9')"; + border: 1px solid #e5e5e5; + border-radius: 4px +} + +.checkbox-btn input[type="checkbox"] { + float: left; + margin-left: 0; + margin-right: 8px +} + +.form-actions { + margin-top: 30px; + padding: 30px 0; + border-top: 1px solid #e5e5e5 +} + +.form-actions p { + line-height: 35px +} + +.inline-fields label, .inline-fields input { + margin-bottom: 0 +} + +.inline-fields label { + display: inline-block +} + +.inline-fields input { + width: auto +} + +.input-group { + display: table; + margin-bottom: 7px; + width: 100% +} + +.input-group:after { + content: ""; + display: table; + clear: both +} + +.input-group input, .input-group .input-group-button { + display: table-cell +} + +.input-group input { + border-radius: 4px 0 0 4px; + margin-bottom: 0; + width: 100% +} + +.input-group .input-group-button { + width: 1% +} + +.input-group button { + border-radius: 0 4px 4px 0; + margin-left: -1px +} + +.form-note { + font-size: 12px; + color: #999; + margin: -5px 0 15px +} + +label .note { + color: #777; + display: block; + font-weight: normal; + margin: 5px 0 10px 16px +} + +.form-extras { + display: none +} + +[class^="btn"] { + display: inline-block; + margin: 0; + padding: 10px 15px; + font-weight: bold; + line-height: 1; + color: #333; + text-align: center; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.75); + background-color: #eeeeee; + background-image: -moz-linear-gradient(#fff, #eee); + background-image: -webkit-linear-gradient(#fff, #eee); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='white', endColorstr='#eeeeee')"; + background-repeat: repeat-x; + border: 1px solid #c5c5c5; + border-radius: 4px; + box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: pointer; + vertical-align: middle +} + +[class^="btn"]:hover, .zeroclipboard-is-hover { + text-decoration: none; + background-position: 0 -15px +} + +[class^="btn"]:active, [class^="btn"].active, .zeroclipboard-is-active { + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05) +} + +.btn-small { + font-size: 12px; + padding: 5px 10px +} + +.btn-large { + padding: 14px 20px; + font-size: 20px; + border-radius: 6px +} + +.btn-block { + display: block +} + +[class^="btn"].disabled { + background-image: none; + box-shadow: none; + opacity: .5; + cursor: default +} + +.btn-primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #1d6ac8; + background-image: -moz-linear-gradient(#45b3f3, #1d6ac8); + background-image: -webkit-linear-gradient(#45b3f3, #1d6ac8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#45b3f3', endColorstr='#1d6ac8')"; + border-color: #1d6ac8 #1d6ac8 #1a5eb2 +} + +.btn-primary:active { + border-color: #17529b +} + +.btn-success { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #60b044; + background-image: -moz-linear-gradient(#8add6d, #60b044); + background-image: -webkit-linear-gradient(#8add6d, #60b044); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + border-color: #74bb5a #74bb5a #509338 +} + +.btn-danger { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #b33630; + background-image: -moz-linear-gradient(#cd5f59, #b33630); + background-image: -webkit-linear-gradient(#cd5f59, #b33630); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#cd5f59', endColorstr='#b33630')"; + border-color: #cd504a +} + +.btn-link { + color: #4281ca; + text-shadow: none; + background-image: none; + background-color: transparent; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(enabled = false)"; + border-color: #e5e5e5; + box-shadow: none +} + +.btn-link:hover { + color: #fff; + background-color: #4281ca; + border-color: #4281ca +} + +.btn-link:active { + border-color: #3068a9 +} + +[class^="btn"] [class^="octicon-"] { + vertical-align: -1px +} + +.btn-group .btn { + border-radius: 0; + float: left +} + +.btn-group .btn:first-child { + border-radius: 3px 0 0 3px +} + +.btn-group .btn:last-child { + border-radius: 0 3px 3px 0 +} + +.btn-group .btn:not(:first-child) { + margin-left: -1px +} + +.error-color { + color: #ae4545 !important; +} + +/* @end */ + +/*------------------------------------------------------------------------------ + Header Styles +------------------------------------------------------------------------------*/ + +#header-wrapper { + margin-bottom: 0; + clear: both; + height: 61px; + background: url(../images/header.png) 0 0 repeat-x; +} + +#header { + margin: 0 auto; + max-width: 980px; + position: relative; +} + +#header .logo { + float: left; + margin-top: 17px; + display: inline-block; + width: 186px; + height: 27px; + background: url(/images/logo.png) 0 0 no-repeat; + text-indent: -999em; +} + +#header .nav { + float: right; + font-weight: bold; + margin-top: 20px; + text-shadow: white 1px 1px 0px; + font-size: 14px; +} + +#header .nav li { + display: inline-block; + margin: 0; + list-style-type: none; + line-height: 1.4em; +} + +#header .nav a { + color: #515151; + outline: none; + text-decoration: none; + padding: 20px 11px 19px; + -webkit-transition: color 0.2s ease-in-out 0s; + -moz-transition: color 0.2s ease-in-out 0s; + transition: color 0.2s ease-in-out 0s; +} + +.overview #header .nav-overview, +.download #header .nav-download, +.coins #header .nav-coins, +.developers #header .nav-developers, +.blog #header .nav-blog, +.contact #header .nav-contact { + color: #333; + border-bottom: 3px solid #c9c9c9; +} + +.docs-documentation .subnav-documentation, +.docs-guides .subnav-guides { + color: #222; + border-bottom: 2px solid #d8d8d8; +} + +#header .nav a:hover { + color: #327fc7; +} + +/** Search **/ + +#header .nav #search-container { + position: relative; + margin-left: 5px; + text-shadow: none; +} + +#searchfield { + border: 1px solid #dddddd; + line-height: 20px; + height: 21px; + padding: 2px 5px 2px 20px; + display: inline-block; + margin-top: -4px; + margin-bottom: 0px; + width: 51px; + border-radius: 3px; + background: url(/images/search.png) 5px center no-repeat #fff; + + font-family: '.HelveticaNeueDeskInterface-Regular'; + font-size: 11px; + font-style: normal; + font-variant: normal; + font-weight: normal; + color: #000000; + box-sizing: content-box; + box-shadow: none; + vertical-align: baseline; + + -webkit-transition: width 0.3s ease-in-out 0s; + -moz-transition: width 0.3s ease-in-out 0s; + transition: width 0.3s ease-in-out 0s; +} + +#searchfield label { + margin: 0; + +} + +#searchfield:focus { + border-color: #327FC7; + outline-color: #327FC7; + outline-offset: -2px; + outline-style: auto; + outline-width: 5px; +} + +/** Hide native X appearing in IE10 **/ + +#searchfield::-ms-clear { + height: 0; + width: 0; +} + +#searchfield:focus, #search-container.active #searchfield { + width: 120px; +} + +#searchfield:focus + .search-placeholder, #search-container.active .search-placeholder { + opacity: 0; +} + +.search-placeholder { + position: absolute; + cursor: text; + left: 22px; + top: 0px; + font-weight: normal; + font-size: 12px; + pointer-events: none; + color: #aaa; + line-height: 20px; + + -webkit-transition: opacity 0.3s ease-in-out 0s; + -moz-appearance-transition: opacity 0.3s ease-in-out 0s; + transition: opacity 0.3s ease-in-out 0s; +} + +.cancel-search { + position: absolute; + right: 4px; + top: 2px; + background: url(/images/cancel.png) 0 0 no-repeat; + width: 14px; + height: 14px; + display: none; +} + +#search-container.active .cancel-search { + display: block; +} + +#search-results { + position: absolute; + top: 30px; + right: 0px; + width: 260px; + background-color: #fff; + border-radius: 4px; + min-height: 40px; + z-index: 100; + overflow: hidden; + box-shadow: 0px 1px 3px rgba(0,0,0,0.4); + visibility: hidden; + opacity: 0; +} + +#search-container.active #searchfield:focus ~ #search-results, #search-results:active, #search-results:focus, #search-results:hover { + visibility: visible; + opacity: 1; + -webkit-transition: opacity 0.3s ease-in-out 0s; + -moz-transition: opacity 0.3s ease-in-out 0s; + transition: opacity 0.3s ease-in-out 0s; +} + +#search-results li { + display: block; + width: 100%; + border-bottom: 1px solid #f2f2f2; +} + +#header #search-results .result a { + display: block; + text-shadow: none; + padding: 10px; +} + +#search-results .placeholder { + text-align: center; + font-size: 12px; + font-weight: normal; + padding: 20px 0; +} + +#search-results em { + font-weight: bold; +} + +#search-results .result em { + display: block; + font-weight: normal; + font-style: normal; + line-height: 1em; +} + +.result small { + font-size: 12px; + color: #5c5c5c; + line-height: 1em; +} + +.result:hover, .result.selected { + background-color: #297fc7 !important; +} + +.result:hover em, .result.selected em, .result:hover small, .result.selected small { + color: #fff !important; +} + +#header #search-results li:last-child { + border-bottom: none; +} + +/*------------------------------------------------------------------------------ + Subnav +------------------------------------------------------------------------------*/ + +.sub-nav { + max-width: 980px; + margin: 0 auto; + position: relative; + border-bottom: 1px solid #d8d8d8; +} + +.sub-nav > h2, .sub-nav > h2 > a { + color: #333; + font-weight: normal; + font-size: 22px; + -webkit-backface-visibility: hidden; + margin: 50px 0 10px 0; + text-decoration: none; +} + +.sub-nav > h2 > a { + z-index: 10; + position: relative; +} + +.sub-nav ul { + list-style: none; + position: absolute; + right: 0; + bottom: 8px; + width: 100%; + text-align: right; +} + +.sub-nav li { + display: inline-block; +} + +.sub-nav li a { + color: #767676; + font-size: 14px; + margin-left: 16px; + padding: 4px 2px 8px; +} + +.sub-nav li a:hover { + text-decoration: none; + color: #327fc7; +} + +.sub-nav li:last-child a { + padding-right: 0; +} + +.sub-nav li .active { + color: #222; + border-bottom: 2px solid #d8d8d8; +} + +/*------------------------------------------------------------------------------ + Features +------------------------------------------------------------------------------*/ + +.wrapper { + max-width: 980px; + margin: 0 auto; +} + +.wrapper:before, .wrapper:after { + content: " "; +} + +.wrapper:after { + clear: both; +} + +.wrapper.blog { + display: table; +} + +.feature { + position: relative; + height: 420px; +} + +.feature h1, .library-list .feature h1 { + font-weight: 300; + font-size: 42px; + line-height: 1.2em; + -webkit-backface-visibility: hidden; + padding: 80px 0 0 0; + margin: 0; + text-align: left; +} + +.library-list .feature { + overflow: hidden; + border-bottom: 1px solid #ddd; + padding-bottom: 40px; +} + +.feature .intro { + color: #666; + font-size: 18px; + line-height: 1.5em; + max-width: 400px; +} + +.feature .button, .highlights .button-secondary { + display: inline-block; +} + +.feature .forknote-large { + position: absolute; + right: -50px; + top: 30px; + z-index: -1; +} + +.feature .library-links { + line-height: 40px; + margin-top: 25px; +} + +.feature .library-links li { + padding: 0; + font-size: 22px; +} + +.feature .library-links span { + width: 60px; + text-align: right; + padding-right: 10px; + display: inline-block; +} + +.feature + .full-width-divider { + margin-top: -1px; +} + +.full-width-divider { + width: 100%; + background: #f2f2f2; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + overflow: hidden; + z-index: 1; + position: relative; +} + +.octicon-mail-read:before { + content: "\f03c"; +} + +.octicon-code:before { + content: '\f05f'; +} + +.octicon-file-text:before { + content: '\f011' +} + +.highlight-module { + list-style-type: none; + display: table-cell; + padding: 40px 14px 30px; + text-align: center; + margin-top: 10px; + font-size: 14px; + line-height: 1.5em; + width: 31.623931623931625%; + *width: 31.570740134569924%; +} + +.highlight-module:first-child { + padding-left: 0; + padding-right: 14px; +} + +.highlight-module:last-child { + padding-left: 14px; + padding-right: 0; +} + +.highlight-module .mega-octicon { + font-size: 70px; + width: 70px; + height: 70px; +} + +.highlights h2 { + margin: 25px 0 15px; + font-size: 27px; + line-height: 1.2; + -webkit-backface-visibility: hidden; +} + +a .mega-octicon { + color: #333; +} + +.full-width-divider + #footer { + margin-top: -1px; +} + +/*------------------------------------------------------------------------------ + Sidebar +------------------------------------------------------------------------------*/ + +.sidebar-shell { + position: relative; + float: right; + margin: 20px 0 0; + width: 290px; +} + +.sidebar-shell.coin-form { + width: 390px; +} + +.sidebar-module { + border-radius: 4px; + overflow: hidden; + margin-bottom: 20px; + font-size: 12px; + border: 1px solid #ddd; +} + +.sidebar-module ul { + margin: 0px; +} + +.sidebar-module.notice { + background: #fafafb; + border: 1px solid #CACACA; + border-radius: 4px; + line-height: 1.5em; +} + +.notice > p { + padding: 12px; + margin: 0; +} + +.sidebar-module li { + list-style-type: none; +} + +.sidebar-module ul li:last-child h3, .headlines li:last-child { + border-bottom: none; +} + +.sidebar-module ul li:last-child ul li:first-child { + border-top: 1px solid #eee; +} + +.sidebar-module ul h3, .headlines > li { + margin: 0px; + color: #666; + border-bottom: 1px solid #eee; + font-size: 14px; +} + +.headlines > li > a { + color: #333; + display: block; + padding: 10px 10px; + text-decoration: none; + font-size: 15px; + font-weight: 300; +} + +.headlines > li > a:hover { + color: #327fc7; +} + +.headlines > li > a > .date { + font-weight: normal; + font-size: 12px; + color: #888; +} + +.headlines li:hover { + background-color: #fdfdfd; +} + +.sidebar-module h3 a { + padding: 8px 10px 8px 10px; + color: #555; + text-decoration: none; + display: block; +} + +.sidebar-module h3 a:hover { + text-decoration: none; + color: #327fc7; + background-color: #fdfdfd; +} + +.sidebar-module ul ul li { + border-bottom: 1px solid #eee; + font-weight: bold; + color: #666; + background-color: #f9f9f9; +} + +.sidebar-module ul li:last-child ul li:last-child { + border-bottom: none; +} + +.sidebar-module .disable > a { + color: #333; + border-left: 2px solid #d8d8d8; + padding-left: 29px; +} + +.sidebar-module ul ul li a { + padding: 6px 0px 6px 31px; + display: block; + text-decoration: none; + font-weight: normal; +} + +.sidebar-module ul ul li a:hover { + background-color: #f2f2f2; + color: #327fc7; +} + + +/*****************************************************************************/ +/* +/* Footer +/* +/*****************************************************************************/ + +.api-status { + text-align: center; + padding: 20px 0; + border-top: 1px solid #ddd; + font-size: 14px; +} + +.api-status a { + color: #999; + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom: 40px; + display: block; +} + +#footer { + position: relative; + bottom:0; + font-size:12px; + color: #636363; + margin: 0 auto; + max-width: 980px; + clear: both; +} + +#footer a:hover { + text-decoration: underline; +} + +#footer .mega-octicon { + color: #ccc; + font-size: 24px; +} + +#footer .mega-octicon:hover { + color: #bbb; + text-decoration: none; +} + +.forknote-small { + background: url(/images/forknote-small.png) center no-repeat; + width:24px; + height:24px; +} + +.lower_footer { + border-top: 1px solid #ddd; + padding: 30px 0; +} + +.footer-cell { + display: table-cell; + text-align: center; + width: 10%; + vertical-align: middle; +} + +.footer-cell:first-child { + text-align: left; + padding-left: 0; +} + +.footer-cell:last-child { + text-align: right; + padding-right: 0; +} + +.footer-cell:last-child li { + margin: 0 0 0 20px; + padding-right: 0; +} + +.footer-cell li { + display: inline; + margin-right: 20px; + list-style: none; +} + +#footer .wrapper { + border-top: 1px solid #ddd; + text-align: center; + padding: 20px 0; +} + +/* end */ + +/*------------------------------------------------------------------------------ + Dev Program +------------------------------------------------------------------------------*/ +.dev-program.feature { + height: 420px; + margin-top: -2px; + overflow-x: hidden; + position: relative; +} + +.dev-program.feature, +.dev-program-callout { + background: #160625; +} + +.dev-program.feature .intro { + font-size: 20px; + line-height: 1.5em; + max-width: 500px; +} + +.dev-program.feature h1 { + width: 600px; +} + +.dev-program.feature .earth { + margin-top: -150px; + position: absolute; + right: -55px; + top: 50%; + z-index: -1; +} + +.dev-program.feature .earth-short-loop { + display: none; +} + +.dev-program.feature .wrapper { + position: relative; + z-index: 1; +} + +.dev-program-callout .wrapper { + padding: 40px 0; + background: #160625 no-repeat top right / 30%; +} + +.dev-program.feature h1, +.dev-program-callout h2 { + color: #eee; +} + +.dev-program.feature .intro, +.dev-program-callout p { + color: #a397ad; +} + +.dev-program-callout h2 { + margin: 0; +} + +.dev-program-callout p { + font-size: 16px; + margin: 10px 0 0; +} + +/* end */ + +/*------------------------------------------------------------------------------ + Not Footer +------------------------------------------------------------------------------*/ +#wrapper { + padding: 20px 0; + height: auto; + max-width: 980px; + margin: 0 auto; +} + +#wrapper:after, #wrapper:before { + content: " "; + display: table; +} + +#wrapper:after { + clear: both; +} + +.content { + width: 630px; + position: relative; + float: left; + color: #393939; + z-index: 2; + font-size: 14px; + line-height: 1.5em; +} + +.content.coin-form { + width: 530px; +} + +.blog .content { + margin-bottom: 60px; +} + +.content dt { + color: #666; +} + +.content ol { + margin-left: 1.5em; +} + +.content ul { + margin: 1.5em; + list-style-type: disc; +} + +.content dd ul { + margin-top: 0; +} + +.content li { + margin: 0.5em 0; +} + +.content img { + max-width: 100%; + margin: 12px 0; +} + +/* Taken from Help in order to show images in ordered lists inline */ +ol { + counter-reset: li; + list-style: none; + position: relative; + padding-bottom: 10px; +} +ol > li { + padding: 5px 0 5px 55px; + position: relative; + margin-bottom: 5px; +} +ol > li:before { + content: counter(li); + counter-increment: li; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 30px; + padding: 0 10px 0 0; + color: #999; + font-size: 22px; + font-weight: bold; + line-height: 35px; + text-align: right; + border-right: 1px solid #ddd; +} +ol > li > p:first-child { + margin-top: 0; +} +ol > li:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} +.content ol > li img { + max-width: 100px; + margin: 0 0 0 10px; + float: right; + border: 1px solid #ddd; + cursor: pointer; +} +.content ol > li img.expanded { + max-width: 400px; +} + +.content .full-image { + position: absolute; + top: 5px; + right: -20px; + z-index: 100; +} +.content .full-image img { + position: absolute; + top: 0; + right: 20px; + margin: 0; + max-width: 600px; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); +} +.content .full-image:hover .octicon, .full-image:hover .mini-icon { + color: #666; +} +.content .full-image .octicon, .full-image .octicon-remove-close { + position: absolute; + top: 0px; + right: 0px; + color: #999; + cursor: pointer; +} + +.content .description { + margin-left: 20px; +} + +.content .verseblock-content { + padding: 3px; +} + +.content .verseblock-content, +.content .sectionbody .dlist dt, +.content p > tt, +.content dl code, +.content ul code, +p code { + border-radius: 3px; + border: 1px solid #ccc; + background-color: #f9f9f9; + padding: 0px 3px; + display: inline-block; +} + +.content .sectionbody .dlist dt { + margin-top: 10px; +} + +.content .verseblock-content { + padding: 3px; +} + +.content .intro { + color: #868686; +} + +.article-content ul { + margin: 1.5em; +} + +.change { + padding-bottom: 40px; +} + + +.change .meta { + font-size: 13px; + margin: 3px 0 20px; +} + +.change .meta ul { + margin: 0; +} + +.change .meta ul img { + margin: 0; +} + +.who_when a { + padding-left: 2px; + color: #999; +} + +.change .who_when .author { + color: #eee; +} + +.change .who_when .published { + color: #ccc; +} + +.meta li { + color: #999; + padding-right: 20px; + list-style: none; + display: inline; +} + +.published span { + color: #999; + vertical-align: middle; + padding-bottom: 5px; +} + +#markdown-toc { + margin: 1em 1.5em 2em; +} + +#markdown-toc li { + font-size: 14px; + list-style-type: lower-roman; + margin: 0.25em 0; +} + +#markdown-toc li a { + color: #333; + text-decoration: underline; +} + +#markdown-toc li a:hover { + color: #327fc7; +} + +.content table { + width: 100%; + overflow: auto; + display: block; + margin: 15px 0; + font-size: 12px; +} + +.content thead { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +.content table th { + border: 1px solid #ddd; + padding: 6px 13px; + font-weight: bold; + text-align: center; +} + +.content tbody { + vertical-align: middle; + border-color: inherit; +} + +.content table tr { + border-top: 1px solid #ccc; + background-color: #fff; + vertical-align: inherit; +} + +.content table td { + border: 1px solid #ddd; + padding: 6px 13px; +} + +/* @end */ + +/*------------------------------------------------------------------------------ + Pre/Code Styles +------------------------------------------------------------------------------*/ + +code { + white-space: nowrap; + font: 12px Consolas, 'Liberation Mono', Courier, monospace; +} + +pre code {white-space: pre;} + +pre { + border: 1px solid #cacaca; + font: 12px/1.4em Consolas, 'Liberation Mono', Courier, monospace; + padding: 10px; + overflow:auto; + border-radius: 3px; + background-color: #fafafb; + color: #393939; + margin: 2em 0; +} + +ul + pre { + margin-top: 1em; +} + +pre span.comment {color: #aaa;} + +.headers { + margin-bottom: 0; + border-radius: 3px 3px; + border-bottom: 1px solid #CACACA; + background-color: #f4f4f4; +} + +.headers + pre { + border-radius: 0 0 3px 3px; + margin-top: 0; + border-top-color: #ddd; +} + +.headers + pre.body-response { + margin-top: -2px; +} + +.terminal { + background-color: #444; + color: #fff; + border-radius: 3px; + border: none; + position: relative; +} + +.terminal em { + color: #f9fe64; +} + +.terminal span.comment { + color: #ccc; +} + +.terminal span.output { + color: #63E463; +} + +/****************************/ +/* Expandable List Module */ +/****************************/ + +.sidebar-module a + a { + padding-left: 27px; +} + +.sidebar-module h3 { + position: relative; +} + +.sidebar-module .arrow-btn { + background-image: url(/images/expand-arrows.png); + background-repeat: no-repeat; + background-position: -3px -3px; + width: 13px; + height: 100%; + padding: 0 4px; + text-decoration: none; + position: absolute; + left: 0; + top: 0; + background-color: transparent; +} + +.arrow-btn.expanded { + background-position: -41px -3px; +} + +.arrow-btn.collapsed:hover { + background-position: -3px -43px; + background-color: transparent; +} + +.arrow-btn.expanded:hover { + background-position: -41px -43px; + background-color: transparent; +} + +.alert { + position:relative; + padding: 0 15px; + color: #264c72; + border: 1px solid #97c1da; + border-radius: 3px; + background-color: #d8ebf8; +} + +.warning { + position:relative; + padding: 0 15px; + color: #613A00; + border: 1px solid #dca874; + border-radius: 3px; + background-color: #ffe3c8; +} + +/*------------------------------------------------------------------------------ + Dev Program +------------------------------------------------------------------------------*/ + +.program-info-column { + float: left; + position: relative; + margin: 20px 0 60px; + padding-left: 50px; + width: 415px; +} + +.program-info-column:first-child { + margin-right: 50px; +} + +.program-info-column h2 { + margin-bottom: 0; + font-size: 18px; +} + +.program-info-column p { + margin-top: 5px; + font-size: 16px; + line-height: 1.5; + color: #666; +} + +.program-info-column .mega-octicon { + position: absolute; + left: 0; + top: 32px; + color: #333; +} + +.program-info-column ul { + margin-left: 15px; +} + +/* @end */ + +/********************/ +/* Retina support */ +/********************/ + +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi) { + + #header-wrapper { + background-image: url(../images/header@2x.png); + background-size: 8px 61px; + } + + #header .logo { + background-image: url(/images/logo@2x.png); + background-size: 186px 27px; + } + + #searchfield { + background-image: url(/images/search@2x.png); + background-size: 13px 13px; + } + + .cancel-search { + background-image: url(/images/cancel@2x.png); + background-size: 14px 14px; + } + + .sidebar-module .arrow-btn { + background-image: url(/images/expand-arrows@2x.png); + background-size: 73px 80px; + } + .rss-subscribe { + background-image: url(/images/feed-icon@2x.png); + background-size: 28px 28px; + } + .facebook-subscribe { + background-image: url(/images/facebook-icon@2x.png); + background-size: 28px 28px; + } + .twitter-subscribe { + background-image: url(/images/twitter-icon@2x.png); + background-size: 28px 28px; + } + .forknote-small { + background-image: url(/images/forknote-small@2x.png); + background-size: 24px 24px; + } +} + +/* @end */ + + +/********************/ +/* Alert messages */ +/********************/ + +.alert-message { + background-color: #fceec1; + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2); + border-color: #EEDC94; + border-width: 1px; + border-style: solid; + padding: 14px +} + +.alert-message:after { + content: ""; + display: table; + clear: both +} + +.alert-message p:last-child { + margin-bottom: 0 +} + +.alert-message.flash { + border-radius: 0; + margin: 0; + text-align: center; + font-weight: bold +} + +.alert-message.center { + text-align: center +} + +.alert-message ul { + list-style-image: none !important; + list-style-type: disc; + margin-top: 5px; + margin-bottom: 5px +} + +.alert-message .alert-message-options { + margin: 0; + padding: 0 +} + +.alert-message .alert-message-options .btn { + margin-right: 5px +} + +.alert-message .button.classy { + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.85); + border: 1px solid #d5d5d5 +} + +.alert-message.danger { + color: #911; + background-color: #efd0d0; + background-image: -moz-linear-gradient(#f8d8d8, #efd0d0); + background-image: -webkit-linear-gradient(#f8d8d8, #efd0d0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8d8d8', endColorstr='#efd0d0')"; + border-color: #da9797 +} + +.alert-message.danger.danger:hover { + border-color: #c65f5f +} + +.alert-message.danger a { + color: #fff; + font-weight: bold +} + +.alert-message.warn { + color: #613A00; + background-color: #f5dac0; + background-image: -moz-linear-gradient(#ffe3c8, #f5dac0); + background-image: -webkit-linear-gradient(#ffe3c8, #f5dac0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe3c8', endColorstr='#f5dac0')"; + border-color: #dca874 +} + +.alert-message.warn.warn:hover { + border-color: #cd8237 +} + +.alert-message.warn a { + color: #fff; + font-weight: bold +} + +.alert-message.good { + position: relative; + border: 1px solid #97c1da; + color: #264c72; + background-color: #d0e3ef; + background-image: -moz-linear-gradient(#d8ebf8, #d0e3ef); + background-image: -webkit-linear-gradient(#d8ebf8, #d0e3ef); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#d8ebf8', endColorstr='#d0e3ef')"; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) +} + +.alert-message.note { + background: #f5fbff; + border: 1px solid #e4f0ff +} + +.alert-message.muted { + background: #FAFAFA; + border-color: #EEE +} + +.alert-message.block, .sidebar-module-block { + margin: 0 0 20px +} + +.alert-message.block h4, .sidebar-module-block h4, .alert-message.block p, +.sidebar-module-block p { + color: #393C3D; + font-weight: bold; + color: #444; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.49) +} + +.alert-message.block h4, .sidebar-module-block h4 { + margin-top: 0 +} + +.alert-message.block p, .sidebar-module-block p { + font-weight: normal +} + +.alert-message.block.danger, .danger.sidebar-module-block { + background: #fddfde; + border: 1px solid #fbc7c5 +} + +.alert-message.block.danger h4, .danger.sidebar-module-block h4 { + font-size: 14px; + font-weight: bold; + color: #B94A48; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.9) +} + +.alert-message.block.danger li, .danger.sidebar-module-block li { + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.8) +} + +/* @end */ + + +/********************/ +/* Social buttons */ +/********************/ + +/* This gets Google to fall into place */ +.social-share { + font-size: 1px; +} + +/* This gets Facebook to fall into place */ +.social-share iframe { + vertical-align: middle; + +} +.fb-like{ + margin-right:20px; +} +.fb-share-button{ + margin-right:20px; +} +/* Set an optional width for your button wrappers */ +.social-share span { + display: inline-block; + width: 110px; +} + +/* Adjust the widths individually if you like */ +.social-share .google { + width: 75px; +} + +/* @end */ \ No newline at end of file diff --git a/static/css/octicons.css b/static/css/octicons.css new file mode 100755 index 0000000..04107ed --- /dev/null +++ b/static/css/octicons.css @@ -0,0 +1,231 @@ +@font-face { + font-family: 'octicons'; + src: url('octicons.eot?#iefix') format('embedded-opentype'), + url('octicons.woff') format('woff'), + url('octicons.ttf') format('truetype'), + url('octicons.svg#octicons') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* + +.octicon is optimized for 16px. +.mega-octicon is optimized for 32px but can be used larger. + +*/ +.octicon { + font: normal normal 16px octicons; + line-height: 1; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; +} +.mega-octicon { + font: normal normal 32px octicons; + line-height: 1; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; +} + +.octicon-alert:before { content: '\f02d'} /*  */ +.octicon-alignment-align:before { content: '\f08a'} /*  */ +.octicon-alignment-aligned-to:before { content: '\f08e'} /*  */ +.octicon-alignment-unalign:before { content: '\f08b'} /*  */ +.octicon-arrow-down:before { content: '\f03f'} /*  */ +.octicon-arrow-left:before { content: '\f040'} /*  */ +.octicon-arrow-right:before { content: '\f03e'} /*  */ +.octicon-arrow-small-down:before { content: '\f0a0'} /*  */ +.octicon-arrow-small-left:before { content: '\f0a1'} /*  */ +.octicon-arrow-small-right:before { content: '\f071'} /*  */ +.octicon-arrow-small-up:before { content: '\f09f'} /*  */ +.octicon-arrow-up:before { content: '\f03d'} /*  */ +.octicon-beer:before { content: '\f069'} /*  */ +.octicon-book:before { content: '\f007'} /*  */ +.octicon-bookmark:before { content: '\f07b'} /*  */ +.octicon-briefcase:before { content: '\f0d3'} /*  */ +.octicon-broadcast:before { content: '\f048'} /*  */ +.octicon-browser:before { content: '\f0c5'} /*  */ +.octicon-bug:before { content: '\f091'} /*  */ +.octicon-calendar:before { content: '\f068'} /*  */ +.octicon-check:before { content: '\f03a'} /*  */ +.octicon-checklist:before { content: '\f076'} /*  */ +.octicon-chevron-down:before { content: '\f0a3'} /*  */ +.octicon-chevron-left:before { content: '\f0a4'} /*  */ +.octicon-chevron-right:before { content: '\f078'} /*  */ +.octicon-chevron-up:before { content: '\f0a2'} /*  */ +.octicon-circle-slash:before { content: '\f084'} /*  */ +.octicon-circuit-board:before { content: '\f0d6'} /*  */ +.octicon-clippy:before { content: '\f035'} /*  */ +.octicon-clock:before { content: '\f046'} /*  */ +.octicon-cloud-download:before { content: '\f00b'} /*  */ +.octicon-cloud-upload:before { content: '\f00c'} /*  */ +.octicon-code:before { content: '\f05f'} /*  */ +.octicon-color-mode:before { content: '\f065'} /*  */ +.octicon-comment-add:before, +.octicon-comment:before { content: '\f02b'} /*  */ +.octicon-comment-discussion:before { content: '\f04f'} /*  */ +.octicon-credit-card:before { content: '\f045'} /*  */ +.octicon-dash:before { content: '\f0ca'} /*  */ +.octicon-dashboard:before { content: '\f07d'} /*  */ +.octicon-database:before { content: '\f096'} /*  */ +.octicon-device-camera:before { content: '\f056'} /*  */ +.octicon-device-camera-video:before { content: '\f057'} /*  */ +.octicon-device-desktop:before { content: '\f27c'} /*  */ +.octicon-device-mobile:before { content: '\f038'} /*  */ +.octicon-diff:before { content: '\f04d'} /*  */ +.octicon-diff-added:before { content: '\f06b'} /*  */ +.octicon-diff-ignored:before { content: '\f099'} /*  */ +.octicon-diff-modified:before { content: '\f06d'} /*  */ +.octicon-diff-removed:before { content: '\f06c'} /*  */ +.octicon-diff-renamed:before { content: '\f06e'} /*  */ +.octicon-ellipsis:before { content: '\f09a'} /*  */ +.octicon-eye-unwatch:before, +.octicon-eye-watch:before, +.octicon-eye:before { content: '\f04e'} /*  */ +.octicon-file-binary:before { content: '\f094'} /*  */ +.octicon-file-code:before { content: '\f010'} /*  */ +.octicon-file-directory:before { content: '\f016'} /*  */ +.octicon-file-media:before { content: '\f012'} /*  */ +.octicon-file-pdf:before { content: '\f014'} /*  */ +.octicon-file-submodule:before { content: '\f017'} /*  */ +.octicon-file-symlink-directory:before { content: '\f0b1'} /*  */ +.octicon-file-symlink-file:before { content: '\f0b0'} /*  */ +.octicon-file-text:before { content: '\f011'} /*  */ +.octicon-file-zip:before { content: '\f013'} /*  */ +.octicon-flame:before { content: '\f0d2'} /*  */ +.octicon-fold:before { content: '\f0cc'} /*  */ +.octicon-gear:before { content: '\f02f'} /*  */ +.octicon-gift:before { content: '\f042'} /*  */ +.octicon-gist:before { content: '\f00e'} /*  */ +.octicon-gist-secret:before { content: '\f08c'} /*  */ +.octicon-git-branch-create:before, +.octicon-git-branch-delete:before, +.octicon-git-branch:before { content: '\f020'} /*  */ +.octicon-git-commit:before { content: '\f01f'} /*  */ +.octicon-git-compare:before { content: '\f0ac'} /*  */ +.octicon-git-merge:before { content: '\f023'} /*  */ +.octicon-git-pull-request-abandoned:before, +.octicon-git-pull-request:before { content: '\f009'} /*  */ +.octicon-globe:before { content: '\f0b6'} /*  */ +.octicon-graph:before { content: '\f043'} /*  */ +.octicon-heart:before { content: '\2665'} /* ♥ */ +.octicon-history:before { content: '\f07e'} /*  */ +.octicon-home:before { content: '\f08d'} /*  */ +.octicon-horizontal-rule:before { content: '\f070'} /*  */ +.octicon-hourglass:before { content: '\f09e'} /*  */ +.octicon-hubot:before { content: '\f09d'} /*  */ +.octicon-inbox:before { content: '\f0cf'} /*  */ +.octicon-info:before { content: '\f059'} /*  */ +.octicon-issue-closed:before { content: '\f028'} /*  */ +.octicon-issue-opened:before { content: '\f026'} /*  */ +.octicon-issue-reopened:before { content: '\f027'} /*  */ +.octicon-jersey:before { content: '\f019'} /*  */ +.octicon-jump-down:before { content: '\f072'} /*  */ +.octicon-jump-left:before { content: '\f0a5'} /*  */ +.octicon-jump-right:before { content: '\f0a6'} /*  */ +.octicon-jump-up:before { content: '\f073'} /*  */ +.octicon-key:before { content: '\f049'} /*  */ +.octicon-keyboard:before { content: '\f00d'} /*  */ +.octicon-light-bulb:before { content: '\f000'} /*  */ +.octicon-link:before { content: '\f05c'} /*  */ +.octicon-link-external:before { content: '\f07f'} /*  */ +.octicon-list-ordered:before { content: '\f062'} /*  */ +.octicon-list-unordered:before { content: '\f061'} /*  */ +.octicon-location:before { content: '\f060'} /*  */ +.octicon-gist-private:before, +.octicon-mirror-private:before, +.octicon-git-fork-private:before, +.octicon-lock:before { content: '\f06a'} /*  */ +.octicon-log-in:before { content: '\f036'} /*  */ +.octicon-log-out:before { content: '\f032'} /*  */ +.octicon-logo-github:before { content: '\f092'} /*  */ +.octicon-mail:before { content: '\f03b'} /*  */ +.octicon-mail-read:before { content: '\f03c'} /*  */ +.octicon-mail-reply:before { content: '\f051'} /*  */ +.octicon-mark-github:before { content: '\f00a'} /*  */ +.octicon-markdown:before { content: '\f0c9'} /*  */ +.octicon-megaphone:before { content: '\f077'} /*  */ +.octicon-mention:before { content: '\f0be'} /*  */ +.octicon-microscope:before { content: '\f089'} /*  */ +.octicon-milestone:before { content: '\f075'} /*  */ +.octicon-mirror-public:before { content: '\f024'} /*  */ +.octicon-mortar-board:before { content: '\f0d7'} /* */ +.octicon-move-down:before { content: '\f0a8'} /*  */ +.octicon-move-left:before { content: '\f074'} /*  */ +.octicon-move-right:before { content: '\f0a9'} /*  */ +.octicon-move-up:before { content: '\f0a7'} /*  */ +.octicon-mute:before { content: '\f080'} /*  */ +.octicon-no-newline:before { content: '\f09c'} /*  */ +.octicon-octoface:before { content: '\f008'} /*  */ +.octicon-organization:before { content: '\f037'} /*  */ +.octicon-package:before { content: '\f0c4'} /*  */ +.octicon-paintcan:before { content: '\f0d1'} /*  */ +.octicon-pencil:before { content: '\f058'} /*  */ +.octicon-person-add:before, +.octicon-person-follow:before, +.octicon-person:before { content: '\f018'} /*  */ +.octicon-pin:before { content: '\f041'} /*  */ +.octicon-playback-fast-forward:before { content: '\f0bd'} /*  */ +.octicon-playback-pause:before { content: '\f0bb'} /*  */ +.octicon-playback-play:before { content: '\f0bf'} /*  */ +.octicon-playback-rewind:before { content: '\f0bc'} /*  */ +.octicon-plug:before { content: '\f0d4'} /*  */ +.octicon-repo-create:before, +.octicon-gist-new:before, +.octicon-file-directory-create:before, +.octicon-file-add:before, +.octicon-plus:before { content: '\f05d'} /*  */ +.octicon-podium:before { content: '\f0af'} /*  */ +.octicon-primitive-dot:before { content: '\f052'} /*  */ +.octicon-primitive-square:before { content: '\f053'} /*  */ +.octicon-pulse:before { content: '\f085'} /*  */ +.octicon-puzzle:before { content: '\f0c0'} /*  */ +.octicon-question:before { content: '\f02c'} /*  */ +.octicon-quote:before { content: '\f063'} /*  */ +.octicon-radio-tower:before { content: '\f030'} /*  */ +.octicon-repo-delete:before, +.octicon-repo:before { content: '\f001'} /*  */ +.octicon-repo-clone:before { content: '\f04c'} /*  */ +.octicon-repo-force-push:before { content: '\f04a'} /*  */ +.octicon-gist-fork:before, +.octicon-repo-forked:before { content: '\f002'} /*  */ +.octicon-repo-pull:before { content: '\f006'} /*  */ +.octicon-repo-push:before { content: '\f005'} /*  */ +.octicon-rocket:before { content: '\f033'} /*  */ +.octicon-rss:before { content: '\f034'} /*  */ +.octicon-ruby:before { content: '\f047'} /*  */ +.octicon-screen-full:before { content: '\f066'} /*  */ +.octicon-screen-normal:before { content: '\f067'} /*  */ +.octicon-search-save:before, +.octicon-search:before { content: '\f02e'} /*  */ +.octicon-server:before { content: '\f097'} /*  */ +.octicon-settings:before { content: '\f07c'} /*  */ +.octicon-split:before { content: '\f0c6'} /*  */ +.octicon-squirrel:before { content: '\f0b2'} /*  */ +.octicon-star-add:before, +.octicon-star-delete:before, +.octicon-star:before { content: '\f02a'} /*  */ +.octicon-steps:before { content: '\f0c7'} /*  */ +.octicon-stop:before { content: '\f08f'} /*  */ +.octicon-repo-sync:before, +.octicon-sync:before { content: '\f087'} /*  */ +.octicon-tag-remove:before, +.octicon-tag-add:before, +.octicon-tag:before { content: '\f015'} /*  */ +.octicon-telescope:before { content: '\f088'} /*  */ +.octicon-terminal:before { content: '\f0c8'} /*  */ +.octicon-three-bars:before { content: '\f05e'} /*  */ +.octicon-tools:before { content: '\f031'} /*  */ +.octicon-trashcan:before { content: '\f0d0'} /*  */ +.octicon-triangle-down:before { content: '\f05b'} /*  */ +.octicon-triangle-left:before { content: '\f044'} /*  */ +.octicon-triangle-right:before { content: '\f05a'} /*  */ +.octicon-triangle-up:before { content: '\f0aa'} /*  */ +.octicon-unfold:before { content: '\f039'} /*  */ +.octicon-unmute:before { content: '\f0ba'} /*  */ +.octicon-versions:before { content: '\f064'} /*  */ +.octicon-remove-close:before, +.octicon-x:before { content: '\f081'} /*  */ +.octicon-zap:before { content: '\26A1'} /* ⚡ */ diff --git a/static/css/octicons.eot b/static/css/octicons.eot new file mode 100755 index 0000000000000000000000000000000000000000..da731468de702dae087733beffa218fb7fd1ca13 GIT binary patch literal 30848 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 literal 0 HcmV?d00001 diff --git a/static/css/octicons.svg b/static/css/octicons.svg new file mode 100755 index 0000000..0aa83aa --- /dev/null +++ b/static/css/octicons.svg @@ -0,0 +1,195 @@ + + + + +(c) 2012-2014 GitHub + +Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL) +Applies to all font files + +Code License: MIT (http://choosealicense.com/licenses/mit/) +Applies to all other files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/css/octicons.ttf b/static/css/octicons.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b6c3706f2c48a60f501f2f63c57a287098f09104 GIT binary patch literal 30680 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 Ycv*~BbD|_SV~?z@{SSqs%J~2Q01}2F8~^|S literal 0 HcmV?d00001 diff --git a/static/css/pygments.css b/static/css/pygments.css new file mode 100644 index 0000000..5a6759e --- /dev/null +++ b/static/css/pygments.css @@ -0,0 +1,59 @@ +code .c { color: #999988; font-style: italic } /* Comment */ +code .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +code .k { font-weight: bold } /* Keyword */ +code .o { font-weight: bold } /* Operator */ +code .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +code .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +code .c1 { color: #999988; font-style: italic } /* Comment.Single */ +code .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +code .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +code .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +code .ge { font-style: italic } /* Generic.Emph */ +code .gr { color: #aa0000 } /* Generic.Error */ +code .gh { color: #999999 } /* Generic.Heading */ +code .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +code .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +code .go { color: #888888 } /* Generic.Output */ +code .gp { color: #555555 } /* Generic.Prompt */ +code .gs { font-weight: bold } /* Generic.Strong */ +code .gu { color: #aaaaaa } /* Generic.Subheading */ +code .gt { color: #aa0000 } /* Generic.Traceback */ +code .kc { font-weight: bold } /* Keyword.Constant */ +code .kd { font-weight: bold } /* Keyword.Declaration */ +code .kp { font-weight: bold } /* Keyword.Pseudo */ +code .kr { font-weight: bold } /* Keyword.Reserved */ +code .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +code .m { color: #009999 } /* Literal.Number */ +code .s { color: #d14 } /* Literal.String */ +code .na { color: #008080 } /* Name.Attribute */ +code .nb { color: #0086B3 } /* Name.Builtin */ +code .nc { color: #445588; font-weight: bold } /* Name.Class */ +code .no { color: #008080 } /* Name.Constant */ +code .ni { color: #800080 } /* Name.Entity */ +code .ne { color: #990000; font-weight: bold } /* Name.Exception */ +code .nf { color: #990000; font-weight: bold } /* Name.Function */ +code .nn { color: #555555 } /* Name.Namespace */ +code .nt { color: #000080 } /* Name.Tag */ +code .nv { color: #008080 } /* Name.Variable */ +code .ow { font-weight: bold } /* Operator.Word */ +code .w { color: #bbbbbb } /* Text.Whitespace */ +code .mf { color: #009999 } /* Literal.Number.Float */ +code .mh { color: #009999 } /* Literal.Number.Hex */ +code .mi { color: #009999 } /* Literal.Number.Integer */ +code .mo { color: #009999 } /* Literal.Number.Oct */ +code .sb { color: #d14 } /* Literal.String.Backtick */ +code .sc { color: #d14 } /* Literal.String.Char */ +code .sd { color: #d14 } /* Literal.String.Doc */ +code .s2 { color: #d14 } /* Literal.String.Double */ +code .se { color: #d14 } /* Literal.String.Escape */ +code .sh { color: #d14 } /* Literal.String.Heredoc */ +code .si { color: #d14 } /* Literal.String.Interpol */ +code .sx { color: #d14 } /* Literal.String.Other */ +code .sr { color: #009926 } /* Literal.String.Regex */ +code .s1 { color: #d14 } /* Literal.String.Single */ +code .ss { color: #990073 } /* Literal.String.Symbol */ +code .bp { color: #999999 } /* Name.Builtin.Pseudo */ +code .vc { color: #008080 } /* Name.Variable.Class */ +code .vg { color: #008080 } /* Name.Variable.Global */ +code .vi { color: #008080 } /* Name.Variable.Instance */ +code .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/static/css/reset.css b/static/css/reset.css new file mode 100644 index 0000000..885707c --- /dev/null +++ b/static/css/reset.css @@ -0,0 +1,171 @@ +/* `XHTML, HTML4, HTML5 Reset +----------------------------------------------------------------------------------------------------*/ + +a, +abbr, +acronym, +address, +applet, +article, +aside, +audio, +b, +big, +blockquote, +body, +canvas, +caption, +center, +cite, +code, +dd, +del, +details, +dfn, +dialog, +div, +dl, +dt, +em, +embed, +fieldset, +figcaption, +figure, +font, +footer, +form, +h1, +h2, +h3, +h4, +h5, +h6, +header, +hgroup, +hr, +html, +i, +iframe, +img, +ins, +kbd, +label, +legend, +li, +mark, +menu, +meter, +nav, +object, +ol, +output, +p, +pre, +progress, +q, +rp, +rt, +ruby, +s, +samp, +section, +small, +span, +strike, +strong, +sub, +summary, +sup, +table, +tbody, +td, +tfoot, +th, +thead, +time, +tr, +tt, +u, +ul, +var, +video, +xmp { + border: 0; + margin: 0; + padding: 0; + font-size: 100%; +} + +html, +body { + height: 100%; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { +/* + Override the default (display: inline) for + browsers that do not recognize HTML5 tags. + + IE8 (and lower) requires a shiv: + http://ejohn.org/blog/html5-shiv +*/ + display: block; +} + +b, +strong { +/* + Makes browsers agree. + IE + Opera = font-weight: bold. + Gecko + WebKit = font-weight: bolder. +*/ + font-weight: bold; +} + +img { + color: transparent; + font-size: 0; + vertical-align: middle; +/* + For IE. + http://css-tricks.com/ie-fix-bicubic-scaling-for-images +*/ + -ms-interpolation-mode: bicubic; +} + +li { +/* + For IE6 + IE7. +*/ + display: list-item; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +th, +td, +caption { + font-weight: normal; + vertical-align: top; + text-align: left; +} + +svg { +/* + For IE9. +*/ + overflow: hidden; +} \ No newline at end of file diff --git a/static/dist/ng-google-chart.js b/static/dist/ng-google-chart.js new file mode 100755 index 0000000..1105d72 --- /dev/null +++ b/static/dist/ng-google-chart.js @@ -0,0 +1,266 @@ +/** + * @description Google Chart Api Directive Module for AngularJS + * @version 0.0.11 + * @author Nicolas Bouillon + * @author GitHub contributors + * @license MIT + * @year 2013 + */ +(function (document, window, angular) { + 'use strict'; + + angular.module('googlechart', []) + + .value('googleChartApiConfig', { + version: '1', + optionalSettings: { + packages: ['corechart'] + } + }) + + .provider('googleJsapiUrl', function () { + var protocol = 'https:'; + var url = '//www.google.com/jsapi'; + + this.setProtocol = function (newProtocol) { + protocol = newProtocol; + }; + + this.setUrl = function (newUrl) { + url = newUrl; + }; + + this.$get = function () { + return (protocol ? protocol : '') + url; + }; + }) + .factory('googleChartApiPromise', ['$rootScope', '$q', 'googleChartApiConfig', 'googleJsapiUrl', function ($rootScope, $q, apiConfig, googleJsapiUrl) { + var apiReady = $q.defer(); + var onLoad = function () { + // override callback function + var settings = { + callback: function () { + var oldCb = apiConfig.optionalSettings.callback; + $rootScope.$apply(function () { + apiReady.resolve(); + }); + + if (angular.isFunction(oldCb)) { + oldCb.call(this); + } + } + }; + + settings = angular.extend({}, apiConfig.optionalSettings, settings); + + window.google.load('visualization', apiConfig.version, settings); + }; + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + + script.setAttribute('type', 'text/javascript'); + script.src = googleJsapiUrl; + + if (script.addEventListener) { // Standard browsers (including IE9+) + script.addEventListener('load', onLoad, false); + } else { // IE8 and below + script.onreadystatechange = function () { + if (script.readyState === 'loaded' || script.readyState === 'complete') { + script.onreadystatechange = null; + onLoad(); + } + }; + } + + head.appendChild(script); + + return apiReady.promise; + }]) + .directive('googleChart', ['$timeout', '$window', '$rootScope', 'googleChartApiPromise', function ($timeout, $window, $rootScope, googleChartApiPromise) { + return { + restrict: 'A', + scope: { + beforeDraw: '&', + chart: '=chart', + onReady: '&', + onSelect: '&', + select: '&' + }, + link: function ($scope, $elm, $attrs) { + /* Watches, to refresh the chart when its data, formatters, options, view, + or type change. All other values intentionally disregarded to avoid double + calls to the draw function. Please avoid making changes to these objects + directly from this directive.*/ + $scope.$watch(function () { + if ($scope.chart) { + return { + customFormatters: $scope.chart.customFormatters, + data: $scope.chart.data, + formatters: $scope.chart.formatters, + options: $scope.chart.options, + type: $scope.chart.type, + view: $scope.chart.view + }; + } + return $scope.chart; + }, function () { + drawAsync(); + }, true); // true is for deep object equality checking + + // Redraw the chart if the window is resized + var resizeHandler = $rootScope.$on('resizeMsg', function () { + $timeout(function () { + // Not always defined yet in IE so check + if ($scope.chartWrapper) { + drawAsync(); + } + }); + }); + + //Cleanup resize handler. + $scope.$on('$destroy', function () { + resizeHandler(); + }); + + // Keeps old formatter configuration to compare against + $scope.oldChartFormatters = {}; + + function applyFormat(formatType, formatClass, dataTable) { + var i; + if (typeof ($scope.chart.formatters[formatType]) !== 'undefined') { + if (!angular.equals($scope.chart.formatters[formatType], $scope.oldChartFormatters[formatType])) { + $scope.oldChartFormatters[formatType] = $scope.chart.formatters[formatType]; + $scope.formatters[formatType] = []; + + if (formatType === 'color') { + for (var cIdx = 0; cIdx < $scope.chart.formatters[formatType].length; cIdx++) { + var colorFormat = new formatClass(); + + for (i = 0; i < $scope.chart.formatters[formatType][cIdx].formats.length; i++) { + var data = $scope.chart.formatters[formatType][cIdx].formats[i]; + + if (typeof (data.fromBgColor) !== 'undefined' && typeof (data.toBgColor) !== 'undefined') + colorFormat.addGradientRange(data.from, data.to, data.color, data.fromBgColor, data.toBgColor); + else + colorFormat.addRange(data.from, data.to, data.color, data.bgcolor); + } + + $scope.formatters[formatType].push(colorFormat); + } + } else { + + for (i = 0; i < $scope.chart.formatters[formatType].length; i++) { + $scope.formatters[formatType].push(new formatClass( + $scope.chart.formatters[formatType][i]) + ); + } + } + } + + + //apply formats to dataTable + for (i = 0; i < $scope.formatters[formatType].length; i++) { + if ($scope.chart.formatters[formatType][i].columnNum < dataTable.getNumberOfColumns()) + $scope.formatters[formatType][i].format(dataTable, $scope.chart.formatters[formatType][i].columnNum); + } + + + //Many formatters require HTML tags to display special formatting + if (formatType === 'arrow' || formatType === 'bar' || formatType === 'color') + $scope.chart.options.allowHtml = true; + } + } + + function draw() { + if (!draw.triggered && ($scope.chart !== undefined)) { + draw.triggered = true; + $timeout(function () { + + if (typeof ($scope.chartWrapper) === 'undefined') { + var chartWrapperArgs = { + chartType: $scope.chart.type, + dataTable: $scope.chart.data, + view: $scope.chart.view, + options: $scope.chart.options, + containerId: $elm[0] + }; + + $scope.chartWrapper = new google.visualization.ChartWrapper(chartWrapperArgs); + google.visualization.events.addListener($scope.chartWrapper, 'ready', function () { + $scope.chart.displayed = true; + $scope.$apply(function (scope) { + scope.onReady({ chartWrapper: scope.chartWrapper }); + }); + }); + google.visualization.events.addListener($scope.chartWrapper, 'error', function (err) { + console.log("Chart not displayed due to error: " + err.message + ". Full error object follows."); + console.log(err); + }); + google.visualization.events.addListener($scope.chartWrapper, 'select', function () { + var selectEventRetParams = { selectedItems: $scope.chartWrapper.getChart().getSelection() }; + // This is for backwards compatibility for people using 'selectedItem' that only wanted the first selection. + selectEventRetParams.selectedItem = selectEventRetParams.selectedItems[0]; + $scope.$apply(function () { + if ($attrs.select) { + console.log('Angular-Google-Chart: The \'select\' attribute is deprecated and will be removed in a future release. Please use \'onSelect\'.'); + $scope.select(selectEventRetParams); + } + else { + $scope.onSelect(selectEventRetParams); + } + }); + }); + } + else { + $scope.chartWrapper.setChartType($scope.chart.type); + $scope.chartWrapper.setDataTable($scope.chart.data); + $scope.chartWrapper.setView($scope.chart.view); + $scope.chartWrapper.setOptions($scope.chart.options); + } + + if (typeof ($scope.formatters) === 'undefined') + $scope.formatters = {}; + + if (typeof ($scope.chart.formatters) !== 'undefined') { + applyFormat("number", google.visualization.NumberFormat, $scope.chartWrapper.getDataTable()); + applyFormat("arrow", google.visualization.ArrowFormat, $scope.chartWrapper.getDataTable()); + applyFormat("date", google.visualization.DateFormat, $scope.chartWrapper.getDataTable()); + applyFormat("bar", google.visualization.BarFormat, $scope.chartWrapper.getDataTable()); + applyFormat("color", google.visualization.ColorFormat, $scope.chartWrapper.getDataTable()); + } + + var customFormatters = $scope.chart.customFormatters; + if (typeof (customFormatters) !== 'undefined') { + for (var name in customFormatters) { + applyFormat(name, customFormatters[name], $scope.chartWrapper.getDataTable()); + } + } + + $timeout(function () { + $scope.beforeDraw({ chartWrapper: $scope.chartWrapper }); + $scope.chartWrapper.draw(); + draw.triggered = false; + }); + }, 0, true); + } else if ($scope.chart !== undefined) { + $timeout.cancel(draw.recallTimeout); + draw.recallTimeout = $timeout(draw, 10); + } + } + + function drawAsync() { + googleChartApiPromise.then(function () { + draw(); + }); + } + } + }; + }]) + + .run(['$rootScope', '$window', function ($rootScope, $window) { + angular.element($window).bind('resize', function () { + $rootScope.$emit('resizeMsg'); + }); + }]); + +})(document, window, window.angular); diff --git a/static/dist/showErrors.min.js b/static/dist/showErrors.min.js new file mode 100644 index 0000000..72c5343 --- /dev/null +++ b/static/dist/showErrors.min.js @@ -0,0 +1,2 @@ +/*! angular-bootstrap-show-errors (version 2.3.0) 2015-01-19 */ +(function(){var a;a=angular.module("ui.bootstrap.showErrors",[]),a.directive("showErrors",["$timeout","showErrorsConfig","$interpolate",function(a,b,c){var d,e,f;return e=function(a){var c;return c=b.trigger,a&&null!=a.trigger&&(c=a.trigger),c},d=function(a){var c;return c=b.showSuccess,a&&null!=a.showSuccess&&(c=a.showSuccess),c},f=function(b,f,g,h){var i,j,k,l,m,n,o,p;if(i=!1,m=b.$eval(g.showErrors),n=d(m),p=e(m),j=f[0].querySelector(".form-control[name]"),l=angular.element(j),k=c(l.attr("name")||"")(b),!k)throw"show-errors element has no child input elements with a 'name' attribute and a 'form-control' class";return l.bind(p,function(){return i=!0,o(h[k].$invalid)}),b.$watch(function(){return h[k]&&h[k].$invalid},function(a){return i?o(a):void 0}),b.$on("show-errors-check-validity",function(){return o(h[k].$invalid)}),b.$on("show-errors-reset",function(){return a(function(){return f.removeClass("has-error"),f.removeClass("has-success"),i=!1},0,!1)}),o=function(a){return f.toggleClass("has-error",a),n?f.toggleClass("has-success",!a):void 0}},{restrict:"A",require:"^form",compile:function(a,b){if(-1===b.showErrors.indexOf("skipFormGroupCheck")&&!a.hasClass("form-group")&&!a.hasClass("input-group"))throw"show-errors element does not have the 'form-group' or 'input-group' class";return f}}}]),a.provider("showErrorsConfig",function(){var a,b;a=!1,b="blur",this.showSuccess=function(b){return a=b},this.trigger=function(a){return b=a},this.$get=function(){return{showSuccess:a,trigger:b}}})}).call(this); \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b6e855b4feab436bda6db7f85ef15cbc96c89fa6 GIT binary patch literal 4136 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 KMNUMnLSTYk=8}Q{ literal 0 HcmV?d00001 diff --git a/static/images/cancel@2x.png b/static/images/cancel@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ca95b36109cb520eade47f2dac291a3265883c1c GIT binary patch literal 629 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 literal 0 HcmV?d00001 diff --git a/static/images/coins/dashcoin@org.png b/static/images/coins/dashcoin@org.png new file mode 100644 index 0000000000000000000000000000000000000000..74b71ab13437000564a694f76cdf9762293e062c GIT binary patch literal 803 zcmeAS@N?(olHy`uVBq!ia0y~yU~B+k4mP03lH*(V11Yv7Z+91l{~)+v@AAn&5zYdS z$YKTtZeb8+WSBKa0w~B{;_2(kexFl@U&$({F>EnVNG&rYqQp5rH#aq}1juDza4t$s zEJ;mKD9Q%F?sO-!EpBtDvffvL{Z#WAGf*4wL&j0^%ItOwn>c)#Q? zZW8m_@gq&?O)AjBQGhiB_FY!dNLHO`RB+PIC}qW3Z-xX024JkPF*Gm|U}80HBnlol Y%(p|1NlCC)^CHOmp00i_>zopr0FKo{#Q*>R literal 0 HcmV?d00001 diff --git a/static/images/coins/oneevilcoin.png b/static/images/coins/oneevilcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..70840c7bbb61d49de9641ae3035fa2ec20355b97 GIT binary patch literal 8855 zcmV;IB52)-P)EX>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_0K*JTY>22p zL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr?{oLrd!Mx~ z03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE@L0LWj&=4?(nOT_siPRbOditRHZrp6?S8AgejFG^6va$=5K z|`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t74chfY%+(L z4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AWE=!MYYHiJ+ zdvY?9I0Av8Ka-Wn(gPeepdb@piwLhwjRWWeSr7baCBSDM=|pK0Q5^$>Pur z|2)M1IPkCYSQ^NQ`z*pYmq4Rp8z$= z2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV=Mor9X9@Wk zi)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3F4znTKoQsl z_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZXRY(gmfXpBU zWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6qn9`(3jA6(BtSg7z~Dn(ZN_@JTc*z z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW#Hr%UaPGJW z91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5YU_t_6Gogae zLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*CkMxR6CTo)& z$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4=0!`QmC#Pm zhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`hkG4N# zKjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=?H;57x71R{; zCfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV4H2`e-B#~i zJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOjV`f+`tbMHK zY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9k0dT6g(bBn zMJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3sdQ;h>DV6M zJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP-cdbwfPG-_ zpyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1@Q#ce4LsV@ zXw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy`y}IJ%XeDe zRku;v3frOf?DmPgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3e|F(q&bit1 zspqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bETE}(E>+O9O zeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$cQ|r*xkvZnNio#z9&IX9*nWZp8u5o(}(f= zr{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8{*wQ4;n(6< z@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh;dbp6hu<#rA zg!B8%JG^WF000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQ zO+^Ra2^NelA`vyQB~h^>7K~l6 z2Ydb0M5Bp`C7NPlVl+`hid|z6#fXBas3@q2C@L02K>E?!as9S@KS+>+yW=F9Wd7Z| zv$M0$%-f!K_6Yn#?ZU+?O#%;`bYl$0)-+9fDJ#m|E44-sAw@RRXw>pbm4*TUnN-S% zB;pFafytGN1&_pHNlH#$(RCN+Mhb7Q?%5mHt*ih5p65Y0_5#Z8yps76uM!NN=gB22 zKV6oToU!t8a(WXxnTY0jp5!%gCIjtWXUrEw2DYkswI|JpWR_2Fvk~NhL;}=Rz7e z*dK|D3JwPVNIC-Ar~fTre%fBQ-a2MP;{1p)#2kEp1T%jBoTAgZr_k|9xOqezJ98L}biHwMy+u5yUH2PzyT=0K@W0E>8A~?p`|;J$U$3 zM4kV=!Q)X4yUh`R7CQqEbs)qpq0!gkm#~b{j{KKE`D=v*B;lgb=w>^+c5JWJXs#FM zKU4P}GzmEwk6-|wtD62Cot*C@&$9DMN!s+PSyE_^; zvWJ7colP&M)#*@Hu0-0iZ0tE0j6cFIqp^b=6h&Fti9Bj99M1y`V|<*G9Nqb)?wFtU z{ND1{Lm~G|OUoLYxJmz&Z|t!~&6co=jIU|5#Nlu0A;<%ah`38+_MTzT*ai-^L?kGFzl z7?W#l+P21$xqf(W%@)wKDR6qd;i)1e#-qVI=49wOj2|;x&~NzkC%KA(_O&}283x<8 zti|aIF}Ql=Iw*>QMyp5Px4YrXjql^Nj_vAwxs1#lB&TH|D>n}sl?DJHmWa{R*$M9L zTcUF(_xe>$t3%-4WBBHWeUOTU;CVo9Cr9FqQ|QruBFf7v>fEEz8O|4^#*A=i-UAhi z1lxge^B91fV#%$)J&3~hx>J8}}|E?fsK7C#P*m=#Elh|oH#v~J;o9bbKD7L-RxDVQ>Q72fe%fV5{>(CZBl3Is3Y zatVR}MNwc`76k=G_;kw;@ba0Ch{%{aedRJKBE$BA5?0xj-fwn8rAB9QTn7i~zAkQU zDVu@05EZ-EYDCKe9`02(WJteWNPPIT&T4G>awojU%*CzS_hBcOy)>gM7KxCTUw}m` zHe&d=d0<)AuFl%pn6UA zpBzH}esAN#%P5@DR4|+(%!Ij{Cg6jm~i#3W|#X03uolp6Bs2B^?Dt z#TY(r9v(kQHF4jss*xlKjYbQYPAMDZJqw0NRp(5;zJg5 zrL*CGptqOzg!qJqb4e>Uz+f<J2g zp+JDp@XN@^$cDkdVEvj!RYpJl9j@mlq@ zpo7~$(=`6AW;8OGIeBz7C`O|ZH)8K#{wzPdwD>QQrLbtIXQx1*jEk+$MGOY5-S!5VB<$iOwxq8%hu!58nR*D{ov}_1iU3io&Y2w z*%Y9$yc(F9^Hwh?uT)u`M4z|2*NI0uzt$d;XRSnGacQ-zQ^$6QId>S#mjs}sTxoeC zf3xZI2E5VrHQb0iiVs%IF}e29#_u4ag>ZH>Ap@}g$1h;Cv|v0SlZzl}+Ik?QZL5HJ zmZexjSs|XZT0Le=9%CX)%gDj0ut@M6iv`O!ng(HF5k6Qp3)zn@Vdc`<=+fB(rR9}S zYqVfl7Cdho-$B#}5A=EiO3EtX?Cc1?aU&5Lv>Ty8yV10Xv&lU_?+->$NH|!Q#kq^7 z(Q(K2ZP2W#i`8dJXxbZ^bP%V*Bc10h+ng(j&x2F|KbxLX0&5nfcq=ns{ zB&Xfxd7iQq%q^VlkF_5xs=?YZ=;k#68jZ%JUytrxaq`Ibwi!%@fm*GBMyrEfYlM+w z03Hxh0#HHOXj%w@AgYLJj)RMf6GUQB^-8b|gM$1*vmv%;CwCm( z^9^J&iPhcnve-PD7GlrAU~K$yH^id4;euEyfs<3?>ba8ykd>JOilRVKBm@)%o!(Hr zV>zBjW@_drflMy-;yAtz8}B{1AN(>z2TK zu-8ikBv+A-4PWfW^2IaoMi&oEoirL#{YKklvnYxJC7_V@EDNC#Q3yR92}OQkwF*-t z2}or_h`}Rggk)srO{hHx!!S^5^$=1N+O}zlPMz9gVBenT@kVEK?cC9(7bqw!LC=By zkV$Ba@EHJ~A$>7w*nkE_$9Eq*!THD-T)KJ_(Xj~#{B8s0%ouOey+y?(xE^;Oad#4N z`_2O>@(PigR|uIzRIME~Bk1z7@<`&%!IK{q7ZrP&53>QeodfPhA4k~vD>xB)9#Jv3 z0iMUu!F{o8!Bn_+Xakv4V$ql}EQ^67W*}El0FL9qupH*hoQPG+0?@dTgY}}B-hlA) zSMm9`KOsNA2((ZL5iP{dZR;^?h?kYhf*!@ir8s*0EP_J9p(reYN4r)SKYA#p`T64B zgJdjz?^BDZMOmdLgYX(Qy;PydH*4xSo=3MX9yk^BW3?BCh}> zNui=rg<(Uyu^%{YSMk%{ZSj2%tix%OkZKjlD&4!SQgaV?YsKm^x4bRle}^3KE_O5f*A`w zgj%CThYs!V&WJ&{5`F;34t!S!l(h6LZ2f*OT6uaSVByDj@aPH3%F01e6a)ea6iFgC zzsNM37K^Q!NQeZaRG?C8C~HKHor7s%Or_FR8K_$QghBzDxHLvobR4e4+=5Id!LDr^ zFre>qS1FT8v3BMB=f<4lQBkP^Nj$GGwrbH7zwG=Bc5*3bq43YMHFecgtx;cfxlGDf<2cGoP3tla_HwYCZ6_QgVi9iMx`#Ih`Xf2z+23~4DvcIHMg?H!PlrJe zbzj&LG7k3gT1)|Fb%9xq(~)ASq|zcVB!RLDQ(&67IKp6LY_AydJZK?>krNgoGAj0O z0W-)q0O^@I5DILkO<9gZ$M&sFy`4^Lh42Cl467j-hRd@^H4p?cb4(-LwyoWuRO=d4 zRGmC)CGOsT@k2Ze!{F_KlTlJ!^5Ul*cpk5J>10~?E32@wV+e3Obfld`_}H3$GDaiR z8f}eTM8dN}%Lc7@BYPPZtk?j9;l;?Tbzkg6esNKQ0z*5w3{9Gtmfh3RvaH)x#*j=( zW%5*O`opX(rxPh&941s-LS1{NGC^!Y=R(JYYsa!?4qfiY1P8!gFoh)R4T?V2aea?B>=GPvk#!r=o&m}omPweM?x%K&o3xKQgRx|2A+WAc^;pvUTpeIogR1ZJ+hea zR>e5R&}uT=)1$-JwTt5>WRFOMqsL57TD!GqhAERqH5eGNScKhsEUQy|!XpT%h8bLf z09YOv>C@jt{^aR1C~8IFweQpE*~^gp3C!;AHvCvKEH~G#$K8dpQf(qzv1BF~w&Cie zu2h;-7;3hQQ8yYqu2yHjw$DDOQ`K1Z!RJ=N)@Tj9t|&VOT7W!p`chT+E)hpqjUX8o zbC<0*k+pBz3ZJfB3bnRjDy7rwk(*m!_S*SNF%1T0K;K^Qn=sOJyo)hN&&;(L3lSio zQmKyt#YzAmCynvO?w=2#ZELr~dMlwmMUjY&y@P~Wk?Wk96Vdmr?hUFR@jMU}6IVx` zmY#+D!qNuX7GT?!59_-9od+PIEvFI&hJmWAxVn@{0>ILR@8b9U+kS8A;>cT%L4;Vp zc}E@ju>;#65DH)TB}kIM>4>X!q3zvAFe&015=%(dA&KIzBB3xiAh-Z+4r>oqj4qt06@I>5%>FvkLt*7CET-qsM<_Z zR;sb<+jVHus)dO>^;s5n{dB}^1)*k8S5&I})~HP8k$1-wn9EmUA)?8%BC$BTJ}Tk& z<7aUD?n4uKi{{M`9~A_tO!h)*MN$+JA10fWM6z=WY#KT-k$DqCx&JQ6&HvGN=!}`s^da#CL|QuP@2td0_06rO3$2sg;*FA~y0U zTDrM{VQnkw%Oqk%UX82a8FbL=bT&o11OSpEapmkmj2bbh&h@cV{)b#eetq!{%X92B z0MN(Xs|ySO_)eIIFE*|`=-H{m)q3L)5e>hY@1wM|+(a&y%Mg9;2>v&JIt)gp-qoTg z3Mo(1Oeo7rmAYO~G+I3d_J0dEF9o5MTk|^CSA4hyi4ULDn~_&ks>8~2;;TGLjn4*6 zfH`||4+4KZg5Ev5%x5?-^+lE?rDf%nyINQ-dzm#?tz$1khTznH`;tG~dRvlr{NQyQJVtSl>ToY{HR7A&4W z1D|bJnKEtSh`BaxXP(Evk?-Q#&AOlYHfiFF8yAlvXxGLvLG~~y6|)zw zMR9Ryz3RjBJk%=n_M*(VmDcQ+*|urR57@YNIlRZrDNIeva3O8x|HS}hj6w+XwxSqE3wCUA7?gL9$3z{9-_L^KVW7FtdE0ATH=?Fc#^W)s6l z5CoKJ?Nx1M#SnGTL+*uvsU~$29yDICVqboga->^=gYY~GH%{6d>SF&K4jNSN5j2?sj+iy)&vh8C*w(KMx9be z6%(hykrNTP5P21;X_+W3tAJ1_u=)H=6`f$Xt$3O>2*^~I=499uBfSXuBkMPO#@)=! z9Cu*@j>NMpi%PW?_HrqDbnk+mZ+OD3MKc%~1|NR911siFMMh2me0{v2$Sc6Z$0@j# z@DSNK3W!A_&@}zRDF@F3Is>OR{d+2BxhK`0IOX00>y{VffV>w|!sc z8E~!62(R96AmQF)@OU}jwX+-#lE5xnK&*Ir|I!N)M=$*R2~(HiOoLd!hTL>A^c*IP9RWqIqS@H#D`Ja^%i0il zHRpL7&^R7MRK~-LL;ubo#7kHma_y$?MqIyn_hd#!jz}P&{uMMBmW4T@nMHv z*0`_a8=B*x=LYRN6msBJ{G-IG|G z%Af1JbYLPbMq}jA0RVuIQ)fK__nqiR5SUP2q4LcyC<4#()&J4(S0r6~SN&zn|EhIW z{T&ktiA1cjlS#tVI^(GkgL=hm`+B{iDiG?4znHiG^p2_N9cp^4oAGzL|M+XLkD{n- zghpB3F0WYWAfQMo!E-`}VF`lZK~faQgESZ!R_*F+U&<1KB+kf&uUkDkeEb;S+<(eu Z{U3!CV+M&RiBEX>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_0K*JTY>22p zL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr?{oLrd!Mx~ z03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE@L0LWj&=4?(nOT_siPRbOditRHZrp6?S8AgejFG^6va$=5K z|`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t74chfY%+(L z4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AWE=!MYYHiJ+ zdvY?9I0Av8Ka-Wn(gPeepdb@piwLhwjRWWeSr7baCBSDM=|pK0Q5^$>Pur z|2)M1IPkCYSQ^NQ`z*pYmq4Rp8z$= z2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV=Mor9X9@Wk zi)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3F4znTKoQsl z_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZXRY(gmfXpBU zWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6qn9`(3jA6(BtSg7z~Dn(ZN_@JTc*z z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW#Hr%UaPGJW z91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5YU_t_6Gogae zLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*CkMxR6CTo)& z$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4=0!`QmC#Pm zhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`hkG4N# zKjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=?H;57x71R{; zCfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV4H2`e-B#~i zJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOjV`f+`tbMHK zY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9k0dT6g(bBn zMJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3sdQ;h>DV6M zJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP-cdbwfPG-_ zpyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1@Q#ce4LsV@ zXw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy`y}IJ%XeDe zRku;v3frOf?DmPgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3e|F(q&bit1 zspqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bETE}(E>+O9O zeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$cQ|r*xkvZnNio#z9&IX9*nWZp8u5o(}(f= zr{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8{*wQ4;n(6< z@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh;dbp6hu<#rA zg!B8%JG^WF000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQ zO+^Ra2^9bqktf#X_K@?^!x-#a_&9%p7We{ zop(_97c@eM=k@Eif=-;e;FFx3=B?7G8|V$@IwHkZ0O139o82cPD@U!@>7=?`GsE*d z1%NONLp(i{f~SXv)z`;cM@!gDPDGMuv&K^pZwYo=Y_)1t46n8e&Um$RyCjOD#7ASk zHSrVtvUcf9H<#4Q@*=x;pG5!uogRM6ysRH9^AA&?w~q z1rP!dLfkun6a|XP1Cr5V11}Qzda9vRDtN1noNZ96+?h758l8H7>V#8|FY;~*Xs`VT znBs2VuHKCICXWIk1Xr)!RL4I^ZJU&w_SN!L8|$a%7~!o^K&_GkaO) zraALP*(fSN}ZVMtID^)90>u>2gi*@m50=#1|GM1%ZcVXz282 z_;_mI<>h%I&`LJ~iTA0(`yHZr5sFeDF}v8O*2< z=x4Wc_U_Z(8+mTRTO;{4U54TOiQoPM%;l>$so>@f$>HN?zWj9l%6D?LT8&5u7@Eev zxrrhHD8MF=n1;2g4m-Mc{nZyizA3d;*?%Zc#>>o1Yc~1A`H`b1&77XA)oLh;`qzU6 z0BD*5O;M0DRJHKP`&TO0?YwgQsGem30IDkgE((*8k%NE$AMDtDc-tp)R}6u`fubn< z*Ph=9A+T_Qm9yk_$w>@5Us~24UAkUDCX@UJmO{@TAP53j znQUL&&7(sBSYCF(u$zC|JMqhJep;o~8z7TP{zHKijpGDJSjO(J!leh4Apco8;^ z2PcSNX&MYofu?Ct6u>eJYE&(U@W^=3Gz~%s2qCZw0tf+QECZIIAz>NNbm_xK6h+W9 zofsD$QU!njRTaP#_s;>$k>jV)qiYB3+H-jJtVOF9>T`{dOW6|Nfiy+IY_Y>=w!+6# zg-Vsmqfx_pXx^v}DwGRAnE-$I`g%hymq96)gJ$Rg>)m_PO&+wsASFWz7nx=@sW;{=z4 zV2a9f9Z1U1p-q!Im@sA#dUopwFHa3vwqzG9Z_(^XNJzoXeMhi-)n?dv9{%1Mm(Ie9 zGEY{UT}Vq!Z%vH%uDq}mX6yF-7%`*|7Jm8NkBh$fWkNYW&q6sdDHSr*tX>H>Zr>~N z1QG%mjAoQATL!OnYmf0G`lEXF$}gN&bLz|`Z1`pJ$=%32T?n z$GWZCar1UmktUJj1qdR+(gh!4#E^df2zA(Gw&2^@F6p^(50cTpPdDt?eQ4&#vzC6s z6ag$5IeL7vBe~sh#N2wf#R5ECAr+_}0B?RE@HUtF*V9bdAh1%%^fLtbHynOtw`Bi987p6Fu?KCb^m>hj>=hmHv zov>N0MY^s`fFCY~Y{UJSc+_at4^_(hKeunD)_}=l2I7nPAHOiR9Cx+{NvW7HWhTyr z-a#23&2wZn3JQ$|*G_IjbaX80cNl@HWxWf{#tkM*PF7-88SwXbSDw{r72@j^>!|i^ zn$#RHZ0d=k+F3-AU_jrlkNGr zN=ZjdQU;QeQo-4*&}#J{M0~ufRVo#vav8k5yimJpIg|Bd;OrbkQAEAEwb89j14KqApfH+f9{ZR1_*d|~l^G{# z0%b)j%rPZTVFtW8E%RDvm|szLJw*YrDLF_8JAjH6%HqheQy4h<6O{4w{F`dXVdNX# z@zs)6xOcaHfsCclg%_rxl@+N zA%puq{w$HO;2)aN%~l(Nf&y{j#BWZ6CH&4k%v$gbs@Cs8(9oE;3qKp~Sp z43Tv`&@C^D5|FSAR0LF{9qVo?pHK zO)(I~X9Z%ZM1m?+Di+zEqm)Zw;^>)B*Q{0SfJsiy#Eo0woxWSUWrLKZAUa{Xw43aB zy;rx#pKI2r0=vZqK@icSOFLXRwgrJ@{EK|wtJiPgmFB(C_4NtZvVA|K5(&IL)el2t zOXgfh6bV?CfuD~jqGJ;9`J!)8wsv>C_wfR7T+wCC?p-?I?C~w|@%DfqilFJgPRePT zM(4JTVX@ka_KbwUQ>~B&`1@S|pv?2!D+a*q+H(Zu%K78-B|ogw>J3i0C{O@=13V#r zBEE=W7|;?1fdRhwapn9X-}maZTj=@56!aQ28D_HuO1b2P@Cl|U3M|W@Tp0~^>^*_{ z!M(9$*}6j6o1SceW&CmS;AXHa1BQLt*jKA&HJGh7C!P(E$z?v$fJUo;Yen)AF7(U} ze7y&L-M(*q=(U?wojp*bC<;o=)8{+BKHexF;DcO)u}G9atJCA%kLICEzX`Y(eGh7- z95hY6aIs6GNT5_mVdr>!|I-${(yS*AA3IYtHqLRd+3cVs(x=Xnnl`G3T)o*j;gzA` z=cySZ^{&~nD8{@(0p{%aQ0k982O7^@{QX#|i>J>@mGUW7P$rY2dgXG6Ow2^C!BD7s z{J8!%)N3;cyAPg%pN}RlB;y5ck3cMwu%Kxg6W{wBt$VzQ)U=F3U7wVkhFp^so=VwM z6sB^e@_@nW^mEB%Qb-hD`vI9J6gAxgnEEaHpk140 z=&3~L^>Bw&W&FEyFnjSTC|Lrjg#8D`R#RXlEK(Aa5Zq}n_8d6j@R~jQkHKc=G5qx| z`K+L8YP`R<+E4CR>myk10qR<=1LpRX{n&RP6KO&-|__ zqjGsYG#d3Bu$5{Q=0v+dz??jD30K2z%0FAOYMNXoaRXQYv(^5LO53vOD==B@ICJ)V zzSnKs`UiqL4FN!2x{wqvwE~AvTtJ(iqmh!5_RR0m_hWG@G9E1&*M7ow^;a{bYF&N? zwMqerkI%0FD5$GB513BvTjFYH_$-q?*VA3pB};F5CaS(-g>oq4>w&9bcMzYD^pufs z<@Xyf`I9f8Qp#S+_$5LJ6mluF85!u@Z#*76bewc>wZ!Xs3KQ z7hkN{fFM6lyzDXgf+)gdGNV(k(FnT{@%a1w`wk=5Y{St0-JiK8Dmorgg%s}CM=ZODt*P2lHm$x&Hu+i=Od$?uB_gTAQPTAPCR&8TaO3R4pHXTX*9S6Ptk93%;pP8c&rRQn}(C0C=97oiAXzcWH->n|5ru7ad2tx?nU#L9S3@-S>+zVn{ETZ8mJ* zbuiz)Uwu9mgrZ?InIZX?M@HIg90Xp#fSw&tr&jf6e&;wIS8qnb*UJ-i>(s#4i>D(c zL+27`2qEzC*0h17V!P+16?q0Q$4*}YA;fp)qVI+(+>jznXE5XI1s{NAS+r`=7``4V zZ2WaUY_@05Kr|W+Hm&&rRttxJd!r~IDcgW0pTD2)?>SmM($g~`*LXrElc8VNgT%u=-8$S2K4IzAnzEUQ~O{j z6fzt>emdW4+P7_vZk>Z+w%Go?U;$t>TX0~@a#XHVA>TgV{qPH{HV)&4z4n-0&71WB z1Xk*r%t;Zb)M_7fK%K_eZ=^f0_95xakdM411#|y1v>b-`_Jbv#@gQHprz6-W)dI@%Ji~5-aAt zhs1Q}Z8L-b9x6Fwv|wC*vJCxq*(EMM@zu+rH_N&D(k6=yBL{Yazn{-j-?t8KglxSP zdk&sPT>OLQUcY7CSJ0cS|2m;p5JU{<*BvXrob}v3>weh@Zx1y_j~WOMkEfNAA#e0X z)4Ek%ehxn$&k2A`_IFw48J4ta?WS2;z0u_Xt#%G`XTAT7u}vnEVg9FMA(gQhH)Zy7 z0TEcnA2HVt!q3+mHamxxJ?9WbQAo?wp?8n=_;Kaj0{gD}Wfx4GfQfGn%=h<2bEm=X zqAbHorBazsrSZ>YNjvw2;M~P4s!cy1Y3Sqankr2Q!R(JGK&epV`}@c5k4MA0H4q(> zi1U}PKleV~UY@vmdMBDSt_!P;!^?~ri;ctF>2KrvKvsU#kjgRL|d! zrDMAm;3cjpENZ0;wj6dUjB2$jLVStX6vqq5Fj#T*=teZCTkvUd z*n#?}k$Gd>7fX7eX;`K7Iu8H()-Lq)_hp``< zorhLuz>onwkQ;N#Ay{~x$MA6xM{-z!2$s7S~o+LDwRMx$;$}=WHPA-XSZ~H zt_<_T`t5BbE`~`+Sr&`te&n#`T#(!kYebBPm!b56>2PoVbHQgBdlMw1Xf!F zW_~aZ<;$0ajpJc3TVb#-`cY2c$FteC z`{+oSsIVZvk{jlN8Vc#LcsF^ctJq6!2;gGp-YD* z==y4F^zGFJ<$?mBR4SYT?)l5t(6!$?2=sq8Q-dIi7&W{<7R`FMz8JQXWT2mvwkAT;0?=mCXX1`iK4{Cs_(@$x|VGQOx>u`Ghh_@hC+ny6i~8l+O! z&){x`N1@N)Nyw8aNxqbyhyr56|11!UMxz<^+6)9sc&D^WiULy8v%@VJH|j%OEsw&S zJaehj+wXqeOzJ_ajc3zW&Sbw;fD`ZEl7kWi`T zz_$@`_kN)R_y68ZCbK;wC8-Q-i8>kpu7%y6n4N2KNwAYhWoX;7NrC+m9wg&tc(grSp_hDgiz2PsC8WkOjIdfLwgAYcaWs4>+ zL^kds$OG7WC8USHte$ zZd5D;L45x8EG?zrBWF*Xy6ESnma>inXsgwVlV`7D%bpPUdnnPNRU@=-*Am^kwnrI1 zAIRmh665o=YE(tHo~_WP*LXC0r80&O?Tb-EUoW-1ybc9wyB*1?Sy-|9XZ*4E1d z!iO3$`n^}rT)rK`7E*$KM2L7^fSnh>^8&m)HSqHGMB}iyhvcrwV-vYdT80Q34)t7!7H^Yp;nD54@seW+w?ih@Y63l;q$Pd zsL5=F(Q3!g{@u{4dq=ct-T*;?0VN8OkaO3tbLV~>KXC=+D)>Pr%QI5uS~+Z7F&n*m zb#?o=xw!`1y%&p{5%+Q7;#FL^b_;j!B|@Q;L8Xu(z}E{FtMlhdc8(Xc*_qv_@l$92 zbmHWN@vfNA2lnrY1)ojEt%xXW{`C(WJ9!ytSvn}?QYd6nSZo{!P2sinP0+7T5A^HZ z)va>Jn)Sb7-jeU3R>>b5xbiYY5g06Xyw?YnX4_&J=pdI!F0d7ivyw1TF906$Mm9ybha zTQ@`Xs+CZqNl&Qc5~n0iLI{$Q)5cKa-=BZ<`0>--oLxXsB$z#Y62`wZ=&A41(lc@6 z<{g~B5`nW9E+OGTGVB}=quBYkih?%R zgyxNEW8<1H5EN9#rSWt+Jq{i@iPIOta3eet5qDxBlS`pe$e@%<(YR54G-^->UD`KC zOd%42gygIbsR{3Ye*4&obM>6{o3L{{)~{NC?p@kHw@=v3 z2z2Z-9=@Kcrxudqc<4HRdas5JUcnz*zAf;6gGNrlrO*hcloOEN8*A?a%>KlJNeG+wV( zDG`1DAWomVieY0vg2}=mz{dlkD1tm>Q*x;Ugb?%}{x0g(tA+2r{1kO+)hP5ByZ0T# zC-YXoYBs~i+w&Pfii99FQ;*(VTjPK8K0@_sm5My4Hk%DU{`?!(Z$E;Z^b8210G44; zwN|+&ST1==i+PaXxO`uoTGesp(k-U|LjjNg-gH*B*27ufHHykR%J=p0F0fyAj_$d2 zgC1>8mSrH9Nx{;<&0BXcZ2V^ktlk#07p{0JIK42h)}d_+q})4;O=}jRV$~{OSr$gK z6*gO5LL`Qvp;F2bb3YFCTMfnspDspPdS-!ly?!GcJqJ#};PEp6frCuSKFr9O=VfTI z*q~CY(5il8oH@82J2!t@B(PX4RviEHJVw6#DLl%x!n`kkgdryj5=mYjVTPd#bUn#6 zICk6*D&r496rCgu6ljL3$m;canJZpLA^|7|@{iSKf3B_3hTKkkQJK|`&QLLp@l7~qLL z2SV`6_Jf%F@dSJ@^=bKr=LNhqaXNM%Jr5tX9R6M!7)(|etvt-R76kaI@!^z_=+dbT znl!5GR6@pYR;|aJuYQKNQUZyDMY$lKeCMWMHt9HZS=FkQVC4jOI7u8pM1NMNH!;rR zg#s^%P^${Id1PhjoIWX~X$oq&6k44gJqJxjmCEJu{@cSadej?*zK2A@qI>6d=-#;< z)~r|ntxk`W)O6@{xkygUKxS4BY&H%R@=4e;eeN>Ut6K*xnlym7wV%&+?|NZ@VzFBB&a?&SG4LIDdq^OaFm8|JluD)W z^7JTPz!74ny*yO{aS<>EW5Lcj{(fEspM<(HK20Og&kLW-#6lrO28_sO)1IE5Hn^0f0U!?iF(eYU*rOFaR5FC$y^jX% z2O}*l{e=L_>2p`mvh#4L6!KypOIe69Vq+5^b23pAApj^kllJrV&UKc%5dts_jjWu4 zLqp2=`M~C44z|KPi&QFsXf>l%w^2`J<1CG~_rM8s>^&Y*mM#&09d94ULVRj^CRoPV zLuLX|AP;C(D#>$StvmiK|}$~yN<$x#FSD2%kI5LF>2Br zRILzDB5~jp0DnI}hy5a>Vjy*v!T{g^Elt3rxWbZHhCxbN!B*08WrLtISxYQs2Tf7X z$QX1PFcCR9+7boJx%1aB{{00A@KvM46d;O1*+P^Pyb%!tiNyKbfrKzR8Upvgm4&2f z3J+2X22A;Kfq>bLk`ABeEN1i`G8H_}m&kajX&LA>coIA{iV`iD!Erq5Rxj9FkLP*h z8ck1~=0-3C>QO;ajJ^^Q+S#N0*SmdJRokNg1M-X19F zX0>ssTc_ZZ?>fB!HePUg&vLvVNLf6fvof=8y2@rFqhcNQ8PdNS>>OX>lc|tPv1Y># z{CVDVeuXSDOKtfke?BlP;M0{hgcUKuKtqEymx5CYt| z6OD!cD<06ynfo2eJg53=NwA~w6JB@N?|f*u(+9wLRcHiIf+dFz4sM!43nJ&r+iFw_ zoIG=-z&>h~5(*D5hprIC)qK4)_;J&2WasGIdf%{HcW~(3rBbU3M^nJ45d$3dyLB_% zwSjoiPLN}zDT*>rdaIY#V0OL~oKh~ut|J$osZ#Qky@sJN=(RR5nyjTVv4jxN5V3xf z`_7y=j>DU8e};1Y-lg(R6a}c%Dl}xGFu2eL?N6k~M!0^EZ=Y}yF&4`G4;IxI8q5y-* zau2pd9n{r8_wSomrJj{2ZnC5Qy$#twBjk1=rxAOh#YCZ%983s>{d7xP!z)mLf+g}5S+5(4=7cwqmb zkb<=pUvKp8+S;YCO_v2=Q22cDN|$7|@Vl{aCA`=*VV8oH6EJE}FNb}IB#LM zSUEs29DdB6^8VKp-8;9rq%&GvIw17aD6nR;W45$x(R8Rw$tD8;GAWBc&xXQaa4suT z)V(;QXJnLGMsl7PP_aT;RH|5T4H3OQ7n`;na$3%!C_rm419szuXVR_??BDzMGCmrJ zE*$rWB0*F{B(k%04yjD%j;%|z_B2IN2o1aK)U`kU{3}q3+3Q77z|IXz9roLI=uh~% zP&a}QK(Jd35VDdVrCoiBrcN3+BvY zgCJt_?+4+II^NEKMMU>*9UW2^09dvDcbB~VI9`Cj*{43GF+KS~sZ@QWQYlJ4DGIRJ?70%D;&{G**|{$S&70H?*Cv~?X@+)T2N0C^)8Ocz7aaB-`_>zfNR&>W zak$#zAEYAkUePR|M?x;b-%DL8l`*VV8y3!-iZTIy4mZPyNwc9=DV!dQrfFox=~8T_ z^o%FV-#lKaH~Mx)+g2@1Z;tJ8Ge_%Mfh~%n@X_q04lSy3nGEY!&TuIusEd*e_8vH1 zq$^HexRRHJtAu43LV&<>Wie^|Fo%8rJbe*@%?ejoh0$z-%!gkEYnlMCiydwMz$#dvj2!Sbx2})cAJU_9DqI_oHJ=Mcy?Sjo7_ud7=7# zzHkL(F2*SGcDvn{ld$d?%JbxhqbJUyO63ZF1~+S%?CJ|D) z5)zid$+OoAB_{+02H>lOA0a&}x5Pk0QF*H4oqO?x>i_$e5U5nL5(5iEQz&1tqQin8 zkJ`M&E5Y)1*X&z_g2`yiF=pHiD|DfAilVZY%zk&9#p-(4skf&JGZuVTs8kb!`oD&6 z7EgoTXep6Hy}Up?3j6jSb=WsI*8rOb4U`bq6hsj;!{YaKUldqQ=uta&Arz~A-UX?P zvWwYfgH@-^D_85N(D{?H%;+}CbFf{!tIY=7jMEX6L~^uM{(>Mv zBs6yZvJ8zI)+^LCdk-AP;S(3&p>Zu@K_mo(v)zX=YHNW8JqIKzVbrjGi`*qoXw)hU z9zCs46VEUV7JmLQ=6yO5shRp>1&xn~3djB|m@Vzwf5L@8_Cl~mhK5q9!0E%kph=^` zf#t@{a14Lvb0}mIm#GWS^P92r`}bz64CWvHt;513BvTcUa6hSo1;PF-$w(;=Z!F2(ta*YSA~ z!dKrKF#s1%{0fSGI@^`I)=wlrPIl&VDPMF<95|tPD2vu$#(-WOaO%*{&t&d??lrnx zygu|DSZ!9fh~P$(1zb+fZ~z3x80P^40QFn+LEqk;7xe1h{)W4FxKzU8r%k)?RfOBZRa*T`k))x84(d_8dJ>~)A72MOyQxx#9*qi47F`JM!?{%IQ$6Wzm- zL_%QaI8>`%9Y=QkfaXo=7eOc%@Xm*GaVX>>)Jpdl5Hq#LEK7RCFes|oV7}+Df1zf( zU7KcP!0Wxkmdu*+v)#_QX;TxZl`?!hdpW*bwzf#ujvh4#k>__}=zwm>$kMwd!;{&@ zAvXR&{wj4s>ce{1E`rj|fu<;IUAGjc_Wx9*vOH$91*0c^iX$h^!^cDEmNl^1?BFcA zK7dXCJT=-WzyQFmJx4HnNZ)bInl_BJ+1=;#q*2N7&6+KkyLcspB9uY)^7O#6FJ|KO zp$({6qb9624uU8;E!U{zQtaM$G+$urva_6Ke>9y}O@(C{y#LOdxP5s)I<^Z&Q5=BVAtNe1XYzH85IlNl9Mx$nVsHg#JErYG@0FNRI}N6 z^zP9fKdhMV)O|z4Ze!B>^O2mE1(}2{a!M$KBqR>wW$y*eI z4O8FhizV|ucB&{uT6z|G4jhlH96eaZJzyaOFq2 zQ19fs6Gx7*^Te&^Ju)eay$4UCb=MINQ-|c&nl-ME&@(#`vVT1$j2;ZT-43nZ_^`+* zRj8d~G1y@;nV`q^2Xd(_oxF zcg3lDyi%(gW_>aVNl~YL=!CGDy2W8;%y z%tw35EA5+i+HJAg!7wyr8ZV3-+zS^&e#4R7>(TqQj!tDL=Qs|(Y~776Z%hFZc&BPd zJy#a8+M$w&OJKYg<&@pXmB9zRIW6;AXqX>e3;|tM8;7wY`eM=Ck6ae6IgUfr{dgQX zb_zdl*^S6+ai9a#@KY-wVHrrJEGUYC(QL);&EKGPt7ea{pE>VqY}mRFN`(|WFM{I* z*z6o~j8;&*h<-iWV9bdAXwkeO{C$0#D%kbZdt2@3KYS`8?nb*kZd()y5>m4^LVL^U zl5|c3=Ia&fsP=7|)SNzdMP$_d1jyZNr=TbbI)fPvUa5vJ=YND2%^JGx-WrQ8vgA)v8oP#R_Fn zzFd%7-+9}P1NdzIH?Z1yDBK*z!U-a5R_oo&xX>n0R_(zGayW|>-Shw+ac$IH~b(?oX!qN|`(Ykle zC;(QQP0;0JHO)%A6#-S1e7)#O3@`xDzfU(DK6VPj2KAZ#%@;F%Psu9Yj7&bBYUJeT zFmCD`l&}3N4jlf|Jru^%12jWJpKE-4lAf5H3WZdHTGcDLWek(ag8zN}1A^*y$D*Y_ zz~9dcDut}r{A_Xz7Nn)5x3=coy$)3sz!c~5J>4P@yw5DUIsjr%e2F5R=wtIc4x@d&?@XC}WB6$hFIs#GfP(tXcg z3dOjobI`bLe|+=9Rs?z}AC?g=p1Gj_Xbl$d7JWZrioODMEw_NhZGZuQ5kvX_0Oox9 z?%ThuU9z*JVvIc0N@#U@{IqcgY6ka5+pfd0=U@o3vT_Pc(wMLDuTfp_f{5t*dBBTL z%5!_HSiWcl%I$Uz@d?RTv3euQ*6e`p11IC;>5JfbzE~;BW0}Qf7xdX#!N!b;eE+uXK~a@ zBr9=3OkOUz3ui;t2l#qrT)B3ur_pS2+mXH7cM(k?{y_??7F($$J1S6K;RG-=Z4dDC zY<}(Bo-F`i)Rs(*OR8jdMV@Oxctm86IbW>#@zSO16=X6=spae~s0o7j!hwa5JilI6 zCfgTx^XO0jC7vX(R8}e@BL@KiKG?DQ@U~Cpt{4J=dm%ydVu6Lg!UVj92K9e!=&JusYtge?hbXhf_QJ?EFB(wtD%nxr_UYKTT25lv z`8*%oYo+o$rM|5%U%g2MH*ZJ|A3yWur}J07ldIKgL_$g}%l3=XM3Dd#U=v78!&+5` z9o@VBDik$QSnvLq7BEk?8@KN$Zr+akYVG>%QzPyrz}HLtucJDT9LFjI`q}NAz5BHH zMxLAS)=0ihmti=6;GwEr5wJZj&r-i-GqkIJhPaP6i#{y}Qnq~x@(map1aKRw3?Z;b+Kl{_!C z*o!c+6a|yn2A$CgUk?R(_h`TF#ObT^XMZ#%bL?9~Z2(ZaQ4d7kIP%Y-kpEP^fBy0f zvoO*nbcT+r>j{P6SQePIqarf?%=-Hj*u>`F|GZBnFqFhgC1n*-mdf*$d6-{@dNc{t6aW6JkthCo^lyrKm=jI} z%ywSX8f_fSi`?MqJkL`A2*WVM(?cnEdU#lUeY|zFgw5nc zB#Aa_JO%NVV7J9qt5(JEYP;Z!S39>$qA2RIU+P;EKfy0+m%em!`G4`)!9rMAK~h+l*xu33)WX^X z1d?&(YjEe6^75E9(_^^1S7*dIt#0egd z$Dfoky4P?_Pd!#9qstD8GW+Mn(zg2HG>noeIjQakbuZVeXM$}hdj)8JR-irDA`2Eu&}Vi zwBn~GwC47l`f`dsspUAy+Aggbaq%*rGI04ipsE0r)1&9+t zGIOwR0$(^0>HWvIxLRQ^{J-c!Mh6}0LwADRqCgsuFpC82k*G+(Gy6{vLmMNv3Gyir zV<3qNJD?z=3AN2&mBP@3(Bx^BqP}2pLFxEc3qj2Anqy=J`i5)_z{mua)iPHi;te1y z!9IirZL`_q|AId3eZG=w1+NZ@>pQ=KdgAi_LKu)U&;TP44uhyDjDQNg6Zk}eD)GHv zoSisC;)haLBe9MIgCjhSU~z&Q6+&cSegT4FGnM>Ln8*+*VH*L=0vbhe#q(0azjS}8 zETQjVWyNUo5NFuU8SZGD@ww1-{OQFxa#v^4X540Wk2tUqLPKZ!)D3u;w$mXexMY|P zK*g9&ge?9z0~3aI>K>I~3rMG7CWcT;;Ag&POlLpNh+XktvBU??qUS)r-NfX9@l+E5Ejxk~|0S)e9RJyFh7QB{0UkW<;H@mBQE3@P3zP0Up)c2qTy zO3AmZ`J+Oo%v{El;ybvuCBVJ=Qba^S5Wk3mIY{v@n@! zflPsxk(jc|yc&yIgT`$)mTpuYW=)fPg_@O|mN>VJSC(toLt*T%*fhCVxrQlWo%-q^ z+f3W+3me{OLSY8QOaBd7AN5Tke%&6a&rmRHeT!Z;PJPB&jIO_))OHr@a|XhRc}WJL z1`XS#sFR~3RMVvcM~0*J<{K6tjv0N-Q}sdP7n%y+z3G}YoVC0g8|(M9n$_hrEHp*6RJ0ITN)i0Tn06!C zR#uih3+^pW-Plvv!L!iWdzNrlC|B5*<>(hRrZjYWyeH(=V=dIII1J@m;+px5`FC;; zdYwz1+;>X1M_sM$f7#DDN!fE9-1RRHW?Zfv@EjWM)^F^0((asWYaXp!Qto2ys2)Eo z>8$fkbuIf05A+*lk9f#8mb4t&P8%?oFr=y#EKa~xV4kYoxhHi7b<%d_JRQAW`Luf* zY+`nMc@tIt)g04W-v08|`S$R{d$V{gfBVS?Lf;}%z`SCeVP)i~o%mvCSUUUkap=d6gm{_DJ+sKdJJEH|AGowz!awAi9`bwY5Lu+wY z9Ir^D5$b)J!Ih!ZVY%Vuq4S8WNVjl?xSWG_d)hVzbRKj|v;(wvv^a8l@(_w9%H70* zB>8J&_lVBl7%9n>$pJru{s#U{V9jdmvS9JH^A+Yw?xyTg7QlR$xrcQL(F!TRdB9P@ zv11WtkvEkzyRLt!zi)6emfveV^zK4xifyXqR-vsGoeygh@)XIVlSZmnDg6H4nMT^B0qG9|g&bLOs#_mU};l&t4I7CrIqPVNrXnaJTm3i}j zOG|}+f6gIrz-N`jiV}7_$DDFx(}mJCRW&Z;?{2kTJvG=B^bl}u`{cip?;4N0X>O{t zD6YV*<~^J}WW+wjCQMyT1t`1yy(i3DmQ+lQ{-*vR&6(xrx~)CcwtQQ5 zSi&%BL%=g)_M)|Uh)>TbTuc^)R1b0_+#AW>S+y~3Y zhF|?{X2EWG(|6!R>`?YJO9x{7%M=n9f^O@+=jn}2&FbQ1WhV7&tU`2J{y;^J)gH$i#A=(^$GpUEHdVb^aZ zdnNnm<>)ar@^eyEbE`rpH{#AJDq ztU-oFdUE1M;zaYg+ca86|^n| z<-+1dE(ndv`CIkWeI^9>MDj`=!fBc$DfKp)!O;|{hAG;Axh_vC`R@88@{i`Lqa% ziHZ4#m<~~Rk})^j#wS$>Rcj*0Lk5$Bk%$UNBoM<8QYC^w@q_O`=P*vDA-3 z9IWqFArYqf`5NiiSo-Quv=lIRk75$>M3CNdFtio0aOGKqTbEhd-+C_#XAOCtKRTS| z*S4I4X7wSNa;4)&vBYt>o|cn zh$*&Njiu^(FZ8*+f%p2R*S2x}HzTUg14>lEDl$R2H0Y;*;P*n}EoHWkj&wR!1WH^A zQ``VuW-3g=_{fkI(`hyyA~Yp8xBg{#E!Rr^tn<`VTa*Pzi?1FR-Zyv-*CSs{P1bE3 zcVy7$$;||+Q3NT`{7KsqthFWNG7a)rGV}gn&yq4@$dU?OxO-Bgk!G>K?+(n`4Y#%R zAqq_$4IW1^xn1lsRaPVZN=K&?&D1Z$H7hRX|*=UPG?(LhKQWQ5KN30E-X+xoAq zm3W2uQ4r2G_0VtBV~R%La+I_R9x43!^Cw2CBb)E#X{@0pn>Po;{$a=EDB6^&DBld+ zIR&h!eGn!?!v7FA1S@O-kxPSvQGcUF`Qyi#s>V8TWn?)ur^CtH$T#^MpUbu9WHCH7 zf>0h2qznmAp1)&H?nwNYOj>zWhUOjq3=My6?Bj+q?AWGmM=SsOyXzWpB?g5~*D^cX z{e#&T-D@<@CgPJ)8b2& zc8kkN2Fqc=f-N_+o*ng|P`B2)b9}ocqegrUjbM%3qr;}ILD489Neh%{|E*(9A+hWal!PCUq zTs{tt+HYg>?3dy9lH-3|xHZZJxyq%ZVUVtv+3Z&Ir&kcY__|jg`_zPc%^MjP0@hcpHF_*QOQvzLb8t|8^SNCIEeVg5*si;j#%kUC(`H<_ zzhz~If!}B}+RS6fl^%Brs>O=`XL^?vaNtYjImmNt=%;w-5#>pVpTYY~z7N8Tc#>#+#o zQ}%YjBdPMkW$8`Zjqb-RwycL+51!V(!ySENjS9AMi+8dwhVrqcF%P5~S=}2J5a=!ezuglKtM_s%ZR6tD^yV;u<&3=_)7Ow}%{NQtW)P@mv#8ZG3N28~vi z+da(}T%4ZczujBri?CLsPSD7H+o8E0Z|;_eTXT$u&iy(H7hj|_yqeHm*Nh98Dx!$cRA)0ouP{sW)t=HpmIl_&U6WSxRlj=L2 z{&V8r(Y1D$|M(#TMc4ixrCAC=^Crz8wVKs#kB3f^Do6Og@sh!|)!t%~B^-j3SXi&G zp0V7w1Chbm}f@^gfqJVPSu^7v*G08AbiDY_vdarrTB;?xzj=lo8< zqEZ8KT07WLvA868ZtmQXkGD@}m?Y1M_9Etb+W~YQ#L-R)UX@zahNJb`=YeP>6*wu$ z=A_N1;*fc$L&g51WN%4ty{dt0!pFVpY!%cpmIb)8o0aprVT`Ic%f%YO+xQ!W)q-ur zK0iEEvx&~+cUFkdroisa(KJ$+ct~UfD=5*_2P!B~YE!<02qS3AbA{l_-T$9vHE(kD zb1xT&(2{&YC1?J`GtIML85j4ci{)DNVJ1_1QqM@x{pK!2a^8$S-Q&(04!p~_DOM0W zH6+ATnmhG)@=8r=rq)*n^2-Y;CnpS;Z#N7gVxSOxm<(k=ni5!@I;6b(kg%2HU{QJ7 zhQ9aFBbN?rqb9)}Gz8pFOY=s}wT`s7=t}E7Obik>ItVw%8++~w6rnPZBPtO%pT?tQcZHaY`f!3QTVa)m3)-WjP170ehCBf?UhXcSf|(XhVUgO5-7(#KMJ)Q%g?CU_*Fm^sz8Iz0~%~ zh(sU_Iaz;&0?*0ISkc~M3XhoCeB|h)0+HK6cnH1i^I~+InUo`^GqZsDoI}YHlRC}O zA2QBC05|xBH_l{2pLKq89%r^emK^%-IP!vt00osW(k$TSMrEn#5ycQWXYk{x0Y#~B zUQ2`-Aqr~}ckAblio{SLO_fuN#E7O8oSv}5O0yYZa8zm~-}P-^&+4r6zoN8dp#nD< zTKCtdt;?p4ibh5G6@j2JaO5(SY_7&Ztr}zj<9X<-+xy`L3CkEP4yE}z%SkMJUI)UA z$DeYv6f7AQ2xs%KN*NgAi)ZCZQ;fhR%#x*eym1Uu<3Opv47OrF<6^yOxa{C62j6jZ zq_-`;7@kYPt2NZ2h9OGURe{o5?hM(k>4^@2@XS+j##pyOCOv6fuTW;IYL3q6Nv+xB-z^bcr$EXyE}X@=-u?n{ zy+Yen_m(r+nv`@H?}8I5nlR-rw(WAgVAWOYy#0th)50AH{=Q!NitOP*JzJ~--}xXV z9}MZfd(p*Xe1PFEkA_rsO%6k7yY^?`7fw!qJgRyVE#Yq^gOr6NxM!ZcaQ@ms@=h3O z#S<1X*vBEl_rviqeq^`guZ?HHYt61CdyY7v(NBQY){#s$f!Lg|vkTirqtE;ADJC$hmfBp5v zr};eceKG+A337=*EeJ&x5pkyi()?#g=1tqh1E>C-7z=jl(9!mL0(K9q@;9I8@GAul zkWFE(fS)(lhmJO9H`II&K4M!K25xqplogyL__CW*Ui>(t%^WATjB`qka&HMJ@ao|a zIXZ;(d%0@R)zjD@gKFgp58ozO$zl*%6e$b>;S)1Rz>YCj!YHdsAvMaPd1mH#@@ORw zs<~RjA4i$bts)zVm|xHCzav^}b)X3Aox>$%(5LXZ&P_Htg9J8pnP3oapayDV!SnqF z!fR7dI1tKHh&!`0c=dU0UC?H%6e_rE{(p2A9Uqo}cv&7<4Y9jjh3Q27AG}%8dc|9Pk+WFr=2#qemu$ zhy{<>)d!O_1{oC++NUpakloRm{TmEKMZZ8s`)V5!CgPvN5G(|?2Z#Lk`Y}j`Qc!`w z@9G&NSjeEM7cV^&=FR`(`$~bdb1@h+`l3ANxz9{<&;minv3k&x9KL8hvd`* zAxa_Fyo(Th6lSM|dN=S8wo^sfdoU3x(!2KPaRNFqN;vStn0t*dM z5J-^*CsC<0S`}e=^s8sguo$HP2LgUT`8a^O8tCfX$ zI03_xMRLLHZi%8D&mDJFF}6^oJ1J-!`~rxFNa`fMgP$)N-&rI7;ue~jl3l-<;Pbjd zkI3r@O~rus>Vdb#2dWDMwELCALnX^jXv{K|(9s7pw?eisJKFCJdZe2}Yj)w()?VEv z`b;#Vw_8*qk$Fy^Ni6?3h~SJvffQT5faiHjv2J!DEaKQ zhVBJ!<%Ta9--0li8C>8{VDEe~gKMMJvIQ9r*M>k8OBm`8(tB&Shq7I3H%i*f1Arp+rX@6j0~wrg6gIweSV2m zfV>WLuwTtez0HT-DuzLyuAC8e)o{3Jf-K=Z67-XhRsQz7|4L>?%}~w!u)#zr2Q8we zS8tmA0cmQLdf09WgRqWauo4Z8OEHW#$6rP0VJ(~=>Fj2(JcG2?FBQE1?T;Z>lfxfg z3PaTHCuf9AQTE~9j~uenglXmT!T5F;6v8vT%+hWB`4MG$5?eDI{s8hff0i@huo2ir zyN&x@26(kj478&?Wj&*6#sDrVMo=q}7mYOUYKJL3AHip}GAJFmewi`cvw5#sM_l^f zk%)RgYb|Y-$~CFX_Zj3cl`E~tI$xrPqg!_E* zt`uJxSjk~zafAI$f3c*Jk}JUK@%NZajg~r4r5T$Ywk);pZY{P!SspH?G}&E2c13~) zYOfxY^p69}j@Ap3cBesANUN?xh7(VAj1S`)qqI~)>a}0VNd>De;KUOljnPQ@1H0l= ze+OObO$^Ss@d;{sgMY_b*?zRbBna7$@(s?3GxN~btG;sIbMod3@dx>-Uxb!)vZwcX(=?HxtH|!E!!cs_*ZK2nL6wA=h7;E4+BH$tUprY<+_4 zWI?ydbU!wSz} zGBnj1{*t%vpk!8dV42j!O%6q7Ne`cG|s{HpvJkmYnG2A^0%fnaD82Bx9jvA~sx^QBDA zZbt-j{$$b|_*j3>^)tqsH&5R#*fR|x+&`5^8m;fF2Xt?EWW(MeO{+-4NBJ?a__Cj} z;Z$DVXcsPr;#>G#(!0!?>Rau3E0SBVu}Jy?Fny;+v|!bLahJ!F!(KrN)%g4S+YuC{ zazQdxEZFHbnaJ~)k^R|212e9Vq^QoR;lTZi92#PpP%ulzeW;tFGVL2QvUN)IDU#5> z#2a3WCQ}|CkxTPee{0l^@oKV8LaKU2A{?*mc)uIeCUUg|88{Q)?mv8XcS)55lgGyR zj$f3jiW58{_v_XB`ess53Ms6Ss)#f^I4(`3yL%%S2g{ckbtm>$t=0>jRvTE3%p2I( znnKbU>4V>o`efJx;K{A-6qx@l*rvnqycrXHS}#XvF!D8@Eph1R815wtT7-to-aVn$2zRJb{ly_cQ&?*MwsCN;JkNaf@lE+^ zY)*`1D363EcRLWF1q0TCApBTl~ z*Nd@bl7U_L&Ox-3TT7_z`jjj+>os4AVV4(7Q8fAFU4JMN=2C_{~60BcD*Lw*R4z{fZaPz$7VoZb&?wA)oJ(b=uEkp*4ea!O+l))X9GvW=PR zWJuE9e$o;D>ac%K3@-d@84*_|9ZjWBM)c~&mm}1ZW|Yg4NrI)o>3cJQ-sOy2g@jHy zIk?FG0SlToo`{paPcGI#z<)*rLi4rk>S%gTy+L?K)fD_>3EljyoMMd#5P5#MkyJmk+>GdC8Hr7G7t<-!3u+$)j<(VS#Si3O35bd$a|2 zn_>jS!qeMn269<3u$x)UXM(vx-~evd^SygeM!%}rlnByR;%)X0Pea(~=F3?^udn?t zhkj=yr>1DpS!RuCPieJ1dr!RfJ>FZoUicle&M`V74x_x=$f54b|aPq7YqH0 zFcXvw2W();@W<2Z3JN{Mtw|wA=4^wN)=`Wp%oE1Wqn>wr^~Gt7{7AQo?kb1ftmRo$ z%*Ye$yaOE@I&;JffomyAVSI%B!yIDtt2K=hkZtD^P{2^D&!{oeqc&19^*)0a-I|mQ z50(==CSzpZL$6}XYEA1gPC>rC{hU-aH$#c?;q^8lLNfF&2;N2gK& zPs>vHr|cVwV8F-GS{;Q<>fF<2gmQ%Zrg|GfkMAq0Bbz6%7mY&{7bqf#ZcE0-DF?6R zjh-@}dsR~R5bXf{ki6<<&;$-(J2KKvLOvW0G+De*)w0zV-np6ikykRULW3ef_k*(` zhPFni@t06snba`$e5=D|#&ipSDWB4nsQ#JyktO_+rxtcl6yv*25{`RWOLFUW<5$$D?Ab}ZJdkX~>N~>{E{fO-`cNX)0dZ0B& z{dbqpbAPgcIt0zaGYD?I>C`%B)y-|l$kpr_tNh=g5|)L8sWG>2Y;S-|o|hEROIojxJ~Vm{RHyO-PmKvAR?Np;{iwz}I%;t5plZ?%yo)<{4lb9TF$% z)Y%rhJ12lZ%>kE0k!VX$Jg)Q((GK18dq)cR(A{Se=lF*Y$Qk5<`t#);DHn)YnW+IT zS&zcszyEvlboMFhpT75M!wbEmLUeFIO-&4koWXsr$t~op|3l2QINY7 z?ohDlekLXo9JW){*9Bxt@9uT2jrhKnAT-p=ZcdMBkby?nM3Ym}E~u0xo#}Q}J_i@w zJ09Shz<}a`FrIHQpx|u%Xc&@n3$QW4@?s=vRflKX9v+c6>M{crko^#0u`x0doumxh zCauIt8Dcd^le3rmw(@Ulr#1JY-Q|!j$l%-zS*=AwjH!A|_&fBAf#{O^bP-P{iZ7duiX`KI3iH*u7$L zFbS6Ls-O2&vLHx*S*^!>fr2kU$G%$iCYS6r-v0+S{db%m z)Y4tAPYr;<;umX+VTg>-mHS?#!`cg~k0I&JbCJKD@h_g{A#`A`}8s z`E7M%YtUDPP6@2%Dz)ar(tW(WAvCMBN`*T#deT`Y^4y zaX-zzAQ27<;|^*845eJy26}sJKEiHHc<+}@BtXhJbzmLcB-#jz@nPRnI^MdVz)|6I z`$1T-Uo<{%pl;_ab^D@1-ycI}Z|pUrXUou35$de;_}f^0UD*q!E&$-O^*TCoT|6=n zJW+nx*7Ns@2{BB*=5|vwbcKRS(7{cYM*kKfecL<^w@ZVUySMdX>UUOMA18bSF&6a-Or~?a-eCES29KXvad8~37e63F z4Fpl9ngpp5$=&rOl8D{EMZ3wSBnE3%y{tEUt#K-j%%o%GYO;xJuF_g^@u?xq&Wn!_ zNQAtBXTyG6{@LNFee;a*UwmantTN`BY3*U0tSQY3PJK;LjbmqE?K|d`W^$Puag`r^ zxjqza_4r041Qr4mG)iygKh;f|qT+e7cTS8BTgm8fRJFmmZ0S2zaHk7-8J zUbHqOHH9r(6Pi~!JrgN;FCIV)4ss8CS@!8oRdki3*Bt3YN__hCTwvZW7=ZO-uRo06>n{&XnNN~uN~HRYzD*%^Wvh&8SkLI!=lWDob%4z4W|nF_ zIQH_zyLtevRpyuW{jq=v&B^vUZLMdY@n2-bU@^13PM<*9c%T>;{To=74uB=<40vBn z-I>3>RK@WJDC1qeEVvi`zyNaCwKgsPCOo&LrfQMz{ab=QoYXF)lHk!Q*h-39AE<={ zyskHhZGjz$Mc!3;N-6W0vmu2TgTvW0(|C=VM1+ej&zf8S8&xcPu>bt*X|xpovDD+E zs^ob3zg~bJsr2cQeedmCt~b1;jh^XrcPtgvnG;359oZ`3qr>-g=2MGHJym}%8V>cV z!m++<2E30jsHFFN2auuDwq{m)CBH;AccbeIXA?7;G_|y7!0V^Gc)>Gb7W9O4mrEGh zm82Ydt=?j)yV;X|R+kp&YTRzz{>GYFBu=sd9hOSF^*5Ao9q##x$f`?RB)L(N*tUC{ z+1F@778qY$$1Bj@-wy_w#&Mf5~lB=1eg&+ucVv3|Yo+haTl%R9T0ZDEl7kBq~rt>dUBja)J$Ft=qm z!B(ry6Wt1qGmllnX3ljRcn}3N%Le`(Ggq^n#cdNX@F3u_>_=olfCvr2kbZYU%9qVl z%X+RrH(UGz_wjTQj7xVlM_dl*1g<{tv$t-!1$_UcB7>uuxJaF=PPA!GmHV>g`Cea13sw#DshxJa|x zw2=l@mfMiv&K|x+BC&gAN(rlQ1JXf$;?1Gom9Xf^4&T>A78I*B<8@&cxYCq$Rx4 zxyeh#d~!J3-D;v`zw@b3h7v5NKLA~F$!V)}^4JbE(=E%o(rg|*u4eax?K{AOL?W8Q z1Xg|_t`S1f?a0I(NZ|$0g!yWIosMgeX2DQ^@MnK&=K`bNkK#!U@Vwd^YPkmhfQerc zX3unpe>*}H!@#uAXT)~kx<;e_rZ>=ZYC-k$Yk`Cgf{g>LGc=3T1Zyw`;N%D-b|;4I zHxQtMz@Dt#x&}3b1pJSCLjnrJ*br=wP|2N!ml!qbN;?UrbA}XcGLv1zzXxEYx5+~4 zrwV}%AoK1ECIp_ck9K8o91J9|^-BF0VO^hP(}n@%vR)@yQu~h^*^-fA3MIZOhWu49 zPGu69Y3c6Ms zqY}cc@t560lQ}v%DwZw?6wwIfX$HOVU|#I+lhM-R0Tz|HIl#`tak)2;Tp;WrBH8!l zX>eCu*y{Vf7|a{RK4Sd9DU=Wu21%tZ3izA%_UR!aLlOAK#_ua78Wij!J2#Z|1dzAU zUK+}kB+S##A}5a!aJaAZn}h#O%Ti9J9`v|-YXd*OJr#aNtJ3yJi*c*VPIO$ zqtCC`&qT?G6s>Cobv8?;GQIGtHfkXr8drf~2$-SyUO$lK$am&@pIes}{JPq(GJTKS z00p)FQuPe+JH&iY&L>0d6C3MPo9V9HL}o`JzJGJ#l>YF8P91v?3RSiR&JJx@!|twk z2Xa7duEe@*74^ZOSRM}6_C5G)si03*&E(YB(DI-$OhvDRLARsK z@8>TiXtN7R&k3Jj`Rz0Rn8>T`4pr}iR=(oJwG4Yl#S0Xz2RPNm3$68-U0thJP1Z>k z3B^`tYZ=L(!AcBG%|lBjf+Q9BkXJ(X!#k2v*7?E;#5l!RV!rsxAY+^VVS`hx5ZWbW_3(E-|cuBpR-J%iC`C78y{wRMbr z&fF#a^VM-er<2eC?2~B6o$-A}_2x0f;JV(WHN%t}Wqxih+ZG+%KUrQ7Lf7K}0U4xP zvq7uZWRXPqyh1m1LwYa9^4Hav#(i7_=~2I|(Ua9q8+rWeySW-tewKAfr#I#YhYfqG zZKM~B|GzOUN7Nj26aXGLUT$!USeY5`LLSPlKJtV20~5{F!$YN`=x~ErnFS6fwp*tV!`&W(*zVI93reJp zoj}E%FSa}}M!tk{bVI}#)hwR1-l)I}hziO;>>&FqNxj}sR19}Wcx}7+JTsh+=MZtB zEy2^1`vNZB`06Tpl^%ZNsHy=rn>Vo`SBq$p7%JPsKRuoQ(~;9z>~QF_r3OwAS!mzR z!V1Dvting>*&cnZIc}$P0P-LDo4j7|I_0l$@bBgz;*>9-q~a;bXP==3%7@sPgKJQx zsX_hBC>=Yg0*PSIi_2`KBxnEWqHss^toh$uK61l^apsF=ojP~3w-(0PBBrU*;(OHj zHiDO~wU{K<>dXuMLbEHzj?7i<4jQz zDHc}t3cKipbk)rFdZzvXA#J%#>s8FCfPo${iCi>Fc*Ld+1oQzz^UG#;8-1e2NZX6r z8v-@Z#uy-da5;kad^Vs{hKBTn!3gn%XvYxlirtN@5%oCyp!Q{W;R0e3T2I}IiqZu%|OM@)_1+ihO*kFHsS)TaJT@d#k3=)E!sQeYr2 zU67P$5{m+eRP`oPczT_-2&*y;&{e!RQ;9;D-7xY{A;a*(l24<$dGgUc6%|!KU>J~) zkQm&ruu#CXj89U7%rqfEhy9f)Zpl19IwqwDA2iL~d9UTlrq^PyC`vE&HtsLMV(sC` zJXu?WRx}umm5^t?Ndq^{VHXMTZ!@Ij7BOq1m%iHm77c1VN;dtBk1CE$gamr#;Q{aM zWaS#@fLysdwbOw_D z@9rS}=tqQ+1ec1){Y6x@Feim(hAhCWWsXq+k8CMBB<$`-r^SC3w|}Zu0mmjMufd{a z-e~s^Unv993_U5q`;`7aVmklR57vaHGQ!k=hN-~lbQpW7h8qa|kd`#F7{x~bM(^&E zLH}h3rs6By&gel1ehvvvppgD!YvZ4pY94Q z2=GB;f!CLa!+#}-7Q-*&(`tlXeC{3RQ+bzA{lJ70scL?rUP;D7f`yt$KT6t(8NYLx zuaxrbF_Rd^{dS@u#10M7ENClJvCuuB`!t&`l-#6C9~(Mq_z#PBdXNBe87cs(j5jBT z#*`yCJ->rl9RHx2!zftN4^}%ykht8|(d=$Gw=dx`4Z#~`;x}fpfm%S$ zHkgf;FaHO7yVd7#tprD}Cp!?5ti?F{-J3@Q<*F>~4TF>qDnrD7D;Lx`S3;Yg$tEbV z&IN;TCoU&PzjE(BejM=X(?BA-q+o$aiT0RR4D!o7*eqN zpOU#8nbIYO?>t4CX!rn^Xb&VQ5MKuK4?+7O^Cl-n{_^iVVvad_&=1GK#j?2hiUal{ z>^2H{>(w0CiVXGK#%Km9N=Gzg$@=uRlUnVL^Tm&pA9tGRHBRy-p#~(6@jF)+nDQ>_ z>fc!bjU4a}0VNwBulZu&Jo=Y-dcF)I^DKf8c<1(cQ7^4eJCN5}!H{1ZDJ=k3&6DTK z^pek3tE}y5eL%`OS97l#I$vW2WJ$RUkJE)AKBqSvR%YGto|?t|(OfZ(@9$?sv#=bo z3Sr-FxQ@r66f1d?*yQ@4mmW$%Nepp_jo z42wu6n<=#adb_iC9!a~4ZBXj$jzE@ft@fQL9{s&E9~_5K*^~&)qN=v+YKj@A3SS6OA_}IrI*2 z+`o8I)Gx3TX+;2@R{(7gy(!Kx2q#GI+~T$uhc72EZ4RP^hVzL)(wh()K2BAk-7q^X zey4akLg)f4KtTWNe7w9xvPfdlHJ%+GlwI3@Vt%dtF=aYd%@@$!$zQa~I8XE#+~6M} zV}QK+-#EW8JIVCdNys-_%9kQx3iIQL@&h!#0}x^wPl|P@uUv(Q{4@^ z8@hm00RHX4cL$xPA|$Vis$ll}SEVUCJAj+oW6slwcDmH9o?QO}DEa_Cs(0f0_zPtn z%^MOsNj7s6BGLJwsRxANkv%L9;K2e)W8Zj};Z@J&0SO)LS5iKeG9kqf8Gzhia{c3t z&w0nN;cFE?a5e-$^0zi?f`^fu5G5KRlZJvn)=Ra-dT;C&_<*|X6nWR6Zm!++JMz54 z(BVIC8*i4<#^>;c3_YJHDJ|`4wbd!qVnB$itzuw2X_Y7KvEceR?bTL30nxbT_W7<6 z%Y4?PY4TA_%5S85PGL<_G-4TY0kH*MZRyE=20v>tumP``hWC}Mu5n!cVN8WM8bdh3e?>HSRF^yp0$MA%|k3Ws$eLu z?W=2ePTv=1UA!5@96#3bxpHUSZn&tl>b~OhF9}+?!%6sdCX&#WT{yr@#A>0Ae6GoV z+1OgVp)b;(5vAT`Ans9J78f?UUBxaLC}8SJcn4iD*?G84A{dbo+8>dgE0Opm@UD>6 zl8tDZDuvA#V22Osbw*+h&}XhgLfyTNK%Ibq5f+dzUGkqr4kTZ6;^hbamSTOm{;SKN>`J6>5|>i&jA6od0H*v)AIVSPaVgh$)|D{bfz8ml*^dbMhI}^AZwVrjPZ>CBY5Aq}Kk7 z0!8O=Hw&j{cRkPNdSkVQ`!Ce=p)xWX9KF$0J+_6WCKszF!NvM`NO>u?XAtVL+bxiH zx${|dpEGse0vU4+%rH&>Yf@sLo?^LYXb3boC=e*F`(?p3H5`E94po)muC9(*TnV73 z*lpIMHa|3jz+<}q_Vo*D!ucuBSO7f1#K9!=QZ$axDu@nrYgUHkOp@FFM8%!O22M~k!L2H=8F2{sCzPMtH@hD0&O!c zX3SVg?lrQUO|w$H3F@T3+!Ygs4=!z3fA|&i#*IMqCMl~{ zq^PZaN&hLTLZ|fA=wjzSz0ID^RMwLy=u7v6-V}roy{kv8yki3m@P+@Czwi zBN?OsN#_h*&5)>SpuvV{UtuGI1Y7$hYEI7dl%d7^LLlc4z6i@2aAa4*s-3k`GJEY0K4(~*o`Ca2R(i|TrCGa2?U0ZWa5(eX zYqtL!B!Dw!pW2>>@HgjNG<;(C5Q^HZcgzUtK&>k1`!-3Eeg8IwV6Qpjl1r6>z`s_> zRy0Km%8|w&(u}_S&K=)|+L2gklujYWKU6bP65`#y8P6|aIn=u^!2ah z>tz+wX1;{Z*=i{Y*VFt&Y$$nm^TGN;pynsLcyxB3C_RgvklJ9=glXj4kA*^DvwZl`Gk_fe9ulLTUs^UA3@ZALB7a*LE?X2-j_#fsLz->`ltO~l z$)`9R4AIem(L$en_2LU0a!nXo!>LIrq~};I(*s8Lt3$xJ>C#(+E4=B1&cPKk8NGy6 z{%om1tIijBpc+a9+L!-rQ5Wo&vVaNjZ~sCsAb~bIM%&-D=ABhjwR@?i>AD+;aX>rL zsQ1w~hgp5d7851k>vcI%`txgBri3F26p`I(1>1Ml7;ZOsn#x<}+F3XhRRTe+BYZy! z4%-8vY*ewN^Aqy|XaoNtmqVh^r$5){XZ&>x>>DP(e^5W;ZoFUN1+!i|jk!%Re(w)@ z-#*_57|tK~6uRNCsu075;3DMkjCIXD;Tgsh0Gr_;(X^X~41bu%EZUaBd*j`=gXOu=2TZC4j@z^9J1 zGUl$Yj-~(o7=;CD5HF}(HbF{6m7Yh}J903k!ornl8-AMqOTlu}co^WWiv7i@S8zT6 z;Dm_}s|IB)Is2VtCe4}NsaO~bi(`A&FG3ZVfKlXG!7B}=DCo3Glb)PJ6st-z5@jSdLxt?$96*?KXSab!=#d0Kj4A1}%paG$`%6gu#W5&Hhp=i?Lcag6gR_jPs@X74xFn)8|K!vk2?96TLspR3>Deel7s zBi+~`xn5H8aM?dzMK`26_xTdZK&7!$xrsoij{u0|Q83KBWrKJ8BLIO7(4S|WZI-9n zey^j{z1Q3JkYi@X%y8rjl9W}M&$Lkhn$0Gc*UAgjrL^P_>kq<$qAnT2-fX<&Hpwph zFBG$%bv9`jocaFS&E-G)Jv$R~bmH(LETrhDG9?5HG(@{keIF=o5w5=FUA? z>)`kGJL-eJWDSs^Ql+G?E0>w4FqTv3t0a3%_miyAfdsSyLLpGNTa%-t)B%QkIYC_} zBLlLTjDBBM-p~BVEO-*>-ZIekx!ulgmE&)o20Qq$`*DYGBNQ0UdYHyN)(S5>KF?vH zd+#X2N27Fkm&S0JfpeUBbkqhP%y^y1Sa}G=h9Km#ealQi^`j*4Wm7}XYg&!LGQtpw zY11tkTJ9`6nzGfV2LXVszCK&PE!Cerhy&b|u9Sqds#dL)&;J08hY4P0ZsAHg&8%yl zOxq@hmo6h=^Q$ZE(cd}PHoODigGmhKoFA~!>FzjiK~hvIyG-)Sigf)KDYtgL97fB6 z-}SK|Et@}tBdbboXUu=q`>yG@a^OTU+v({Q%L2aJNfUA%H4qm&P|3nW$L!S?VXb_2 z_6!YGaV01qKxfSD@g8Cwb|6^m0*5h;&tDbUXoB{8)u+zB-}o|tYx$06vpC)sK!BBJ zpTUF%(|Jo4oEhp2t1(-NMBDX@g7RG`Eix4iTO~7x2Bo-Ue?!I|FiinpyvXC}y(#-b z9+(gK&_L}hynkoZZtc)6+r*Q&)K9TjqT^Lj2(;kNB4q@^Lx2R zwz@SV*pY@bR5x*ex;>W6g;P?b6G!_fkF;w zuId)~wYd3r>6~o{1dIrpXX3QW=1L?p(g8^swm>`9ns-9xorl|_%d%H*t;0%-bFeX4 zcIQ`#yTCDsK@1R^^6=`p-$u<{6wM7zw88}{Smh7Wi&i9OOXSEVE){e6nwsX8y$#q- z*OG!WZSqpNI@|u=_!I8lS`vl%Qx(EVg*&?uYOye!k1a*aw^iKIH6I726@fC#e)4HT z=jfl!e*D2!zZkqRzMyr^PefA3R_c0V;ZpGKmD+lnuiN? zefzXxyNYS#Hze$NetZ-?x%T@hue2p~vo%Fn{4Y<^(PashyLg8h&F6OzF=xQXiGhyI z;Vfi}Edtjc&`tl*@kT)APBh9mLTg2^oGupA|(46WjlB0`@R_pPrPVXWA-R2xM?Djv)kx$;%uB(KM)l zBbckwwbSGWY$mDaa1z#hO3kT7-*8l2pX=F#<0eyXqX*I&f!-Y^A4- z=hI?rqiLJcC(sHdP#k-gm|&wYHh>Y%hTzZu71Uk7W;5@_?K}<5VW<;WKAuPSrhgM* zZ~5ghWd4EefY(Mpt#GN7#lAWkz=Yx>WPA$h`>xTR%t|9qK`jV%Mpgz`jJQA-*BaDy zMJc%F?%NNp_$T(8to_D}H;UW}+%Z2x|jYm3O_ggTiS*Q0aY zie}~daz3-hiKUq}D1in@8;yd2?!Ysg->HK?*fFG{9?0VJmi_QGK)C0B(3d+u?zcF@2^1q`oLUe z-y-5Q6JJpP7ZH*sMiL>rCjqNaU@w`tKt&@l&c-V&FL2P=0p`w2H+uvKbzD$CiI?%V z3*jhpg%(fflC`Y&QPWeTqK(7;tz`KGfMZIp=3M3iOBrNEyhQbu4+2yAdYON?Xhgcm z*cm@NB5lU9@pP{ow?}yxRu%)=0zB#%pX*x8FwgIKJ?JwfG$<|5EnUa9eglR1ULuA9Q)BFSAuAWeTV^~$ zQG&p%>r%fWO%8OQ^6%DVTgICsJ<$FS_kA5rR0nRIoYn?D`APTE4@~%KdP0F6z+Z;R z>~SRq5}dhRD3sy|49+#4})nf%#zjZ!W;{eqIOj z@7DlP?C;IgWq%CQrLO?9{#XTyhITy?!k@BvRN}fs@mqz2yp&x@xz=+X%$Vvvy^w%N&V&0HTTz@6Hmn(&enPOie}|M+uxHO~HZ)vY>xiO zNM>I@jZnzALdNyLny2AxnY?LwLYMN&K2Nc-FzW&6aqn4xU$yL!;w0iY+Lzwlu4@+% zx{qVT)*l*HxbU$O+1cMG5OrT|R5%i_bFwl+ zXqO5~DLei)MPn?7^lVfYr0c?E@wiWYUimXVXPn`6(eAl%m%?U>2!>%MeI^2LEsj2% z))9#krpf-{IrrQ&aH^OxLHAMh(~iY)>VsT^MU)bM<`9+A&ufm3Cc8ZiF$9I}aM=Xf z#qTdmgNo___x2)RT|^E0A?NRUHt5fjFGC@>~CD z0EbnRlkO)%R_IX02LQCeAk0QASLS&TaeQ!9+HZ-aizmtcLUuxvs)1|$+Cd87zg4pW zz}l(*x`_>NWLun5AAbJ#yRWjcpGpPESO6_3^zmzdov3n61A-8swO2sjA`-=DA<$s6 z*jTz{DnuvX#ea2#9Llmf4ItBo1gUOa$&2c=<7xm&LBc;-amGK3jF6)4PIp)Qm6uPH zG7TwYD(7-$sx%e0Ym`6mf|dIYF$Nk=o;0KwFCP64N3}(C_ZT`t|*_*7n(I|F#%>Z>GPdX zz_X9~0wj3?v{lDX#9L?`$rk312DnD*g{>#V(|M|1kG&I>3cYnAq#-6YFLmPpO6W=Q z&2+t?Ms2k1cFqeg)_M^569j-YLeX6(Ko?@yi z(Hi|nhQS^f@T z(K2V3q$vhjk12KW7w4~`F1@|fI{C$g8Pe_Kz6UOIo!HH;3W{B7KM3e4+DB-;WYeXq zp`rs#3V;Ko@iIA{up{H~pIoomtDm0U-#__^@Pw%wIZ^INpk+9rXj<;CR=K^4*VY$a zmf`J7hW@V8U|J4@vR2#bVXgipw#T3S zvbp#$7x^FTN6Ak>J)%;nVZRbOxUWgXQ!Kjob}icE^9$8^-=S*3PBIDM5-ldtBwE6z zyDtjpp0n7g9a!YT_km%MzfH0}~TN)W>4~ua$S){5*HtrQUqufzbW!*8V zJRfNo4Eu9DBm(vSAGa?wapXxCDMOmrb33}=d$TjglPTOTLf=E#)8?ysv)3k zgag9qqg@_%75Us*N^Oa`>MT5X10XfKoAaxSLGbS9`px_YfQ~u_-LMdTIE%{)@|kF% zN*s9XjXW0XMs??CNB7MSB(2Yr^kU>&6s>TXp1J}|v}OhLXt|&xyKn!LzDU(BGQb?t ztG}1+;%#D6z}T}_S6AjjkH0-g77+%FsLojs-Bj~;`Ya_0JUkjP3Nze_!YG|1U56?# z*rFzn)&At5(n#o}V$HD!T&I)ZshCt&OEEW_- z6P9RYefc6*t>|Qg#~Hi|8LD%g{PQ&BH{B?zO4fVk3+L6c82GR>wpi~oq?|$dl7x8= z&JCAa%Gu?Ho8^Kp8*sL@wbgU2DNzV~2=;^wIH|0IY}PwH@)q6L=?8O+^5jLZvmfb5 zMY6+JB51^L3Ab7tnENGM-`f6bI|0M8f5>*DslqqM?U|s#8rhY|G>mY&`|&*Y_H@(w z!sjmZo(jA5=4c+Jng==i&q?NE@7n!w(USLJeIzbEjptGKVUxfg9~azYFH7(EAeaK~ zCQcoT?N54Dv#XxUtw>1$k8aA=+To8S4Kez4NYM`n*f;S=qG8g zKr&`W+ZmrvM)9S@devT9JVZ&0J=nj$2w}^MvJ5P8P_OQJw-YUup`9u>gqxua+Pyu&v@3XM9d8B9qK35p~q ziUg^(%NDN>kvFAP@tTc&JHjPny73jZj9nU+ll}wQ^SygFV?ndy$`|q6KTE8=(9D=c zAKOhh(Ju8p6{Y^`4bRT|RMY=P&e|570{DrM>2F6i24B6MAGJuQ#|LVgz8)_JVi4TO zgeky_UHWXewex;$D=z$DT&z1GU z8b>6uQ~DTSoB+SqosdDrcte5DnFK+#tzV|Zb#1UWh{hK3#7_7=6@d{0ZDHYd%IZ*f zifC_+Cs{b@QD)0<+C07tgWx#wA)}C0eG(nYirPe;AnSB+UN%LOL-% z@{5|k{L?HfB^-(zoCYPie+cA1ziZCuv0e897w3pM`Ilb`dU{&!LyL7PsQd1)Dlrj1 z3(Z;tVCX{!y$N1l54U}P>8IRCARjCe(el*3USgm0`_ZXL`dGdC(iJDL7)j9!;TxuZ8g3;{MB{us=wj{ zS~+nQVEl{8qNWQr-Q0&3)wd(kZadl z_rDT%op5x|MI`LxO^GLT>^i7Hzc; z{XC4Hdj1Tch(iu7KwO-sIJxif^)R#O!$?1@DwC7RSZ<;`m&9Bbgg^_F)= zumm_i7D2<1CiM8HvUlF$pvoVwdf=zz`(vK{?)h74P18Yg@v^m1OcW&#XYaW{(37vJ zD=vly5@f_6Ud`v8URx|4xvSzaAJ?p-wDTK5Ij=p9@M5t>C6dwAF@C5P98b|xlz;&a z@_R_nz4z^-af29mD($Qq=}YsgE=Gq3n#kj{duzJv8UqsTt!z%HL{N~}F~`rhC223|wr z7JK_y$x(XKGNQr3@-C(a9_LqrH-9VE^)Kh#QCEi|B!atTP7nco;!6)`9Cn&4sYTw5Q9~Idvp0;bxWUt2 zvgMT2gusN1NXr%AFj=+fI{q$!R`-Q5vY9Sdk^d?$hU1i%ef>ltK8JB=@JY#{$gF|h zU80V__y%3{&QNnJ$loe{S73&U`=z4WxfG>wRx3h+GHG-q`7_BWv1jB;6{Zxd z#PyGuwi(syElQ3_U+Og8qOe4h`Id@F%=w{(|bf3SYSuSZTrYg zjEWnk!VMtZ4Mhn?05cqLqoQ@%!xNcG;P3|wlSYlyya_dMQM1i(O5F2>^=fN}`8^4| zN=k~(t3UV*5#U^+Mtzq$G*S^`jhrj2f(TFsr^f-W@L zv%c6NSw{koiW0TEFO2L-#q|53*&-Rf3>1vLeM%fG9{s|>K>1OjWGmuW&PocougwsP zD_cNs#R&%yh3%Ty>6@Ayk*mcfYRVE^YzZc!G%W*5Rqroq`o!!2G(J(5_PL3JSkN*l zMH^{%X^VAr*}I1C*+3((`I|$v>~z)U(QPd~Bf&D?Ogm=fX88xzN1she4fUEKAdN15 z-iDGgQ4oU?u2Io@BKeNvxJ6t|nt>uIs&D^Ypn^)81}tn}XpriLk{tml7BcX0w6yHS z&fC}x$fC~P-(^%<**M#4E0axCRH^A{g*=Dgaq+Z@Rm~NxiHlRwu(^TmnUn}gs0bR8 zLkb%c{FpH=Y&Jli+nkM;dja zbzBt8Bx)fce9j7d%1eqUI5?aSOp$BOBfwb#Jb5{XUIFuJJV=e-9B&v7#=c1=SFo8( zp#*OEieoZ+`4OvM8&X*DC83l~7;U;zU2`P}ILhHTP%9DxHHU^B!@;KFmY_Dhnp!gG zLKeG-ssv1VZOz+=?u3q$lETu&Hv>PE7C}tgy^!s2b0Qo=R&PTr+hN3z5yborV^9V& zH&U)hHiC~U8%EFF1$r6^7Cj>UP_L&5k7?Oo=!tF!GHV8W$jFITSm(2(O*6kChr&Z$ z8Pj3j;kcn%zOF2rjFRPG`txTi?n)Htal!mrt@;x7MNNtagwZ2g0w$c4_ts0AT=0F` zwbbI%5;o$e=dkK;W2_MWervdfJmB+Mn)ZCkm>?i0BusAce#lnuur5+<9~4IAkT2-y zkQ`{>XUxCS@r5I-A_HdAky6s;Pl#Mjc$s)x=SRW2^5yct6ls1teR>6oXzRy@f#IJU z?+kMpMPhr!aG(FW_FhM$33_nyzA^F$nARfYu{pWB&ptw1N*q~j7*@j8kli0NqG1eK z%SJv5utvfs(}*Yg1J!n;uSj>?IyPucY&r8G2 zRY_Ik-PaqfPiQdts=x#&Prs3cg?Ux^paN~&<)h|zku9}XL)`aGL`&(}EuVajYQIz< zH*BE$l;x!&2s@o{O^Vqxn46xR_pi<&&iTu~9P7{^1P#j!tR1Cjf&&^k+gpe1&yqBf z2Fz?qLg-7#e;6U_IIq;74W&XkacBr{^(q$EO7iO` zBPij`RmnwspNUP<1J;tm_Di<@Hp?661inbRn^@#b+FX&owBZ5G1eM6N2)js!fn1NX zV!w*zZmu!tCd258$60>cgYUc|21ArJd_X?f%&@i(^*h$-QqBX0f#&ox%`<$PA?w29 z&b)RN#5v2muz-{@SVENedz}Ad4bN&}GB3iIr3>jwkDW(r^Fim+#MgGiJO7t~M;Fb2 zrIf@Z-3Z(Cn~v*kh0eNR(>|x~+Qa4L=PsJOHJQ*g$f^a^+86pOo71(x>lY`%TiJ4M zfu5^~@SV>sOE|>f2{12@z2f2NOQV@O?`>G~UE9}`Kh<6Bk(@tzUN&c&-C_G~Qj%zQ z8u{%Y)OYc6^6SaB*58_*{yj9%A>`-hB|Qv-=esEb#{LRlN{1t_xG4X9GMJt2w7%iG zyz$2K+OplNSOUg(_*)Dmr`^ia(o%b9N(;GoxnW$Mn%t_kM%~(}RLXD6cf%N!*y>?)E_$A}D&Jym z9_0VZ;O7c|v+?oSeLG#r;CL8~o_o$l5~h(z*1o#(NAyBQjGYV~1(}wrHWe}m@K|4b zlkX`7b&rBoCDMC$-IGRs>`#sV8TZ+=bas2*yFsRiPk%)9i68t7$#i=w-c%k(d8pl{ zk0DImDbs%VHUcb{2$>?1>e_1G3tQ`{BK~&7P5y@x&?0Go&6MfNK0V8qqy|iuGNsp)EqXKEit1>3kJvo9X}-rO8BNg*JuleH zm`chtR7%`rGP21ISVlnuE`3L=Ol2Mn<+#2egF**C#0eD|IvW4C%UIRYC)LpWFyoQi z6Xehxvn^zj9E^9dQ>i~h@_v#pEUv;8RS@WhBAO?Q1qGc)KWhVBaOY2noX`+Xy%35o z6oasER|UZ@?nOn^-||Ms6y=qtDz2)s1MnJ*6cn&Oig45$L%3Qx^gs8T17n}Z*|1hU z7<#tJ!w`z$;9zNBKW3m~Asc~_fxc`813m-2fEein3(Z;(aZ!MdK7ovXMug(GD!2Ig z)VQR?>;i#yPtD6Fdh=V&qx|11J`Wi(r?O=i2yc#aT{Re^rl#u5z{rT~v^X<}rwWtX zGk)gqdWN_LCIKB5`048|He;I+*MZ5vY4Mn0n#^?}Rr+j7^!^whQ*fwPC=14Q5sfSliR;`{(Abn?GyM z?4I7;)m2^H)nz+WR{ARfEG{e<7#M=M7*HMz3?QK^dFd`>~P{0K2dKf za$A>|oM6PU$i=o-oJ+_=AHWtipuaqTAus1@`xtl1`mYOD0Q@075XX^oN(Hl%bAAb~ zEZ|_4<41l17c8n>%3}jVC%aIC%wWU*Dg<4V=sSib*iNADBF&u+XNT2~R$J#lT%Bj_06+tR@?uqDEyq_`(f``4XY1tlHS!)4t`6|^xJE)-SumkuaEE!uUKKD8OXm$Mgd-{~_8i8QkDDa(P2Erh)G?vQ6kU zhG(*$-51gtiuIzGPuKcZ_K8pA0=vnk;n|KK=IHDS=O=9n^)-kzk#xV=*2^o zsODnGvuP-OAEE(P4XY}gGrk2F-7)$+s6n5S%+->dH>oP{=Tct5DvKWeYe}S1rc(CY zzR&n1p&oHur%lXMdLrWzGCx=E62M#Coqr6@JJzj&_`{Gr_}Jj+G9lQ=o!0GxYhQwQ z6UyGMP3!6m7-zDe(eh^k4I*Cy88F@Ur=l4jgr)^^FzI@S{ygwh#AIIR^XvdbmtgK6 zpB}p*_6$Gb`_i66coSm-eX(Ppi~7on11yK#DN^7t{q$vFl>=^cSr;`j%3Py$?Az=&jD3UqpOqVBFL zMkA4h|Jft%e9(;nksV;NTdf&VGuzLVZnDSW;^7|FlT|xlVSE4F!u2!1uMhbT=rjli ze>f6QjG!3lI2k(HC`=p7SD5|Hwcq6Jq^O~idCWgiPA7o+pX?CrAnj-`z%JNo0v1K^ z$zsJ0$sFSFsQvpXcH_gu)5Sc*i^Vbvw5OqJdDTKJMQ$l6Vv=#>B(ur zX?`jubUF-w^k!H%bQ<(S3~mhV>D_~1N5)4-can|_?-cLEweM8LrUeK2!^#=oRdZb> zFOs%$P(?=6sfDRE%z~x~3o#2#M#+pwjRcIUE>U+gM@0AIORA{I9Rv~IP0HtQ(aSb z(iBrQKa;0%ry8eOvs--@nK+)9o}d}8O3U9v-1EGu+#^7PM$4dtrcjh>HWF$$ucfLk zsXJ&iR1a3iRO3+X%rIqQHrq-I#iI0XsBIdpT{d!>QeWa;Y#nYLd2EPGMHnjT-D{}vZ|G;Ug#yCQe4iUv5StiWl00gkobMQr zw2&IVCJvFxc*#`lTTc~h7ir^Ydvs{KYq*8CN4t03*eA)M1+SY0XHhTp6l z-~G^;5}4?k^dau%*Ol)6EhwxjwvpDYA*3#pk+YoRr#rOa*0V2MLh_R&U4$?wEhtPl zz4u4;Msdmtp`Y7DgL8u&(RY!I;b#&lDNKx;5_zHkfg0w}1oY&39y8mp^@JM* z_u^$4`Yd;cw2OMR8TBFy$*DAN{ZC$>JO(!nh3!2rvv#JAp`9^2n8>M&zKwznh1B_7 z`5%pF4V`SaT#UNPDEyKilg}<}DXf$_`gSMAD08;|bpH8D#|XmMa?CXwCsr+!D+43j zi8wtYGs8W9;W-YT^tD8x|&9o4uC(!agEM7}$0d({AP#`9O1CGDE|G@$Az|aL$#%HR0g2&ycplH)XLF^)URL@Gt>) zjYX&Sqm4;dZvrryH~ysyOAR9tqeBb7tJy4cJ}&5+yEp88X_acOs-mYw>Cv>+*tyZO zk=2-0vW@y{L!gFz%WPSF`}Gy{P%;)uz^D55jFAigu z^k+@>P0q^h%BSl^4V8{7#V5}vO)e0}CEr=fXx7D7)vB*Xs+zU1eC!?zotp+vr+?{` zLC$Hh%dzj96IfW>nVzaCh0KQ@J>E+HTIrl}(b@J6f8jx7LP{WnfEs|xeoK2knh+rg zNkifxSo7&WA5O}T$S1!MdpUme3%(An8tfm8GUypfOV><~dNqE~xUu`SjX|j>Q^76H z)v~j5UfQb=P#jeJG*yuK+brv+=b2^i($PLewgnH7{p&R38=MKFyB4q0$jS5tW^$52 zawfxPO}l3Kb@O%iYnP|>=ti#kIUT3=<;Bz0wOQuUZNuWP`>7V43k;e_t=_w$_mNTQ zHJ@$P)7;CCIPPxic+_09f6+JdINEG_^}fVGg&~a+ne$gX_FYGR)I!vvZ1rl>Ao?QE zy3qIA?Sk{{Vt56*FLkC(1{s!x<^m;!jnSwF;dG|r( zNU&G%jP_^w<^t_nNmr@2#a*Ktll}Q-+p&wt**E?YpOS}z>x-@8dl{J!V{ZztwflkV zZ!-%q-|s@|LPCNpQ8e7qyLCkr6h63WA%M}NWD#ueMdcB<`G`Zt{=zAQex{^r%NHN` z;A<`erjG@V3_C@YSdAkr8Pu_JPp}OmtFcnU0dOmA(g--s&xV5%%p9*6Ay%*x?lN?Iy>E{PjWBx3c2WMrGm!zO7dv- zlK=DlATCdK4hHri%S=(#QB_Kk+rY+(LC?@e--yB0%J#iA7#OcB_j}RG$Wf2j)ymS^ zf!mc2@INiM-^>40GXjYJr-`ElA3#+~mRQ8b-iVl;fsKI)zz<7IOw4ODGaE-nl%tPD2xCXCEnTwIJyEQ~BH^zSX`9o(!P^<3$#9Z3Hd$o~rm zXyjmEZ)WRgW@AnK4_rNc8z)CT0N|g2{{8$fo<^=_{~5{J;s3~bCy?=F{5V{xjqsUDf{R%F6L)&p)30Ur%1f ze<=8aqW_()|EYbSFMe2F#((FYAJ)`SCG(vf_+~&E#rHe-KfHPW{9^=C{onn)%n;io zboFi=GH8hdg%n*s9A_fgDh_4tcQpnfAR04O`||nLxx$eTZ~^)4@pd52Lh0J%G2@Y$ zQaIrxlt~tWx8N?rF4KwS1#N{>GY1)mr&NR+6*Ktm<=6Z-1wKb&)9&yn&MWW;>^p@;rPKumWIsi2VI4<{}> z$-f{&CMXnW@Hgtjbbp}a5VIV#W*|`f4WAt1Ugp11N5*sj4PQb$J>v!rrLIxab&_p& zyn_R04PLnGvN@LMa9-F}tY;XCF)#z~H<@2)>b2X{y!i>n{mm<)tq!%WC~~S_XM*zM zuUp%P?B?xnDLh_Va}fzvc<>O@nWit|v^$l#8niYDifcS@+uw6s=&~nzm}Hkk|1qCU{p_5fX+!h*?w=_0^@NAAwS9M2=z>GZ7Z+OLN&8^F_a6CK zc_1~?r9@6(s>1^s9}trrWuRVf5(qub4B%;6iW?aur*CKm8yufvT@5i(`vU- zY2~^DTMbu>1;R%f^Hv@3;fxtW`0BA5jzvzcX?H7oOs-&YA}T2U!(>eih%iQwBhkQN znL0iLvdlx6l&LmvWw)k^%O#oyA#h^PU`aG-UiU4@9DXWTv%%!!$}J(U3LhSxwEF!g z6pivZE*TjRu?njgWJ`uFf7NgThybGlL=d+pByP~bUTrwTPnYhz3k~q(5UBbv`1GFz z-Mv97t0_e01bc(=&8|8cKY5rjb*w5yhvjK;7`zstA`$oj;{iJk(Q<{rUrfHgC^JCB zaHrh0f`rMv(v(Am{7WN4EpS7ey>z4-$u$q9AZCc@&zpWu3 ztGVO}KQC6G)E)M)*JJ7)Q1I=M~o_TdGU!8GWJFPMQ7x;HEi6iv{OrwiFWSAa!kcI3=Jgx ziv(M90f#cYlkeGsOOscl`5%H;Q@R6X)}lfUj$!<=m5HXs3Vl)8vBbuHO2R5~b-82M zw7+E0Kz@!Qj1*|`f)yQHooA?Nt0O30=M29(`;AM?> zbogD91-=D^R5V&xo`R0l09LHHaO<@g__<%xDB6qqb2?9Sog)%=;1iz7`sA#~bu&z} z)AW7&a-<_{=Jz*={kv*}o`augwi=A9TPthp-cB;Dh+#p)vUBs!rR9VMA~D!}h)v1T zllhrujxL=+tR_=iy$^SWo}+1%Z>d@vbKbIIJR~+mkp7AHQ`>%da=BC75g;L$*^Q z^~K=rs$p}0_wBefJ3XfiKMC`7vqbEWDBmbI;2rWU*cWAusOWfzj9z4w{zQ9)P@uT2 z1p;A@+>fMw>FlW~zp$HYqQ(zKA1gW1wZE3F^~lJmKuNznBD9}$eY2K~7z|vo9=MPF zd6(*q;7HWtbyoq~ZjfAmJg4lWoqW%y-@%Grow5*IC0W*n*2PWl6vJH3FJhg*?RnXl zaWHB!*801j$@P=4k_Iv!TC8c|{LW+h^ z{13s$Km`5;4H#8V2Q8hYh-U=eAS0EdzwB|?0#)M}(6LNFrBQ={hb05EhfG=N!NKe2 z)b=Y&9JNr%wO~_kJi}6kY?@P6015$W%4D?6bTQ)TM_Ah6uT-X|0{t&=gj&46o(U|! z=3X5TvVGSG>6?FMN+Pu$>MbBsRqwVgJZ)(e`34J4IG2L{KEEzF2W9TUc)=b^CxbFx30Az zR>XZHR=y5FeAV<9(`VR%=q8@!wC=b;%4$nxQ_Vw;V%v5nJVKkLVEkXI)MwZ1q(c2+-ghP!1dem$R^%-O}rc!)_DLnL7bhjCc{!8rXl|ZG%b^}E9w=w%; zXN<%O;jtoaNu-NU?muo${%Reag2E_?^J;Iv4Pt_{9>G zb#F+K4Cc|#N)I`I1O_26gmbseLf|^{Mvtb;*6oqJ~Y(3x2C3zSwn7dI@Iy8g2qgP zlE1Hp?LFKAsUk^b1Ok;-{Cgu4$vxDS13K`^KW+(5m1?DQIC^nNP1dnkE;peJzUdi` z_}{lIQYyns=pM?naFy!<28blDJ}31yfRB=m5SCZp=<1Hek$MG4-DeyG1Gv8m^!FJv{J$yfa9fMFf-mB<@OHpQVQr78Q>0v3Klxl0$XTO2+FKQD8u6gdF5lnLn-c0n41W)&t zm{%RYoFL}(L(wR#0}JaT0#aF`0)hhb#rHE2{(#9OK>h^Z00 zEAxRPJw*L*7S)oYD&g_UO^-F&0F)O{tlQQx4wTU$(o9&@y3MN+YmJ;gRc*S(ejTyL&93c8>~A9J5~;9ccSnWy21W{pbTk zu5oz^9m#20c=_A{8GD*9lV8R$N?asHp!xHhE{%rr=t}=uq{>5!@XRXbN|1GrJ&+z| zmtgvq;5gj@sWB*6BJy}g!7AZ+6~U11Kk86Sw-Hcx10puXO0tbddSk8*%Lwuw`2-5$ z)g^eO+V1{%HdGy%^R+$=8p34PC>*!i`~p6LAZ?J=qbpiT|B>(>MD3$7LpMV7`L`5^ z%bWDH!vcJb^P0|lA?WR(fue(jt0HMculm!j>Ebn*@hU&&Z-?(2PZr90I=XALMMr>9 zMH;z567)m{H+YStiSzQ+$oV2%wokBBL-UQslCj4%d4d9C2OpGLr|YkW`>uIaC?O*8;G~$25-i>vsLil8GZ0LnMjH!=)MrlOzQLzSy6t!s z#LChpM*H2}COp_qhf}V>3->wP_x5T(OL+S>=3c$=)6>GQlLz6}`)|)Dy*cZJUo5f* zJ`1qIQrkH)JMLh^%j_>ZH=#`=URCp4uezVjGU{83BWbVQxsp|I^TFj(~yBAl_OYWFtRX8Bhsk9|+6)*~Lpc6iL~C z-A2KbN>`48c6(^%$14YicvW8egmiSy==Ss3mxC`^=SdnA9iQeKjixqjFPl{F%F6kj z(5yy36{lXGI3EcJFuik3_}O24D|?qyG+O*%B$ zd$=soK}W&j$13@xR@G^9tRg}2h>;uWEl+3T9JVXPq0lNaK8W>cVz5JJ+s2+Q8&;av ziMqE^yBYF?76^}8=g@FX(RjkFFG}))dq?Z26mZ{FQh&=S|H@_@CJ<>^w@b&<>0GJp zdy@xCzT>mM>oekJQR8qUN$Z5$R%W8#!MAZEkEV7zo6UcGSEr}MJY-gY1OOC2;h>>W zRhT|}IL$nTNk7D-R^wLAO^TvELTNDFYmX@HU@01h{hV0x!j-U2gibJCcaQ=4=5;$_ zkJ=C@>4QH7fVUAxHjAEh7+H?IpC2Dl_f;~g=hKSrAQ&|&pH(9qQkyH6<8m_WI?6Wd zY7Ko8S7z5Yd7*Ql9%8#4zE{Kg0i+wF2mv)3DwrnYnBXo=YOa|uz@^Hkj@!UU?XBF+ zZomF$1=J-}W54LKFWMavDg^Pazj)iEt8-RPCiV!F#mjWhA=R1K5s>Uxgm3QAH<;1_~;MmhDU(bVjr{nK_d7fGix zebm%$j8aVnsQsVJxe~)HIm&9E(4QT*yORi9Z|*3rDLh{-u7GshI2S^(8I)Z)RZ*}0 zxS6gvH9gF3>{c!?0LYv2+iuho4OKLm88WWcq=AZ9BUXnOBUWYkGsOx@cXxN&(^Z`I zXPGHouX`+?nJE1D%C$jJM|t&wIuyrh9J2r-WS&n!a_y6w za2Ni{;Tu|0llsoJhnJ)>J z4#}02DYE`!e}chiGDC!sf|~J}Tb)xzh6MZs{6b*?53H4_T_0}htfQpeGXYYH^&kx3 zWtBgt1Ns}a`O=u2+N}bf`t3H2sFZ)#%?VV0Zbg%_PT_lOu3|*XXVmGJ0NP%PEWNuW zqxnRuzhrL;+K?*9q3TFISeBF@t<31_yB^F#A^FY&4PEF7Ff&7kA5(F;xpWLQ`jUcxrcOeJw{6=;T!nHl2 zoSKLR;1~%9zkQ9~3>*uIqFxrjov-3p0G+E<;zy`vgPeQ^@M^8BoRntOiV}YbVE7rX zHJx|6?2%U6CHCJoyviko8^Ucb`+nRrc)Rjr{U4GQmfFG zAj!q0Y9?YybjoZ#)gryCnmn#5bl`#*(C=(INh2^TO(K}JWMyQWrz@_Vxy<;(9kekD zki{1w`$eMR!~lOnm4}}(%9wMDH1L}N|J~obHWSewJ{+^2donVZ!x##H28b^K>`YFI z^ZY@4Tr4l>Jbt#%)25f#?&H?1Wl25wOVfc$=_l(N+iYuG#e|TraF#BvW7y zRho$9X*61`OS5pTlwI&>$`3RA#mct9k{B(AJ0R#Z^>eDc@bIXI3fMf;n=Q_kQV6jK zprg+|#*hERVz85-l-U%#vcLF_mZ_RHt@)LeP}3h2T6cA$ys!8bFHLz_1AL{WZ{NIh zG1`lA;-%cDK)WWR*QvUSV9Gd9D2napuAkDPSMyrUYCar&;+<|=<;h615|3sg=b&~0 zqWrFy$H(n8bA_E*<|0iugB7)kJLg9IlP%RJ?+}BNTJ|aZ?bQn3%!wY>|2Uh7{b+*( z?I2JVSU!>Hj#q5!HNTxJ$9pd@#)j6yt~!OEbd##v)67NIxbXQdkJfx729e3iIVGP# zu(;bWk_Da4s(Q9{&M%)T=uh*R3S6*gyVoFuczZ(+;q$1cpn5dLF;PD$S0(beAEuc0 ztAPp>__oG>qRaVj_7&RjBf`b{Q%G71LA)|<2zh)olRkzx*J4Wyhc->i=AtlMNNAI# z8O!1K7~(uGv4Xzuk>jVY%}dHI?XIZ-<00*u#=5oK`5b!WC7-^(qm;H}mjeTbmscM{ zCo-3vq<=X(rLVb<$Y#l(L{cg}ZphO~>ul@(EjBy!{`nc0xQg3Gu2NLaur`(2fNNA>HQUdNY4 z^oHcsHZQaO1wk(H<6~EXGcAABKKKv8zam0Aef%9|u%z2P#hxiD!tbS+Ci%80F^4O617Xvc2A~03B0Fji4ZL(1 zj-Y^%pbt>-qc+_#7iWy8QODeIC90t&gqhLI#^AIsT}MK8W#&^CtWGB$MEtzJgJOu~ z59(qaAPfPd+l=~iG5f3(XvYUpyf783*YJBXW9~{)W6}()B0McABhJhav5qp7+5*ML zGYL+(wpab3oefI3S|^mY2Siytt<_UlyBb9&de2uPn*>3yRhR3S`Tei{`{U`4lysn@dSq0oQ8^@jK zNSV<@hltu?mJ&DJmJ)l=^Lw1e=9`sn=bMe*9SA5hA$NC37E4CP;m0g!_XEo(K*r-K zQtwMyhWOLHjRK9vk%}yw)zBhg$(rmdea7P~ktV@rY5QnXqG zGb!7zF>YHHhBpzpwbx`+WTB%$!#h(o^`EwUdhfMEE!vh(Icn$1aaf)E@VAE~t1`QM zzpcS8={JZss!n)jI9&tNS7buGs6hdvFIzd&^RM`5W3D~lefgimU5ucLc0Y{8_hv;( z!Z~CCpL9c2o9OC1xptPYrcE}P-_QQBWo4-3)8-_K6#k<(pypw<;9wzp3w`o_1y}tJ z35{k6vs#DtzGZ54DB{-oPfQh$>qs9UqQZHH6r-F)2P>a_Wcv`8VEJ~Q*-ksGXfWu9`XQnV zYoC^q%rCYk{)}~WV|>j4`GZtLhlyU4as?i(0EI?I*z|-z#BkPu#c1{xzUf-Qj3qTz z?2!cYH}sqJihiqn-Z92=Q4 zocF8Si`9&agsh73xA=GH zmpE;)mYU-iP!-2RV(Vn%i!6$f>dYnBDgI~hvyA1C)?h0V)=PPmyhac*q+@8q4?Yx& zT=@#mW0dEm;;);%zjZcBTSbSX8vJA)BvNxG?=0E2mic4+L1mI(q)3w{Vn-&Hwp|~8 ze!_=$?j$o6)KDmVRwc^ZNMcY6ml`v6|5hfSxj3g7c>^U9NheQqd$t6v8{GlA_A8*P zRP`6=dU0QUKHD31t{1sNE8aj|8m)F7;vUa9klN#kJ`=vVyvb!&8YgExJtyK`DwENIaGN1{k#6Yf0=JeURH?k;dhAbq)|7aF8tm)%b&Qs*D5ah*lRtV z#fR1O*Rt4lN-l9C5V9+RjOrKr%`n?c`)g|0q~I2+bgXBjZY=qoLW)^qB)rN)49P|$E7o5I^`qQxPy zPXdf(gCtl0w~VKKD78in4jvX>aRDMTjfph|7ZMNR_u!>Bvd)vJT2{@9^qpgsuQjZrdc8x$(wZPzMU=`j%amz{TaZ3=^yBiGE%nM=&>v8T*& zXZFIf6(aV7rwvcj(hYqdZwF}*UpZ|xgQ1wg88W6B=EpyeAck+?9|53}q@p&NO%s7f z6z}F2-D9#6Pq~kW7PJ>toC}(!jqG$9)NMH9NYYgv%QZ(&GI}qkKXh{Vr-5b|=0vY} ziebM!Zny9IxUY^pIWXjl4bvA3KcF2XzK4lk(XZ+%k{h>&8F*`6LjbGIMUF6va}|T@ ztDoVv1D4vyJ7#srC6X9>M?*S8ab8iuF)&kCgO1jR?3I=tyxeUa7uF4aJ)YzmiFltH zaw%7Nf?b(l#}aFr!+yPc2E*&>BB0b->~9iNnsBMfb2kcD=%rO%g48l`LB z^vR#xU7(N)PK-oI5%@)@Q&z-h>fug**w{j!H=4}0VX-ZvJIC$uAUB*X;qz3T{CsNC zCwuy`=;rvItoFjxN*k9|zzq?5j@@AWbH*Diy2@-gEL%B)7tB=kiakTM3AT|$Tps`O z6g{N<_vFWB8*LF?{CSYAnpL@}ymtTFmj_&Y%PhP_oHDJf-D3T0Bc)O@%u3Bro5^ex zSEQTbS7!wUg0B|=l=FH|n&org(&Opp?@n(XvL@_vZPqLI;cx+C>t%pt-fn?NHuIxJ!CVX zcT!}}z*ILcf7pMqN~>(WO!(8>sU>I9^%rX#pmrRQrZt)DjJz^$!&urR`JZ4M9S<+M zxpqcU?V3B938N;EJ5yAAgegK=y7xYo0Rx~Bpr2LvPo%D;uGy8E-ifNGS}y-REAPHL zkoMNQ>{Y9)hsQ?87m%w8kH-vd@Ma1hY;rpvF+o7YEW2xbnj-45ufa)q(@C{TLWm_A z`AvW8e#4MDp4T4m&_?#QWZCvLf-qcz%qLfbSl+SbW1vxSL`~Bic6_Z3F0=Hbi{z>M zsPYtnO;%q}xb}BMJZ4-28yua*`%@dDvgeQYmL>c2nG$9cWp5#f1T<4R>l-dEPKHCh z$Zo+yQHdst>`!MJ4-b11BhoTmTzAq%>p6!k=5&L@(y}dS$`y~rMyu_+(ReTXcpR`J z;%Kq!N0K*R)f+o*Z#x*MacI2a%IB?VoCy@eNcwiX*lsZ+=cRIsAH9r`^eVBxH@}v1_a`G0?W0J)Gl!pKA*D84M2aAsj znyl5!fuUSDc5SqBhXU&2sFd6um7=l>R{KfEfSP z5V0?CQbaQxpZ*hs{x=%^?(-0ZfOUe)n|aa?rFX=pMdhKRjoP7%*dYhGZUt*VGXumJ zJ^DT1OG&}(1)`@qA#5r?Wq-4B$Kvw!FzQ{{HY z0I~>&u-u$Cz+ud%Bgb`gabK|*kHR)kp%IqhGya_q+TbWXy`Qs&gH4oBRx(8{RLfWx^(D|=w zp;-x0n-|0%&$tpS9FEf{mNyV6i%S$Kfme-r5tgLdR47(KjEYPfp}mP!v`setJ-$hD zNQJwdQwBm#sEkBgO`C*5du{>l&cd2NvPBtL=I_Ycf;TSeeI_>;An_O6Tg76DXw>aT zVO&GQkI>8=n-lT|h5q0Ueytt7IXy-PT7KxGi@#7rlIcGWyM#n>LW7ZYlWe9@S6T!S ziQdazaJOX27AN|0(v&fI|2gCTma7=RKV0-#q;ZtRDCCh%9`Yd4e= zBBKi~v2gn4H2XlFuM@>@+)FMS|S|VdSyKA7CDksA-_nZ;J_2H|JQw@g83o; z6NE+O%_o9{hBYP$UzBf}!XRlDxgbOpJ@4jeJQe_`O8AyrpJWRLSDX5vb+xUI4zu=v}Ft?S=O`?FBx3NBy|uk&H@Q!7J@0dq zg}p3<`lq%FFD^?Rv{1wilS^sJsyd=|tQ0&15}^LNk;{F3Q(vDX0w`5oPvqr&DXm?( z{rDI38nFS!cyT|5KP_kBnh09X#1h37j9bfm|xE{u#6=zyVr4;4Uk8s0+P+D1F$yQOc96Q5iUy zuop1o#~td2UMf`7y3aI*L@s`Z_QkflrC>@%5a(UTMo{IkA)$ymX3(rJ z2rA;{+nL6a(SclBLCNabPv9WRWLM00+gZy4lX%I1Lh|&km$B`9^a$(H5;y*@0w_k% z8{#yD4P57O9NX#`1@lV;XC5T-gS@n0J^B_LsXDP-ERAX>3qR0O2>8YPLWDBbff-8f zcL&qdTSzUk+^fiY`>nVAZ#J7ZRpHIj=&4hZ?I`i0iMq#9+; z9d9I)9qEHdX9X8yQFrHl2gvb*@O=yXKH=|pK<6cm5BsdiW0O0Z3IVIgW&L03J6ZA| zB65hg3T5*`n91dmh(sZ3GK+D;k;%gj9Jt&zF{W5{igFh=Y2R**pMRbowZoQ3l;B?e zReT77Ln8l33xq~Gyidz%yf#rjoO%!(R-bR0g@? z4Y`gP1Ic2A`K*9m-@v^}0})%U_1g=X%Q~~bwjPj}=SgUe$9b?W;`?mO#$ulM1#q{~ zL~MUKE&TRTPs}CGJO8^JlLh-wC|BY`is;uvMj%|cBv7A&rU}gyr>M2 zAeJK{jiOQ$hAPc(MW!cx*WU%bL`F)!pvduF%XN-lVmm1cgHXO8Qgx9KoaG%i%4~d7 zK*MI~M*~)M+%88Xf~sKtE^EYyWxz#|AI|%b8i?(GPm{OXZt+HCz7m|KxS|<{3ZRg? zV>9_ zXn=;3VK3>v)JiMPHJ}K+Fa9XJ*WdMxgbzqMS-!cSHKXI=P#+QOoJl_Z_2hdL7BoZs z?TA}?=M(+*8f|0x!EiulZBHY_uo9TS8He)j7Ldyl;dLRDxE(epS{4Sv0pi36lnT^v z^Jz>cPYh(yKV(^YNj2>XOmrYD==gLrBL4oiof7gl-OCqZ3z~{HcKz-3?%u{j`iN}3 z^4Y)&Qa@=N`x}ZCd0s#APXS8-z@aABr=Q@VAmT$(mQYHNSo7o56XiV7qh@CUbl#-Z zSPT-GAbsl61{~l<=f&Ve0EjXEr*rBLDS;mEJIy#-n_86JSro3d2?to9-t5!nAg#$N z1T|p~YIEdA0)b5+RS?yj$m`W>=yEOul9LEV(IlS`Fq4+?JB>Dd>O({Sd%7;$C-1)s z2Y4_)5b!i0Wk~M zuW`U%IbjK|C$u9(52CV&v1mBgW6Wgs7O4+V+EoF=CCOtx5C7ZD>w-ZCLdHV9ZpFKsMbv`J>4Ww~`mgZv zsuI5<8FA%BU1r}+bwSgm!axJmu`iy(Oy5ZIVh)U0h|= ziuJV?J5dw{U>{mfWSsQFGA{@^sW&r6zo_bi3A zDTBkJ1A+Ll!Pr9m&PC>viNtxYKZOl_Ju(LVsydsJM)?wNX@IbW$m(VyFok(T%Cd;_ z=tOumkPS#K-#&nWy}fZYf z(qKZ2$V@b~mDq7u@&?j`*-b=DgV|h2Rd5|F9909slt}NCMOE%;xNhXZ_W=D}oy= zhv?PlK;Si>^)<7P$cz8$-Mz@vWadX#ET4m=w)>g(UFc7rQWS2ev6*ziu8+RPj*vh@ zgZuju6aV*3@B_M^Lphu&uJdbwD!k~R{S&MeZoKo%qTbM%7i8GpV-9@TYf)kWx* z;3EbQgp6`|%Jn5UW9(W)c!xa^g#;L;GJ+caH`xCSm;!Bx2FM21lIDxWhBJx^_md02 zQUJw11|n9H2*1BS?01g~2tyueRtM~dAXC%QD!46ncr?}bUPzWf-vP#gg za0=UTVgG+9ZwxXP$tlT*^pgTLc>pEMfItu%_FoZtue=u|CJr2i%EK*0{yWEfiDQt! zg+V(3N%t84MbZC4^+SRHCz22@DDOasYQN=f|8+FGxlvvfAQLUtWAt)WJ`)wtwxKdK z1qS~L;c0daJxuOeGd;=p{*vM^NUMQoL_FnANKr+ z)d_KPYVtce-kpH`JXWhwc#;T4+;uzs5vs{1@a^eZnsfOVLI85xl$5D2byMLgcAM_P z9_C{8jS=UPRCHBPSL%yZ$&YS-D_2XFB&UUi&0J_~rNdq8|H$lZ3uYrlQOvkm6H-srKN8>$LIDbIx= zI`2I?1Iu`UR$OK8IU4c5IYhJkE<36UP&9W{ew*SFhKnW$x$FJ@DtKwf zl;CZ~1|N=P6;y0U9bLf$SHP!xj&WXN@jYbLjSvbJY77Bq_;W*I^F{goJ;QzSKBE3c z-FfWPuMcRVNKKQ%>o+scwOOaX{T#K09{ale1}u-w4t|SI3cdM#B;AFN;{UNGTDvJl zzM$xpZz(Y_T%;Ro^(c|j*y{1q5Z zj+Xg)kH_ipTNazu8$3cR%^8!RiE#1ex~tnpIx8qQo8TjwH4X}*RhB&kZ`^7Yrh+K> z1p8%{i9#I_6IfOAp@FRz?0Teqnsmw;_CpkXmM1;&iK7Y+{_8J`^F5sXLWaB7G&ULM zBbFZwung((e8WeXGv-mrzc3w6X2h*%n(Qdl@%1p8>+1|2oeGZ4|yfGAu3(XhR70j6N0sl2!qrj z>5sIDv$KoC|o?B z`fT?<(ieHa)@Ys?n1!TkEuBnrgafq*V;0lG~jNSJz7;Ib>m6HXepP4}UnxjHWr_2Q`}-B7zY>LqgwWHVcQ^&BNEdtTsj7p?O_IJnFRzAH!%_NpCzilitNN;xB4y!PvY%5H@e0ca zYVa2_{ghkFB@UEp^YeGOz6y&od+dPAxF|)0(TU$=pW%2OYqR&Vw;5D}yd2d`yTYQZ zp0{q8nuOy|e!kkV+_L%=UdUH5! zVPGioE}ZE>J0*kJA#**`FEl7ZBF$olW$M&?1xAW>c`Scb=C7s^=9hpKC5Z`Sp7QM6%Xs<;Tjpr25K>)z~J;V|MR6{ zH8|FVPOx}uG1QcYcB0e^4;R(Q}M@N8=aOXc2?#h6)qQp(@LPlBJjXjj1e3<|&?xXZ3j0I+=qu z!6Q}1<2Tnm`l`DMT6h5jR32jUYNlAdl{OgKKJyN`Ey0iKMvT)z?s^27Gz{l|q*o0@ z687@kyYPyIuZe{*BkM1VMgDd?PtIg=QpZHXgngo}1T~WsBy+EpA8?r}BREr#zL?Ko ziDj_LuLVn6O%yGOibGf5X(_VAB{wGh!nC6)&jppG#YS=zMBQJ$OPYZ_NAlsfki6?s z9;-fO^fA*>_oY(x<(K{1#s{tvJU+VR0Q(UWd@&Hse2eXP>+N@87Vp%s4)oo<_%N|3 zDZ1Gj#wRn=U{s<@tS*SD(`KPgdG-l0+(>EYnDndL5X#<MqW4TqE`Z8@h=W*eb?p!yFqo1ybxY!&j3+XP<<4jzj9u~aDb7Ko;xtnCa` zHti{DLw7b}h$!SxC??qB_LsDtvW3+~_R~?!66gCIWTZbhI9B6nR7{_8LBm;hjJbwD zPq|UE+4Q+Yb(c%LuNHp&<%smNjvCSh{><4TAgt7cWr z@s4skv=qFM+^Xd^{nNm&=@}LV$nq_LLr3X<4E=lAyvOzZePW|;U=X+4>b}(FWjp$@ z@r%e`oVipt+ZS?K(P+era4Iq0%W|ubXVp1)C5L6bz!qJXQ!NzinT%=^I+g$zO&Y{-q)-VYig{RU_%HSVukjTw}g@}lo= zC0W+Y$%dFn|C>Thv1odGYkHp^ahnpZBDa=WupgDvLS0&gj9_a3b0#Ia`#;6*Wy*cr z6JHr}&TUTCIr)3-!g5VtY4%8AwFuK|F!j05O__)a=a3!VH1miKw17F^xXDB zBwBhIh?F|fk3iq6!Jv0|dQvM^J-Gb}KXmGX240`lf@zDpDK73fwaxF#TVUFtP|4$* zm(W~?>yOTCL?I$_W&G8Rw!t|NJ?rAe(ed$U=@FwTL|oTfhIw>Kv{n-lSMrL!MoDE%V$G7WcL@06HeE}3`%AuY0&-L5wHn+M$<4{HZ z3nYt8FJ71RZvMg$xbOGMz?W%ULyko9c!-85GA)IwIuc1lE#FUYyYO z8+oakdVlNmO>0bv=V0?e`7{m3>J1zvFW0vqKwq|x72HT@ssR{MCEr$l6p=Zg+)Cpv zF|G9+O!;y!L!Vn3BG)u}&=)DUL&34gs3Y{%uG3W55y){hpaptI*g0M0ZgvQp#3%K54uy~yU7%t(wkIGQR3`Q=x+i)~#6m>X% zod{Y~&mCC?I{@~wA$}mb9~F=0P90V|Z-!9c?0h8bRGEzr_h6(I6VJm@0cQxj!&yg81%um5IOKT9_1NB#;?X8AuEZ%r63i?gTKIU+S(`K?3(ni_nffjS z#Ae{kZ32P2-HJ;r{25O>vYEh(%Aue$q+8cEA}s0(o=5@g(tFde z!n~@f!wA$MNr?NOyB=2kwzq_85cFuyH8lR;sw#ofpVxuL`5b=<9Hip!U7UM;40$Jc zK=gaXtYoITEFIzG*O=GM4r}h8YB) znyDupyz|O%?C?f89Y~GSL6yH1wPf&(uDaPbkSDUeWM;&+bu>-v3Z8XrJfi6_g+b=7 zS|`R+N6j}gYb;LJgpAAz7r@E3aahNUQ2xgo>Mf8Gh{jUL5h+yFa& z^UA8@f$qp46*o?B#^PRT_+t(@6PIh%5>TfN05gDkx#d}n)Z7>|qxysR%m^=d-Hanu zmvy;O33fn1R#$6<6J7wvOTJFz)Lo$hA)Wk`@M+nH+URVWmE2Yv5#ak* zZ&*vGA=sPz^jQ1Z&LO%HSJy%MB$E;&2(Q<>uvb-M5%s>O7Ob1wnrV6Z ztCxlQJPn9WR90c!u-gPj=T^dtn`WABE4=lVOeV5+Oc?5|UnPAkwhZ6`|_Np zpA(+KRo#)IwP>eYMLpb^+W2e-QG(uZd^quireo?X^}R7*SWF<^J(aa$Wj+^0ebFMN zL0^`aa1gm@V0z+El^%7l9CHF#B4zV$7hJ>Wum+igvWB|de#tm;Maq{TJnEMoFln&g zoT%&_5==%EB~C29I8f4$-|Elz<3B6%5hwX<`Zd%|2hu&P?Y0E^qOoQN(=1c@QdWX= zW%F>jx%=xqHuLRq`POekswMsC%H4PdGYxYf(NJbv_e*q}p-%WUprWD(Asjl`=zY8jnWcuS^^LnTr>yQU{kO*pNvCFeYXq})nxY8Y{bne9) zBf2sr)VpG#GsEItiX3%w-?Q76Y*U0a9u(!(MBL;1V?Y4=v*^~bwKAI7&Z@iwwt1Fq zJ5Zf*0FaMR|J`LFV3d+>bq{@@EoN=eD3Nmzg~A5Cv`Hsmr;T7Z{ZUCQna9!RSocEkpms)LhrBGhVoS-p2+ z?2Sf!VpPd&27YgZE|=M+@uu#$PKs|q8?*JP_x#K2?|75jOAK%fl=9R~m4k(r8CXM< zz6p}B*&;z9auca*PO~VM2o_<7E&#?7e=l7Q)Yol;+sL$ll+WpVQdryrD$+Ps+QJ!V zU&H>!`oQ?!zj}1DTe)5<29DnBzg2$*M%&YLcaezlRQTk=L+;CETyjIu_ra$*L({NM z%rxm*V7aA~id=mD#9Gkw$ma@#O7X?;U61^&)~GdOC60*XlShC_9PW`C7RiU&NPkF8+YamA4fbc7tQwlCHRiGo5xZ*T8TGyFw#Q@8y0 zk}LHEi9~CkKJ*z(A8>W&oJ&5M*1E=RFr)C=zJ-lH>Wvib?Q~}k61@jr@QCZyR9ims zWW;Cod;%}v|D6nwSfJO*KWVgZ>0ksp2&F{oZjdJuGTWuStU&V~ZM|F$X{RpCGW{thbra>XFqC!n;t* zZgOEW>YD2Ad;3f#Upv27=CwN5CZ=BZsTa>(h1SDEyE*C*M^0h70V()O#uV z!QoS(KhL)5(&Go=yOJ2CyX3wM9-$?fm;KtzSE>7VC*lhvc+kjry?aIf%{WqSc`$yq zV}{CAhH$<&5%5Q=4h6vmOk#l?zw6P&_I77}KYh)x;$?E`@JFP|=l6o71-24sEJ}W?6J`aof@tntY$`k0TQy zoeqJjsJ)x2DDr&L;IGqWbD@InhUn@-{`1q5V@b~5sFe(mpSP}wG)GwnXwvE;z+pgr z$0;M6Jw#s2r6j0?&NcP9g@xOZTFARMuW#4c4f>9z(xIN-3;p<8MR&v*OvqvX3jp>q zu@$A$^X%mEROwyXSN*H|ZS4=>`#Lrl#<;VZkPAg`qdi?<_~Kd%$#0gzyX>Cj@i@in zX5Fv{M5URn57U)aVf(hbV2`6Pf75Cmw)!>VFUIN z9+ZzY01C>ZP%MT)`V?}3+X6;b01sApKpE%t3 z=IR>9?uQlFwD|c1ncIU^WhK=&p4qV*weJScP55oLPo-hRjIq|=8DzrVZnMmEljgYk zuD|BjXPFBbU~0PT-oVV*8@ft3K3W|X)&L99L%V8W^`7p^CnKmu8Ht^+y`SnSw-EK) z;X_S*lw|w1GPO5_{QM9$NB(Tu4~CpEhg^sGG;**jR+vPBAu(yx`P>-4BV(sF#3tvW z~Gt-U>9p*T)L;pzlKuE+~N~-8F zZ===>m)O4;^uDIDIGhpc;wmI3-T(ow(Fv>p^%k* zjpckHU=+r2JhK8s4kjpoA9>8($;W+vf9?J5GL^W|CR-d-H* z>G&>9VZg=2{iAIMw&V>Ro9Zd9LV@}K3a3izjx*4Y!G-QL>tTZ_KDsg)#un%pRzRKm zhGKRg*G3CbRo4r9`;>~sV{9+5cA>Y+ma+Z(v+u1Zx6f&G;K%OrC5~{gr;+Au9I`J~ zWUc_zozXQt`s2F%T~!~--RX>JD{}_ai|{%f4AVMS4GE&>m*;ZB+SOMg?$* z*P~(7YpsB09L<8wL0pC?y*%^(nU6CPr5&0sV;IFGK*xLUOtf&kaa1|?pq~+VJp`{D zDxpjBerNIc=+Abk&twzqF$zpkK%mh)>5x`akc6#jDmErd3O+*5kF1SU-YnO3822u# z!zofv?W6hpU{)M$T2Sbz+2{0|FrhrS(L(Gt^zCJjqFoP&&Z!za{UhxLRrM0A;Eg5! zzJ+@UP2lswvlDUa=B#!Nhfk?J_E?a8t*gccYxXlXz`E)bl?LS%mR)Y}EY`L2ipri4 z!!&@WmX7gVngF(8qqA4G%jVF#gw67TpB-N!_K`coW2eht$7$JY`XRo|0|}tj^4Ft# z&z0P`SzO4K)!<&Z5Qf*BH_7h}bCNLO!9q@=%R4mwJE!`k54U>AJbu$pV`*t-Jzsr+ z1Nbx+VJ5CE#;pYb;;^a5*B~Hq6*Z;G<&g8q7Uz5m;swqAIie#0#n}pJC?APKsZo*~ z;ncj&5CVHOTFYHxj?TDimU_Q8E-hw@jY^2bcsJM;bE}?|^pidDI*c_g7r5@PIF+Ma z^qW&3vH-zr5(Zgx^|Rr2Wp)TehkZ|#T#5J+hKaQ|c;ZHXl0O~OF^QifxzRc2xXX{k z;itbo{{u98mDy3gF0t+EjD!TXX_gP6B}?9T)v!hVXkw5lbFs(gsFo{&!)!qarndrk z5+jM_AfG-vn_3y|0OF^apxxuH?jWFRa|#aCT$$rG0*KfHYem7v^ea?~3zcsuX;_u6iLzn*Ez2-44{#!Mv)?+OfKZ!Id@m z=!x{T&2+gPZ@`uD>@Tu|L9{-A{=t+yb?e+31#hSn59md{#U`<~s|iR7>O_gvq{R!$ zn|%*BY|>A9ROOI-aWQY2sJ?!BD^XHm)63@E9WEIg@!86JogJ0YcvMO+Gh;yX@N+a7 zNI=V-^{Pl7WbDXT_M9u{3Kktd3vJd-cny&Du` zc)sFylcqKahnGuF{pv(?C_472Q8l79L!``UgD7LApmVTs5Jku0yYoNA5p!N-8e!Zw_%IWV=so#tb?TiK+ zCmSdIL~S}UY_Dl5Dfcs7Rraa&@G``NdatoivSrowUS#%+5{lC?O{h-QaB%pn>@9ya z9+**)`kDuM-c@x+&6%XQZ1ZQ)UT19uL+nUDXgI@j6u$XWXTF50X%oqC7HZ~l^MI5e z*2Letw4s>@kox1JgGHauxAU^GBGIMS>%L`*eRTTopvtx_;aX=Yj0t^P+VNat6p@`1Lc6UCZPyMGFw4K3FK)V zvbs$nqdizOzIg-+rXcEo(vm1UbIsyAlcI6XykKiFVCRCMg1 zbnJ)mwzK~J9_BtYtCZO!*}shxV8@ ziFiRiDUIR&7SR_Uq^hLt|>>}OJr=4a<*fq+%6O| z(LTWDo1bR-Cj>J-vx{T%#uY&)W5>?Sf)X|C_O2(=&vGAf?L?LK4I^F^^-iMjTE3a( zQ@;`i>h~ol3N%_rBIP&7_DezUJsuFfL?>c$L>OmUfo_uQ81xXgA3uEF-o^oiK5Ivq zY@qiHx=>*ETmVM~@bVm zP(BH7`|$%xLnSp%yTy2(sR%Ixd;9&_c%O8R)1X8vnVV+b^k2_%Qi-t9^n?%UL#{0F z@xJn(6~znxQzQ6&p2&3msTRi~+zY+A=6s8F$^uQpi*nNLybDKQE6HDN5CMYGh(!-D5X0MoW>PI|;vukG!_@ zFLLgSVl}dp{Gsq8$NMGovc;MyWTWv7tEoM2VKk1gd#tgN`6#p`I2kuz){ym=_Z^j) z_cz#|Dt_qAe#pAIq2OH^=^qZ!FElL)*OJ=theN{m9V+dJZE!Id^{yw^YEkB!p^;Vez5ZQo0_ zM@%0Y#bH{oIGK+Cx|Synf9VQ_kLCN(iKjh5JqN>uG?LPN<+6Q)%_<0;qCVId!hY@$ zqMuxA@}{h0jW7QF?>L8(qofYC`lEK0N?gLU6YwSl)KggO2Pn}88h? zn~$~stU%atX%-(Ov)UL>%4r^fn7VCY!F}aK1&T@tc(|0hV@N(6#W`X;xW1!4D z{5WMrOps;wGs^kxhA2c<`OgnXy_V)&;?{^P;?{m16?seQRJo`!YE_gv(-s2NJ?*`} zh?27GsR;cIGzS*nS?JE(PG?nWRSs?mx~XwrtgRAiX{-KX3_4-XI*Rm{{QBa(y~^;h zb@cMTi)9NYR5kyM@@X4TIcw!u_J$Aj-V*h%!JS(< zt={1+hrP0EN7A#Ngo;X!BP?j{!O8)mAFg#$i%|_fiYzPozo`idyc>qjAUT3^@ z$AfhWCLDBldAVZ-5aC}%b2~|~rPf7%Xg%z#(LK5cfg>=UN+<3gnm~F5SN#?e#?BH_ z9dAdWZcIJ>f(hI$br>U`Lwaal??Z5uCe)K|c9edp@+Uy=kWI z*4BWG^eAWJ(K5I@{9T!Nu~i$n?q^a#U6wsyOk@iWEBDQKR6Y2y)ceG&Pas+w&h|k{ z_?0r!aKv^?i+oxAQdZ_d-Zg7L*x(aVt2Z1HeXcMIvI5sC5~3~@Mpt&20$q?J@58G7 zW(d$)h!M~N8?~xF-?xpQxD}dUK{2Rk$YAe3NUaNNJ^_u3p?D0mG5eG`WqS$tIDLp- zV?Spy`-`Q~Vn}jYNqHuUDg7O}dF3yY<+--T^unY;hTHW}bmjLkcOhEq?$oWe{AEeL zZvu59DA=fCqb?b$Y*IcJ4deSdliS)He41GXwgt) z6+X{GM|rpUti-)bjIkSnbp;1tL)yX8?lT8{IyXUTkL-XcvpoIXNBf*;3R50PeJ6RH zjcC`M+Vdqr<)v_)M$E?KCLHt6mfLFGJbJq0%A!g{9jX_8h~sr<(gi6PGjwIv}ZV$7%@)gjNiZkL!#yc{M9X zvs}l63!TX8Uppn39V?;LG(W_pmv~7JX-p7m8>;823 zl+WecG;OIRv_0KQ`skRKj80x?58o*kAPc*u}*w5jq?E^Wh8gh>F{b;%6WO&DszHiP8&a8aR~f zf(_~P^K~?j?$KG?4k0np)AR#TtV58C8EN}u8h+YFGkI&JaRAazoJH`$5>2no2{>jg zSf%GR=|VYj+5%p&5 zD(akOOv+Hs_lEzE_sXc4(1x^YQ~nf}yXLo5sd>)<3&#Vz4zEZ}sPnZ5wXX46T{9#e z^cf)}zgC57$E=HeoP+=$YctaUHC5BH0X5Tkptc0QBhHt6X7Vi9Or|W~48B(I@*=g~<6wB`-7ugpK{Jx8fL}(8zd|DqxdK!sNOmfx_e|iB^eQUytGD)?RA>agV&H>NIuT6gt zZ99qp={%FYm9Glpr*NlEiJ9i_!(Z>G*~`j!`nNkya7|mN*(F-qI9*8ia`fEp&sI|5 zpZOdNB+WXTp%he$Oku$*i98Pdxz8y0;H>P3Wl;B`u6bFT4~;!4%n&8vSk#)h!!+^R zaug7MC!5Fd*1EfE+m>5aA|BM)FRQSc;r6{P{n3M~dMs0`UDs?9lgW79sk<)wdMziV zov4W`Smjq`{UZ^%lpMgEvxX?`l8z{~W{j_;6;%zdhw3hTj*Yc%vyPerkL-8j%+*r>T3BxIe}tD1r@Gh$9a!L-?h0+R z{1(R9R9p3y;i5#`_YzUPA=$I~PzDu_4?ioVbNBWxhJ0l<-?XJz&B*>V^8mh=RR`_N_ zvqG>5l*oVGY>Xe@hF7s#GdEWkM~!uVB9(puw$x z8=$&46ec%vm+htL>2O%3#dR}nmRb4U(2Ai?P67Qr%@w3y=nxtQbZtK@ogP?7%Fx* zU)nMy%%G9N;icTs_iXix%7B^Hy=gJP2t=U3NDHo=%Z!A9D<}j1Npee07hZjGi>OZi zz9lfuHtHLA%pba{4R%T~8M9$+N{pfw_sB|oj@aYB;NM&MDjF!;KR)=udJu7DX*<#hhnpo@5PV9$KitQJp8Qd)Y?9yzJdoOmddk&hJ;ILCsdm& zX{G&Ngy2ScuPs*z%P^9Ny*tsXMnF$v^zMmwoA!dPvgXH;BZoxFUG~q;z!f)U{XIn$ zHlm5FyA}D%U#oB1=UyF^Q=TYQqEHFZoy{MT!7e}67jSWPAeUc=_5)|rqn#r12>{fs z+WG`nbiuEXtS)+1@B>H^9oP9ZeRCOP3UW_b8+Ll71PP!v=fxZ4e(}_FJu(M*EuvUbV?DiAk%~_ArFS_Nz z&W^G?D<5K+=Uovd8(;7fU~~yG@{g8Ai(Gzv$Oxs^SdET_Yi9&QCBs)j)Qy*?v&-~y z=8bBbFw^LAN1mRx8-MR( zwm~=xYv^A@y~3mePDE8UWj>CSoot=xzvca|f4K&e_SKoYi;7WpaUbBFQ~NmR5)(L? zoi8?<%U6do<%I22zhGqfI;Gd%F>G+;;l1{6WcGlbcSp3h=(tfp4EmqSHMQ|$CBzN} z@X+Th_NNt2_dUE1Lbmr-BED);Uo(`i&F1<}ENn$)w;-$wUSqsGPMLNasOU8yBMkaI z+A{)6;}-XER&{J|6Q{54E>WBP&`-{6-M=pGXAt3WCLkn_)0HtcJg^NkKZt_ptPj4c zg3S%O(|2l2_lztIKP7?0pg@U4&)nkiO482J&<_=LJMIFVZ+{$~vyI<21R+-zD*flY zyDa;c9CS~)vy!H}r1-d9<;s0- zC90VAcXeGqaO*mIhsQ$f_4={zfJge~z3Icsyg%f0O=X^#ckb+to|F|G7P&`LdPkVibk##jNF`CQ&^_tKVISww<6+;SMeQ0rc{Q* zAiI!D8^OH{5LqLB*w1u(dUPx4R3Q|L4CmW*l)K?f6I>o1uiA5EwiP!jHN1LiRE+;s zTXbB6$t0#>_Gt30cQG+GoAblMW5zT9c%)G=Vwc`D5d@gX?>ND;!D@^Bt+an?`ytyBpM!|%h-%vzrXw};c@9Gw&!O+ROT2l3}G84-cB z1e+`UFZo6}2Y2J3o}?+1@!#TR{V=n3nspq=e5rnz=W9tlX- z{6>5&lW9uJPo|UyDOzf=OdTq9LU6Z+LUN=V@Eh%H9_!!R$SUm9Q6$u<(3meU9oL16 zVDncRoRD6y^vngqxcbz~bwv{cG{#qcXw=%GM-?Dk$E?o4R8&W6=>L}e`a?+AxXIOG zjMK3x>4XSI~T=~$0C7-R7E@=WyPqWnjs&ip2Dm>IO@v=Ynr zOox?fV}A_Q`YxDuDM*Z?Cx9vP1%u!`2R?qSlHu~_Oy6YxhZcUnM(C`yeVGJ)QWc|diuh+qRd*8 z4^`yn{;YC&8Au&ldf-?vVr|%S`oU!w{*l*3^7B`C+75nJROt69vE;-tgUHxYSLPwj z(r0HR>VkBf0XNcpbS!yMkH<#-%<9G1`{A8?cY~GnyNn2BSr3(ZL71&_PlkcIy@0 zU&UCay|1*GbzA8!O5J^-<)nE7<$~eIX*vI6RHXz>X-h1nFS1S%ucWUP@Dp>n*6yU;pE427lMY zUR7uEnipJMlfCS$H3$1fNjKN(GS|r6FwnRnO_@jXQnsgT@zaYj#-&U=K6#e(>F)Lx z6Q!Lu(d0T_u~z%xd&uTWXumc);F36JsWtcpuAJMwP35q#C~noOAP`?w7)ho+|#6Yr3`i2=Oo7a(`P%5P;2n`YLLhYd;qfJ1Ffe zR_uE=^4akW!_;t|&m8^0UH&botL646m~&5}^l4PtyBf)o_3Nxi<-6MXO+@=fanN7o z2a)jLUJUO;bP7+ItSm-u-)(4@hXTj4dD2iF9;{GgdU!u_R0%ULeS>8I;=zwjg)sB& zwH-f{T?-!(qcH-p?%>L%hB@jjsXJAHa-YcP^jwUi3u<6FON=p%*M|bNDj*>sx88R} z8Ar(bW7>?;NM2*L&4lIYQb6b4xby4Wi4Ew8+(j4(%oT<0mgdE!z?`O4h|Lu9ScanY zH#nT5RcCBtb}B5+C%)N$7dUG8@%&@?R|euhTHOjSn01exh%Y{rzFOLFxg~i8)hpN3 zk)RdJtb^HP=+oh8KW~@+-Ck;&J#+rO@3je66Rv-NXlO4--wocwb4|8LE9`PCanQN2 zsG;J6^kFc$19Hrb4T8Z+24x?vjyW#~Dzw}GT>g-%{U*&^iBI6@{_KrbJyfT=6ZuC` zroUdl*Qaf{1Mh1Rc(cHuJO1j}>&nQ&FLT(eO_?0Z(rEUvc+{a8d5NBL9;CB#l9}70Q5y++ zs`D>6mSHp}KGNXuL@4mTxLye1Zef48sP%O{4dB+pvGAIDm3jdzIw`KctVy`2ug)it zU7`f)*Bp;gYdXrmvuKXL=(_$DGBP-BIB58I%j9e^j4we2L*jqQ#iZzi-#(D)Ov{L< zQgWvWU0%u$Qd#z2@5=oSCx%H;K<*TuOP<##ew%>LTiykvVv7idV=VQ+U6@0Y7LhUg z-AtrZh=Uw|qYq99{J%%%(omf251M1j7#dhui^7CbYz1vN8%>xK+5@GKT;#x+@oLK= zj9ZKH>Gu#CxtQR`f!qkg|4Xv}N1N+tK|H%<&wImU1 zH2>2lgx3GO0FE2FC{wmSK@DOVg{;5PghQc7b5hC311mm*`&Hu5a=oS@r-Fyt zq{7iyL_kt1V(elQqR28y{~DOMkncF;%14ap!kqn67`gTJHlY?M<}11sBG=?%%$jn6 zC2Z(q?g2EhNK*@=VxnKl6Ltgs@3@k|Vf_!`9!o&s-4X?ewh3SM#Fa*``zo>v_ZB;k zmK&a&0_WLFKZFJ^Vy^BiW*M^CXfN8&Qt{N4?T73GF_eH06ZG;g=YVdH?_^Tp-aBp` zCIf4R5=&@?zsbeI4FsRIoaMqNL$m~g;-`cGRxPqPrhHAN|LTpTTgpEi$1$<&4XIeR9nHANv6j?}$3ezy%cYKruM0STfQ) zsRUB~2d`wIDYUJ*FAM()tD-D)9b7!0;2xeTl^j|j@it>}j~MYY`8jL44!f9CL~w&p zICQS4{*AN4(b$eiIJd!Y^}oWJ!37-{Jk+cs(oZf*gdw(qv}HbmwuGK*Zl$2h-?nm& z@hlu^aT%PtD-{e!C8m8bosLv8z4S$tNG_g~-%kvkrk=(dfw9BHUn^2H;{VT_p%#ry zZ~K(5qvr5vgWhT9PqV(gMQ9F1cym3HE}!;UE8iIHvgj-AxhOhC5=+z!jo4+V-5e>t zn(Hu{t$`}jpQ+uU#1;Lp7@@n~cOoxhorkF&k#Mver+tM2(myA_`cB_iM`kdoK8R$M3ah zk9~j44d%MKs>VEiZm<$n5%Wq}et1~qNuyH;ShOG!-)5l5#n4)ly9DV-q=dquQLrtu$@qq)4q;0=*UefaNb*!2OYck*RW)B09maW%40!v@T(2xCNBlh9tr|!jTxbR_iKJ%ZRjKICPScuzd1BSy%xjKPmT; zde41A%{eU!v0rh|UG45f%j>6VzbW!1bRe?v-_ZZg>u_Egxg?AJ%b)@}U={uF*h9VY zhsWJx_9kxFhT3oP((=ze3w9*(NTD*JY0KmV+qqI`PBgv26C>3i546Z0cCqkj2cr7a zaWwL6H1Z!G(?0rbRik*jb(A6D5~i>mI?q2GG(KtrEj8p1Ht4fZw4PiJ5h7&t%CFlQ z#3KD$JiRHSc)@U{is2!*pMg;9%T5QdRW#q3H59_i^Cj~Tj&(~3(v_fyHy5(%nYL2oOz_ZCHXdk)_n9O%bMP*%$> zoS-sjHa(I2P=3qZecZO>QFWTpF>p5|5%cy!r?pfW`Y>+@xpklqxp?B(!yk(rAf8on zV5jj*Q~-dndyYk8ItvOMX}XCc+WUXaQvNqI0jMaDzcg~TxpBpm4<-BICI#Nq`2$+j zK&uC1Yo@4>e8XuUdP0CS_H89pNxujj`t_JJdaIi3FBu0~z(d&fr4)Mm6pUhU*ug&k z13W51->dSA3y{ZIVYSOC<)7hq-=NHCU@yV?E!K_LItz-xArlcJ-6{y*DSM?85-XTA zewpea22kh_L5fioR1ec9pz3kbRydywet(E42uCpops1iM^3?t}_i;&4HN{fiC|mPTi+^ICit+dgtk82+gyku6tUz zmx5k>f-)P+5t8Ri=>6%y4jN&a3^6i|$WSZ=|79;?ae|7%SH9z+i2%3w`hS%aZ$U*b^V@^q>8(}1SH*Y?LHxY!SSm3Wl*3b20x|E$ z-Oqx>Lst-fRqbsc+6NNNyp9vNAxe@F-P9qEFaKQpT?$KlPsFc?%J`H!m~p$=0HK8b z8;)FFq|F1QYVg$4w?pPcCYI!k2fd!AZGU{>!svaPMG@Aok1JeKb|BS&K>V? z-RE)MKkVn){*tbP_z#1j?q@;>IUQ)3+#zJo@L+#HwCrbHOv&$Cv(BJ3kCGz<>}t!#C-zn{7Vt#Uzzc!NQO4MJlP-kzG^N7qzlQz*4Y+*9;X&1 zLR}Vsv!Easfgqyjll#3#hHKOhAKUefNMI&p%uTWC--U`40h-^e?^`7(#2thgfp&c) zA&IMG0_QOrfu?k2d4@7>!yG7T?F(#sO8^uh_X1J(5?*$wl228=|5eDlpP>V~1LOO3 v!qCaEr0gGz&`6@-$b~`)1>lI@NmH(Vcg(04jDB3D{7G6|UaU&QAn^YKfWWoP literal 0 HcmV?d00001 diff --git a/static/images/documentation/create-form-seed.png b/static/images/documentation/create-form-seed.png new file mode 100644 index 0000000000000000000000000000000000000000..49ea8b7a995575b8941157bbc8f4581828722561 GIT binary patch literal 30681 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 literal 0 HcmV?d00001 diff --git a/static/images/documentation/create-form.png b/static/images/documentation/create-form.png new file mode 100644 index 0000000000000000000000000000000000000000..cee73f563b34a623fe503c609c5be07cf73f5221 GIT binary patch literal 30385 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 literal 0 HcmV?d00001 diff --git a/static/images/documentation/vps-vultr-ip.png b/static/images/documentation/vps-vultr-ip.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9714174fa61fbc1664ad252284c3650816e178 GIT binary patch literal 61349 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⁢G%<4f0vqq<3)4mu8Dc`#=-%7 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

    CCW4E#bNptJ@w-X}PoXSev&$-t zgAmo!S`BuW70F}dqS97^%P7r$>)W50Cw-HAs8IFD3BN*&FYbdlRDS?SB@mQDuGPVKW<^QsqZ~oJo6Z>_A@;1NUCd% z%~*e8`I*9rY-XAGO@;q0becjmqY++okhG(n>Tn!w0_L@_eC8scc+BiB>Wp(5tY zmHl=J8mt$;G)Y`LKdvm9jurrViX`&5>WC*w*8NcTWut zi^96+VEt?~}aWkOUhWlU~aON5z?IvmXr`o7(R= zo%I)8@+6aYh$~&3&4QxB~=o z&rj1Nv_)FDX{S?p&Ho2ttBJt^{dgajJ45MRrhFCtHFa&H0yb(a0#4|^a>@)`@@(cHXF-l&h4GSnX z&3y8|Q(~u!5kcLxQm3^nw076m^c-u=>3v!DN*D#T3%p`UsW_$jvPmdsB7EP9+@*9d z(9fOj4{yb>yp7Q+)VznsjM8%PU6qeGr#8c7FwNRT;2KB%yBv_Pz=&Cf{{T6E^96ym z*}mw(lr#|IQ+U+IN3$Ra`2lj`Bb?&I2HqTLy^%hmNVGp8;7SltBP9>PVv?B8_0BJ1Mtgsp}mI))3@&c&zH4(#Et!+mKwQI&{SxWPid1fKQ;9ryf zV7uAMggg6*F{R~7GY1Q+%5iO(&$AL)Z@cc+(IN%8fcNKFM?88u>Q3U{f2YoxYPCs{ z7aN-0+4NUqt{NrNIj(xEKK-~{1`RQ2qC4Jl3fK0QRMnZ@LU>T-93d_ z%aS)u?`NhKc$n6cAGglU3cPeh=j#;zf|((L_q;{2{U7sItx_BO1W7FRqUH0861nyZ zH9{csWwfl`S}~cZeg`iq-*}e}?lUVW?`(6|%z(osjhLQWX3#&{8eGB&XP$qc2u>SoP}?fQDcrMDqL5oV2G@6p&P|ZYqOx9}9MSPsonj3i zz%=+?_%Z^gpd$+oen#Khz#c|t~z%(?8Z(fPNj(3QGIKmXZ`DNn5ot~_Q!zHn~6yHR}7PU~1-L7g$U1F(B-1FM#RKIhUu`MN)*dJ9KWa#V< zcz(scyF>(qvfMU=bQm~Zr22;pJ&)r0lkYthEKl22Ke^1--A7T1yqlP{<}X>i`9+Ev zTv{+PXdr)$xGnihM;qVq*hY5(DgV@itB+_0!ef$_lm>@)*N9|z?|(e6BM!VcMEXYBo-bet9C_lKN%jb0l;JXk5p3hmCj$IMDgm z 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 literal 0 HcmV?d00001 diff --git a/static/images/facebook-icon.png b/static/images/facebook-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..80d36dc6d5471daab4610ed6f89b23634428e5cc GIT binary patch literal 3270 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 Eg55zmga7~l literal 0 HcmV?d00001 diff --git a/static/images/facebook-icon@2x.png b/static/images/facebook-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf848d4a6055d091568461bb34a274ff8cad893 GIT binary patch literal 3817 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 literal 0 HcmV?d00001 diff --git a/static/images/feed-icon.png b/static/images/feed-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..428988e69b1d9df5bf26ea6eac1393e836215a04 GIT binary patch literal 622 zcmV-!0+IcRP)Dun?oL-f`+!|H`hwmDp`iGV z-k_~PZ7Tg^dC-+0G)etI%M`dYXq-lqH5#;pz)}lfsty9nNkbl0@Tq%n1KaBX&MgX*S3`i8|3c}@lO9A} zs|y2-+)xSf_ze8qyUc8(?zN2r8u-;c@UySe(C<@leVgkCx@-HW%mR_}A;A5%(65t- z&aSHuXo{w`06#ebcWH+m)a6~k!mNe9zg-k)!@n6ubZ*1HXD@65etkncWb9ajfEx4D zYzb3TkeZnh9aL_hySRnx2f2R~{?kMnTAepgxqHNB`FtQRFuOXLS)wvE6ZWF5Ua4`q z3${hidia@VnVGoj`;Eu_I4{slZFG7K^gA=c&l$7Z@EOfgJ#CZxz}}7g2Q31QJ~I<; z=<3PS^Ty+QashcXX(%+7sjin+t=TZ*;YRl61G0gW!8KH0#*Z6Mw>5sogH@gj=x!af z75QPz_#C+b4tJ`THQfeST@-rb064Yss4I0Eum}B@7b>=mdhA>MoimX>fLn8cvR91V zEd-YInpkN8Y=SHTsg+HJ^4%-+BCKi;>I@ofAn4}bC2LpCACmb@Q_nIR;Q#;t07*qo IM6N<$f}rahDF6Tf literal 0 HcmV?d00001 diff --git a/static/images/feed-icon@2x.png b/static/images/feed-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90749098a702e7f688acda30b0dcabeb1e63b4b9 GIT binary patch literal 1094 zcmV-M1iAZ(P)|$z`q+QIyI+ni)Mhb7sN!Ah@^w_S)+pGe|Cb_G25YgzAb}OKA}sQ`##sfdB~Ag?vPM{xWD2uZ+W}^?6pNBn5!PlM zV7dU8Y>=z|2TWm&vM3-LKuk^tEM`%_l>ZMfl@$#j;5bSM0P~zIP`CDw@%S{UmI6|> zd!b~2%m84clV3JEE|8U(V_`DGZDhQ-Ose64-vCPh7XHW&{9GzPiZB{sL5uhsYf4 zB=h^*xX3i-%xQjYhc`V1l%cD#;^0PiIiP1p`D>U|eXef+WnJ4!#`AMz{^)nL8K|n(bKSHrstr7R+y54%|3}3C4eg-u!TvV%N9J`<11k zqp{y>bbw;z8@vLPPv3Z5NwF(iq&<-}o%FC?1IjI#dT?Ccx3`+?Of?pS5o>!eeouQSNn;qe z6AOrVb6|K6;eNfEgvZtH2qt(<*Z16;6~uR>3~pHK;RT>z3zk9ya2#u+kMiU znWWcsl(o_6N9ik)DDfy(F)Ky-C|v?Q%xYwH`v|Io)xg@%N|hM?0FIYPj!W9(>Hq)$ M07*qoM6N<$f{rrzbpQYW literal 0 HcmV?d00001 diff --git a/static/images/forknote-large.png b/static/images/forknote-large.png new file mode 100644 index 0000000000000000000000000000000000000000..e3caeb80bdaf2b961940e8457206f5d0ea8776cb GIT binary patch literal 8723 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 PZ<>Ej^MAiaxj+72|02DL literal 0 HcmV?d00001 diff --git a/static/images/forknote-large@2x.png b/static/images/forknote-large@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..722cf6250301fcb28e8cf132efc7da5cf363f8aa GIT binary patch literal 13686 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 literal 0 HcmV?d00001 diff --git a/static/images/forknote-small.png b/static/images/forknote-small.png new file mode 100644 index 0000000000000000000000000000000000000000..899280ea4a7b88d66b23dcfb43308db5288d293d GIT binary patch literal 2987 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 literal 0 HcmV?d00001 diff --git a/static/images/forknote-small@2x.png b/static/images/forknote-small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a4300db54b767c4cc9ed52776f362e57d2f0c5f8 GIT binary patch literal 3225 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 literal 0 HcmV?d00001 diff --git a/static/js/app_create.js b/static/js/app_create.js new file mode 100644 index 0000000..8534dce --- /dev/null +++ b/static/js/app_create.js @@ -0,0 +1,26 @@ +angular.module("create-coin", ["ngRoute", "googlechart", 'ui.bootstrap.showErrors']).config(['$routeProvider', + function ($routeProvider) { + $routeProvider. + when('/', { + templateUrl: '/partials/create.html', + controller: 'CreateCtrl' + }). + otherwise({ + redirectTo: '/' + }); + }]).value('googleChartApiConfig', { + version: '1', + optionalSettings: { + packages: ['corechart', 'gauge'], + language: 'en' + } + }); +angular.module('create-coin'). +filter('nlToArray', function() { + return function(text) { + if (typeof text !== 'undefined') { + return text.split('\n'); + } + return ''; + }; +}); \ No newline at end of file diff --git a/static/js/bootstrap.min.js b/static/js/bootstrap.min.js new file mode 100755 index 0000000..1cddc3b --- /dev/null +++ b/static/js/bootstrap.min.js @@ -0,0 +1,12 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=7acaf9e459baeeb64c10) + * Config saved to config.json and https://gist.github.com/7acaf9e459baeeb64c10 + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),n=i.data("bs.alert");n||i.data("bs.alert",n=new o(this)),"string"==typeof e&&n[e].call(i)})}var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.3.5",o.TRANSITION_DURATION=150,o.prototype.close=function(e){function i(){a.detach().trigger("closed.bs.alert").remove()}var n=t(this),s=n.attr("data-target");s||(s=n.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var a=t(s);e&&e.preventDefault(),a.length||(a=n.closest(".alert")),a.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(a.removeClass("in"),t.support.transition&&a.hasClass("fade")?a.one("bsTransitionEnd",i).emulateTransitionEnd(o.TRANSITION_DURATION):i())};var n=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=n,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.button"),s="object"==typeof e&&e;n||o.data("bs.button",n=new i(this,s)),"toggle"==e?n.toggle():e&&n.setState(e)})}var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.isLoading=!1};i.VERSION="3.3.5",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",o=this.$element,n=o.is("input")?"val":"html",s=o.data();e+="Text",null==s.resetText&&o.data("resetText",o[n]()),setTimeout(t.proxy(function(){o[n](null==s[e]?this.options[e]:s[e]),"loadingText"==e?(this.isLoading=!0,o.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,o.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")?(i.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==i.prop("type")&&(i.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),i.prop("checked",this.$element.hasClass("active")),t&&i.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var o=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=o,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var o=t(i.target);o.hasClass("btn")||(o=o.closest(".btn")),e.call(o,"toggle"),t(i.target).is('input[type="radio"]')||t(i.target).is('input[type="checkbox"]')||i.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){t(e.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(e.type))})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.carousel"),s=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e),a="string"==typeof e?e:s.slide;n||o.data("bs.carousel",n=new i(this,s)),"number"==typeof e?n.to(e):a?n[a]():s.interval&&n.pause().cycle()})}var i=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",t.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.3.5",i.TRANSITION_DURATION=600,i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},i.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e),o="prev"==t&&0===i||"next"==t&&i==this.$items.length-1;if(o&&!this.options.wrap)return e;var n="prev"==t?-1:1,s=(i+n)%this.$items.length;return this.$items.eq(s)},i.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));return t>this.$items.length-1||0>t?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",this.$items.eq(t))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){return this.sliding?void 0:this.slide("next")},i.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},i.prototype.slide=function(e,o){var n=this.$element.find(".item.active"),s=o||this.getItemForDirection(e,n),a=this.interval,r="next"==e?"left":"right",l=this;if(s.hasClass("active"))return this.sliding=!1;var h=s[0],d=t.Event("slide.bs.carousel",{relatedTarget:h,direction:r});if(this.$element.trigger(d),!d.isDefaultPrevented()){if(this.sliding=!0,a&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var p=t(this.$indicators.children()[this.getItemIndex(s)]);p&&p.addClass("active")}var c=t.Event("slid.bs.carousel",{relatedTarget:h,direction:r});return t.support.transition&&this.$element.hasClass("slide")?(s.addClass(e),s[0].offsetWidth,n.addClass(r),s.addClass(r),n.one("bsTransitionEnd",function(){s.removeClass([e,r].join(" ")).addClass("active"),n.removeClass(["active",r].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(c)},0)}).emulateTransitionEnd(i.TRANSITION_DURATION)):(n.removeClass("active"),s.addClass("active"),this.sliding=!1,this.$element.trigger(c)),a&&this.cycle(),this}};var o=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=o,this};var n=function(i){var o,n=t(this),s=t(n.attr("data-target")||(o=n.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""));if(s.hasClass("carousel")){var a=t.extend({},s.data(),n.data()),r=n.attr("data-slide-to");r&&(a.interval=!1),e.call(s,a),r&&s.data("bs.carousel").to(r),i.preventDefault()}};t(document).on("click.bs.carousel.data-api","[data-slide]",n).on("click.bs.carousel.data-api","[data-slide-to]",n),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),+function(t){"use strict";function e(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}function i(i){i&&3===i.which||(t(n).remove(),t(s).each(function(){var o=t(this),n=e(o),s={relatedTarget:this};n.hasClass("open")&&(i&&"click"==i.type&&/input|textarea/i.test(i.target.tagName)&&t.contains(n[0],i.target)||(n.trigger(i=t.Event("hide.bs.dropdown",s)),i.isDefaultPrevented()||(o.attr("aria-expanded","false"),n.removeClass("open").trigger("hidden.bs.dropdown",s))))}))}function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new a(this)),"string"==typeof e&&o[e].call(i)})}var n=".dropdown-backdrop",s='[data-toggle="dropdown"]',a=function(e){t(e).on("click.bs.dropdown",this.toggle)};a.VERSION="3.3.5",a.prototype.toggle=function(o){var n=t(this);if(!n.is(".disabled, :disabled")){var s=e(n),a=s.hasClass("open");if(i(),!a){"ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(t(this)).on("click",i);var r={relatedTarget:this};if(s.trigger(o=t.Event("show.bs.dropdown",r)),o.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),s.toggleClass("open").trigger("shown.bs.dropdown",r)}return!1}},a.prototype.keydown=function(i){if(/(38|40|27|32)/.test(i.which)&&!/input|textarea/i.test(i.target.tagName)){var o=t(this);if(i.preventDefault(),i.stopPropagation(),!o.is(".disabled, :disabled")){var n=e(o),a=n.hasClass("open");if(!a&&27!=i.which||a&&27==i.which)return 27==i.which&&n.find(s).trigger("focus"),o.trigger("click");var r=" li:not(.disabled):visible a",l=n.find(".dropdown-menu"+r);if(l.length){var h=l.index(i.target);38==i.which&&h>0&&h--,40==i.which&&hdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},i.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},i.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth

    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,o){if(this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(o),this.$viewport=this.options.viewport&&t(t.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var n=this.options.trigger.split(" "),s=n.length;s--;){var a=n[s];if("click"==a)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=a){var r="hover"==a?"mouseenter":"focusin",l="hover"==a?"mouseleave":"focusout";this.$element.on(r+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,o){i[t]!=o&&(e[t]=o)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusin"==e.type?"focus":"hover"]=!0),i.tip().hasClass("in")||"in"==i.hoverState?void(i.hoverState="in"):(clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusout"==e.type?"focus":"hover"]=!1),i.isInStateTrue()?void 0:(clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide())},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var n=this,s=this.tip(),a=this.getUID(this.type);this.setContent(),s.attr("id",a),this.$element.attr("aria-describedby",a),this.options.animation&&s.addClass("fade");var r="function"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,h=l.test(r);h&&(r=r.replace(l,"")||"top"),s.detach().css({top:0,left:0,display:"block"}).addClass(r).data("bs."+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var d=this.getPosition(),p=s[0].offsetWidth,c=s[0].offsetHeight;if(h){var f=r,u=this.getPosition(this.$viewport);r="bottom"==r&&d.bottom+c>u.bottom?"top":"top"==r&&d.top-cu.width?"left":"left"==r&&d.left-pa.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},i.prototype.getTitle=function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},i.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},i.prototype.tip=function(){if(!this.$tip&&(this.$tip=t(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&(i=t(e.currentTarget).data("bs."+this.type),i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),e?(i.inState.click=!i.inState.click,i.isInStateTrue()?i.enter(i):i.leave(i)):i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null})};var o=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.popover"),s="object"==typeof e&&e;(n||!/destroy|hide/.test(e))&&(n||o.data("bs.popover",n=new i(this,s)),"string"==typeof e&&n[e]())})}var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.3.5",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var o=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.tab");n||o.data("bs.tab",n=new i(this)),"string"==typeof e&&n[e]()})}var i=function(e){this.element=t(e)};i.VERSION="3.3.5",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),o=e.data("target");if(o||(o=e.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var n=i.find(".active:last a"),s=t.Event("hide.bs.tab",{relatedTarget:e[0]}),a=t.Event("show.bs.tab",{relatedTarget:n[0]});if(n.trigger(s),e.trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){var r=t(o);this.activate(e.closest("li"),i),this.activate(r,r.parent(),function(){n.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:n[0]})})}}},i.prototype.activate=function(e,o,n){function s(){a.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),r?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),n&&n()}var a=o.find("> .active"),r=n&&t.support.transition&&(a.length&&a.hasClass("fade")||!!o.find("> .fade").length);a.length&&r?a.one("bsTransitionEnd",s).emulateTransitionEnd(i.TRANSITION_DURATION):s(),a.removeClass("in")};var o=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=o,this};var n=function(i){i.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',n).on("click.bs.tab.data-api",'[data-toggle="pill"]',n)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.affix"),s="object"==typeof e&&e;n||o.data("bs.affix",n=new i(this,s)),"string"==typeof e&&n[e]()})}var i=function(e,o){this.options=t.extend({},i.DEFAULTS,o),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};i.VERSION="3.3.5",i.RESET="affix affix-top affix-bottom",i.DEFAULTS={offset:0,target:window},i.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return i>n?"top":!1;if("bottom"==this.affixed)return null!=i?n+this.unpin<=s.top?!1:"bottom":t-o>=n+a?!1:"bottom";var r=null==this.affixed,l=r?n:s.top,h=r?a:e;return null!=i&&i>=n?"top":null!=o&&l+h>=t-o?"bottom":!1},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=this.$element.height(),o=this.options.offset,n=o.top,s=o.bottom,a=Math.max(t(document).height(),t(document.body).height());"object"!=typeof o&&(s=n=o),"function"==typeof n&&(n=o.top(this.$element)),"function"==typeof s&&(s=o.bottom(this.$element));var r=this.getState(a,e,n,s);if(this.affixed!=r){null!=this.unpin&&this.$element.css("top","");var l="affix"+(r?"-"+r:""),h=t.Event(l+".bs.affix");if(this.$element.trigger(h),h.isDefaultPrevented())return;this.affixed=r,this.unpin="bottom"==r?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==r&&this.$element.offset({top:a-e-s})}};var o=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=o,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var i=t(this),o=i.data();o.offset=o.offset||{},null!=o.offsetBottom&&(o.offset.bottom=o.offsetBottom),null!=o.offsetTop&&(o.offset.top=o.offsetTop),e.call(i,o)})})}(jQuery),+function(t){"use strict";function e(e){var i,o=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(o)}function i(e){return this.each(function(){var i=t(this),n=i.data("bs.collapse"),s=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);!n&&s.toggle&&/show|hide/.test(e)&&(s.toggle=!1),n||i.data("bs.collapse",n=new o(this,s)),"string"==typeof e&&n[e]()})}var o=function(e,i){this.$element=t(e),this.options=t.extend({},o.DEFAULTS,i),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};o.VERSION="3.3.5",o.TRANSITION_DURATION=350,o.DEFAULTS={toggle:!0},o.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},o.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,n=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(n&&n.length&&(e=n.data("bs.collapse"),e&&e.transitioning))){var s=t.Event("show.bs.collapse");if(this.$element.trigger(s),!s.isDefaultPrevented()){n&&n.length&&(i.call(n,"hide"),e||n.data("bs.collapse",null));var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var r=function(){this.$element.removeClass("collapsing").addClass("collapse in")[a](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return r.call(this);var l=t.camelCase(["scroll",a].join("-"));this.$element.one("bsTransitionEnd",t.proxy(r,this)).emulateTransitionEnd(o.TRANSITION_DURATION)[a](this.$element[0][l]); +}}}},o.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var n=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(n,this)).emulateTransitionEnd(o.TRANSITION_DURATION):n.call(this)}}},o.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},o.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,o){var n=t(o);this.addAriaAndCollapsedClass(e(n),n)},this)).end()},o.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var n=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=o,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(o){var n=t(this);n.attr("data-target")||o.preventDefault();var s=e(n),a=s.data("bs.collapse"),r=a?"toggle":n.data();i.call(s,r)})}(jQuery),+function(t){"use strict";function e(i,o){this.$body=t(document.body),this.$scrollElement=t(t(i).is(document.body)?window:i),this.options=t.extend({},e.DEFAULTS,o),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",t.proxy(this.process,this)),this.refresh(),this.process()}function i(i){return this.each(function(){var o=t(this),n=o.data("bs.scrollspy"),s="object"==typeof i&&i;n||o.data("bs.scrollspy",n=new e(this,s)),"string"==typeof i&&n[i]()})}e.VERSION="3.3.5",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,i="offset",o=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(i="position",o=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),n=e.data("target")||e.attr("href"),s=/^#./.test(n)&&t(n);return s&&s.length&&s.is(":visible")&&[[s[i]().top+o,n]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=o)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(void 0===n[t+1]||e= 0 && url.length == cleanDocUrl.length){ + $(this).parent('li').addClass('disable') + var parentTopic = $(this).parentsUntil('div.sidebar-module > ul').last() + parentTopic.addClass('js-current') + parentTopic.find('.js-expand-btn').toggleClass('collapsed expanded') + } + }); + } + } + + // bind every href with a hash; take a look at v3/search/ for example + $('#js-sidebar .js-accordion-list .js-topic a[href*=#]').bind("click", function(e) { + if (window.location.toString().indexOf($(e.target).attr('href')) == -1) + setTimeout(styleTOC, 0); // trigger the window.location change, then stylize + }); + + // hide list items at startup + if($('body.api') && window.location){ + styleTOC(); + } + + $('#js-sidebar .js-topic').each(function(){ + if(($(this).find('.disable').length == 0 || firstOccurance == false) && + $(this).hasClass('js-current') != true){ + $(this).find('.js-guides').children().hide() + } else { + activeItem = $(this).index() + firstOccurance = false + } + }) + + // Toggle style list. Expanded items stay + // expanded when new items are clicked. + $('#js-sidebar .js-toggle-list .js-expand-btn').click(function(){ + var clickedTopic = $(this).parents('.js-topic'), + topicGuides = clickedTopic.find('.js-guides li') + $(this).toggleClass('collapsed expanded') + topicGuides.slideToggle(100) + return false + }) + + // Accordion style list. Expanded items + // collapse when new items are clicked. + $('#js-sidebar .js-accordion-list .js-topic h3 a').click(function(){ + var clickedTopic = $(this).parents('.js-topic'), + topicGuides = clickedTopic.find('.js-guides li') + + if(activeItem != clickedTopic.index()){ + if(helpList.eq(activeItem)){ + helpList.eq(activeItem).find('.js-guides li').slideToggle(100) + } + activeItem = clickedTopic.index() + topicGuides.slideToggle(100) + } else { + activeItem = undefined + topicGuides.slideToggle(100) + } + + return false + }) + + $('.help-search .search-box').focus(function(){ + $(this).css('background-position','0px -25px') + }) + + $('.help-search .search-box').focusout(function(){ + if($(this).val() == ''){ + $(this).css('background-position','0px 0px') + } + }) + + // Dynamic year for footer copyright + var currentYear = (new Date).getFullYear(); + $.each($(".js-year"), (function() { $(this).text( currentYear ) })); + + // Grab API status + $.getJSON('https://status.github.com/api/status.json?callback=?', function(data) { + if(data) { + var link = $("") + .attr("href", "https://status.github.com") + .addClass(data.status) + .attr("title", "API Status: " + data.status + ". Click for details.") + .text("API Status: " + data.status); + $('.api-status').html(link); + } + }); + + // Add link anchors for headers with IDs + $(".content h1, .content h2, .content h3, .content h4").each(function(e){ + var id = $(this).attr("id"); + if (!id) return; + + $(this).prepend(""); + }); + + // #### Search #### + var searchIndex, + searchHits; + + // Load the JSON containing all pages + // Has it been loaded before (and stored with localstorage)? + if (localStorage['searchIndex']) { + searchIndex = JSON.parse(localStorage['searchIndex']); + + if (localStorageHasExpired()) + loadSearchIndex(); + } else { + loadSearchIndex(); + } + + function loadSearchIndex() { + $.getJSON('/search-index.json', function(data) { + searchIndex = data["pages"]; + localStorage['searchIndex'] = JSON.stringify(searchIndex); + localStorage['updated'] = new Date().getTime(); + }); + } + + function localStorageHasExpired() { + // Expires in one day (86400000 ms) + if (new Date().getTime() - parseInt(localStorage['updated'],10) > 86400000) { + return true; + } + + return false; + } + + // Expand and activate search if the page loaded with a value set for the search field + if ($("#searchfield").val().length > 0) { + $("#search-container").addClass("active"); + searchForString($("#searchfield").val()); + } + + // On input change, update the search results + $("#searchfield").on("input", function(e) { + $(this).val().length > 0 ? $("#search-container").addClass("active") : $("#search-container").removeClass("active"); + + searchForString($(this).val()); + }); + + // Global keyboard shortcuts + /* + $("body").keyup(function(e) { + if (e.keyCode == 83) { + // S key + if ($("#searchfield").is(":focus")) + return; + + e.preventDefault(); + $("#searchfield").focus(); + } + }); + */ + + // Keyboard support for the search field + $("#searchfield").keyup(function(e) { + if (e.keyCode == 27) { + // ESC + e.preventDefault(); + $("#searchfield").val().length > 0 ? cancelSearch() : $("#searchfield").blur(); + } else if (e.keyCode == 13) { + // Return/enter + e.preventDefault(); + goToSelectedSearchResult(); + } else if (e.keyCode == 8 || e.keyCode == 46) { + // Update search if backspace/delete was pressed + // IE9 doesn't trigger the input event on backspace/delete, + // but they do trigger keyUp + $(this).val().length > 0 ? $("#search-container").addClass("active") : $("#search-container").removeClass("active"); + + searchForString($(this).val()); + } + }).keydown(function(e) { + if (e.keyCode == 38) { + // Arrow up + e.preventDefault(); + moveSearchSelectionUp(); + } else if (e.keyCode == 40) { + // Arrow down + e.preventDefault(); + moveSearchSelectionDown(); + } else if (e.keyCode == 27) { + // Prevent default on ESC key + // IE inputs come with some native behaviors that will + // prevent the DOM from updating correctly unless prevented + e.preventDefault(); + } + }); + + // Make clicking the label focus the input label + // for browsers (IE) that doesn't support pointer-events: none + $("#search-container .search-placeholder").click(function(e) { + $("#searchfield").focus(); + }); + + $(".cancel-search").click(function(e) { + cancelSearch(); + }); + + function cancelSearch() { + $("#searchfield").val(""); + $("#search-container").removeClass("active"); + } + + function searchForString(searchString) { + searchHits = []; + searchString = searchString.toLowerCase(); + + // Search for string in all pages + for (var i = 0; i < searchIndex.length; i++) { + var page = searchIndex[i]; + + // Add the page to the array of hits if there's a match + if (page.title.toLowerCase().indexOf(searchString) !== -1) { + searchHits.push(page); + } + } + + renderResultsForSearch(searchString); + } + + // Update the UI representation of the search hits + function renderResultsForSearch(searchString){ + $("#search-results").empty(); + + // Check if there are any results. If not, show placeholder and exit + if (searchHits.length < 1) { + $('
  • No results for
  • ').appendTo("#search-results").find("em").text(searchString); + return; + } + + // Render results (max 8) + for (var i = 0; i < Math.min(searchHits.length, 8); i++) { + var page = searchHits[i]; + + $('
  • ' + page.title + '' + page.section + '
  • ').appendTo("#search-results"); + } + + // Select the first alternative + $("#search-results li:first-child").addClass("selected"); + } + + // Move the selected list item when hovering + $("#search-results").on("mouseenter", "li", function(e) { + $(this).parent().find(".selected").removeClass("selected").end().end() + .addClass("selected"); + }); + + function moveSearchSelectionUp() { + $prev = $("#search-results .selected").prev(); + if ($prev.length < 1) + return; + + $("#search-results .selected").removeClass("selected"); + $prev.addClass("selected"); + } + + function moveSearchSelectionDown() { + $next = $("#search-results .selected").next(); + if ($next.length < 1) + return; + + $("#search-results .selected").removeClass("selected"); + $next.addClass("selected"); + } + + function goToSelectedSearchResult() { + var href = $("#search-results .selected a").attr("href"); + if (href) + window.location.href = href; + } + + // Earth animation + if ($('.dev-program').length) { + setTimeout(function() { + $('.earth').fadeOut(); + $('.earth-short-loop').show(); + }, 19 * 1000); // Let first loop run through 19 seconds + } + + // copy Help's image show/hide functionality in OLs + var dismissFullImage; + + $('ol img').each(function(index, elem) { + return $(elem).parent().prepend(elem); + }); + + $(document).on('click', 'ol img', function(event) { + var $fullImg, $img; + dismissFullImage(); + $img = $(event.currentTarget).clone(); + $fullImg = $('
    ').prepend($img); + $(this).closest('li').append($fullImg); + return $(document).on('click', '.js-full-image', function() { + dismissFullImage(); + return false; + }); + }); + + dismissFullImage = function() { + $(document).off('click', '.js-full-image', dismissFullImage); + return $('.js-full-image').remove(); + }; +}); diff --git a/static/js/jquery.js b/static/js/jquery.js new file mode 100644 index 0000000..ce1b6b6 --- /dev/null +++ b/static/js/jquery.js @@ -0,0 +1,5 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
    a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x(" + +

    Вие използвате ли захар? Кога и как? Защо бихте или не бихте се отказали от употребата на захар?

    + + + + + +
    + + + + + + + + + + + + + + + + +;T; I"S'От всичко по малко... + +В умерено количество не вреди... + +Това е гориво за мозъка... + +Чувала съм всички оправдания за употребата на захар. + +##Въпросът е: трябва ли да ядем захар и ако да, в какво количество? + +###Къде всъщност е проблемът? +Захарта има много форми освен бялата кристална захар, която се намира на рафтовете на супермаркетите. Тя е под формата на глюкозо-фруктозен сироп, царевичен сироп, мед, кленов сироп или нектар от кактуса агаве. Тя провокира силна реакция в човешкото тяло и съвременните хора използват все по-големи количества от нея. Захар откриваме в съдържанието на около 80% от пакетираните стоки: плодови сокове, газирани напитки, вафли, бисквити, шоколад, колбаси, пастети, кетчуп, майонеза, сосове, лютеници, млечни десерти, зърнени закуски, хляб, макарони, чипсове и солети, чай, тестени изделия, мариновани риби и меса, бульони за готвене и още, и още... + +Често ми казват, че съм крайна като казвам на хората да изключат захарта и рафинираните въглехидрати от храната си. "Не мога да изключа цяла хранителна група" - ми казват. Да, но захарта не е хранителна група. Захарта съдържа: + +* нула нутритенти +* нула протеин +* никакви полезни мазнини +* никакви ензими + +Захарта е просто бързи и празни калории, които се метаболизират изключително бързо в енергия, която трябва да се изразходи веднага или се натрупва като излишък. Всъщност захарта съдържа 12 въглеродни атома, 22 водородни атома и 11 кислородни атома (C12H22O11). Това е всичко, което тя дава на тялото ви. И отнема много минерали, докато се метаболизира! Захарта е една химически извлечена субстанция, по същият начин по който се произвежда кокаинът. И има същият пристрастяват ефект за мозъка. Между другото формулата на кокаина е C17H21NO4. Можете да забележите, че на захарта й липсва азотният N атом. + +###Има ли все пак безопасно количество? +Според мен няма [безопасно количество](http://rense.com/general45/sguar.htm). Естествено съдържащите захар плодове и зеленчуци са с балансирано количество фибри, витамини, ензими и други вещества, които подпомагат усвояването на захарта и не затрудняват и ограбват тялото. Добавената захар не доставя нищо, а вместо това: +Уврежда черният дроб: когато приемаме фруктоза (50%от захарта) тя отива към черният дроб. Ако чернодробният гликоген (храната за мускулите) е нисък, например след тренировка тя ще се използва, за да възстанови липсите. Но повечето хора не приемат фруктозата след бягане или физическо натоварване, а често когато дробовете им са пълни с гликоген. Когато това стане, черният дроб превръща гликогенът в [запаси от мазнини](http://diabetes.diabetesjournals.org/content/54/7/1907.short). Част от мазнината отива към мастните депа, но част се запазва в дроба. Малко по малко това може да доведе до [редица](http://hyper.ahajournals.org/content/45/5/1012.short) [чернодробни](http://www.journal-of-hepatology.eu/article/S0168-8278%2808%2900164-5/abstract) [заболявания](http://www.journal-of-hepatology.eu/article/S0168-8278%2807%2900427-8/abstract); Повишаване на холестерола и триглицеридите в кръвта; ЛЕПТИНОВА резистентност с последващо [затлъстяване](http://www.theguardian.com/society/2013/mar/20/sugar-deadly-obesity-epidemic), проблеми със съня, неконтролируемо желание за храна; Липса на усещане за ситост и пристрастяване към захар и въглехидрати, т.нар. [непрестанен глад за сладко](http://www.sciencedirect.com/science/article/pii/S0306452205004288). + +###С какво да заместим захарта? +Напълно съзнавам, че в съвремнният свят е невъзможно да имаме хранене с 0% захар. За съжаление и заместители те, които се предлагат не са най-здравословният избор. Ето все пак кратък разбор на най-често срещаните: + +* **Бялото кристално вещество**, което е направено от захарно цвекло съставлява 50% глюкоза и 50% фруктоза. Често в етикетите ще я прочетете и като "декстроза". +* **Глюкозо-фруктозен сироп** съдържа 55% фруктоза и 45% глюкоза. +* **Етанол** (алкохолът за пиене) не е точно захар, макар бирата и виното да съдържат остатъчни захари и нишесте, плюс алкохол. Те се метаболизират по същият начин като фруктозата и "ограбват" тялото от ценни минерали и соли. +* [**Захарните**](http://articles.mercola.com/sites/articles/archive/2013/10/23/aspartame-artificial-sweeteners.aspx) [**алкохоли**](http://health.howstuffworks.com/wellness/food-nutrition/facts/artificial-sweetners-unhealthy-eco.htm) като **ксилитол**, **глицерол**, **сорбитол**, **малтитол**, **манитол** и **еритритол** не са нито захар, нито алкохол. Те се усвояват от клетките на тънкото черво и макар да са с по-малко калории, могат да причинят доста вреди на тялото: подуване, диария, главоболие и световъртеж. Прекомерната им употреба се свързва и с клетъчни мутации и рак. Ксилитолът е полезна съставка в някои пасти за зъби и има антикариесогенен ефект. +* **Мед** - той съдържа около 53% фруктоза, но е напълно естествен продукт, който приет в малки количества и суров (не топлинно обработен или в горещи напитки) има много ползи за тялото. Богатото съдържание на минерали и антиоксиданти (повече от тези в спанака) го правят отлична добавка към храненето. +* **Стевия** - листата на това растение от Южна Америка са много сладки и употребата им е напълно безопасна. Не може да се каже същото обаче, за екстрактите (стевиол) или тинктурите от стевия които се продават в търговската мрежа. Използвайте само стрити листа или чай от листа на сладката билка. Подобно растение е Ло Хан, но от него се използват плодовете му. +* **Фруктоза** - изолираната плодова захар е популярен заместител в диетичните и диабетични стоки. + +В заключение ще ви дам малко домашно. Изгледайте този филм: Горчивата истина за захарта (Sugar - the bitter truth). Ако аз не съм ви убедила да се замислите за вредата от захарта, то Д-р Р. Лъстинг със сигурност ще го направи! + + + +**Вие използвате ли захар? Кога и как? Защо бихте или не бихте се отказали от употребата на захар?**;T; +I")

    От всичко по малко…

    + +

    В умерено количество не вреди…

    + +

    Това е гориво за мозъка…

    + +

    Чувала съм всички оправдания за употребата на захар.

    + +

    Въпросът е: трябва ли да ядем захар и ако да, в какво количество?

    + +

    Къде всъщност е проблемът?

    +

    Захарта има много форми освен бялата кристална захар, която се намира на рафтовете на супермаркетите. Тя е под формата на глюкозо-фруктозен сироп, царевичен сироп, мед, кленов сироп или нектар от кактуса агаве. Тя провокира силна реакция в човешкото тяло и съвременните хора използват все по-големи количества от нея. Захар откриваме в съдържанието на около 80% от пакетираните стоки: плодови сокове, газирани напитки, вафли, бисквити, шоколад, колбаси, пастети, кетчуп, майонеза, сосове, лютеници, млечни десерти, зърнени закуски, хляб, макарони, чипсове и солети, чай, тестени изделия, мариновани риби и меса, бульони за готвене и още, и още…

    + +

    Често ми казват, че съм крайна като казвам на хората да изключат захарта и рафинираните въглехидрати от храната си. “Не мога да изключа цяла хранителна група” - ми казват. Да, но захарта не е хранителна група. Захарта съдържа:

    + +
      +
    • нула нутритенти
    • +
    • нула протеин
    • +
    • никакви полезни мазнини
    • +
    • никакви ензими
    • +
    + +

    Захарта е просто бързи и празни калории, които се метаболизират изключително бързо в енергия, която трябва да се изразходи веднага или се натрупва като излишък. Всъщност захарта съдържа 12 въглеродни атома, 22 водородни атома и 11 кислородни атома (C12H22O11). Това е всичко, което тя дава на тялото ви. И отнема много минерали, докато се метаболизира! Захарта е една химически извлечена субстанция, по същият начин по който се произвежда кокаинът. И има същият пристрастяват ефект за мозъка. Между другото формулата на кокаина е C17H21NO4. Можете да забележите, че на захарта й липсва азотният N атом.

    + +

    Има ли все пак безопасно количество?

    +

    Според мен няма безопасно количество. Естествено съдържащите захар плодове и зеленчуци са с балансирано количество фибри, витамини, ензими и други вещества, които подпомагат усвояването на захарта и не затрудняват и ограбват тялото. Добавената захар не доставя нищо, а вместо това: +Уврежда черният дроб: когато приемаме фруктоза (50%от захарта) тя отива към черният дроб. Ако чернодробният гликоген (храната за мускулите) е нисък, например след тренировка тя ще се използва, за да възстанови липсите. Но повечето хора не приемат фруктозата след бягане или физическо натоварване, а често когато дробовете им са пълни с гликоген. Когато това стане, черният дроб превръща гликогенът в запаси от мазнини. Част от мазнината отива към мастните депа, но част се запазва в дроба. Малко по малко това може да доведе до редица чернодробни заболявания; Повишаване на холестерола и триглицеридите в кръвта; ЛЕПТИНОВА резистентност с последващо затлъстяване, проблеми със съня, неконтролируемо желание за храна; Липса на усещане за ситост и пристрастяване към захар и въглехидрати, т.нар. непрестанен глад за сладко.

    + +

    С какво да заместим захарта?

    +

    Напълно съзнавам, че в съвремнният свят е невъзможно да имаме хранене с 0% захар. За съжаление и заместители те, които се предлагат не са най-здравословният избор. Ето все пак кратък разбор на най-често срещаните:

    + +
      +
    • +Бялото кристално вещество, което е направено от захарно цвекло съставлява 50% глюкоза и 50% фруктоза. Често в етикетите ще я прочетете и като “декстроза”.
    • +
    • +Глюкозо-фруктозен сироп съдържа 55% фруктоза и 45% глюкоза.
    • +
    • +Етанол (алкохолът за пиене) не е точно захар, макар бирата и виното да съдържат остатъчни захари и нишесте, плюс алкохол. Те се метаболизират по същият начин като фруктозата и “ограбват” тялото от ценни минерали и соли.
    • +
    • +Захарните алкохоли като ксилитол, глицерол, сорбитол, малтитол, манитол и еритритол не са нито захар, нито алкохол. Те се усвояват от клетките на тънкото черво и макар да са с по-малко калории, могат да причинят доста вреди на тялото: подуване, диария, главоболие и световъртеж. Прекомерната им употреба се свързва и с клетъчни мутации и рак. Ксилитолът е полезна съставка в някои пасти за зъби и има антикариесогенен ефект.
    • +
    • +Мед - той съдържа около 53% фруктоза, но е напълно естествен продукт, който приет в малки количества и суров (не топлинно обработен или в горещи напитки) има много ползи за тялото. Богатото съдържание на минерали и антиоксиданти (повече от тези в спанака) го правят отлична добавка към храненето.
    • +
    • +Стевия - листата на това растение от Южна Америка са много сладки и употребата им е напълно безопасна. Не може да се каже същото обаче, за екстрактите (стевиол) или тинктурите от стевия които се продават в търговската мрежа. Използвайте само стрити листа или чай от листа на сладката билка. Подобно растение е Ло Хан, но от него се използват плодовете му.
    • +
    • +Фруктоза - изолираната плодова захар е популярен заместител в диетичните и диабетични стоки.
    • +
    + +

    В заключение ще ви дам малко домашно. Изгледайте този филм: Горчивата истина за захарта (Sugar - the bitter truth). Ако аз не съм ви убедила да се замислите за вредата от захарта, то Д-р Р. Лъстинг със сигурност ще го направи!

    + + + +

    Вие използвате ли захар? Кога и как? Защо бихте или не бихте се отказали от употребата на захар?

    +;T; @uI"!/blog/2014-05-09-солта/;T{;{ ;I"Q + + + + + + + Храната като лекарство: Солта + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Храната като лекарство: Солта +

    + +
    +
      +
    • + + May 9, 2014 +
    • +
    +
    + + +

    Ако гледате телевизия, четете печатната преса или ходите на лекар, шансовете да смятате прекомерната употреба на сол за голяма опасност за здравето е около 100%. И сте прави… ако говорим за обикновенната трапезна сол, която се използва масово в производството на хранителни стоки.

    + +

    Но аз имам една голяма новина за вас: Солта е жизненоважна за човешкото тяло и ние трябва да си я набавяме ежедневно! Нали не мислите, че е случайност щастливият трепет, който ви обзема при мисълта за морските летни бани (сол + витамин D) ;-)

    + +

    Трапезната сол = вредна за тялото!

    + +

    Трапезната йодирана сол е химичен продукт, направен в лабораторни условия, със съдържание на 97% Натриев Хлорид (NaCl), избелена с химикали като алуминий и др. и не съдържа никакви полезни вещества. Нейната употреба води до дисбаланс на минералите в кръвта и клетъчните течности и вреди на тялото. Всъщност соленоводни риби, поставени в разтвор на вода и трапезна сол… умират.

    + +

    А сега нека ви разкажа за истинската сол, която е дала живота на Земята.

    + +

    Знаете, че телата ни се нуждаят от вода. Но костите, мускулите и органите имат нужда от определени количества минерали и соли, които си набавят чрез водата. Физиологичната течност, която е нормалната среда на всяка клетка е разтвор на вода с 0,9% сол. Следователно солта е важна част от оптималното здраве и баланс в организма.

    + +

    Нерядко ще срещнете твърдения, че солта е причина за високо кръвно налягане и други сърдечни проблеми. Всъщност изследване доказва, че високото кръвно налягане се дължи на дисбаланс в минералите и микроелементите в кръвта: т.е. ако се приема само NaCl без оптималното количество Магнезий, Калций и др.

    + +
    +

    В проучване на университа Харвард взели участие 60 000 медицински сестри. Тези, чиято диета била бедна на магнезий и калций имали по-голям риск от повишено кръвно налягане.

    +
    + +

    Реално можем да избегнем риска от хипертония(високо кръвно налягане) не чрез редуциране на натрия, а чрез балансирането му с другите важни минерали.

    + +

    Истинската сол = полезна за тялото!

    + +

    Истинската сол е най-добрият източник на микроелементи. Това са химични елементи, които се съдържат в организмите в хилядни части от процента (желязо, мед, цинк, молибден, бром, флуор, аргон, йод и др.). Те са необходими за нормалната жизнена дейност. Влизат в състава на ензими, витамини, хормони. Влияят на растежа, размножаването, кръвообразуването и др. Недостигът или излишъкът им води до нарушения в обмяната на веществата.

    + +

    Какви са ползите от солта?

    + +

    Страдате ли от:

    + +
      +
    • Целулит
    • +
    • Високо кръвно налягане
    • +
    • Камъни в бъбреците
    • +
    • Проблеми с жлъчният мехур
    • +
    • Проблеми със ставите
    • +
    • Умора
    • +
    • Причерняване
    • +
    • Лош сън
    • +
    • Астма или дихателни заболявания
    • +
    • Неравномерен пулс
    • +
    • Проблеми с надбъбречните жлези
    • +
    • Диабет или проблеми с кръвната захар
    • +
    • Слаб мускулен тонус
    • +
    • Задържане на вода, отоци и подпухване
    • +
    + +

    Всички тези състояния могат да се дължат на дисбаланс в минералите и липсата на сол в клетките (да, дори и задържането на вода).

    + +

    Отново искам да се спра на факта, че обикновенната трапезна сол би задълбочила тези проблеми, внасяйки твърде много натрий и хлор в системата, за сметка на другите макро- и микроелементи.

    + +

    Негативно заредените йони на солта, разтворени във вода подпомагат хормоналните, химичните и електричните процеси в тялото. Микроелементите подпомагат нервната и сърдечна функции.

    + +

    Ето някои от най-честите състояния, които адекватната употреба на сол може да подобри:

    + +
      +
    • Абсорбцията на храната, храносмилане: минералният баланс, който се създава от солта и микроелементите й подпомагат усвояването на храната от тънките черва. Солта участва в състава на стомашният сок и подобрява храносмилането.
    • +
    • Извличане на токсини от клетката чрез негативно заредените йони на солта.
    • +
    • Контрол на кръвното налягане - истинската сол регулира, а не повишава кръвното налягане, когато се приема в умерени количества. Отрицателно-заредените йони стабилизират електричните импулси и регулират сърдечният ритъм.
    • +
    • +Киселинен баланс - солта има алкализиращ ефект и взима участие в механизмите, които поддържат pH на тялото.
    • +
    • +Кръвна захар - употребата на истинска сол повишава инсулиновата чувствителност, включително и при пациенти с диабет II и I тип.
    • +
    • +Алергии - истинската сол, разтворена във вода е естествен и ефективен антихистамин. Подобрява и състоянието на кожни заболявания като Екзема и Псориазис.
    • +
    • Влияят върху почивката и съня - микроелементите подпомагат хормоналните процеси в тялото и подобряват качеството и количеството на съня. Намаляването на количеството на хормона на стреса от кръвта - кортизол се забързва при наличие на достатъчно сол. Неслучайно стресовите състояния провокират желание за силносолени храни (чипс, солети, пържено)
    • +
    • +Репродуктивно здраве - подпомагайки хормоналният баланс, истинската сол подобрява фертилността и при мъже, и при жени.
    • +
    • +Целулит - отстраняването му се подобрява с приема на умерено количество полезна сол.
    • +
    • +Мускули - Мускулните крампи и напрежение се облекчават при редовна употреба на истинска сол. Тук незаменим помощник е Магнезият. Професионалните атлети използват вани с Магнезий и сол, за да лекуват тези състояния.
    • +
    • +Кости - около 1/4 от солите в тялото се намират в костите. Ако някъде в тялото има недостиг на сол или микроелементи, те се набавят от костите, за да може тялото да функционира нормално. Следователно консумацията на полезна сол е профилактика срещу остеопороза.
    • +
    • +Щитовидна и надбъбречната жлези - ако имате проблеми с някоя от тези жлези, умерената консумация на сол ще облекчи състоянието ви, благодарение на ефекта, който оказва върху регулацията на pH.
    • +
    • +Нерви - електричните заряд на солта помага нормалното функциониране и невронните комуникации в тялото.
    • +
    • +Уста и зъби - микроелементите помагат за възстановяване на електролитният баланс и реминерализацията на зъбите. Плакнене със слабосолен разтвор убива бактериите и дезинфекцира.
    • +
    • +Хидратация - солта и микроелементите й са есенциални за добрата хидратация на тялото.
    • +
    + +

    Как да изберем добрата сол?

    + +

    Истинската сол съдържа целият набор от 84 микроелемента и има мек вкус и приятен аромат. Често тя е със седефен блясък и в различни цветове.

    + +

    За съжаление естествено-богатите на минерали храни са част от миналото. Съвременните методи за обрботка на почвите са ги направили бедни на хранителни вещества. Те са буквално “измити” от земята. Затова пък моретата са поели тези нутритенти и сега можем да ги открием в морската сол. Тя е един чудесен избор за набавяне на нужните минерали и микроелементи. Разбира се, винаги купувайте възможно най-чистата сол, която можете да си позволите, тъй като в големите водни източници често има доста токсини и замърсители.

    + +

    Най-добрият избор остава небезизвестната Хималайска розова сол, която се добива в дълбочина от едноименните планински масиви и при нея липсват всякакви съмнения за индустриални замърсявания.

    + +

    С която и от двете - натурална морска или розова хималайска сол да изберете да замените обикновенната трапезна сол у дома, със сигурност ще подобрите значително здравето си и това на близките си.

    + +

    Вие какво мислите за солта? Страхувате ли се от нея? Смятате ли, че солта може да е полезна? Напишете в коментар.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"3Ако гледате телевизия, четете печатната преса или ходите на лекар, шансовете да смятате прекомерната употреба на сол за голяма опасност за здравето е около 100%. И сте прави... ако говорим за обикновенната трапезна сол, която се използва масово в производството на хранителни стоки. + +Но аз имам една голяма новина за вас: Солта е жизненоважна за човешкото тяло и ние трябва да си я набавяме ежедневно! Нали не мислите, че е случайност щастливият трепет, който ви обзема при мисълта за морските летни бани (сол + витамин D) ;-) + +**Трапезната сол = вредна за тялото!** + +Трапезната йодирана сол е химичен продукт, направен в лабораторни условия, със съдържание на 97% Натриев Хлорид (NaCl), избелена с химикали като алуминий и др. и не съдържа никакви полезни вещества. Нейната употреба води до дисбаланс на минералите в кръвта и клетъчните течности и вреди на тялото. Всъщност соленоводни риби, поставени в разтвор на вода и трапезна сол... умират. + +А сега нека ви разкажа за истинската сол, която е дала живота на Земята. + +Знаете, че телата ни се нуждаят от вода. Но костите, мускулите и органите имат нужда от определени количества минерали и соли, които си набавят чрез водата. Физиологичната течност, която е нормалната среда на всяка клетка е разтвор на вода с 0,9% сол. Следователно солта е важна част от оптималното здраве и баланс в организма. + +Нерядко ще срещнете твърдения, че солта е причина за високо кръвно налягане и други сърдечни проблеми. Всъщност [изследване](http://www.nytimes.com/1991/12/31/science/hypertension-research-challenges-role-of-salt.html?pagewanted=all&src=pm) доказва, че високото кръвно налягане се дължи на дисбаланс в минералите и микроелементите в кръвта: т.е. ако се приема само NaCl без оптималното количество Магнезий, Калций и др. + +>В проучване на университа Харвард взели участие 60 000 медицински сестри. Тези, чиято диета била бедна на магнезий и калций имали по-голям риск от повишено кръвно налягане. + +Реално можем да избегнем риска от хипертония(високо кръвно налягане) не чрез редуциране на натрия, а чрез балансирането му с другите важни минерали. + +**Истинската сол = полезна за тялото!** + +Истинската сол е най-добрият източник на [микроелементи](http://www.fitday.com/fitness-articles/nutrition/vitamins-minerals/trace-minerals-what-they-are-and-their-importance.html). Това са химични елементи, които се съдържат в организмите в хилядни части от процента (желязо, мед, цинк, молибден, бром, флуор, аргон, йод и др.). Те са необходими за нормалната жизнена дейност. Влизат в състава на ензими, витамини, хормони. Влияят на растежа, размножаването, кръвообразуването и др. Недостигът или излишъкът им води до нарушения в обмяната на веществата. + +##Какви са ползите от солта? + +Страдате ли от: + +* Целулит +* Високо кръвно налягане +* Камъни в бъбреците +* Проблеми с жлъчният мехур +* Проблеми със ставите +* Умора +* Причерняване +* Лош сън +* Астма или дихателни заболявания +* Неравномерен пулс +* Проблеми с надбъбречните жлези +* Диабет или проблеми с кръвната захар +* Слаб мускулен тонус +* Задържане на вода, отоци и подпухване + +Всички тези състояния могат да се дължат на дисбаланс в минералите и липсата на сол в клетките (да, дори и задържането на вода). + +Отново искам да се спра на факта, че обикновенната трапезна сол би задълбочила тези проблеми, внасяйки твърде много натрий и хлор в системата, за сметка на другите макро- и микроелементи. + +Негативно заредените йони на солта, разтворени във вода подпомагат хормоналните, химичните и електричните процеси в тялото. Микроелементите подпомагат нервната и сърдечна функции. + +Ето някои от най-честите състояния, които адекватната употреба на сол може да подобри: + +* Абсорбцията на храната, **храносмилане**: минералният баланс, който се създава от солта и микроелементите й подпомагат усвояването на храната от тънките черва. Солта участва в състава на стомашният сок и подобрява храносмилането. +* Извличане на **токсини** от клетката чрез негативно заредените йони на солта. +* Контрол на **кръвното налягане** - истинската сол регулира, а **не** повишава кръвното налягане, когато се приема в умерени количества. Отрицателно-заредените йони стабилизират електричните импулси и регулират сърдечният ритъм. +* **Киселинен баланс** - солта има алкализиращ ефект и взима участие в механизмите, които поддържат pH на тялото. +* **Кръвна захар** - употребата на истинска сол повишава инсулиновата чувствителност, включително и при пациенти с **диабет** II и I тип. +* **Алергии** - истинската сол, разтворена във вода е естествен и ефективен антихистамин. Подобрява и състоянието на кожни заболявания като **Екзема** и **Псориазис**. +* Влияят върху почивката и **съня** - микроелементите подпомагат хормоналните процеси в тялото и подобряват качеството и количеството на съня. Намаляването на количеството на хормона на стреса от кръвта - **кортизол** се забързва при наличие на достатъчно сол. Неслучайно стресовите състояния провокират желание за силносолени храни (чипс, солети, пържено) +* **Репродуктивно здраве** - подпомагайки хормоналният баланс, истинската сол подобрява фертилността и при мъже, и при жени. +* **Целулит** - отстраняването му се подобрява с приема на умерено количество полезна сол. +* **Мускули** - Мускулните крампи и напрежение се облекчават при редовна употреба на истинска сол. Тук незаменим помощник е Магнезият. Професионалните атлети използват вани с **Магнезий** и сол, за да лекуват тези състояния. +* **Кости** - около 1/4 от солите в тялото се намират в костите. Ако някъде в тялото има недостиг на сол или микроелементи, те се набавят от костите, за да може тялото да функционира нормално. Следователно консумацията на полезна сол е профилактика срещу остеопороза. +* **Щитовидна** и **надбъбречната жлези** - ако имате проблеми с някоя от тези жлези, умерената консумация на сол ще облекчи състоянието ви, благодарение на ефекта, който оказва върху регулацията на pH. +* **Нерви** - електричните заряд на солта помага нормалното функциониране и невронните комуникации в тялото. +* **Уста и зъби** - микроелементите помагат за възстановяване на електролитният баланс и реминерализацията на зъбите. Плакнене със слабосолен разтвор убива бактериите и дезинфекцира. +* **Хидратация** - солта и микроелементите й са есенциални за добрата хидратация на тялото. + +##Как да изберем добрата сол? + +Истинската сол съдържа целият набор от 84 микроелемента и има мек вкус и приятен аромат. Често тя е със седефен блясък и в различни цветове. + +За съжаление естествено-богатите на минерали храни са част от миналото. Съвременните методи за обрботка на почвите са ги направили бедни на хранителни вещества. Те са буквално "измити" от земята. Затова пък моретата са поели тези нутритенти и сега можем да ги открием в морската сол. Тя е един чудесен избор за набавяне на нужните минерали и микроелементи. Разбира се, винаги купувайте възможно най-чистата сол, която можете да си позволите, тъй като в големите водни източници често има доста токсини и замърсители. + +Най-добрият избор остава небезизвестната Хималайска розова сол, която се добива в дълбочина от едноименните планински масиви и при нея липсват всякакви съмнения за индустриални замърсявания. + +С която и от двете - натурална морска или розова хималайска сол да изберете да замените обикновенната трапезна сол у дома, със сигурност ще подобрите значително здравето си и това на близките си. + +**Вие какво мислите за солта? Страхувате ли се от нея? Смятате ли, че солта може да е полезна? Напишете в коментар.**;T; +I"7

    Ако гледате телевизия, четете печатната преса или ходите на лекар, шансовете да смятате прекомерната употреба на сол за голяма опасност за здравето е около 100%. И сте прави… ако говорим за обикновенната трапезна сол, която се използва масово в производството на хранителни стоки.

    + +

    Но аз имам една голяма новина за вас: Солта е жизненоважна за човешкото тяло и ние трябва да си я набавяме ежедневно! Нали не мислите, че е случайност щастливият трепет, който ви обзема при мисълта за морските летни бани (сол + витамин D) ;-)

    + +

    Трапезната сол = вредна за тялото!

    + +

    Трапезната йодирана сол е химичен продукт, направен в лабораторни условия, със съдържание на 97% Натриев Хлорид (NaCl), избелена с химикали като алуминий и др. и не съдържа никакви полезни вещества. Нейната употреба води до дисбаланс на минералите в кръвта и клетъчните течности и вреди на тялото. Всъщност соленоводни риби, поставени в разтвор на вода и трапезна сол… умират.

    + +

    А сега нека ви разкажа за истинската сол, която е дала живота на Земята.

    + +

    Знаете, че телата ни се нуждаят от вода. Но костите, мускулите и органите имат нужда от определени количества минерали и соли, които си набавят чрез водата. Физиологичната течност, която е нормалната среда на всяка клетка е разтвор на вода с 0,9% сол. Следователно солта е важна част от оптималното здраве и баланс в организма.

    + +

    Нерядко ще срещнете твърдения, че солта е причина за високо кръвно налягане и други сърдечни проблеми. Всъщност изследване доказва, че високото кръвно налягане се дължи на дисбаланс в минералите и микроелементите в кръвта: т.е. ако се приема само NaCl без оптималното количество Магнезий, Калций и др.

    + +
    +

    В проучване на университа Харвард взели участие 60 000 медицински сестри. Тези, чиято диета била бедна на магнезий и калций имали по-голям риск от повишено кръвно налягане.

    +
    + +

    Реално можем да избегнем риска от хипертония(високо кръвно налягане) не чрез редуциране на натрия, а чрез балансирането му с другите важни минерали.

    + +

    Истинската сол = полезна за тялото!

    + +

    Истинската сол е най-добрият източник на микроелементи. Това са химични елементи, които се съдържат в организмите в хилядни части от процента (желязо, мед, цинк, молибден, бром, флуор, аргон, йод и др.). Те са необходими за нормалната жизнена дейност. Влизат в състава на ензими, витамини, хормони. Влияят на растежа, размножаването, кръвообразуването и др. Недостигът или излишъкът им води до нарушения в обмяната на веществата.

    + +

    Какви са ползите от солта?

    + +

    Страдате ли от:

    + +
      +
    • Целулит
    • +
    • Високо кръвно налягане
    • +
    • Камъни в бъбреците
    • +
    • Проблеми с жлъчният мехур
    • +
    • Проблеми със ставите
    • +
    • Умора
    • +
    • Причерняване
    • +
    • Лош сън
    • +
    • Астма или дихателни заболявания
    • +
    • Неравномерен пулс
    • +
    • Проблеми с надбъбречните жлези
    • +
    • Диабет или проблеми с кръвната захар
    • +
    • Слаб мускулен тонус
    • +
    • Задържане на вода, отоци и подпухване
    • +
    + +

    Всички тези състояния могат да се дължат на дисбаланс в минералите и липсата на сол в клетките (да, дори и задържането на вода).

    + +

    Отново искам да се спра на факта, че обикновенната трапезна сол би задълбочила тези проблеми, внасяйки твърде много натрий и хлор в системата, за сметка на другите макро- и микроелементи.

    + +

    Негативно заредените йони на солта, разтворени във вода подпомагат хормоналните, химичните и електричните процеси в тялото. Микроелементите подпомагат нервната и сърдечна функции.

    + +

    Ето някои от най-честите състояния, които адекватната употреба на сол може да подобри:

    + +
      +
    • Абсорбцията на храната, храносмилане: минералният баланс, който се създава от солта и микроелементите й подпомагат усвояването на храната от тънките черва. Солта участва в състава на стомашният сок и подобрява храносмилането.
    • +
    • Извличане на токсини от клетката чрез негативно заредените йони на солта.
    • +
    • Контрол на кръвното налягане - истинската сол регулира, а не повишава кръвното налягане, когато се приема в умерени количества. Отрицателно-заредените йони стабилизират електричните импулси и регулират сърдечният ритъм.
    • +
    • +Киселинен баланс - солта има алкализиращ ефект и взима участие в механизмите, които поддържат pH на тялото.
    • +
    • +Кръвна захар - употребата на истинска сол повишава инсулиновата чувствителност, включително и при пациенти с диабет II и I тип.
    • +
    • +Алергии - истинската сол, разтворена във вода е естествен и ефективен антихистамин. Подобрява и състоянието на кожни заболявания като Екзема и Псориазис.
    • +
    • Влияят върху почивката и съня - микроелементите подпомагат хормоналните процеси в тялото и подобряват качеството и количеството на съня. Намаляването на количеството на хормона на стреса от кръвта - кортизол се забързва при наличие на достатъчно сол. Неслучайно стресовите състояния провокират желание за силносолени храни (чипс, солети, пържено)
    • +
    • +Репродуктивно здраве - подпомагайки хормоналният баланс, истинската сол подобрява фертилността и при мъже, и при жени.
    • +
    • +Целулит - отстраняването му се подобрява с приема на умерено количество полезна сол.
    • +
    • +Мускули - Мускулните крампи и напрежение се облекчават при редовна употреба на истинска сол. Тук незаменим помощник е Магнезият. Професионалните атлети използват вани с Магнезий и сол, за да лекуват тези състояния.
    • +
    • +Кости - около 1/4 от солите в тялото се намират в костите. Ако някъде в тялото има недостиг на сол или микроелементи, те се набавят от костите, за да може тялото да функционира нормално. Следователно консумацията на полезна сол е профилактика срещу остеопороза.
    • +
    • +Щитовидна и надбъбречната жлези - ако имате проблеми с някоя от тези жлези, умерената консумация на сол ще облекчи състоянието ви, благодарение на ефекта, който оказва върху регулацията на pH.
    • +
    • +Нерви - електричните заряд на солта помага нормалното функциониране и невронните комуникации в тялото.
    • +
    • +Уста и зъби - микроелементите помагат за възстановяване на електролитният баланс и реминерализацията на зъбите. Плакнене със слабосолен разтвор убива бактериите и дезинфекцира.
    • +
    • +Хидратация - солта и микроелементите й са есенциални за добрата хидратация на тялото.
    • +
    + +

    Как да изберем добрата сол?

    + +

    Истинската сол съдържа целият набор от 84 микроелемента и има мек вкус и приятен аромат. Често тя е със седефен блясък и в различни цветове.

    + +

    За съжаление естествено-богатите на минерали храни са част от миналото. Съвременните методи за обрботка на почвите са ги направили бедни на хранителни вещества. Те са буквално “измити” от земята. Затова пък моретата са поели тези нутритенти и сега можем да ги открием в морската сол. Тя е един чудесен избор за набавяне на нужните минерали и микроелементи. Разбира се, винаги купувайте възможно най-чистата сол, която можете да си позволите, тъй като в големите водни източници често има доста токсини и замърсители.

    + +

    Най-добрият избор остава небезизвестната Хималайска розова сол, която се добива в дълбочина от едноименните планински масиви и при нея липсват всякакви съмнения за индустриални замърсявания.

    + +

    С която и от двете - натурална морска или розова хималайска сол да изберете да замените обикновенната трапезна сол у дома, със сигурност ще подобрите значително здравето си и това на близките си.

    + +

    Вие какво мислите за солта? Страхувате ли се от нея? Смятате ли, че солта може да е полезна? Напишете в коментар.

    +;T; @{I"R/blog/2014-05-18-здравословното-хранене-е-измама/;T{;{ ;I"5N + + + + + + + Здравословното хранене е измама + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Здравословното хранене е измама +

    + +
    +
      +
    • + + May 18, 2014 +
    • +
    +
    + + +

    Живеем във време, в което 24 часа в денонощие не са ни достатъчни за всичко, което искаме да свършим. Стресът в работата, на улицата и дори в дома ни е огромен. Недоспиването и набързо приготвената храна ни карат да се чувстваме отпаднали и летаргични. Това неминуемо вреди на физическото и психическото ни здраве.

    + +

    Като съвременни интелигентни хора решаваме да се справим със заобикалящите ни проблеми. Няма как да спрем да ходим на работа, решаваме поне да се погрижим за здравето си. Но как?

    + +

    Сещаме се за безгрижното ни детство, когато бяхме с крепко здраве, дълбок сън и толкова енергични… +Питаме се: Какво се е променило? Не съм ли същият човек, но малко по-порастнал? Как мога да върна времето и да се чувствам пак толкова добре? +И лампичката светва: Ако се върна крачка назад и започна да се храня по-здравословно и да се движа повече, вероятно ще се почувствам по-добре!

    + +

    Втори сценарий: Имаме познат, колега или роднина с тежка диагноза рак, диабет или друго сериозно заболяване. Замисляме се за бъдещето, търсим информация за профилактика на болестите, решаваме да подобрим качеството си на живот. +Съвсем естествено светва тази същата лампичка: ако водя здравословен начин на живот, вероятността да ме застигнат тежките диагнози значително намалява.

    + +

    Трети сценарий: По телевизията, във вестниците, в Интернет непрекъснато се говори за вредата от наднорменото тегло и последствията му. Забелязваме, че се налага да отпуснем една дупка на колана или по-лошо: дънките вече не ни стават. Цък! Лампичката! Време е за здравословно хранене!

    + +

    Има и още варианти. Има и я и ТВОЯТА версия.

    + +

    Най-големият проблем на здравословното хранене, е че то няма ясна дефиниция.

    + +

    Разликата между здравословно и нездравословно е в нашето разбиране за света.

    + +

    За вегетарианците, здравословни са растетелните храни, а месото е отрова и води до подкиселяване на организма, рак и смърт.

    + +

    За бодибилдърите и хората от фитнес индустрията протеините - естествени и синтетични са най-ценната храна, а плодовете, хляба и захарта са отрова.

    + +

    За палео последователите естествените цели храни са източника на здраве и дълголетие, а млечните, зърнените и алкохола са най-вредните продукти.

    + +

    Правителствата на развитите държави като САЩ, Великобритания и др. поощряват консумацията на големи количества пшенични продукти и твърдят, че наситените мазнини от животински произход водят до сърдечно-съдови заболявания и рак.

    + +

    Натуралистите се хранят само с истински, цели храни и изцяло избягват всички преработени, пакетирани, рафинирани стоки. Те не консумират нищо, което е претърпяло човешка намеса.

    + +

    И какво се случва в крайна сметка? Всяка храна е вредна и опасна за някого!

    + +

    Ето каква е истината. Няма добри и лоши храни.

    + +

    Има три начина по които храната може да ви навреди:

    + +
      +
    • Прекомерна консумация на храна, която може да доведе до наднормено тегло и заболяванията съпътсващи го.
    • +
    • Да доведе до дефицит на някои нутриенти в тялото.
    • +
    • Директно да повлияе метаболизма и телесните функции.
    • +
    + +

    1. Излишъкът от калории

    + +

    Калорийният излишък е само една възможна причина за наднормено тегло. Хормоналният дисбаланс и колебанията в нивата на половите хормони, хормона на стреса (кортизол), инсулина в комбинация с лептин и грелин (хормони, свързани с храненето) също оказват влияние на теглото. Хроничната липса на един или група биоактивни вещества (макро- и микронутриенти, ензими, витамини) карат тялото да се презапасява и да задържа всички хранителни вещества, които постъпват в него. +Почти винаги прекаляването с храна се случва, когато човек приема бедна на нутриенти, витамини и соли храна. Тогава мозъка изпраща сигнали за намиране на необходимото и се появява неконтролируем глад: човек унищожава каквато и да е храна, която е попаднала в полезрението му. Независимо дали знае или не знае колко е вредна или безполезна за организма. Тези липси на хранителни вещества могат да се породят и от състояния като силен стрес, преумора, безсъние. Това пък от друга страна може да доведе до проблеми с хормоните, които могат да се задълбочат до много по-сериозни състояния. Ако се върнем 50 години назад ще открием много по-малко затлъстели хора. Причините за това са, че хората тогава са били подложени на по-малко стрес? Едва ли! Спортували са повече? По-скоро не! Причината, в съвременното общество да има епидемия от затлъстяване, е храната която ядем. Очевидно е, че трябва да отделяме повече внимание на качеството й, а количеството ще се регулира без усилие. +Последствията от излишното тегло са всеизвестни: повиншен пулс и кръвно налягане, сърдечно-съдови заболявания, диабет, умора, понижаване на либидото, обездвижване и липса на енергия. Но още повече влияе на психиката и душевният комфорт на всеки от нас. И носи още стрес.

    + +

    2. Храни, които ограбват тялото

    + +
      +
    • Храни с празни калории - това са храните, които доставят на тялото бърза енергия. Ако тя не се изразходи веднага, се отлага като запаси. Това са захарта, алкохола, бялото пшенично брашно. Да, те са вкусни и при консумацията им усещаме този прилив на енергия, освобождават се и хормоните на щастието, но така или иначе не получаваме нищо с дълготраен ефект. Дори напротив: бялата захар и белият хляб са храни, които при храносмилането извличат и се свързват с минерали и биоактивни вещества от тялото. Само по този начин те могат да се усвоят, тъй като в състава им липсва всичко друго, освен енергийни молекули.
    • +
    • Храни, които имат съставки-антагонисти. Пример за това са храни с високо съдържание на Калций (мляко, млечни продукти) и Магнезий (пълнозърнести храни, варива и ядки). При смесването на тези храни не може да усвоят и двата важни микроелемента, тъй като за тази цел се използва един и същ път в тялото. Обикновено Калцият надделява и не случайно недостигът на Магнезий е много разпространен. Изявява се със следните симптоми: схващания на мускули (крампи), проблеми със стави и сухожилия, отпадналост и безсъние, тежък ПМС.
    • +
    + +

    3. Директно влияние върху организма

    + +

    Алергиите към храна не са рядкост. Някои от най-силните алергени са глутенът (протеин в пшеницата), ядки, дребните плодове от семейството на ягодите, лактозата в млякото. Реакцията към алергена е моментална и много бурна. Това са медикаментозно-контролирани състояния и най-разумно е да се избягва употребата на проблемната храна и производните й.

    + +

    И ако сега си мислите, че ме е обхванала някаква лудост и се отричам от всичко написано до сега…Не, но не е изключено да се случи! +

    + +

    Аз все още се оповавам на Хипократовите думи “Лекарството ви трябва да е вашата храна и вашата храна - лекарство”. Целта на тази статия е да ви припомня да не се страхувате от новите идеи и различното мнение. В него ще откриете част от вашата истина.

    + +

    Бъдете готови да променяте гледната си точка, за да намерите най-верният път към вашето психическо и физическо здраве и благосъстояние.

    + +

    Ако тази статия ви е харесала - моля, споделете я с приятелите си.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"0Живеем във време, в което 24 часа в денонощие не са ни достатъчни за всичко, което искаме да свършим. Стресът в работата, на улицата и дори в дома ни е огромен. Недоспиването и набързо приготвената храна ни карат да се чувстваме **отпаднали** и **летаргични**. Това неминуемо вреди на физическото и психическото ни здраве. + +Като съвременни интелигентни хора решаваме да се справим със заобикалящите ни проблеми. Няма как да спрем да ходим на работа, решаваме поне **да се погрижим за здравето си**. Но как? + +Сещаме се за безгрижното ни детство, когато бяхме с крепко здраве, дълбок сън и толкова енергични... +Питаме се: Какво се е променило? Не съм ли същият човек, но малко по-порастнал? Как мога да върна времето и да се чувствам пак толкова добре? +И лампичката светва: Ако се върна крачка назад и започна да се храня по-здравословно и да се движа повече, вероятно ще се почувствам по-добре! + +Втори сценарий: Имаме познат, колега или роднина с тежка диагноза рак, диабет или друго сериозно заболяване. Замисляме се за бъдещето, търсим информация за профилактика на болестите, решаваме да подобрим качеството си на живот. +Съвсем естествено светва тази същата лампичка: ако водя здравословен начин на живот, вероятността да ме застигнат тежките диагнози значително намалява. + +Трети сценарий: По телевизията, във вестниците, в Интернет непрекъснато се говори за вредата от наднорменото тегло и последствията му. Забелязваме, че се налага да отпуснем една дупка на колана или по-лошо: дънките вече не ни стават. Цък! Лампичката! Време е за здравословно хранене! + +Има и още варианти. Има и я и **ТВОЯТА версия**. + +###Най-големият проблем на здравословното хранене, е че то няма ясна дефиниция. + +Разликата между здравословно и нездравословно е в нашето разбиране за света. + +За **вегетарианците**, здравословни са растетелните храни, а месото е отрова и води до подкиселяване на организма, рак и смърт. + +За бодибилдърите и хората от **фитнес индустрията** протеините - естествени и синтетични са най-ценната храна, а плодовете, хляба и захарта са отрова. + +За **палео** последователите естествените цели храни са източника на здраве и дълголетие, а млечните, зърнените и алкохола са най-вредните продукти. + +**Правителствата на развитите държави** като САЩ, Великобритания и др. поощряват консумацията на големи количества пшенични продукти и твърдят, че наситените мазнини от животински произход водят до сърдечно-съдови заболявания и рак. + +**Натуралистите** се хранят само с истински, цели храни и изцяло избягват всички преработени, пакетирани, рафинирани стоки. Те не консумират нищо, което е претърпяло човешка намеса. + +И какво се случва в крайна сметка? Всяка храна е вредна и опасна за някого! + +Ето каква е истината. **Няма добри и лоши храни**. + +###Има три начина по които храната може да ви навреди: + +* Прекомерна консумация на храна, която може да доведе до наднормено тегло и заболяванията съпътсващи го. +* Да доведе до дефицит на някои нутриенти в тялото. +* Директно да повлияе метаболизма и телесните функции. + +**1. Излишъкът от калории** + +Калорийният излишък е само една възможна причина за наднормено тегло. Хормоналният дисбаланс и колебанията в нивата на половите хормони, хормона на стреса (кортизол), инсулина в комбинация с лептин и грелин (хормони, свързани с храненето) също оказват влияние на теглото. Хроничната липса на един или група биоактивни вещества (макро- и микронутриенти, ензими, витамини) карат тялото да се презапасява и да задържа всички хранителни вещества, които постъпват в него. +Почти винаги прекаляването с храна се случва, когато човек приема бедна на нутриенти, витамини и соли храна. Тогава мозъка изпраща сигнали за намиране на необходимото и се появява неконтролируем глад: човек унищожава каквато и да е храна, която е попаднала в полезрението му. Независимо дали знае или не знае колко е вредна или безполезна за организма. Тези липси на хранителни вещества могат да се породят и от състояния като силен стрес, преумора, безсъние. Това пък от друга страна може да доведе до проблеми с хормоните, които могат да се задълбочат до много по-сериозни състояния. Ако се върнем 50 години назад ще открием много по-малко затлъстели хора. Причините за това са, че хората тогава са били подложени на по-малко стрес? Едва ли! Спортували са повече? По-скоро не! Причината, в съвременното общество да има епидемия от затлъстяване, е храната която ядем. Очевидно е, че трябва да отделяме повече внимание на качеството й, а количеството ще се регулира без усилие. +Последствията от излишното тегло са всеизвестни: повиншен пулс и кръвно налягане, сърдечно-съдови заболявания, диабет, умора, понижаване на либидото, обездвижване и липса на енергия. Но още повече влияе на психиката и душевният комфорт на всеки от нас. И носи още стрес. + +**2. Храни, които ограбват тялото** + +* Храни с празни калории - това са храните, които доставят на тялото бърза енергия. Ако тя не се изразходи веднага, се отлага като запаси. Това са захарта, алкохола, бялото пшенично брашно. Да, те са вкусни и при консумацията им усещаме този прилив на енергия, освобождават се и хормоните на щастието, но така или иначе не получаваме нищо с дълготраен ефект. Дори напротив: бялата захар и белият хляб са храни, които при храносмилането извличат и се свързват с минерали и биоактивни вещества от тялото. Само по този начин те могат да се усвоят, тъй като в състава им липсва всичко друго, освен енергийни молекули. +* Храни, които имат съставки-антагонисти. Пример за това са храни с високо съдържание на Калций (мляко, млечни продукти) и Магнезий (пълнозърнести храни, варива и ядки). При смесването на тези храни не може да усвоят и двата важни микроелемента, тъй като за тази цел се използва един и същ път в тялото. Обикновено Калцият надделява и не случайно недостигът на Магнезий е много разпространен. Изявява се със следните симптоми: схващания на мускули (крампи), проблеми със стави и сухожилия, отпадналост и безсъние, тежък ПМС. + +**3. Директно влияние върху организма** + +Алергиите към храна не са рядкост. Някои от най-силните алергени са глутенът (протеин в пшеницата), ядки, дребните плодове от семейството на ягодите, лактозата в млякото. Реакцията към алергена е моментална и много бурна. Това са медикаментозно-контролирани състояния и най-разумно е да се избягва употребата на проблемната храна и производните й. + +####И ако сега си мислите, че ме е обхванала някаква лудост и се отричам от всичко написано до сега...**Не, но не е изключено да се случи!** + +Аз все още се оповавам на Хипократовите думи “Лекарството ви трябва да е вашата храна и вашата храна - лекарство”. Целта на тази статия е да ви припомня да не се страхувате от новите идеи и различното мнение. **В него ще откриете част от вашата истина.** + +Бъдете готови да променяте гледната си точка, за да намерите най-верният път към вашето психическо и физическо здраве и благосъстояние. + +Ако тази статия ви е харесала - моля, споделете я с приятелите си.;T; +I"2

    Живеем във време, в което 24 часа в денонощие не са ни достатъчни за всичко, което искаме да свършим. Стресът в работата, на улицата и дори в дома ни е огромен. Недоспиването и набързо приготвената храна ни карат да се чувстваме отпаднали и летаргични. Това неминуемо вреди на физическото и психическото ни здраве.

    + +

    Като съвременни интелигентни хора решаваме да се справим със заобикалящите ни проблеми. Няма как да спрем да ходим на работа, решаваме поне да се погрижим за здравето си. Но как?

    + +

    Сещаме се за безгрижното ни детство, когато бяхме с крепко здраве, дълбок сън и толкова енергични… +Питаме се: Какво се е променило? Не съм ли същият човек, но малко по-порастнал? Как мога да върна времето и да се чувствам пак толкова добре? +И лампичката светва: Ако се върна крачка назад и започна да се храня по-здравословно и да се движа повече, вероятно ще се почувствам по-добре!

    + +

    Втори сценарий: Имаме познат, колега или роднина с тежка диагноза рак, диабет или друго сериозно заболяване. Замисляме се за бъдещето, търсим информация за профилактика на болестите, решаваме да подобрим качеството си на живот. +Съвсем естествено светва тази същата лампичка: ако водя здравословен начин на живот, вероятността да ме застигнат тежките диагнози значително намалява.

    + +

    Трети сценарий: По телевизията, във вестниците, в Интернет непрекъснато се говори за вредата от наднорменото тегло и последствията му. Забелязваме, че се налага да отпуснем една дупка на колана или по-лошо: дънките вече не ни стават. Цък! Лампичката! Време е за здравословно хранене!

    + +

    Има и още варианти. Има и я и ТВОЯТА версия.

    + +

    Най-големият проблем на здравословното хранене, е че то няма ясна дефиниция.

    + +

    Разликата между здравословно и нездравословно е в нашето разбиране за света.

    + +

    За вегетарианците, здравословни са растетелните храни, а месото е отрова и води до подкиселяване на организма, рак и смърт.

    + +

    За бодибилдърите и хората от фитнес индустрията протеините - естествени и синтетични са най-ценната храна, а плодовете, хляба и захарта са отрова.

    + +

    За палео последователите естествените цели храни са източника на здраве и дълголетие, а млечните, зърнените и алкохола са най-вредните продукти.

    + +

    Правителствата на развитите държави като САЩ, Великобритания и др. поощряват консумацията на големи количества пшенични продукти и твърдят, че наситените мазнини от животински произход водят до сърдечно-съдови заболявания и рак.

    + +

    Натуралистите се хранят само с истински, цели храни и изцяло избягват всички преработени, пакетирани, рафинирани стоки. Те не консумират нищо, което е претърпяло човешка намеса.

    + +

    И какво се случва в крайна сметка? Всяка храна е вредна и опасна за някого!

    + +

    Ето каква е истината. Няма добри и лоши храни.

    + +

    Има три начина по които храната може да ви навреди:

    + +
      +
    • Прекомерна консумация на храна, която може да доведе до наднормено тегло и заболяванията съпътсващи го.
    • +
    • Да доведе до дефицит на някои нутриенти в тялото.
    • +
    • Директно да повлияе метаболизма и телесните функции.
    • +
    + +

    1. Излишъкът от калории

    + +

    Калорийният излишък е само една възможна причина за наднормено тегло. Хормоналният дисбаланс и колебанията в нивата на половите хормони, хормона на стреса (кортизол), инсулина в комбинация с лептин и грелин (хормони, свързани с храненето) също оказват влияние на теглото. Хроничната липса на един или група биоактивни вещества (макро- и микронутриенти, ензими, витамини) карат тялото да се презапасява и да задържа всички хранителни вещества, които постъпват в него. +Почти винаги прекаляването с храна се случва, когато човек приема бедна на нутриенти, витамини и соли храна. Тогава мозъка изпраща сигнали за намиране на необходимото и се появява неконтролируем глад: човек унищожава каквато и да е храна, която е попаднала в полезрението му. Независимо дали знае или не знае колко е вредна или безполезна за организма. Тези липси на хранителни вещества могат да се породят и от състояния като силен стрес, преумора, безсъние. Това пък от друга страна може да доведе до проблеми с хормоните, които могат да се задълбочат до много по-сериозни състояния. Ако се върнем 50 години назад ще открием много по-малко затлъстели хора. Причините за това са, че хората тогава са били подложени на по-малко стрес? Едва ли! Спортували са повече? По-скоро не! Причината, в съвременното общество да има епидемия от затлъстяване, е храната която ядем. Очевидно е, че трябва да отделяме повече внимание на качеството й, а количеството ще се регулира без усилие. +Последствията от излишното тегло са всеизвестни: повиншен пулс и кръвно налягане, сърдечно-съдови заболявания, диабет, умора, понижаване на либидото, обездвижване и липса на енергия. Но още повече влияе на психиката и душевният комфорт на всеки от нас. И носи още стрес.

    + +

    2. Храни, които ограбват тялото

    + +
      +
    • Храни с празни калории - това са храните, които доставят на тялото бърза енергия. Ако тя не се изразходи веднага, се отлага като запаси. Това са захарта, алкохола, бялото пшенично брашно. Да, те са вкусни и при консумацията им усещаме този прилив на енергия, освобождават се и хормоните на щастието, но така или иначе не получаваме нищо с дълготраен ефект. Дори напротив: бялата захар и белият хляб са храни, които при храносмилането извличат и се свързват с минерали и биоактивни вещества от тялото. Само по този начин те могат да се усвоят, тъй като в състава им липсва всичко друго, освен енергийни молекули.
    • +
    • Храни, които имат съставки-антагонисти. Пример за това са храни с високо съдържание на Калций (мляко, млечни продукти) и Магнезий (пълнозърнести храни, варива и ядки). При смесването на тези храни не може да усвоят и двата важни микроелемента, тъй като за тази цел се използва един и същ път в тялото. Обикновено Калцият надделява и не случайно недостигът на Магнезий е много разпространен. Изявява се със следните симптоми: схващания на мускули (крампи), проблеми със стави и сухожилия, отпадналост и безсъние, тежък ПМС.
    • +
    + +

    3. Директно влияние върху организма

    + +

    Алергиите към храна не са рядкост. Някои от най-силните алергени са глутенът (протеин в пшеницата), ядки, дребните плодове от семейството на ягодите, лактозата в млякото. Реакцията към алергена е моментална и много бурна. Това са медикаментозно-контролирани състояния и най-разумно е да се избягва употребата на проблемната храна и производните й.

    + +

    И ако сега си мислите, че ме е обхванала някаква лудост и се отричам от всичко написано до сега…Не, но не е изключено да се случи! +

    + +

    Аз все още се оповавам на Хипократовите думи “Лекарството ви трябва да е вашата храна и вашата храна - лекарство”. Целта на тази статия е да ви припомня да не се страхувате от новите идеи и различното мнение. В него ще откриете част от вашата истина.

    + +

    Бъдете готови да променяте гледната си точка, за да намерите най-верният път към вашето психическо и физическо здраве и благосъстояние.

    + +

    Ако тази статия ви е харесала - моля, споделете я с приятелите си.

    +;T; @I"L/blog/2014-05-25-изяж-си-слънцезащитният-крем/;T{;{ ;I"L + + + + + + + Изяж си слънцезащитният крем + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Изяж си слънцезащитният крем +

    + +
    +
      +
    • + + May 25, 2014 +
    • +
    +
    + + +

    Всички очакваме лятото скоро да ни зарадва с по-слънчеви дни, море, разходки и слънчеви бани по полянки и плажове.

    + +

    А знаем ли как да се радваме на слънцето? Как да получим най-доброто от него, без ужасните и болезнени изгаряния по кожата?

    + +

    Да поговорим малко за влиянието на слънцето върху човека. От всякъде ни заливат с истерични новини за това колко е вредно слънцето. То състарява кожата, изгарянията водат до рак и най-добрата превенция била “да не си показваме носа навън”, ако не сме се намазали обилно с поне 2-3 мазила от аптеката със слънцезащитен фактор 20-30-50 и поне 10 непроизносимо химични вещества в състава..

    + +

    Всичко това нямаше да е толкова страшно, ако всъщност беше вярно. Лошото е, че въпреки все по-масовото използване на слънцезащитни кремове, статистките показват, че броят на болните от рак на кожата не намалява.

    + +

    Освен това, нанасяйки подобни помади по кожата си, ние блокираме достъпа на слънчеви лъчи и неволно спираме производството на важният за здравето витамин Д. Той всъщност не е точно витамин, а бъдещ хормон, който има важна роля за здравето на костите, зъбите, и нормално функциониращата имунна система. Последствията от недостига на витамин Д не закъсняват: мускулни и ставни болки, повишен риск от сърдечно-съдови заболявания, проблеми със зъбите и венците, тежка астма в детска възраст, диабет, някои форми на рак и възможна теоретична връзка с болестта на Крон и мултиплена склероза.

    + +

    Всъщност слънчевата енергия е животворна и е храна за всички растения, които ни снабдяват с кислород и на свой ред стават храна за хора и животни. Слънцето не е враг и не трябва да се страхуваме от него, просто трябва да знаем как да го използваме в наша полза.

    + +

    Аз съм от хората с изключително светла кожа и винаги съм изгаряла, дори при най-кратко слънчево излагане. Никога не съм имала загар, а само червенина и отоци. За мен слънцето беше враг номер едно и още от дете мразех да ходя на море. Лятото се обличах с дълги ръкави и крачоли, защото изгарянията бяха бързи и болезнени.

    + +

    Ето обаче какво забелязах миналото лято: освен, че всеки уикенд бях някъде в планината с моят любим велосипед под жарко слънце, някъде между резервната гума и пакетчето с ядки и плодове в раницата намерих недокосната опаковката със слънцезащитен крем, която носех. А нямах изгаряния! Мистерия? Всъщност не. Истината е, че слънцезащитата става отвътре-навън и в тяло, което е чисто от токсини, слънцето не предизвиква възпаление. А слънчевото изгаряне е точно това: класическо възпаление - оток, болка, зачервяване, повишена температура.

    + +

    Кожата е един от органите, чрез който тялото отделя токсини. Когато течностите (пот, вода, мазнини), които се отделят през нея са токсични, кожата буквално се “пържи” в тях. Тогава вероятността да се стигне до слънчево изгаряне е почти 100%. При редовни токсични слънчеви бани съответно нараства и вероятността от проблеми като изсушаване и сбръчкване на кожата, алергии, поява на пигментни петна и дори рак.

    + +

    Не бих искала да пропусна и корелацията, която може да се направи със зачестилата диагноза меланома (рак на кожата) и високата консумация на рафинирани растителни мазнини, богати на Омега-6 мастни киселини. В последните 50 години и могат да се наблюдават и двете събития. Дали има връзка можем само да предполагаме. Аз съм склонна да мисля, че да. В статията ми за мазнините може да си припомните защо те са неподходяща храна за хора.

    + +

    Както вредната храна може да повлияе негативно на кожата и здравето като цяло, така правилната диета може да ви донесе много ползи.

    + +

    Ето как да подобрите естествената слънцезащита на тялото си:

    + +
      +
    1. +

      Яжте достатъчно добри мазнини. На човешкото тяло ежедневно са необходими наситени животински мазнини (масло, мазно месо, яйчен жълтък), мощно ненаситени мазнини (кокосово масло), Омега - 3 мастни киселини (риба, рибено масло). Избягвайте рафинирани те животински мазнини и маргарина.

      +
    2. +
    3. +

      Прием на достатъчно антиоксиданти. Тези малки частички, които приемаме с храната се свързват със свободните радикали, които ограбват тялото от важни минерали и микроелементи. Ако избягвате употребата на зърнени храни и най-вече пшенични продукти и вредни мазнини, най-вероятно в храната ви има достатъчно антиоксиданти. Ако искате обаче наистина ударна доза, то хапвайте редовно дребни плодове от рода на боровинките, какаови зърна, зеленият чай и животинските мазнини.

      +
    4. +
    5. +

      Достатъчно витамин Д. Тъмният пигмент меланин, на който се дължи бронзовият загар по кожата започва да се произвежда само ако има достатъчно витамин Д в тялото. Т.е. ако има недостиг получаваме изгаряне, а не тен. Ако се кажем с крем, блокираме производството на витамина и задълбочаваме проблема. Оптималното ниво на витамин Д помага производството на меланина да е по-бързо и след това да се задържи в кожата по-дълго.

      +
    6. +
    7. +

      Постепенно излагане на слънце. В зависимост от типа на кожата, човек трябва да започне с кратки слънчеви бани от 5 до 30 мин дневно. На тялото трябва да се даде възможност да произведе достатъчно витамин Д и меланин, иначе слънчевото изгаряне е неизбежно.

      +
    8. +
    9. +

      Избягвайте да нанасяте по кожата си химически вещества и използвайте натурална козметика. Тъй като слънцезащитните кремове реално не предпазват от вредните ефекти на слънцето, а дори могат да ги задълбочат, по-добре ги пропуснете. Някои масла имат естествен слънцезащитен фактор и влизат в състава на качествените и безвредни слънцезащитният продукти: например кокосовото масло SPF4 или масло от ший SPF6.

      +
    10. +
    11. +

      Хидратирайте се. За всички процеси в тялото е нужна вода. Не забравяйте да пиете ежедневно по 2.5-3 литра вода, особено когато сте под слънчевите лъчи.

      +
    12. +
    + +

    Не е ли страхотно, че с пълноценно хранене можем да решим още един проблем! Ето още хора, които мислят така.

    + +

    Избягвайте:

    + +
      +
    • преработени храни
    • +
    • растителни олиа
    • +
    • зърнени и пшенични продукти
    • +
    • захар и нишесте
    • +
    + +

    Яжте:

    + +
      +
    • Много наситени животински мазнини
    • +
    • Много храни, богати на Омега - 3
    • +
    • Много зеленолистните зеленчуци
    • +
    • Домати и доматено пюре (ликопенът е естествена защита срещу възпалението)
    • +
    + +

    А вие как се защитавате от слънцето? Лесно ли хващате тен или по-често изгаряте? Напишете ми отговора си в коментар.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I".Всички очакваме лятото скоро да ни зарадва с по-слънчеви дни, море, разходки и слънчеви бани по полянки и плажове. + +**А знаем ли как да се радваме на слънцето? Как да получим най-доброто от него, без ужасните и болезнени изгаряния по кожата?** + +Да поговорим малко за влиянието на слънцето върху човека. От всякъде ни заливат с истерични новини за това колко е вредно слънцето. То състарява кожата, изгарянията водат до рак и най-добрата превенция била "да не си показваме носа навън", ако не сме се намазали обилно с поне 2-3 мазила от аптеката със слънцезащитен фактор 20-30-50 и поне 10 непроизносимо химични вещества в състава.. + +**Всичко това нямаше да е толкова страшно, ако всъщност беше вярно.** Лошото е, че въпреки все по-масовото използване на слънцезащитни кремове, статистките показват, че броят на болните от рак на кожата [не](http://www.healthiertalk.com/skin-cancer-rates-rising-record-pace-1703) [намалява](http://phys.org/news155384568.html). + +Освен това, нанасяйки подобни помади по кожата си, ние блокираме достъпа на слънчеви лъчи и неволно спираме производството на важният за здравето **витамин Д**. Той всъщност не е точно витамин, а бъдещ **хормон, който има важна роля за здравето на костите, зъбите, и нормално функциониращата имунна система**. Последствията от недостига на витамин Д не закъсняват: мускулни и ставни болки, повишен риск от сърдечно-съдови заболявания, проблеми със зъбите и венците, тежка астма в детска възраст, [диабет](http://www.webmd.com/diabetes/guide/type-2-diabetes), някои форми на рак и възможна теоретична връзка с [болестта на Крон](https://www.vitamindcouncil.org/vitamin-d-news/vitamin-d-deficiency-linked-to-active-crohns-disease/) и [мултиплена склероза](http://www.webmd.com/multiple-sclerosis/default.htm). + +Всъщност слънчевата енергия е животворна и е храна за всички растения, които ни снабдяват с кислород и на свой ред стават храна за хора и животни. **Слънцето не е враг и не трябва да се страхуваме от него, просто трябва да знаем как да го използваме в наша полза.** + +Аз съм от хората с изключително светла кожа и винаги съм изгаряла, дори при най-кратко слънчево излагане. Никога не съм имала загар, а само червенина и отоци. За мен слънцето беше враг номер едно и още от дете мразех да ходя на море. Лятото се обличах с дълги ръкави и крачоли, защото изгарянията бяха бързи и болезнени. + +Ето обаче какво забелязах миналото лято: освен, че всеки уикенд бях някъде в планината с моят любим велосипед под жарко слънце, някъде между резервната гума и пакетчето с ядки и плодове в раницата намерих недокосната опаковката със слънцезащитен крем, която носех. А нямах изгаряния! Мистерия? Всъщност не. **Истината е, че слънцезащитата става отвътре-навън и в тяло, което е чисто от токсини, слънцето не предизвиква възпаление.** А слънчевото изгаряне е точно това: класическо възпаление - оток, болка, зачервяване, повишена температура. + +Кожата е един от органите, чрез който тялото отделя токсини. Когато течностите (пот, вода, мазнини), които се отделят през нея са токсични, кожата буквално се "пържи" в тях. Тогава вероятността да се стигне до слънчево изгаряне е почти 100%. При редовни токсични слънчеви бани съответно нараства и вероятността от проблеми като изсушаване и сбръчкване на кожата, алергии, поява на пигментни петна и дори рак. + +Не бих искала да пропусна и [корелацията](http://www.dldewey.com/hydroil.htm), която може да се направи със зачестилата диагноза меланома (рак на кожата) и високата консумация на рафинирани растителни мазнини, богати на Омега-6 мастни киселини. В последните 50 години и могат да се наблюдават и двете събития. Дали има връзка можем само да предполагаме. Аз съм склонна да мисля, че да. В [статията](/blog/2014-04-08-%D0%B7%D0%B0%D1%89%D0%BE-%D0%BD%D0%B8%D0%BA%D0%BE%D0%B3%D0%B0-%D0%BD%D0%B5-%D1%82%D1%80%D1%8F%D0%B1%D0%B2%D0%B0-%D0%B4%D0%B0-%D1%8F%D0%B4%D0%B5%D1%82%D0%B5-%D0%BC%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D0%BD/) ми за мазнините може да си припомните защо те са неподходяща храна за хора. + +Както вредната храна може да повлияе негативно на кожата и здравето като цяло, така правилната диета може да ви донесе много ползи. + +###Ето как да подобрите естествената слънцезащита на тялото си: + +1. Яжте достатъчно **добри мазнини**. На човешкото тяло ежедневно са необходими наситени животински мазнини (масло, мазно месо, яйчен жълтък), мощно ненаситени мазнини (кокосово масло), Омега - 3 мастни киселини (риба, рибено масло). Избягвайте рафинирани те животински мазнини и маргарина. + +2. Прием на достатъчно **антиоксиданти**. Тези малки частички, които приемаме с храната се свързват със свободните радикали, които ограбват тялото от важни минерали и микроелементи. Ако избягвате употребата на зърнени храни и най-вече пшенични продукти и вредни мазнини, най-вероятно в храната ви има достатъчно антиоксиданти. Ако искате обаче наистина ударна доза, то хапвайте редовно дребни плодове от рода на боровинките, какаови зърна, зеленият чай и животинските мазнини. + +3. Достатъчно **витамин Д**. Тъмният пигмент меланин, на който се дължи бронзовият загар по кожата започва да се произвежда само ако има достатъчно витамин Д в тялото. Т.е. ако има недостиг получаваме изгаряне, а не тен. Ако се кажем с крем, блокираме производството на витамина и задълбочаваме проблема. Оптималното ниво на витамин Д помага производството на меланина да е по-бързо и след това да се задържи в кожата по-дълго. + +4. **Постепенно излагане на слънце**. В зависимост от типа на кожата, човек трябва да започне с кратки слънчеви бани от 5 до 30 мин дневно. На тялото трябва да се даде възможност да произведе достатъчно витамин Д и меланин, иначе слънчевото изгаряне е неизбежно. + +5. Избягвайте да нанасяте по кожата си [химически вещества](http://www.nature.com/clpt/journal/v89/n1/abs/clpt2010227a.html) и използвайте **натурална козметика**. Тъй като слънцезащитните кремове реално не предпазват от вредните ефекти на слънцето, а дори могат да ги задълбочат, по-добре ги пропуснете. Някои масла имат естествен слънцезащитен фактор и влизат в състава на качествените и безвредни слънцезащитният продукти: например кокосовото масло SPF4 или [масло от ший](http://theglamlaboratory.blogspot.com/2011/06/cracking-code-shea-butter-and-spf.html) SPF6. + +6. **Хидратирайте** се. За всички процеси в тялото е нужна вода. Не забравяйте да пиете ежедневно по 2.5-3 литра вода, особено когато сте под слънчевите лъчи. + +Не е ли страхотно, че с пълноценно хранене можем да решим още един проблем! [Ето](http://www.marksdailyapple.com/forum/thread27271.html) [още](http://www.marksdailyapple.com/8-natural-ways-to-prevent-a-sunburn-and-sunscreens-not-one-of-them/#axzz32jepnEmn) хора, които мислят така. + +Избягвайте: + +* преработени храни +* растителни олиа +* зърнени и пшенични продукти +* захар и нишесте + +Яжте: + +* Много наситени животински мазнини +* Много храни, богати на Омега - 3 +* Много зеленолистните зеленчуци +* Домати и доматено пюре (ликопенът е естествена защита срещу възпалението) + +**А вие как се защитавате от слънцето? Лесно ли хващате тен или по-често изгаряте?** Напишете ми отговора си в коментар.;T; +I"r1

    Всички очакваме лятото скоро да ни зарадва с по-слънчеви дни, море, разходки и слънчеви бани по полянки и плажове.

    + +

    А знаем ли как да се радваме на слънцето? Как да получим най-доброто от него, без ужасните и болезнени изгаряния по кожата?

    + +

    Да поговорим малко за влиянието на слънцето върху човека. От всякъде ни заливат с истерични новини за това колко е вредно слънцето. То състарява кожата, изгарянията водат до рак и най-добрата превенция била “да не си показваме носа навън”, ако не сме се намазали обилно с поне 2-3 мазила от аптеката със слънцезащитен фактор 20-30-50 и поне 10 непроизносимо химични вещества в състава..

    + +

    Всичко това нямаше да е толкова страшно, ако всъщност беше вярно. Лошото е, че въпреки все по-масовото използване на слънцезащитни кремове, статистките показват, че броят на болните от рак на кожата не намалява.

    + +

    Освен това, нанасяйки подобни помади по кожата си, ние блокираме достъпа на слънчеви лъчи и неволно спираме производството на важният за здравето витамин Д. Той всъщност не е точно витамин, а бъдещ хормон, който има важна роля за здравето на костите, зъбите, и нормално функциониращата имунна система. Последствията от недостига на витамин Д не закъсняват: мускулни и ставни болки, повишен риск от сърдечно-съдови заболявания, проблеми със зъбите и венците, тежка астма в детска възраст, диабет, някои форми на рак и възможна теоретична връзка с болестта на Крон и мултиплена склероза.

    + +

    Всъщност слънчевата енергия е животворна и е храна за всички растения, които ни снабдяват с кислород и на свой ред стават храна за хора и животни. Слънцето не е враг и не трябва да се страхуваме от него, просто трябва да знаем как да го използваме в наша полза.

    + +

    Аз съм от хората с изключително светла кожа и винаги съм изгаряла, дори при най-кратко слънчево излагане. Никога не съм имала загар, а само червенина и отоци. За мен слънцето беше враг номер едно и още от дете мразех да ходя на море. Лятото се обличах с дълги ръкави и крачоли, защото изгарянията бяха бързи и болезнени.

    + +

    Ето обаче какво забелязах миналото лято: освен, че всеки уикенд бях някъде в планината с моят любим велосипед под жарко слънце, някъде между резервната гума и пакетчето с ядки и плодове в раницата намерих недокосната опаковката със слънцезащитен крем, която носех. А нямах изгаряния! Мистерия? Всъщност не. Истината е, че слънцезащитата става отвътре-навън и в тяло, което е чисто от токсини, слънцето не предизвиква възпаление. А слънчевото изгаряне е точно това: класическо възпаление - оток, болка, зачервяване, повишена температура.

    + +

    Кожата е един от органите, чрез който тялото отделя токсини. Когато течностите (пот, вода, мазнини), които се отделят през нея са токсични, кожата буквално се “пържи” в тях. Тогава вероятността да се стигне до слънчево изгаряне е почти 100%. При редовни токсични слънчеви бани съответно нараства и вероятността от проблеми като изсушаване и сбръчкване на кожата, алергии, поява на пигментни петна и дори рак.

    + +

    Не бих искала да пропусна и корелацията, която може да се направи със зачестилата диагноза меланома (рак на кожата) и високата консумация на рафинирани растителни мазнини, богати на Омега-6 мастни киселини. В последните 50 години и могат да се наблюдават и двете събития. Дали има връзка можем само да предполагаме. Аз съм склонна да мисля, че да. В статията ми за мазнините може да си припомните защо те са неподходяща храна за хора.

    + +

    Както вредната храна може да повлияе негативно на кожата и здравето като цяло, така правилната диета може да ви донесе много ползи.

    + +

    Ето как да подобрите естествената слънцезащита на тялото си:

    + +
      +
    1. +

      Яжте достатъчно добри мазнини. На човешкото тяло ежедневно са необходими наситени животински мазнини (масло, мазно месо, яйчен жълтък), мощно ненаситени мазнини (кокосово масло), Омега - 3 мастни киселини (риба, рибено масло). Избягвайте рафинирани те животински мазнини и маргарина.

      +
    2. +
    3. +

      Прием на достатъчно антиоксиданти. Тези малки частички, които приемаме с храната се свързват със свободните радикали, които ограбват тялото от важни минерали и микроелементи. Ако избягвате употребата на зърнени храни и най-вече пшенични продукти и вредни мазнини, най-вероятно в храната ви има достатъчно антиоксиданти. Ако искате обаче наистина ударна доза, то хапвайте редовно дребни плодове от рода на боровинките, какаови зърна, зеленият чай и животинските мазнини.

      +
    4. +
    5. +

      Достатъчно витамин Д. Тъмният пигмент меланин, на който се дължи бронзовият загар по кожата започва да се произвежда само ако има достатъчно витамин Д в тялото. Т.е. ако има недостиг получаваме изгаряне, а не тен. Ако се кажем с крем, блокираме производството на витамина и задълбочаваме проблема. Оптималното ниво на витамин Д помага производството на меланина да е по-бързо и след това да се задържи в кожата по-дълго.

      +
    6. +
    7. +

      Постепенно излагане на слънце. В зависимост от типа на кожата, човек трябва да започне с кратки слънчеви бани от 5 до 30 мин дневно. На тялото трябва да се даде възможност да произведе достатъчно витамин Д и меланин, иначе слънчевото изгаряне е неизбежно.

      +
    8. +
    9. +

      Избягвайте да нанасяте по кожата си химически вещества и използвайте натурална козметика. Тъй като слънцезащитните кремове реално не предпазват от вредните ефекти на слънцето, а дори могат да ги задълбочат, по-добре ги пропуснете. Някои масла имат естествен слънцезащитен фактор и влизат в състава на качествените и безвредни слънцезащитният продукти: например кокосовото масло SPF4 или масло от ший SPF6.

      +
    10. +
    11. +

      Хидратирайте се. За всички процеси в тялото е нужна вода. Не забравяйте да пиете ежедневно по 2.5-3 литра вода, особено когато сте под слънчевите лъчи.

      +
    12. +
    + +

    Не е ли страхотно, че с пълноценно хранене можем да решим още един проблем! Ето още хора, които мислят така.

    + +

    Избягвайте:

    + +
      +
    • преработени храни
    • +
    • растителни олиа
    • +
    • зърнени и пшенични продукти
    • +
    • захар и нишесте
    • +
    + +

    Яжте:

    + +
      +
    • Много наситени животински мазнини
    • +
    • Много храни, богати на Омега - 3
    • +
    • Много зеленолистните зеленчуци
    • +
    • Домати и доматено пюре (ликопенът е естествена защита срещу възпалението)
    • +
    + +

    А вие как се защитавате от слънцето? Лесно ли хващате тен или по-често изгаряте? Напишете ми отговора си в коментар.

    +;T; @I"K/blog/2014-06-02-как-мария-си-върна-усмивката/;T{;{ ;I"M + + + + + + + Как Мария си върна усмивката + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Как Мария си върна усмивката +

    + +
    +
      +
    • + + June 2, 2014 +
    • +
    +
    + + +

    Днес искам да ви разкажа една история. Главен герой в нея е (да я наречем) Мария.

    + +

    Мария е на 26 години, образована жена, с многостранни интереси. Тя също така държи на здравето си и веднъж годишно ходи на профилактичен преглед при зъболекаря си. На 25 години тя има 2 пломби, поставени в детските й години. Не пуши, не пие газирано и не яде вредна храна. Отвреме-навреме си позволява по малко шоколад и чаша алкохол. Спортува редовно. Общото и здравословно състояние е чудесно. Зъбите и венците й са в перфектно състояние.

    + +

    През последните 12 месеца Мария решава да промени драстично начина си на живот и да започне да се храни само със сурова храна, като изключи също така всички животински продукти. Менюто и се състои само от плодове, зеленчуци, ядки, растителни мазнини и няколко вида водорасли и т.нар. суперхрани. Плодовите фрешове и смутита често заменят твърдата храна.

    + +

    И какво мислите установява зъболекаря след една година? Шестнадесет (Да! 16!!) кариеса!!

    + +

    Няма да осъждам избора на Мария да се храни според своите разбирания.

    + +

    Няма да чета лекции колко е полезно или вредно здравословното хранене.

    + +

    Няма да ви развивам научни теории защо са се получили тези кариеси.

    + +

    Искам само да ви дам няколко практически съвета как да подобрите състоянието на зъбите си, ако храната ви изключва една или няколко групи храни или страдате от множествени кариеси без ясно видима причина.

    + +
      +
    1. +Голямото трио - Витамин Д, витамин К2 и витамин А +Калцият е Супермен за вашите зъби. Но той не може да дойде и да изиграе своята роля да поправя и заздравява емайла и дентина, ако организмът не може да го складира на правилните места. Витамин К2 кара Калция от храната да се връща към зъбите. Витамин Д подобрява абсорбцията на Калций в червата. Витамин А участва във формирането на костите и зъбите. Това са трите витамина, които работят в защита на вашите зъби от кариес. А комбинирани заедно техният ефект е толкова голям, че могат да възстановят вече налични кариеси и емайлови изтривания. +
        +
      • Витамин К2: този малко известен (дори на лекарите) особняк е трудно да си набавите, ако сте на веганска диета, въпреки че най-богатата храна е вид ферментирала соя - натто, до която, ако имате достъп - нямате проблем. Ако не сте фенове на соята обаче може да си набавите К2 от твърди и меки високомаслени сирена, особено ако са от сурово мляко. Други източници са органни меса, яйчният жълтък и рибен хайвер. Ако и вие като мен не обичате хапчета, но по някаква причина не можете да си осигурите този витамин с храната, то нямате друг избор освен да добавите една таблетка към дневното меню. Убедена съм, че това е липсващата част в пъзела на кариесите при хората с множествен кариес. +
      • +
      • Витамин Д: Слънчевият витамин! Ако живеете някъде на тропиците и всекидневно ви огрява силно слънце, най-вероятно имате достатъчно витамин Д. Ако обаче сте далеч от Екватора, то нивата на този важен витамин-хормон се нуждаят от оптимизиране, особено през зимата. В България можем да постигнем добро ниво на витамин Д от май до септември и то ако ежедневно се излагаме на слънце за 2-3 часа по оскъдно облекло. Т.е. суплементирайте с витамин Д почти целогодишно. За предпочитане е да си набавите Д3, а не Д2 форма.
      • +
      • Витамин А: Да, витамин А е най-ценната съставка на оранжевите моркови или сладките картофи. Обаче при тях получаваме бета-каротен, а нашите тела търсят витамин А (каротен). Повечето хора нямат проблем да превърнат провитамина във витамин, но при някои това не се случва, в това число децата, диабетно болни и хора с проблеми на щитовидната жлеза. Освен оранжевите плодове и зеленчуци, богат източник на витамин А са зеленолистните, яйчният жълтък, черният дроб, пълномаслено мляко. Тъй като витамин А е мастно-разтворим, винаги добавяйте полезна мазнина към салатите.
      • +
      +
    2. +
    3. Как да предпазите зъбите си от киселинни атаки. Ако четете блогове и статии за здравословно хранене, със сигурност сте запознати със благотворното влияние на ферментиралите храни върху човешкото здраве. И то безспорно е такова, но има едно “но”. Ако след хранене с ферментирали, кисели храни имате чувствителност в зъбите, то значи че те са подложени на ерозивното действие на киселината. +Друга киселинна атака идва от прясно изцедените плодови сокове, особено тези, които съдържат цитрусови плодове, ябълки, грозде. Защо фрешовете не са най-добрият избор може да прочетете тук. Ако все пак това е важна част от диетата ви, която не може да бъде изключена, следвайте тези правила: +
        +
      • Пийте киселата напитка през сламка и възможно най-бързо.
      • +
      • След киселинно хранене изплакнете устата си с разтвор от половин лъжичка сода за хляб в половин чаша вода. Содата неутрализира остантъчната киселинност в устата.
      • +
      • +Не мийте зъбите си поне 1 час след прием на кисела напитка или храна. Обяснявам: преди слюнката да е извършила своето реминерализиращо действие върху зъбите, емайлът е крехък заради киселинната баня в който е бил току-що. Ако започнете да четкате зъбите, докато балансът не се е възстановил, вие ще нараните допълнително крехкият емайл. Получават се микропукнатини и микроскопични кариеси, особено на местата, където емайлът е на тънък слой: около пломби, при резците, около зъбната шийка (до венеца).
      • +
      +
    4. +
    5. Не забравяйте хигиената. Въпреки, че се храните с подбрани продукти, без замърсявания и химикали не забравяйте редовната хигиена. Ежедневното изчеткване на зъбите с подходяща четка и паста е задължително. Както и ежедневното почистване на междузъбните пространства с конец за зъби. Ако се храните изключително със сурова храна, не забравяйте да посещавате редовно своят стоматолог. Нека той ви препоръча подходящи средства за хигиена, за да се предотврати изтриването на зъбите, което е често срещано при такъв тип хранене.
    6. +
    + +

    Съвременната наука се развива непрекъснато и вече лечението на кариеса не е свързано само с болезнени посещения при зъболекаря. Бъдете информирани за избора, който правите относно здравето си и винаги изисквайте най-доброто за себе си и децата си!

    + +

    За да завърша днешната история ще ви разкажа какво се случи с кариесите на Мария: След шест месеца, тя има четири нови пломби, а останалите дванадесет спряха развитието си и се очаква зъбите да се възстановят напълно. И Мария си върна усмивката, само защото спазваше съветите, които споделих и с вас днес!

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"/Днес искам да ви разкажа една история. Главен герой в нея е (да я наречем) Мария. + +Мария е на 26 години, образована жена, с многостранни интереси. **Тя също така държи на здравето си и веднъж годишно ходи на профилактичен преглед при зъболекаря си.** На 25 години тя има 2 пломби, поставени в детските й години. Не пуши, не пие газирано и не яде вредна храна. Отвреме-навреме си позволява по малко шоколад и чаша алкохол. Спортува редовно. Общото и здравословно състояние е чудесно. Зъбите и венците й са в перфектно състояние. + +През последните 12 месеца Мария решава да промени драстично начина си на живот и да започне да се храни само със сурова храна, като изключи също така всички животински продукти. Менюто и се състои само от плодове, зеленчуци, ядки, растителни мазнини и няколко вида водорасли и т.нар. суперхрани. Плодовите фрешове и смутита често заменят твърдата храна. + +И какво мислите установява зъболекаря след една година? Шестнадесет (Да! 16!!) кариеса!! + +Няма да осъждам избора на Мария да се храни според своите разбирания. + +Няма да чета лекции колко е полезно или вредно здравословното хранене. + +Няма да ви развивам научни теории защо са се получили тези кариеси. + +Искам само да ви дам няколко практически съвета **как да подобрите състоянието на зъбите си**, ако храната ви изключва една или няколко групи храни или страдате от **множествени кариеси** без ясно видима причина. + +1. **Голямото трио - Витамин Д, витамин К2 и витамин А** +Калцият е Супермен за вашите зъби. Но той не може да дойде и да изиграе своята роля да поправя и заздравява емайла и дентина, ако организмът не може да го складира на правилните места. Витамин К2 кара Калция от храната да се връща към зъбите. Витамин Д подобрява абсорбцията на Калций в червата. Витамин А участва във формирането на костите и зъбите. Това са трите витамина, които работят в защита на вашите зъби от кариес. **А комбинирани заедно техният ефект е толкова голям, че могат да възстановят вече налични кариеси и емайлови изтривания.** + * Витамин К2: този малко известен (дори на лекарите) особняк е трудно да си набавите, ако сте на веганска диета, въпреки че най-богатата храна е вид ферментирала соя - [натто](http://en.wikipedia.org/wiki/Natt%C5%8D), до която, ако имате достъп - нямате проблем. Ако не сте фенове на соята обаче може да си набавите К2 от твърди и меки високомаслени сирена, особено ако са от сурово мляко. Други източници са органни меса, яйчният жълтък и рибен хайвер. Ако и вие като мен не обичате хапчета, но по някаква причина не можете да си осигурите този витамин с храната, то нямате друг избор освен да добавите една таблетка към дневното меню. **Убедена съм, че това е липсващата част в пъзела на кариесите при хората с множествен кариес.** + * Витамин Д: Слънчевият витамин! Ако живеете някъде на тропиците и всекидневно ви огрява силно слънце, най-вероятно имате достатъчно витамин Д. Ако обаче сте далеч от Екватора, то **нивата на този важен витамин-хормон се нуждаят от оптимизиране**, особено през зимата. В [България](http://www.bb-team.org/articles/4614_ednogodishen-eksperiment-s-vitamin-d) можем да постигнем добро ниво на витамин Д от май до септември и то ако ежедневно се излагаме на слънце за 2-3 часа по оскъдно облекло. Т.е. суплементирайте с витамин Д почти целогодишно. За предпочитане е да си набавите Д3, а не Д2 форма. + * Витамин А: Да, витамин А е най-ценната съставка на оранжевите моркови или сладките картофи. Обаче при тях получаваме **бета-каротен, а нашите тела търсят витамин А (каротен)**. Повечето хора нямат проблем да превърнат провитамина във витамин, но при някои това не се случва, в това число **децата**, диабетно болни и хора с проблеми на щитовидната жлеза. Освен оранжевите плодове и зеленчуци, богат източник на витамин А са зеленолистните, яйчният жълтък, черният дроб, пълномаслено мляко. Тъй като витамин А е мастно-разтворим, винаги добавяйте [полезна мазнина](/blog/2014-04-08-%D0%B7%D0%B0%D1%89%D0%BE-%D0%BD%D0%B8%D0%BA%D0%BE%D0%B3%D0%B0-%D0%BD%D0%B5-%D1%82%D1%80%D1%8F%D0%B1%D0%B2%D0%B0-%D0%B4%D0%B0-%D1%8F%D0%B4%D0%B5%D1%82%D0%B5-%D0%BC%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D0%BD/) към салатите. + +2. Как да предпазите зъбите си от киселинни атаки. Ако четете блогове и статии за здравословно хранене, със сигурност сте запознати със **благотворното влияние на ферментиралите храни върху човешкото здраве**. И то безспорно е такова, но има едно "но". Ако след хранене с ферментирали, кисели храни имате чувствителност в зъбите, то значи че те са подложени на ерозивното действие на киселината. +Друга киселинна атака идва от прясно изцедените плодови сокове, особено тези, които съдържат цитрусови плодове, ябълки, грозде. Защо фрешовете не са най-добрият избор може да прочетете [тук](/blog/2014-04-02-%D1%82%D1%80%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%BA%D0%BE%D0%B8%D1%82%D0%BE-%D1%81%D0%B5-%D0%B7%D0%B0%D0%B1%D0%BB%D1%83%D0%B6%D0%B4%D0%B0%D0%B2%D0%B0%D1%82%D0%B5-%D1%87%D0%B5-%D1%81%D0%B0-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%B8/). Ако все пак това е важна част от диетата ви, която не може да бъде изключена, следвайте тези правила: + * Пийте киселата напитка през **сламка** и възможно най-бързо. + * След киселинно хранене **изплакнете устата си** с разтвор от половин лъжичка сода за хляб в половин чаша вода. Содата неутрализира остантъчната киселинност в устата. + * **Не мийте зъбите си** поне 1 час след прием на кисела напитка или храна. Обяснявам: преди слюнката да е извършила своето реминерализиращо действие върху зъбите, емайлът е крехък заради киселинната баня в който е бил току-що. Ако започнете да четкате зъбите, докато балансът не се е възстановил, вие ще нараните допълнително крехкият емайл. Получават се микропукнатини и микроскопични кариеси, особено на местата, където емайлът е на тънък слой: около пломби, при резците, около зъбната шийка (до венеца). + +3. Не забравяйте **хигиената**. Въпреки, че се храните с подбрани продукти, без замърсявания и химикали не забравяйте редовната хигиена. Ежедневното изчеткване на зъбите с [подходяща четка и паста](/blog/2014-02-19-%D0%BA%D0%BE%D0%B8-%D1%81%D0%B0-%D0%BD%D0%B0%D0%B8%CC%86-%D0%B4%D0%BE%D0%B1%D1%80%D0%B8%D1%82%D0%B5-%D1%87%D0%B5%D1%82%D0%BA%D0%B0-%D0%B8-%D0%BF%D0%B0%D1%81%D1%82%D0%B0-%D0%B7%D0%B0-%D0%B7%D1%8A%D0%B1%D0%B8/) е задължително. Както и ежедневното почистване на междузъбните пространства с **конец за зъби**. Ако се храните изключително със сурова храна, не забравяйте да посещавате редовно своят стоматолог. Нека той ви препоръча подходящи средства за хигиена, за да се предотврати изтриването на зъбите, което е често срещано при такъв тип хранене. + +Съвременната наука се развива непрекъснато и вече лечението на кариеса не е свързано само с **болезнени посещения при зъболекаря**. Бъдете информирани за избора, който правите относно здравето си и винаги изисквайте най-доброто за себе си и децата си! + +За да завърша днешната история ще ви разкажа какво се случи с кариесите на Мария: **След шест месеца, тя има четири нови пломби, а останалите дванадесет спряха развитието си и се очаква зъбите да се възстановят напълно**. И Мария си върна усмивката, само защото спазваше съветите, които споделих и с вас днес! ;T; +I"1

    Днес искам да ви разкажа една история. Главен герой в нея е (да я наречем) Мария.

    + +

    Мария е на 26 години, образована жена, с многостранни интереси. Тя също така държи на здравето си и веднъж годишно ходи на профилактичен преглед при зъболекаря си. На 25 години тя има 2 пломби, поставени в детските й години. Не пуши, не пие газирано и не яде вредна храна. Отвреме-навреме си позволява по малко шоколад и чаша алкохол. Спортува редовно. Общото и здравословно състояние е чудесно. Зъбите и венците й са в перфектно състояние.

    + +

    През последните 12 месеца Мария решава да промени драстично начина си на живот и да започне да се храни само със сурова храна, като изключи също така всички животински продукти. Менюто и се състои само от плодове, зеленчуци, ядки, растителни мазнини и няколко вида водорасли и т.нар. суперхрани. Плодовите фрешове и смутита често заменят твърдата храна.

    + +

    И какво мислите установява зъболекаря след една година? Шестнадесет (Да! 16!!) кариеса!!

    + +

    Няма да осъждам избора на Мария да се храни според своите разбирания.

    + +

    Няма да чета лекции колко е полезно или вредно здравословното хранене.

    + +

    Няма да ви развивам научни теории защо са се получили тези кариеси.

    + +

    Искам само да ви дам няколко практически съвета как да подобрите състоянието на зъбите си, ако храната ви изключва една или няколко групи храни или страдате от множествени кариеси без ясно видима причина.

    + +
      +
    1. +Голямото трио - Витамин Д, витамин К2 и витамин А +Калцият е Супермен за вашите зъби. Но той не може да дойде и да изиграе своята роля да поправя и заздравява емайла и дентина, ако организмът не може да го складира на правилните места. Витамин К2 кара Калция от храната да се връща към зъбите. Витамин Д подобрява абсорбцията на Калций в червата. Витамин А участва във формирането на костите и зъбите. Това са трите витамина, които работят в защита на вашите зъби от кариес. А комбинирани заедно техният ефект е толкова голям, че могат да възстановят вече налични кариеси и емайлови изтривания. +
        +
      • Витамин К2: този малко известен (дори на лекарите) особняк е трудно да си набавите, ако сте на веганска диета, въпреки че най-богатата храна е вид ферментирала соя - натто, до която, ако имате достъп - нямате проблем. Ако не сте фенове на соята обаче може да си набавите К2 от твърди и меки високомаслени сирена, особено ако са от сурово мляко. Други източници са органни меса, яйчният жълтък и рибен хайвер. Ако и вие като мен не обичате хапчета, но по някаква причина не можете да си осигурите този витамин с храната, то нямате друг избор освен да добавите една таблетка към дневното меню. Убедена съм, че това е липсващата част в пъзела на кариесите при хората с множествен кариес. +
      • +
      • Витамин Д: Слънчевият витамин! Ако живеете някъде на тропиците и всекидневно ви огрява силно слънце, най-вероятно имате достатъчно витамин Д. Ако обаче сте далеч от Екватора, то нивата на този важен витамин-хормон се нуждаят от оптимизиране, особено през зимата. В България можем да постигнем добро ниво на витамин Д от май до септември и то ако ежедневно се излагаме на слънце за 2-3 часа по оскъдно облекло. Т.е. суплементирайте с витамин Д почти целогодишно. За предпочитане е да си набавите Д3, а не Д2 форма.
      • +
      • Витамин А: Да, витамин А е най-ценната съставка на оранжевите моркови или сладките картофи. Обаче при тях получаваме бета-каротен, а нашите тела търсят витамин А (каротен). Повечето хора нямат проблем да превърнат провитамина във витамин, но при някои това не се случва, в това число децата, диабетно болни и хора с проблеми на щитовидната жлеза. Освен оранжевите плодове и зеленчуци, богат източник на витамин А са зеленолистните, яйчният жълтък, черният дроб, пълномаслено мляко. Тъй като витамин А е мастно-разтворим, винаги добавяйте полезна мазнина към салатите.
      • +
      +
    2. +
    3. Как да предпазите зъбите си от киселинни атаки. Ако четете блогове и статии за здравословно хранене, със сигурност сте запознати със благотворното влияние на ферментиралите храни върху човешкото здраве. И то безспорно е такова, но има едно “но”. Ако след хранене с ферментирали, кисели храни имате чувствителност в зъбите, то значи че те са подложени на ерозивното действие на киселината. +Друга киселинна атака идва от прясно изцедените плодови сокове, особено тези, които съдържат цитрусови плодове, ябълки, грозде. Защо фрешовете не са най-добрият избор може да прочетете тук. Ако все пак това е важна част от диетата ви, която не може да бъде изключена, следвайте тези правила: +
        +
      • Пийте киселата напитка през сламка и възможно най-бързо.
      • +
      • След киселинно хранене изплакнете устата си с разтвор от половин лъжичка сода за хляб в половин чаша вода. Содата неутрализира остантъчната киселинност в устата.
      • +
      • +Не мийте зъбите си поне 1 час след прием на кисела напитка или храна. Обяснявам: преди слюнката да е извършила своето реминерализиращо действие върху зъбите, емайлът е крехък заради киселинната баня в който е бил току-що. Ако започнете да четкате зъбите, докато балансът не се е възстановил, вие ще нараните допълнително крехкият емайл. Получават се микропукнатини и микроскопични кариеси, особено на местата, където емайлът е на тънък слой: около пломби, при резците, около зъбната шийка (до венеца).
      • +
      +
    4. +
    5. Не забравяйте хигиената. Въпреки, че се храните с подбрани продукти, без замърсявания и химикали не забравяйте редовната хигиена. Ежедневното изчеткване на зъбите с подходяща четка и паста е задължително. Както и ежедневното почистване на междузъбните пространства с конец за зъби. Ако се храните изключително със сурова храна, не забравяйте да посещавате редовно своят стоматолог. Нека той ви препоръча подходящи средства за хигиена, за да се предотврати изтриването на зъбите, което е често срещано при такъв тип хранене.
    6. +
    + +

    Съвременната наука се развива непрекъснато и вече лечението на кариеса не е свързано само с болезнени посещения при зъболекаря. Бъдете информирани за избора, който правите относно здравето си и винаги изисквайте най-доброто за себе си и децата си!

    + +

    За да завърша днешната история ще ви разкажа какво се случи с кариесите на Мария: След шест месеца, тя има четири нови пломби, а останалите дванадесет спряха развитието си и се очаква зъбите да се възстановят напълно. И Мария си върна усмивката, само защото спазваше съветите, които споделих и с вас днес!

    +;T; @I"P/blog/2014-06-07-Храната-като-лекарство-Маслото/;T{;{ ;I"G + + + + + + + Храната като лекарство: Маслото + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Храната като лекарство: Маслото +

    + +
    +
      +
    • + + June 7, 2014 +
    • +
    +
    + + +

    Ако искате крепко здраве и дълголетие, то яжте редовно масло! Наистина.. то е добро за вас и от него не се пълнее.

    + +
      +
    1. +

      Маслото е “пакетирано” с много важни и ценни витамини: витамин А, витамин Д и витамин К се откриват в големи количества в истинското масло. За тяхната роля относно здравето съм писала тук, тук и тук. И все пак ще повторя: Витамин А е ключов фактор при изграждането на костите и зъбите, нервната тъкан и очите. В маслото той се намира в най-лесната за усвояване от човека форма: ретинол. Витамин А, който се намира в оранжевите зеленчуци или се приема като синтетична добавка е бета-каротен. Той лесно се превръща в каротен от възрастни здрави индивиди. Но при деца, хора с диабет, тиреоидни проблеми, жлъчни заболявания или хранене бедно на мазнини това е невъзможно. За тях е задължителен приемът на витамин А от истински храни: масло, жълтък, черен дроб. +Витамин Д е всъщност хормон, който има влияние върху цялостното здраве и работи в комбинация с витамин А. Той подпомага абсорбцията му и предотвратява предозирането му. Най-добрият източник на витамин Д е слънцето, но често хората не могат да си набавят достатъчно чрез него. Една от най-честите причини за недостиг на витамин Д се среща при хора на нискомазнинно хранене и/или диета без животински продукти. +Витамин К Ако си спомняте в проучванията на Д-р Уестън Прайс се споменаваше “вълшебната” съставка, която предпазва от кариес и лекува вече налични такива. Той го нарича Активатор Х. Истината е, че това е витамин К2. Най-добрият източник на този витамин е масло, направено от млякото на крави, хранени само на паша. Такова масло е изключително ценна храна, която трябва да присъства ежедневно в храната на децата и на цялото семейство.

      +
    2. +
    3. +

      Маслото има здравословни ползи за вашето тяло. Маслото е най-богатият източник на линолеова киселина (CLA) и бутирова киселина. Тези мастни киселини имат доказан противораков ефект при рак на гърдата и тумори в млечните жлези, антивъзпалително действие в стомаха и червата и имат стимулиращ ефект върху имунитета на бързорастящия и развиващ се организъм при децата.

      +
    4. +
    5. +

      От маслото НЕ се пълнее! То е източник на късоверижни и средноверижни мастни киселини, чиито молекули не се откриват никъде в складираната мастна тъкан в тялото. Всъщност тези мазнини имат важна роля в поддържането на теглото и контролът на апетита. +Първо, мазнината стимулира освобождаването на жлъчна течност, която подпомага усвояването на витамините от храната, елиминира токсините и изхвърля остарелите хормони извън тялото. +Друг полезен ефект е, че мастните киселини от маслото забавят повишаването на кръвната захар и по този начин създават усещане за ситост, което се запазва по-дълго. Дори при прием на захар и други бързо усвоими въглехидрати (хляб, сладкиши), комбинацията им с масло стабилизира кръвната захар и човек няма онова чувство, че трябва да “похапне нещо сладичко” след основното хранене. И все пак това е доста неблагоприятна комбинация, от гледна точка на храносмилането, така че не я използвайте често. Това което трябва да правите, е да се храните с повече мазнини и достатъчно протеини. По този начин тялото ви няма да усеща глад дълго време, а така можете да контролирате приема на храна и да намалите излишното си тегло.

      +
    6. +
    + +

    Ами холестерола?

    +

    Спомняте ли си изследването на Ансел Кийс от 1950г, което анатемосва животинските мазнини и пропагандира зърнените култури и растителните мазнини? Е, вече неколкократно е доказано, че неговата хипотеза, че сърдечно-съдовите заболявания се причиняват от консумацията на холестерол е грешна! Новите проучвания доказват, че нискомазнинното хранене повишава триглицеридите, и намалява HDL холестеролът, а вие със сигурност не искате това, повярвайте ми! Ниските нива на холестерола се свързват с много заболявания сред които:

    + +
      +
    • +

      по-висока смъртност 1, 2, 3

      +
    • +
    • +

      повишен риск от депресии 4, 5

      +
    • +
    • +

      повишен риск от насилствено поведение и суицидни действия 6, 7

      +
    • +
    • +

      повишен риск от деменция и болест на Алцхаймер 8, 9

      +
    • +
    + +

    Популярен е мита, че HDL холестеролът е добър, а LDL холестеролът е лош. Всъщност един подвид на LDL холестеролът е този, който наранява артериите и в последствие по тях полепват плаки и токсини. Това са малки и плътни частици холестерол. Те се превръщат в безопасните големи и пухкави частици LDL холестерол, когато се консумират полезни наситени мазнини като яйца, масло, кокосово масло и предпазват от инфаркт. Ето още интересна информация по темата.

    + +

    Е, убедихте ли се, че маслото е суперхрана? Надявам се тази статия да ви е била интересна и полезна. Съветвам ви винаги да избирате висококачествено масло, направено от млякото на крави, отглеждани на паша. Такова масло е безценен продукт, който трябва да присъства ежедневно на трапезата ви!

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"%)###Ако искате крепко здраве и дълголетие, то яжте редовно масло! Наистина.. то е добро за вас и от него не се пълнее. + +1. **Маслото е "пакетирано" с много важни и ценни витамини**: витамин А, витамин Д и витамин К се откриват в големи количества в истинското масло. За тяхната роля относно здравето съм писала [тук](/blog/2014-03-17-%D0%B2%D0%B8%D1%82%D0%B0%D0%BC%D0%B8%D0%BD%D0%B8/), [тук](/blog/2014-02-24-%D0%B2%D0%B8%D0%B6%D1%82%D0%B5-%D1%82%D0%B0%D0%B8%CC%86%D0%BD%D0%B0%D1%82%D0%B0-%D0%B7%D0%B0-%D0%BF%D0%B5%D1%80%D1%84%D0%B5%D0%BA%D1%82%D0%BD%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8/) и [тук](/blog/2014-06-02-%D0%BA%D0%B0%D0%BA-%D0%BC%D0%B0%D1%80%D0%B8%D1%8F-%D1%81%D0%B8-%D0%B2%D1%8A%D1%80%D0%BD%D0%B0-%D1%83%D1%81%D0%BC%D0%B8%D0%B2%D0%BA%D0%B0%D1%82%D0%B0/). И все пак ще повторя: **Витамин А** е ключов фактор при изграждането на костите и зъбите, нервната тъкан и очите. В маслото той се намира в най-лесната за усвояване от човека форма: ретинол. Витамин А, който се намира в оранжевите зеленчуци или се приема като синтетична добавка е бета-каротен. Той лесно се превръща в каротен от възрастни здрави индивиди. Но при деца, хора с диабет, тиреоидни проблеми, жлъчни заболявания или хранене бедно на мазнини това е невъзможно. За тях е задължителен приемът на витамин А от истински храни: масло, жълтък, черен дроб. +**Витамин Д** е всъщност хормон, който има влияние върху цялостното здраве и работи в комбинация с витамин А. Той подпомага абсорбцията му и предотвратява предозирането му. Най-добрият източник на витамин Д е слънцето, но често хората не могат да си набавят достатъчно чрез него. Една от най-честите причини за недостиг на витамин Д се среща при хора на нискомазнинно хранене и/или диета без животински продукти. +**Витамин К** Ако си спомняте в проучванията на [Д-р Уестън](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/) [Прайс](/blog/2014-03-03-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-2/) се споменаваше "вълшебната" съставка, която предпазва от кариес и лекува вече налични такива. Той го нарича Активатор Х. Истината е, че това е витамин К2. Най-добрият източник на този витамин е масло, направено от млякото на крави, хранени само на паша. Такова масло е изключително ценна храна, която трябва да присъства ежедневно в храната на децата и на цялото семейство. + +2. **Маслото има здравословни ползи за вашето тяло**. Маслото е най-богатият източник на линолеова киселина (CLA) и бутирова киселина. Тези мастни киселини имат доказан [противораков](http://jn.nutrition.org/content/127/6/1055.short?related-urls=yes&legid=nutrition;127/6/1055) [ефект](http://ar.iiarjournals.org/content/26/1A/27.long) при [рак на гърдата](http://link.springer.com/article/10.1007%2Fs11745-009-3288-4) и [тумори в млечните жлези](http://www.ncbi.nlm.nih.gov/pubmed/10386321), [антивъзпалително](http://www.ncbi.nlm.nih.gov/pubmed/11989838) [действие](http://www.fasebj.org/content/early/2000/12/02/fj.00-0359fje.long) в стомаха и червата и имат стимулиращ ефект върху имунитета на бързорастящия и развиващ се организъм при децата. + +3. **От маслото НЕ се пълнее!** То е източник на късоверижни и средноверижни мастни киселини, чиито молекули не се откриват никъде в складираната мастна тъкан в тялото. Всъщност тези мазнини имат важна роля в поддържането на теглото и контролът на апетита. +Първо, мазнината стимулира освобождаването на жлъчна течност, която подпомага усвояването на витамините от храната, елиминира токсините и изхвърля остарелите хормони извън тялото. +Друг полезен ефект е, че мастните киселини от маслото забавят повишаването на кръвната захар и по този начин създават усещане за ситост, което се запазва по-дълго. Дори при прием на захар и други бързо усвоими въглехидрати (хляб, сладкиши), комбинацията им с масло стабилизира кръвната захар и човек няма онова чувство, че трябва да "похапне нещо сладичко" след основното хранене. И все пак това е доста неблагоприятна комбинация, от гледна точка на храносмилането, така че не я използвайте често. Това което трябва да правите, е да се храните с повече мазнини и достатъчно протеини. По този начин тялото ви няма да усеща глад дълго време, а така можете да контролирате приема на храна и да намалите излишното си тегло. + +####Ами холестерола? +Спомняте ли си [изследването на Ансел Кийс](/blog/2014-03-26-%D0%B2%D0%B5%D0%B3%D0%B5%D1%82%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D1%8F%D1%82-%D0%BC%D0%B8%D1%82/) от 1950г, което анатемосва животинските мазнини и пропагандира зърнените култури и растителните мазнини? Е, вече неколкократно е доказано, че неговата хипотеза, че сърдечно-съдовите заболявания се причиняват от консумацията на холестерол е грешна! Новите проучвания доказват, че нискомазнинното хранене [повишава триглицеридите](http://www.jci.org/articles/view/6572), и [намалява HDL холестеролът](http://www.ncbi.nlm.nih.gov/pmc/articles/PMC296399/), а вие със сигурност не искате това, повярвайте ми! Ниските нива на холестерола се свързват с много заболявания сред които: + +* по-висока смъртност [1](http://www.sciencedirect.com/science/article/pii/S0022395608002525), [2](http://www.ncbi.nlm.nih.gov/pubmed/21951982), [3](http://www.amjmed.com/article/S0002-934300354-1/abstract) + +* повишен риск от депресии [4](psychosomaticmedicine), [5](http://www.sciencedirect.com/science/article/pii/0140673693925569) + +* повишен риск от насилствено поведение и суицидни действия [6](http://www.psychologytoday.com/blog/the-breakthrough-depression-solution/201106/low-cholesterol-and-its-psychological-effects), [7](http://www.ncbi.nlm.nih.gov/pubmed/11104842) + +* повишен риск от деменция и болест на Алцхаймер [8](http://www.neurology.org/content/64/10/1689.abstract), [9](http://people.csail.mit.edu/seneff/EJIM_PUBLISHED.pdf) + +Популярен е мита, че HDL холестеролът е добър, а LDL холестеролът е лош. Всъщност един подвид на LDL холестеролът е този, който наранява артериите и в последствие по тях полепват плаки и токсини. Това са малки и плътни частици холестерол. Те се превръщат в безопасните големи и пухкави частици LDL холестерол, когато се консумират полезни наситени мазнини като яйца, масло, кокосово масло и предпазват от инфаркт. [Ето](http://authoritynutrition.com/top-9-biggest-lies-about-dietary-fat-and-cholesterol/) още интересна информация по темата. + +Е, убедихте ли се, че маслото е суперхрана? Надявам се тази статия да ви е била интересна и полезна. Съветвам ви винаги да избирате висококачествено масло, направено от млякото на крави, отглеждани на паша. Такова масло е безценен продукт, който трябва да присъства ежедневно на трапезата ви!;T; +I"{+

    Ако искате крепко здраве и дълголетие, то яжте редовно масло! Наистина.. то е добро за вас и от него не се пълнее.

    + +
      +
    1. +

      Маслото е “пакетирано” с много важни и ценни витамини: витамин А, витамин Д и витамин К се откриват в големи количества в истинското масло. За тяхната роля относно здравето съм писала тук, тук и тук. И все пак ще повторя: Витамин А е ключов фактор при изграждането на костите и зъбите, нервната тъкан и очите. В маслото той се намира в най-лесната за усвояване от човека форма: ретинол. Витамин А, който се намира в оранжевите зеленчуци или се приема като синтетична добавка е бета-каротен. Той лесно се превръща в каротен от възрастни здрави индивиди. Но при деца, хора с диабет, тиреоидни проблеми, жлъчни заболявания или хранене бедно на мазнини това е невъзможно. За тях е задължителен приемът на витамин А от истински храни: масло, жълтък, черен дроб. +Витамин Д е всъщност хормон, който има влияние върху цялостното здраве и работи в комбинация с витамин А. Той подпомага абсорбцията му и предотвратява предозирането му. Най-добрият източник на витамин Д е слънцето, но често хората не могат да си набавят достатъчно чрез него. Една от най-честите причини за недостиг на витамин Д се среща при хора на нискомазнинно хранене и/или диета без животински продукти. +Витамин К Ако си спомняте в проучванията на Д-р Уестън Прайс се споменаваше “вълшебната” съставка, която предпазва от кариес и лекува вече налични такива. Той го нарича Активатор Х. Истината е, че това е витамин К2. Най-добрият източник на този витамин е масло, направено от млякото на крави, хранени само на паша. Такова масло е изключително ценна храна, която трябва да присъства ежедневно в храната на децата и на цялото семейство.

      +
    2. +
    3. +

      Маслото има здравословни ползи за вашето тяло. Маслото е най-богатият източник на линолеова киселина (CLA) и бутирова киселина. Тези мастни киселини имат доказан противораков ефект при рак на гърдата и тумори в млечните жлези, антивъзпалително действие в стомаха и червата и имат стимулиращ ефект върху имунитета на бързорастящия и развиващ се организъм при децата.

      +
    4. +
    5. +

      От маслото НЕ се пълнее! То е източник на късоверижни и средноверижни мастни киселини, чиито молекули не се откриват никъде в складираната мастна тъкан в тялото. Всъщност тези мазнини имат важна роля в поддържането на теглото и контролът на апетита. +Първо, мазнината стимулира освобождаването на жлъчна течност, която подпомага усвояването на витамините от храната, елиминира токсините и изхвърля остарелите хормони извън тялото. +Друг полезен ефект е, че мастните киселини от маслото забавят повишаването на кръвната захар и по този начин създават усещане за ситост, което се запазва по-дълго. Дори при прием на захар и други бързо усвоими въглехидрати (хляб, сладкиши), комбинацията им с масло стабилизира кръвната захар и човек няма онова чувство, че трябва да “похапне нещо сладичко” след основното хранене. И все пак това е доста неблагоприятна комбинация, от гледна точка на храносмилането, така че не я използвайте често. Това което трябва да правите, е да се храните с повече мазнини и достатъчно протеини. По този начин тялото ви няма да усеща глад дълго време, а така можете да контролирате приема на храна и да намалите излишното си тегло.

      +
    6. +
    + +

    Ами холестерола?

    +

    Спомняте ли си изследването на Ансел Кийс от 1950г, което анатемосва животинските мазнини и пропагандира зърнените култури и растителните мазнини? Е, вече неколкократно е доказано, че неговата хипотеза, че сърдечно-съдовите заболявания се причиняват от консумацията на холестерол е грешна! Новите проучвания доказват, че нискомазнинното хранене повишава триглицеридите, и намалява HDL холестеролът, а вие със сигурност не искате това, повярвайте ми! Ниските нива на холестерола се свързват с много заболявания сред които:

    + +
      +
    • +

      по-висока смъртност 1, 2, 3

      +
    • +
    • +

      повишен риск от депресии 4, 5

      +
    • +
    • +

      повишен риск от насилствено поведение и суицидни действия 6, 7

      +
    • +
    • +

      повишен риск от деменция и болест на Алцхаймер 8, 9

      +
    • +
    + +

    Популярен е мита, че HDL холестеролът е добър, а LDL холестеролът е лош. Всъщност един подвид на LDL холестеролът е този, който наранява артериите и в последствие по тях полепват плаки и токсини. Това са малки и плътни частици холестерол. Те се превръщат в безопасните големи и пухкави частици LDL холестерол, когато се консумират полезни наситени мазнини като яйца, масло, кокосово масло и предпазват от инфаркт. Ето още интересна информация по темата.

    + +

    Е, убедихте ли се, че маслото е суперхрана? Надявам се тази статия да ви е била интересна и полезна. Съветвам ви винаги да избирате висококачествено масло, направено от млякото на крави, отглеждани на паша. Такова масло е безценен продукт, който трябва да присъства ежедневно на трапезата ви!

    +;T; @I"Y/blog/2014-06-15-как-да-се-откажем-от-вредните-навици/;T{;{ ;I"A + + + + + + + Как да се откажем от вредните навици? + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Как да се откажем от вредните навици? +

    + +
    +
      +
    • + + June 15, 2014 +
    • +
    +
    + + +

    Случвало ли ви се е някога да решите да се откажете от някой вреден навик и да се провалите? На мен да! И съм сигурна, че на много от вас също!

    + +

    Но защо се получава така? Нали осъзнато решаваме, че нещо е вредно за нас, че не се нуждаем от него в живота си ни и носи само негативи… и все пак е толкова трудно да спрем, да изкореним гадния навик да пушим, да си лягаме късно, да ядем чипс и т.н.

    + +

    Това се случва, защото отказвайки се от нещото, вие се обричате на провал!

    + +

    За да се откажете от нещо и да нямате нужда от него в ежедневието си се налага да мобилизирате цялата си воля, а това е бързо изчерпаем ресурс. Знаете какво се случва: всеки път когато отворите хладилника виждате бутилката с Кола и се изискват сериозни усилия да не си налеете една чаша, както е било до вчера. Опитвате се да се разсеете с нещо, но след час отново стигате до хладилника и Колата пак е там… и волята ви вече не е толкова силна.

    + +

    За да премахнете един лош навик не трябва да се опитвате да СПРЕТЕ да го правите, а трябва да го ЗАМЕНИТЕ с нещо полезно.

    + +

    Ето как да премахнете три вредни навика и да ги замените с полезни:

    + +

    1.Да спрете вредните газирани напитки от типа на Кока-Кола

    + +

    Тези от вас, които ме познават сигурно си спомнят, че до преди 3 години аз не се разделях с бутилката диетична кола. За тези, които не ме познават обяснявам: пиех литри кола на ден. С диетичната кола се изчерпваха всички течности, които приемах за деня. Тя беше напитка, служеше ми и за десерт, пиех кола преди лягане, след ставане, по всяко време. Трябва да призная, че неколкократно съм правила опити да я спра, но след максимум няколко седмици се връщах към вредния навик и наваксвах и за пропуснатите дни. Защо се получаваше така? Защото решавах, че ще спра колата и ще пия само вода. Е, колкото и благородно да звучи пиенето само на чиста вода, след като си свикнал със сладкия, газиран вкус… ами просто не се получава. Затова замених колата с газирана вода с парче лимон или лайм, изстуден плодов или билков чай, в по-студеното време топъл чай, например ройбос или мента. Така напитката все пак има вкус, без да е пълна с вредности като подсладители, оцветители и хиляда Е-та. Дори на заведение можете да си поръчате всички тези здравословни напитки, които по никакъв начин няма да ви отнемат нещо от приятното изкарване с приятели.

    + +

    2.Да спрете да похапвате между другото чипс, бисквити, бонбони

    + +

    Да спрете вредната боклучава храна е страхотна идея, но тя няма да бъде успешно реализирана, ако не си направите план! +Ако имате навика да похапвате чипс или солети между храненията, първо трябва да помислите защо имате тази нужда. +Възможно ли е основното ви хранене да не е достатъчно засищащо и скоро след това да изпитвате глад и да посягате към вредната храна в лъскава опаковка? Ако се опитвате да спазвате някакъв режим или да ограничавате калориите в основните хранения, от изключителна важност е да преценявате добре количеството и качеството на нутриентите си, защото ако се лишавате от протеини или мазнини тялото ви ще се опита да си навакса. Тогава идва момента на умопомрачение, в който унищожавате цял шоколад за 10 минути и се чувствате виновни… и все още гладни! +Ако пък похапвате от скука пред телевизора или пред компютъра, то значи правите това неосъзнато. За да коригирате този лош навик трябва да положите усилие и да подбирате храната по-внимателно.

    + +

    За преходният период между похапването на джънк и премахването му от вашето ежедневие трябва да намерите здравословен заместител. Например морков, нарязан на пръчици, стъбла целина, сурови ядки (не прекалявайте с тях), резенчета зелена ябълка, лентички от разноцветни чушки или дори можете да си направите домашни соленки от семена и подправки по ваш вкус.

    + +

    3.Да спрете да се успивате сутрин.

    + +

    Да ставате винаги в последната минута и да бързате за работа всяка сутрин е много стресиращ навик. Но как да промените това? Как да се научите да ставате на време и денят ви да започва с усмивка на лицето? Лесно е: трябва да си лягате на време. +Да, знам, че е трудно да оставиш по средата интересният филм или книга и да легнеш да спиш. Още по-трудно е да зарежеш по средата прането за гладене или проекта, чийто краен срок е утре. Ето какво можете да направите: Навийте си аларма, която да ви сигнализира, че трябва да си лягате. Ключовият момент е да оставите 30-45 мин толеранс до момента в който трябва да си миете зъбите и да сте на път към леглото. Ако навиете алармата за часа в който вече се предполага, че трябва да сте легнали и реално не успеете да го спазите това ще ви изнерви и ще зарежете цялата схема. За това оставете този интервал, в който спокойно можете да приключите деня си и същевременно да си легнете на време.

    + +

    Ако все пак не успеете да се вместите в този интервал, тук можете да изчислите в колко часа трябва да си легнете, за да се събудите свежи и отпочинали, в синхрон с циклите на почивка и работа на мозъка. Аз го ползвам понякога и според мен работи успешно.

    + +

    В заключение: природата не търпи вакуум! За да преустановите един навик, той трябва да бъде заменен с друг. Иначе сте обречени на провал. Ако искате да успеете ви трябва план!

    + +

    Вие с кой вреден навик сте се преборили? Как? Напишете ми в коментар.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"$Случвало ли ви се е някога да решите да се откажете от някой вреден навик и да се провалите? На мен да! И съм сигурна, че на много от вас също! + +Но защо се получава така? Нали осъзнато решаваме, че нещо е вредно за нас, че не се нуждаем от него в живота си ни и носи само негативи... и все пак е толкова трудно да спрем, да изкореним гадния навик да пушим, да си лягаме късно, да ядем чипс и т.н. + +Това се случва, защото отказвайки се от нещото, вие се обричате на провал! + +За да се откажете от нещо и да нямате нужда от него в ежедневието си се налага да мобилизирате цялата си воля, а това е бързо изчерпаем ресурс. Знаете какво се случва: всеки път когато отворите хладилника виждате бутилката с Кола и се изискват сериозни усилия да не си налеете една чаша, както е било до вчера. Опитвате се да се разсеете с нещо, но след час отново стигате до хладилника и Колата пак е там... и волята ви вече не е толкова силна. + +За да премахнете един лош навик не трябва да се опитвате да СПРЕТЕ да го правите, а трябва да го ЗАМЕНИТЕ с нещо полезно. + +Ето как да премахнете три вредни навика и да ги замените с полезни: + +1.**Да спрете вредните газирани напитки** от типа на Кока-Кола + +Тези от вас, които ме познават сигурно си спомнят, че до преди 3 години аз не се разделях с бутилката диетична кола. За тези, които не ме познават обяснявам: пиех литри кола на ден. С диетичната кола се изчерпваха всички течности, които приемах за деня. Тя беше напитка, служеше ми и за десерт, пиех кола преди лягане, след ставане, по всяко време. Трябва да призная, че неколкократно съм правила опити да я спра, но след максимум няколко седмици се връщах към вредния навик и наваксвах и за пропуснатите дни. Защо се получаваше така? Защото решавах, че ще спра колата и ще пия само вода. Е, колкото и благородно да звучи пиенето само на чиста вода, след като си свикнал със сладкия, газиран вкус... ами просто не се получава. Затова замених колата с газирана вода с парче лимон или лайм, изстуден плодов или билков чай, в по-студеното време топъл чай, например ройбос или мента. Така напитката все пак има вкус, без да е пълна с вредности като подсладители, оцветители и хиляда Е-та. Дори на заведение можете да си поръчате всички тези здравословни напитки, които по никакъв начин няма да ви отнемат нещо от приятното изкарване с приятели. + +2.**Да спрете да похапвате между другото** чипс, бисквити, бонбони + +Да спрете вредната боклучава храна е страхотна идея, но тя няма да бъде успешно реализирана, ако не си направите план! +Ако имате навика да похапвате чипс или солети между храненията, първо трябва да помислите защо имате тази нужда. +Възможно ли е основното ви хранене да не е достатъчно засищащо и скоро след това да изпитвате глад и да посягате към вредната храна в лъскава опаковка? Ако се опитвате да спазвате някакъв режим или да ограничавате калориите в основните хранения, от изключителна важност е да преценявате добре количеството и качеството на нутриентите си, защото **ако се лишавате от протеини или мазнини тялото ви ще се опита да си навакса**. Тогава идва момента на умопомрачение, в който унищожавате цял шоколад за 10 минути и се чувствате виновни... и все още гладни! +Ако пък похапвате от скука пред телевизора или пред компютъра, то значи правите това неосъзнато. За да коригирате този лош навик трябва да положите усилие и да подбирате храната по-внимателно. + +За преходният период между похапването на джънк и премахването му от вашето ежедневие трябва да намерите здравословен заместител. Например морков, нарязан на пръчици, стъбла целина, сурови ядки (не прекалявайте с тях), резенчета зелена ябълка, лентички от разноцветни чушки или дори можете да си направите домашни соленки от семена и подправки по ваш вкус. + +3.**Да спрете да се успивате** сутрин. + +Да ставате винаги в последната минута и да бързате за работа всяка сутрин е много стресиращ навик. Но как да промените това? Как да се научите да ставате на време и денят ви да започва с усмивка на лицето? Лесно е: трябва да си лягате на време. +Да, знам, че е трудно да оставиш по средата интересният филм или книга и да легнеш да спиш. Още по-трудно е да зарежеш по средата прането за гладене или проекта, чийто краен срок е утре. Ето какво можете да направите: Навийте си аларма, която да ви сигнализира, че трябва да си лягате. Ключовият момент е да оставите 30-45 мин толеранс до момента в който трябва да си миете зъбите и да сте на път към леглото. Ако навиете алармата за часа в който вече се предполага, че трябва да сте легнали и реално не успеете да го спазите това ще ви изнерви и ще зарежете цялата схема. За това оставете този интервал, в който спокойно можете да приключите деня си и същевременно да си легнете на време. + +Ако все пак не успеете да се вместите в този интервал, [тук](http://sleepyti.me/) можете да изчислите в колко часа трябва да си легнете, за да се събудите свежи и отпочинали, в синхрон с циклите на почивка и работа на мозъка. Аз го ползвам понякога и според мен работи успешно. + +В заключение: природата не търпи вакуум! За да преустановите един навик, той трябва да бъде заменен с друг. Иначе сте обречени на провал. **Ако искате да успеете ви трябва план!** + +Вие с кой вреден навик сте се преборили? Как? Напишете ми в коментар.;T; +I";%

    Случвало ли ви се е някога да решите да се откажете от някой вреден навик и да се провалите? На мен да! И съм сигурна, че на много от вас също!

    + +

    Но защо се получава така? Нали осъзнато решаваме, че нещо е вредно за нас, че не се нуждаем от него в живота си ни и носи само негативи… и все пак е толкова трудно да спрем, да изкореним гадния навик да пушим, да си лягаме късно, да ядем чипс и т.н.

    + +

    Това се случва, защото отказвайки се от нещото, вие се обричате на провал!

    + +

    За да се откажете от нещо и да нямате нужда от него в ежедневието си се налага да мобилизирате цялата си воля, а това е бързо изчерпаем ресурс. Знаете какво се случва: всеки път когато отворите хладилника виждате бутилката с Кола и се изискват сериозни усилия да не си налеете една чаша, както е било до вчера. Опитвате се да се разсеете с нещо, но след час отново стигате до хладилника и Колата пак е там… и волята ви вече не е толкова силна.

    + +

    За да премахнете един лош навик не трябва да се опитвате да СПРЕТЕ да го правите, а трябва да го ЗАМЕНИТЕ с нещо полезно.

    + +

    Ето как да премахнете три вредни навика и да ги замените с полезни:

    + +

    1.Да спрете вредните газирани напитки от типа на Кока-Кола

    + +

    Тези от вас, които ме познават сигурно си спомнят, че до преди 3 години аз не се разделях с бутилката диетична кола. За тези, които не ме познават обяснявам: пиех литри кола на ден. С диетичната кола се изчерпваха всички течности, които приемах за деня. Тя беше напитка, служеше ми и за десерт, пиех кола преди лягане, след ставане, по всяко време. Трябва да призная, че неколкократно съм правила опити да я спра, но след максимум няколко седмици се връщах към вредния навик и наваксвах и за пропуснатите дни. Защо се получаваше така? Защото решавах, че ще спра колата и ще пия само вода. Е, колкото и благородно да звучи пиенето само на чиста вода, след като си свикнал със сладкия, газиран вкус… ами просто не се получава. Затова замених колата с газирана вода с парче лимон или лайм, изстуден плодов или билков чай, в по-студеното време топъл чай, например ройбос или мента. Така напитката все пак има вкус, без да е пълна с вредности като подсладители, оцветители и хиляда Е-та. Дори на заведение можете да си поръчате всички тези здравословни напитки, които по никакъв начин няма да ви отнемат нещо от приятното изкарване с приятели.

    + +

    2.Да спрете да похапвате между другото чипс, бисквити, бонбони

    + +

    Да спрете вредната боклучава храна е страхотна идея, но тя няма да бъде успешно реализирана, ако не си направите план! +Ако имате навика да похапвате чипс или солети между храненията, първо трябва да помислите защо имате тази нужда. +Възможно ли е основното ви хранене да не е достатъчно засищащо и скоро след това да изпитвате глад и да посягате към вредната храна в лъскава опаковка? Ако се опитвате да спазвате някакъв режим или да ограничавате калориите в основните хранения, от изключителна важност е да преценявате добре количеството и качеството на нутриентите си, защото ако се лишавате от протеини или мазнини тялото ви ще се опита да си навакса. Тогава идва момента на умопомрачение, в който унищожавате цял шоколад за 10 минути и се чувствате виновни… и все още гладни! +Ако пък похапвате от скука пред телевизора или пред компютъра, то значи правите това неосъзнато. За да коригирате този лош навик трябва да положите усилие и да подбирате храната по-внимателно.

    + +

    За преходният период между похапването на джънк и премахването му от вашето ежедневие трябва да намерите здравословен заместител. Например морков, нарязан на пръчици, стъбла целина, сурови ядки (не прекалявайте с тях), резенчета зелена ябълка, лентички от разноцветни чушки или дори можете да си направите домашни соленки от семена и подправки по ваш вкус.

    + +

    3.Да спрете да се успивате сутрин.

    + +

    Да ставате винаги в последната минута и да бързате за работа всяка сутрин е много стресиращ навик. Но как да промените това? Как да се научите да ставате на време и денят ви да започва с усмивка на лицето? Лесно е: трябва да си лягате на време. +Да, знам, че е трудно да оставиш по средата интересният филм или книга и да легнеш да спиш. Още по-трудно е да зарежеш по средата прането за гладене или проекта, чийто краен срок е утре. Ето какво можете да направите: Навийте си аларма, която да ви сигнализира, че трябва да си лягате. Ключовият момент е да оставите 30-45 мин толеранс до момента в който трябва да си миете зъбите и да сте на път към леглото. Ако навиете алармата за часа в който вече се предполага, че трябва да сте легнали и реално не успеете да го спазите това ще ви изнерви и ще зарежете цялата схема. За това оставете този интервал, в който спокойно можете да приключите деня си и същевременно да си легнете на време.

    + +

    Ако все пак не успеете да се вместите в този интервал, тук можете да изчислите в колко часа трябва да си легнете, за да се събудите свежи и отпочинали, в синхрон с циклите на почивка и работа на мозъка. Аз го ползвам понякога и според мен работи успешно.

    + +

    В заключение: природата не търпи вакуум! За да преустановите един навик, той трябва да бъде заменен с друг. Иначе сте обречени на провал. Ако искате да успеете ви трябва план!

    + +

    Вие с кой вреден навик сте се преборили? Как? Напишете ми в коментар.

    +;T; @I"8/blog/2014-06-19-кафето-за-и-против/;T{;{ ;I"O= + + + + + + + Кафето: За и Против + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Кафето: За и Против +

    + +
    +
      +
    • + + June 19, 2014 +
    • +
    +
    + + +

    Любителите на кафе по света напоследък често имат поводи да се радват. Изследване след изследване доказват ползите за здравето от умерената консумация на кафе: предпазва от рак, предпазва от инсулт, предпазва от диабет, предпазва от развитие на сърдечно-съдови заболявания, за превенция от депресия, Алцхаймер, Паркинсон, бактериални инфекции, цироза и камъни в жлъчката. То подпомага горенето на мазнини и облекчава мускулната треска след тренировка! Има дори проучване, според което ако пиете кафе имате по-малка вероятност да умрете (независимо от причината). Т.е. кафето удължава живота ви!

    + +

    Ами не остава друго освен да вдигнем кафени чаши и да си кажем “Наздраве”, нали?

    + +

    Но да не бързаме толкова все пак…

    + +

    Всичко изброено може би е само причина да оправдаем зависимостта си към кафето. Вероятно знаете, че кофеинът има лек психотропен ефект върху мозъка. Ефектите като ободряване, подобряване на настроението, паметта и концентарцията се дължат на факта, че кофеинът блокира достъпа на инхибиращият (подтискащият мозъчната дейност) невротрансмитър Аденозин в мозъка, и по този начин другите два, които са стимулиращи мозъка - Норадреналин и Допамин увеличават концентрацията си. При ежедневен прием, обаче, тези ефекти намаляват и дори се изгубват, ако не се увеличи дозата на кофеина. За това кафето е една от най-разпространените пристрястяващи субстанции, използвана от хората днес.

    + +

    Друга причина в списъкът “Против” е, че зърната на кафето са семената на растението. Както всички семена и тези имат в състава си инхибитори и антинутриенти, чрез които те забавят покълването си и се защитават от животни, докато не попаднат на подходящо място, за да порастнат (топла и влажна почва). Тези антинутритенти попадат в червата и ги раздразват, а в последствие могат да доведат и до по-сериозни заболявания (синдром на пропускливите черва). Това разбира се се отнася не само за кафето и също от значение е честотата на консумацията му.

    + +

    Голям процент от хората се оплакват, че кафето разстройва стомаха им и/или създава киселини. Това е така, защото кафето стимулира освобождаването на хормона гастрин, който засилва секрецията на стомашен сок. Хормонът холецистокинин също се повишава и кара жлъчката да отделя повече жлъчна течност. В здрав индивид организмът бързо компенсира излишъците като забързва храносмилането, но прекалено честата консумация на кафе без да е придружено с храна води до хронично слабо възпаление на вътрешната повърхност на червата, заради киселият стомашен сок, който се излива там. По принцип той винаги е смесен с храна и не дразни лигавицата.

    + +

    Не може да подминем и факта, че пиенето на кафе влияе и върху изключително важният за здравето ни хормон - кортизол. Повишеният кортизол води до трудности със заспиването и неспокоен сън, лошо храносмилане и лошо настроение. При подобни редовни пикове на кортизола, човек се справя по-трудно със стресови ситуации, спрямо хора, които не пият кафе или пият само сутрин (ефектът върху кортизола спада за около 6 часа).

    + +

    Ако имате целиачна болест или чувствителност към глутен, трябва добре да преосмислите консумацията на кафе, тъй като то създава кръстосана реакция. Причината е в голямото подобие на някои от протеините в кафето с глутена. Ако здравето ви не се подобрява при изключване на глутена, то може би трябва да спрете и кафето като възможна причина за това.

    + +

    Много от ползите на кафето се приписват на голямото количество антиоксиданти и полифеноли в него. Разбира се тези вещества можете да намерите в много плодове и зеленчуци, без да са в комбинация с пристрястяващият ефект на кофеина. От друга страна безкофеиновото кафе се обработва така, че повечето от полезните вещества се изгубват.

    + +

    Да пиете кафе или не? Решението е ваше! Според мен ако сте напълно здрав и млад човек, нямате някое от гореизброените оплаквания, то можете да си позволявате по 1 чаша кафе веднъж на няколко дни, за да си набавите полезните ефекти от него. Но като цяло, кафето и кофеиновите напитки трябва да се употребяват с повишено внимание.

    + +

    Кафеено растение

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I" Любителите на кафе по света напоследък често имат поводи да се радват. [Изследване](http://www.zdrave.bg/?c=n&id=4192) [след](http://www.tialoto.bg/a/125-zdrave/1825-za-kakvo-e-polezno-kafeto/) [изследване](http://www.medicine.bg/novini/14-polezni-svoystva-na-kafeto) доказват ползите за здравето от умерената консумация на кафе: предпазва [от рак](http://onlinelibrary.wiley.com/doi/10.1002/ijc.20989/full), предпазва от [инсулт](http://aje.oxfordjournals.org/content/174/9/993.short), [предпазва](http://link.springer.com/article/10.1007%2Fs00125-009-1516-3) [от диабет](http://archinte.jamanetwork.com/article.aspx?articleid=773949), предпазва от развитие на [сърдечно-съдови заболявания](http://www.sciencedirect.com/science/article/pii/S0167527308008498), за превенция от [депресия](http://archinte.jamanetwork.com/article.aspx?articleid=1105943), [Алцхаймер](http://iospress.metapress.com/content/a423p6m256u26742/), [Паркинсон](http://jama.jamanetwork.com/article.aspx?articleid=192731), бактериални инфекции, цироза и камъни в жлъчката. То подпомага [горенето](http://ajcn.nutrition.org/content/79/1/40.full.pdf) [на мазнини](http://ajpendo.physiology.org/content/269/4/E671) и облекчава мускулната треска след тренировка! Има дори [проучване](http://annals.org/article.aspx?articleid=668690), според което ако пиете кафе имате по-малка вероятност да умрете (независимо от причината). Т.е. [кафето удължава живота](http://link.springer.com/article/10.1007%2Fs00125-006-0435-9?LI=true) ви! + +Ами не остава друго освен да вдигнем кафени чаши и да си кажем "Наздраве", нали? + +Но да не бързаме толкова все пак... + +Всичко изброено може би е само причина да оправдаем зависимостта си към кафето. Вероятно знаете, че [кофеинът](http://wikipedia.org/wiki/Caffeine) има лек **психотропен ефект върху мозъка**. Ефектите като ободряване, подобряване на настроението, паметта и концентарцията се дължат на факта, че кофеинът блокира достъпа на инхибиращият (подтискащият мозъчната дейност) невротрансмитър Аденозин в мозъка, и по този начин другите два, които са стимулиращи мозъка - Норадреналин и Допамин увеличават концентрацията си. При ежедневен прием, обаче, тези ефекти намаляват и дори се изгубват, ако не се увеличи **дозата на кофеина**. За това кафето е една от най-разпространените **пристрястяващи субстанции**, използвана от хората днес. + +Друга причина в списъкът "Против" е, че зърната на кафето са семената на растението. Както всички **семена** и тези имат в състава си **инхибитори и антинутриенти**, чрез които те забавят покълването си и се защитават от животни, докато не попаднат на подходящо място, за да порастнат (топла и влажна почва). Тези антинутритенти попадат в червата и ги раздразват, а в последствие могат да доведат и до по-сериозни заболявания (синдром на пропускливите черва). Това разбира се се отнася не само за кафето и също от значение е честотата на консумацията му. + +Голям процент от хората се оплакват, че кафето **разстройва стомаха** им и/или **създава киселини**. Това е така, защото кафето стимулира освобождаването на хормона гастрин, който засилва секрецията на стомашен сок. Хормонът холецистокинин също се повишава и кара жлъчката да отделя повече жлъчна течност. В здрав индивид организмът бързо компенсира излишъците като забързва храносмилането, но прекалено **честата консумация на кафе без да е придружено с храна** води до хронично слабо възпаление на вътрешната повърхност на червата, заради киселият стомашен сок, който се излива там. По принцип той винаги е смесен с храна и не дразни лигавицата. + +Не може да подминем и факта, че пиенето на кафе влияе и върху изключително важният за здравето ни хормон - **кортизол**. Повишеният кортизол води до трудности със заспиването и **неспокоен сън**, лошо храносмилане и лошо настроение. При подобни редовни пикове на кортизола, човек се справя по-трудно със **стресови ситуации**, спрямо хора, които не пият кафе или пият само сутрин (ефектът върху кортизола спада за около 6 часа). + +Ако имате целиачна болест или чувствителност към **глутен**, трябва добре да преосмислите консумацията на кафе, тъй като то създава кръстосана реакция. Причината е в голямото подобие на някои от протеините в кафето с глутена. Ако здравето ви не се подобрява при изключване на глутена, то може би трябва да спрете и кафето като възможна причина за това. + +Много от ползите на кафето се приписват на голямото количество **антиоксиданти** и **полифеноли** в него. Разбира се тези вещества можете да намерите в много плодове и зеленчуци, без да са в комбинация с пристрястяващият ефект на кофеина. От друга страна безкофеиновото кафе се обработва така, че повечето от полезните вещества се изгубват. + +Да пиете кафе или не? Решението е ваше! Според мен ако сте напълно здрав и млад човек, нямате някое от гореизброените оплаквания, то можете да си позволявате по 1 чаша кафе веднъж на няколко дни, за да си набавите полезните ефекти от него. Но като цяло, кафето и кофеиновите напитки трябва да се употребяват **с повишено внимание**. + +![Кафеено растение](/images/posts/Coffee.jpg);T; +I"v"

    Любителите на кафе по света напоследък често имат поводи да се радват. Изследване след изследване доказват ползите за здравето от умерената консумация на кафе: предпазва от рак, предпазва от инсулт, предпазва от диабет, предпазва от развитие на сърдечно-съдови заболявания, за превенция от депресия, Алцхаймер, Паркинсон, бактериални инфекции, цироза и камъни в жлъчката. То подпомага горенето на мазнини и облекчава мускулната треска след тренировка! Има дори проучване, според което ако пиете кафе имате по-малка вероятност да умрете (независимо от причината). Т.е. кафето удължава живота ви!

    + +

    Ами не остава друго освен да вдигнем кафени чаши и да си кажем “Наздраве”, нали?

    + +

    Но да не бързаме толкова все пак…

    + +

    Всичко изброено може би е само причина да оправдаем зависимостта си към кафето. Вероятно знаете, че кофеинът има лек психотропен ефект върху мозъка. Ефектите като ободряване, подобряване на настроението, паметта и концентарцията се дължат на факта, че кофеинът блокира достъпа на инхибиращият (подтискащият мозъчната дейност) невротрансмитър Аденозин в мозъка, и по този начин другите два, които са стимулиращи мозъка - Норадреналин и Допамин увеличават концентрацията си. При ежедневен прием, обаче, тези ефекти намаляват и дори се изгубват, ако не се увеличи дозата на кофеина. За това кафето е една от най-разпространените пристрястяващи субстанции, използвана от хората днес.

    + +

    Друга причина в списъкът “Против” е, че зърната на кафето са семената на растението. Както всички семена и тези имат в състава си инхибитори и антинутриенти, чрез които те забавят покълването си и се защитават от животни, докато не попаднат на подходящо място, за да порастнат (топла и влажна почва). Тези антинутритенти попадат в червата и ги раздразват, а в последствие могат да доведат и до по-сериозни заболявания (синдром на пропускливите черва). Това разбира се се отнася не само за кафето и също от значение е честотата на консумацията му.

    + +

    Голям процент от хората се оплакват, че кафето разстройва стомаха им и/или създава киселини. Това е така, защото кафето стимулира освобождаването на хормона гастрин, който засилва секрецията на стомашен сок. Хормонът холецистокинин също се повишава и кара жлъчката да отделя повече жлъчна течност. В здрав индивид организмът бързо компенсира излишъците като забързва храносмилането, но прекалено честата консумация на кафе без да е придружено с храна води до хронично слабо възпаление на вътрешната повърхност на червата, заради киселият стомашен сок, който се излива там. По принцип той винаги е смесен с храна и не дразни лигавицата.

    + +

    Не може да подминем и факта, че пиенето на кафе влияе и върху изключително важният за здравето ни хормон - кортизол. Повишеният кортизол води до трудности със заспиването и неспокоен сън, лошо храносмилане и лошо настроение. При подобни редовни пикове на кортизола, човек се справя по-трудно със стресови ситуации, спрямо хора, които не пият кафе или пият само сутрин (ефектът върху кортизола спада за около 6 часа).

    + +

    Ако имате целиачна болест или чувствителност към глутен, трябва добре да преосмислите консумацията на кафе, тъй като то създава кръстосана реакция. Причината е в голямото подобие на някои от протеините в кафето с глутена. Ако здравето ви не се подобрява при изключване на глутена, то може би трябва да спрете и кафето като възможна причина за това.

    + +

    Много от ползите на кафето се приписват на голямото количество антиоксиданти и полифеноли в него. Разбира се тези вещества можете да намерите в много плодове и зеленчуци, без да са в комбинация с пристрястяващият ефект на кофеина. От друга страна безкофеиновото кафе се обработва така, че повечето от полезните вещества се изгубват.

    + +

    Да пиете кафе или не? Решението е ваше! Според мен ако сте напълно здрав и млад човек, нямате някое от гореизброените оплаквания, то можете да си позволявате по 1 чаша кафе веднъж на няколко дни, за да си набавите полезните ефекти от него. Но като цяло, кафето и кофеиновите напитки трябва да се употребяват с повишено внимание.

    + +

    Кафеено растение

    +;T; @I"%/blog/2014-06-29-стресът/;T{;{ ;I"C + + + + + + + Стресът - ръководство за употреба + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Стресът - ръководство за употреба +

    + +
    +
      +
    • + + June 29, 2014 +
    • +
    +
    + + +

    Стресът е неизбежен спътник в живота на съвременният човек. Ако все пак успеем да го задържим в някакви граници, това ще доведе до по-добро здраве в краткосрочен и дългосрочен план.

    + +

    Какво имам предвид под “контрол върху стреса”? Това означава да контролирате нивата на хормонът кортизол в тялото ви. При напълно здрави хора, кортизолът е висок сутрин и започва да спада през целият ден. Но когато човек е под влияние на различни стресори (крайни срокове, проблеми в семейството, липса на сън, натоварено ежедневие), кортизолът остава висок и дори се покачва извън нормите. А този хормон оказва влияние върху цялото тяло: освобождаването на инсулин и другите хормони, свързани с храненето; настроението; храносмилането; имунната система и дори либидото.

    + +

    Как да разберете дали имате високи нива на кортизол? + Имате ли излишно тегло? Имате ли натрупани мазнини около талията и пъпа? Налага ли се да ставте посред нощ, за да пишкате? Имате ли проблеми със съня? Има ли спад в енергията ви в следобедните часове и пик в часовете след вечеря? Трудно ли сваляте тегло, въпреки че спазвате хранителен режим? Тренировките ви стават ли по-трудни с времето, въпреки че сте постоянни? Приемате ли твърде често кофеин? Ако сте отговорили с “Да” на някой от горните въпроси, то има голяма вероятност виновникът за това да е високият ви кортизол.

    + +

    Но как да “вкараме в ред” хормоните и по-точно кортизола? Ето три прости начина.

    + +

    1.Подобрете съня си. Опитайте се всяка нощ да имате достатъчно дълъг и качествен сън. За целта, можете да направите няколко неща:

    + +
      +
    • Избягвайте употребата на захар и въглехидрати вечер (дори от плодове)
    • +
    • Избягвайте кофеиновите напитки след обедните часове.
    • +
    • Опитайте се да вечеряте най-късно 2 часа преди сън (най-добре 4 часа)
    • +
    • Оставете си от 30 до 60 минути без телевизия, компютър, телефон преди сън.
    • +
    • Спете в хладна, тъмна, проветриво стая.
    • +
    • Добавки като магнезий и мелатонин ще помогнат за качественият сън и доброто възстановяване на тялото ви.
    • +
    + +

    2.Движете се повече. Човешкото тяло е създадено за да се движи. Съвременният начин на живот често предразполага към липсата на естествени за хората действия като ходене, бягане, вдигане на тежест от земята. Мога до утре сутрин да ви заспивам с проучвания за това, колко е важно да спортувате и какви ползи ще има това за тялото и духа ви… но няма смисъл. Докато сами се не убедите в тях, няма сила на света, която да ви накара да повярвате, че имате нужда от движение.

    + +

    Аз ще ви дам само няколко отправни точки как да започнете да изграждате своят двигателен режим.

    + +
      +
    • Не предозирайте. Това е най-честата грешка, която правят хората. Решават, че ще започнат да спортуват и се хвърлят с всичка сила в нещо. Резултата често е повишени нива на стрес, травми и не след дълго връщане към старият начин на живот. Започнете с темпо за начинаещи и в последствие постепенно увеличете натоварването. Ако днес изберете да правите йога, нали не очаквате че веднага ще успеете да направите стойка на глава?
    • +
    • Изберете активност, която включва и силово, и кардио натоварване. Но помнете, че никое от двете не трябва да е прекалено трудно за вас. Бягането в парка, комбинирано с леки упражнения е добър старт за повечето хора. Ако не можете да бягате, карайте колело, или се разхождайте. Плуването също е чудесен спорт, който натоварва цялото тяло равномерно.
    • +
    • Пазете ставите, гърба и мозъка си. Не избирайте спортове, които са непосилни за вашата физическа форма в момента и могат да доведат до травми или до “прегаряне” на нервната система от прекомерни усилия. Например ако имате над 20кг излишно тегло не е подходящо да започнете да бягате. По-добре си вземете колело и правете дълги разходки в парка с него.
    • +
    • Когато избирате своята активност мислете в дългосрочен план. Не се записвайте на катерене, ако имате страх от високо, въпреки че катерачите имат красиво оформени тела. Изберете спорт, в който ще имате желание да се развивате и практикувате дълго.
    • +
    • Правете го с удоволствие. Ако харесвате своят спорт, то ще искате да го правите по-дълго и по-често, а така ще имате повече ползи. Не избирайте вдигането на тежести или кросфит, ако не ви доставят удоволствие, независимо че резултатите при другите хора са невероятни. Ако все пак настъпи момент на отегчение, вземете си кратка почивка и се върнете с нови сили и желание към своята любима активност.
    • +
    + +

    3.Усмихвайте се. Даже по-добре: Смейте се! За невро-психологичният ефект от смеха се знае по-малко, отколкото предполагате, но все пак е доказано, че смехът активира определени части в кората на мозъка, което води до производството на ендорфини (хормонът на щастието). Те представляват пептиди (малки протеини), които се освобождават при спортуване, въодушевление, любов, оргазъм. Тяхната основна роля е да подпомогнат освобождаването на допамин, който от своя страна подобрява паметта, настроението, съня и контрола върху стреса. Също така ендорфините подтискат болката. Смехът активира и участъкът в мозъка, който се свързва с емоциите и усещането за щастие - лимбичната система. Това активира автономната (неволева) нервна система и подобрява нивата на кръвното налягане, дишането, и не на последно място намалява кортизолът.

    + +

    Усмивките и смехът действат по подобен механизъм, но навярно се досещате, че смехът има по-мощен ефект. Това, което ще ви изненада обаче, е че дори изкуственият смях има горепосочените ползи върху здравето ви. Така че усмихвайте се повече и света ще ви отвърне със същото (или поне мозъкът ви ще ви накара да мислите така).

    + +

    Стрес

    + +

    Вие как се справяте със стреса? Напишете ми в коментар.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I">'Стресът е неизбежен спътник в живота на съвременният човек. Ако все пак успеем да го задържим в някакви граници, това ще доведе до по-добро здраве в краткосрочен и дългосрочен план. + +Какво имам предвид под **"контрол върху стреса"**? Това означава да контролирате нивата на хормонът **кортизол** в тялото ви. При напълно здрави хора, кортизолът е висок сутрин и започва да спада през целият ден. Но когато човек е под влияние на различни стресори (крайни срокове, проблеми в семейството, липса на сън, натоварено ежедневие), кортизолът остава висок и дори се покачва извън нормите. А този хормон оказва влияние върху цялото тяло: освобождаването на инсулин и другите хормони, свързани с храненето; настроението; храносмилането; имунната система и дори либидото. + +**Как да разберете дали имате високи нива на кортизол?** + Имате ли излишно тегло? Имате ли натрупани мазнини около талията и пъпа? Налага ли се да ставте посред нощ, за да пишкате? Имате ли проблеми със съня? Има ли спад в енергията ви в следобедните часове и пик в часовете след вечеря? Трудно ли сваляте тегло, въпреки че спазвате хранителен режим? Тренировките ви стават ли по-трудни с времето, въпреки че сте постоянни? Приемате ли твърде често кофеин? Ако сте отговорили с "Да" на някой от горните въпроси, то има голяма вероятност виновникът за това да е високият ви кортизол. + +**Но как да "вкараме в ред" хормоните и по-точно кортизола? Ето три прости начина.** + +**1.Подобрете съня си.** Опитайте се всяка нощ да имате достатъчно дълъг и качествен сън. За целта, можете да направите няколко неща: + +* Избягвайте употребата на захар и въглехидрати вечер (дори от плодове) +* Избягвайте кофеиновите напитки след обедните часове. +* Опитайте се да вечеряте най-късно 2 часа преди сън (най-добре 4 часа) +* Оставете си от 30 до 60 минути без телевизия, компютър, телефон преди сън. +* Спете в хладна, тъмна, проветриво стая. +* Добавки като магнезий и мелатонин ще помогнат за качественият сън и доброто възстановяване на тялото ви. + +**2.Движете се повече.** Човешкото тяло е създадено за да се движи. Съвременният начин на живот често предразполага към липсата на естествени за хората действия като ходене, бягане, вдигане на тежест от земята. Мога до утре сутрин да ви заспивам с проучвания за това, колко е важно да спортувате и какви ползи ще има това за тялото и духа ви... но няма смисъл. Докато сами се не убедите в тях, няма сила на света, която да ви накара да повярвате, че имате нужда от движение. + +Аз ще ви дам само няколко отправни точки как да започнете да изграждате своят двигателен режим. + +* Не предозирайте. Това е най-честата грешка, която правят хората. Решават, че ще започнат да спортуват и се хвърлят с всичка сила в нещо. Резултата често е повишени нива на стрес, травми и не след дълго връщане към старият начин на живот. Започнете с темпо за начинаещи и в последствие постепенно увеличете натоварването. Ако днес изберете да правите йога, нали не очаквате че веднага ще успеете да направите стойка на глава? +* Изберете активност, която включва и силово, и кардио натоварване. Но помнете, че никое от двете не трябва да е прекалено трудно за вас. Бягането в парка, комбинирано с леки упражнения е добър старт за повечето хора. Ако не можете да бягате, карайте колело, или се разхождайте. Плуването също е чудесен спорт, който натоварва цялото тяло равномерно. +* Пазете ставите, гърба и мозъка си. Не избирайте спортове, които са непосилни за вашата физическа форма в момента и могат да доведат до травми или до "прегаряне" на нервната система от прекомерни усилия. Например ако имате над 20кг излишно тегло не е подходящо да започнете да бягате. По-добре си вземете колело и правете дълги разходки в парка с него. +* Когато избирате своята активност мислете в дългосрочен план. Не се записвайте на катерене, ако имате страх от високо, въпреки че катерачите имат красиво оформени тела. Изберете спорт, в който ще имате желание да се развивате и практикувате дълго. +* Правете го с удоволствие. Ако харесвате своят спорт, то ще искате да го правите по-дълго и по-често, а така ще имате повече ползи. Не избирайте вдигането на тежести или кросфит, ако не ви доставят удоволствие, независимо че резултатите при другите хора са невероятни. Ако все пак настъпи момент на отегчение, вземете си кратка почивка и се върнете с нови сили и желание към своята любима активност. + +**3.Усмихвайте се. Даже по-добре: Смейте се!** За невро-психологичният ефект от смеха се знае по-малко, отколкото предполагате, но все пак е доказано, че смехът активира определени части в кората на мозъка, което води до производството на ендорфини (хормонът на щастието). Те представляват пептиди (малки протеини), които се освобождават при спортуване, въодушевление, любов, оргазъм. Тяхната основна роля е да подпомогнат освобождаването на допамин, който от своя страна подобрява паметта, настроението, съня и контрола върху стреса. Също така ендорфините подтискат болката. Смехът активира и участъкът в мозъка, който се свързва с емоциите и усещането за щастие - лимбичната система. Това активира автономната (неволева) нервна система и подобрява нивата на кръвното налягане, дишането, и не на последно място намалява кортизолът. + +Усмивките и смехът действат по подобен механизъм, но навярно се досещате, че смехът има по-мощен ефект. Това, което ще ви изненада обаче, е че дори изкуственият смях има горепосочените ползи върху здравето ви. **Така че усмихвайте се повече и света ще ви отвърне със същото (или поне мозъкът ви ще ви накара да мислите така).** + +![Стрес](/images/posts/Stress.jpg) + +Вие как се справяте със стреса? Напишете ми в коментар.;T; +I"(

    Стресът е неизбежен спътник в живота на съвременният човек. Ако все пак успеем да го задържим в някакви граници, това ще доведе до по-добро здраве в краткосрочен и дългосрочен план.

    + +

    Какво имам предвид под “контрол върху стреса”? Това означава да контролирате нивата на хормонът кортизол в тялото ви. При напълно здрави хора, кортизолът е висок сутрин и започва да спада през целият ден. Но когато човек е под влияние на различни стресори (крайни срокове, проблеми в семейството, липса на сън, натоварено ежедневие), кортизолът остава висок и дори се покачва извън нормите. А този хормон оказва влияние върху цялото тяло: освобождаването на инсулин и другите хормони, свързани с храненето; настроението; храносмилането; имунната система и дори либидото.

    + +

    Как да разберете дали имате високи нива на кортизол? + Имате ли излишно тегло? Имате ли натрупани мазнини около талията и пъпа? Налага ли се да ставте посред нощ, за да пишкате? Имате ли проблеми със съня? Има ли спад в енергията ви в следобедните часове и пик в часовете след вечеря? Трудно ли сваляте тегло, въпреки че спазвате хранителен режим? Тренировките ви стават ли по-трудни с времето, въпреки че сте постоянни? Приемате ли твърде често кофеин? Ако сте отговорили с “Да” на някой от горните въпроси, то има голяма вероятност виновникът за това да е високият ви кортизол.

    + +

    Но как да “вкараме в ред” хормоните и по-точно кортизола? Ето три прости начина.

    + +

    1.Подобрете съня си. Опитайте се всяка нощ да имате достатъчно дълъг и качествен сън. За целта, можете да направите няколко неща:

    + +
      +
    • Избягвайте употребата на захар и въглехидрати вечер (дори от плодове)
    • +
    • Избягвайте кофеиновите напитки след обедните часове.
    • +
    • Опитайте се да вечеряте най-късно 2 часа преди сън (най-добре 4 часа)
    • +
    • Оставете си от 30 до 60 минути без телевизия, компютър, телефон преди сън.
    • +
    • Спете в хладна, тъмна, проветриво стая.
    • +
    • Добавки като магнезий и мелатонин ще помогнат за качественият сън и доброто възстановяване на тялото ви.
    • +
    + +

    2.Движете се повече. Човешкото тяло е създадено за да се движи. Съвременният начин на живот често предразполага към липсата на естествени за хората действия като ходене, бягане, вдигане на тежест от земята. Мога до утре сутрин да ви заспивам с проучвания за това, колко е важно да спортувате и какви ползи ще има това за тялото и духа ви… но няма смисъл. Докато сами се не убедите в тях, няма сила на света, която да ви накара да повярвате, че имате нужда от движение.

    + +

    Аз ще ви дам само няколко отправни точки как да започнете да изграждате своят двигателен режим.

    + +
      +
    • Не предозирайте. Това е най-честата грешка, която правят хората. Решават, че ще започнат да спортуват и се хвърлят с всичка сила в нещо. Резултата често е повишени нива на стрес, травми и не след дълго връщане към старият начин на живот. Започнете с темпо за начинаещи и в последствие постепенно увеличете натоварването. Ако днес изберете да правите йога, нали не очаквате че веднага ще успеете да направите стойка на глава?
    • +
    • Изберете активност, която включва и силово, и кардио натоварване. Но помнете, че никое от двете не трябва да е прекалено трудно за вас. Бягането в парка, комбинирано с леки упражнения е добър старт за повечето хора. Ако не можете да бягате, карайте колело, или се разхождайте. Плуването също е чудесен спорт, който натоварва цялото тяло равномерно.
    • +
    • Пазете ставите, гърба и мозъка си. Не избирайте спортове, които са непосилни за вашата физическа форма в момента и могат да доведат до травми или до “прегаряне” на нервната система от прекомерни усилия. Например ако имате над 20кг излишно тегло не е подходящо да започнете да бягате. По-добре си вземете колело и правете дълги разходки в парка с него.
    • +
    • Когато избирате своята активност мислете в дългосрочен план. Не се записвайте на катерене, ако имате страх от високо, въпреки че катерачите имат красиво оформени тела. Изберете спорт, в който ще имате желание да се развивате и практикувате дълго.
    • +
    • Правете го с удоволствие. Ако харесвате своят спорт, то ще искате да го правите по-дълго и по-често, а така ще имате повече ползи. Не избирайте вдигането на тежести или кросфит, ако не ви доставят удоволствие, независимо че резултатите при другите хора са невероятни. Ако все пак настъпи момент на отегчение, вземете си кратка почивка и се върнете с нови сили и желание към своята любима активност.
    • +
    + +

    3.Усмихвайте се. Даже по-добре: Смейте се! За невро-психологичният ефект от смеха се знае по-малко, отколкото предполагате, но все пак е доказано, че смехът активира определени части в кората на мозъка, което води до производството на ендорфини (хормонът на щастието). Те представляват пептиди (малки протеини), които се освобождават при спортуване, въодушевление, любов, оргазъм. Тяхната основна роля е да подпомогнат освобождаването на допамин, който от своя страна подобрява паметта, настроението, съня и контрола върху стреса. Също така ендорфините подтискат болката. Смехът активира и участъкът в мозъка, който се свързва с емоциите и усещането за щастие - лимбичната система. Това активира автономната (неволева) нервна система и подобрява нивата на кръвното налягане, дишането, и не на последно място намалява кортизолът.

    + +

    Усмивките и смехът действат по подобен механизъм, но навярно се досещате, че смехът има по-мощен ефект. Това, което ще ви изненада обаче, е че дори изкуственият смях има горепосочените ползи върху здравето ви. Така че усмихвайте се повече и света ще ви отвърне със същото (или поне мозъкът ви ще ви накара да мислите така).

    + +

    Стрес

    + +

    Вие как се справяте със стреса? Напишете ми в коментар.

    +;T; @I":/blog/2014-07-05-опасната-козметика/;T{;{ ;I"> + + + + + + + Опасната 'натурална' козметика + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Опасната 'натурална' козметика +

    + +
    +
      +
    • + + July 5, 2014 +
    • +
    +
    + + +

    Кой не иска да е вечно млад и красив? Никой не би отказал, нали? Хубавото е, че съвременната козметична индустрия предлага феноменална колекция от разкрасяващи, подмладяващи, освежаващи, възстановяващи, отслабващи, стягащи, слънцезащитни, антицелулитни, против бръчки и срещу пъпки, за блестящи зъби и коса, за слънчев загар и срещу напукани пети, и какви ли още не продукти. Наистина не мога да изброя всички, защото най-малкото не съм запозната с тях. Знаем ли обаче с какво се мажем?

    + +

    Първо да поговорим на кратко за кожата. Човешката кожа е много интересен орган. Знаете, че тя служи за бариера срещу външни влияния и пази цялото тяло и неговите мускули, органи и тъкани. Друга важна функция е, че през нея се освобождават част от излишните течности и токсини. Също така, през нея могат да навлязат различни вещества. Това става по два начина: чрез проникване и абсорбиране. +Проникването в кожата представлява навлизането на дадено вещество между най-горния (рогов) слой и най-долния (базален) слой. Например пигментът при татуиране. +Абсорбирането представлява преминаване на веществото през кожната бариера и навлизането му в кръвта. Това е процес, който се използва в медицината и почти не се използва в козметиката.

    + +

    А какво прониква и какво не в кожата? Кожата ни е напълно непропусклива за водата и всякакви водни разтвори. Нито навътре, нито навън. Ако това не беше така, вероятно след всяка морска баня щяхме да сме поели няколко литра вода или пък в горещите дни щяхме да сме пресъхнали като стафиди.

    + +

    Кожата е пропусклива само за вещества, които са разтворени в масло. Козметичните продукти, които проникват в кожата са на маслена основа: антицелулитни кремове, хидратиращи съставки, различни витамини и антиоксиданти. Има и съставки, които не искаме да проникват въобще: парфюм, консерванти, емулгатори, слънцезащитни съставки. +Как става проникването на полезните съставки? Има два начина. Първият е евтин, определено не-натурален и масово се използва от козметичната индустрия. В състава на продукта се слага разтворител от рода на пропилен-гликол и той разхлабва връзките между клетките на кожата и улеснява навлизането на съставките. Това разбира се уврежда структурата на кожата и в последствие води до изсушаване, излющване, микроскопични язви и други по-тежки проблеми. +Вторият, добрият начин за проникване в кожата е чрез “опаковане” на активната съставка в миниатюрни сфери с натурален лецитин, т.нар. липозоми или нанозоми. Продукти с такива съставки са много по-скъпи, но и много по-ефективни и безвредни. +Тук искам да направя една вметка относно етеричните масла. Много хора смятат, че тъй като са натурални са безвредни. Истината е, че тъй като са масла те проникват и дори могат да се абсорбират през кожата, което означава, че могат да бъдат и опасни. Те не рядко предизвикват алергични реакции и възпаления. Имайте едно на ум, когато ги използвате. Тези при които рискът да дадат реакция е най-голям са и най-силните като аромат: канела, мента, портокал, карамфил и др. Етеричните масла се изписват на опаковките на продуктите с латинските им наименования. Ако в състава на продукта, който ползвате няма парфюм, а мирише силно, то вероятно има доста етерични масла. Това е знак да бъдете внимателни с количествата, които използвате. +Още от съставките, за които трябва да бъдете бдителни в козметиката, която използвате ще прочетете във втората част на статията.

    + +

    Сигурна съм, че много от вас, също като мен избират натуралните продукти не само за тези, които приемаме вътрешно, но и тези, които нанасяме върху кожата си. Тук разбира се отново има маркетингов трик. Думата “натурален” продава! Също и “био”, и “растителен”. Но ако на етикета е изписано “Натурален”, а в състава му откриваме вещества като парафин, петролатум и други вредни за човека и природата съставки, това не е ли незаконно? Ами всъщност не! Търговците имат право да напишат на етикета “натурално” и “растително” ако има само 1% растителен екстракт в състава. Затова бъдете внимателни и винаги четете етикетите на кремовете, шампоаните, пастите за зъби, сапуни и др. +А какво да кажем за “био” продуктите? Наистина ли те са по-безвредни за кожата? Истината е, че не е напълно вярно. Всъщност био и естествените козметични средства могат да бъдат много агресивни, тъй като растителните екстракти често са силни алергени. Т.е. винаги трябва да внимаваме за съставките на продукта и да го тестваме на малки, скрити кожни участъци. Независимо от сертификатите и цената, която плащаме трябва да следим за реакцията на кожата. Когато тя го “одобри”, тогава означава, че продуктът е добър.

    + +

    Надявам се тази статия да ви е харесала и да ви е била полезна. Ако е така, споделете я с приятелите си. Очаквайте продължението й другата седмица.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"!Кой не иска да е вечно млад и красив? Никой не би отказал, нали? Хубавото е, че съвременната козметична индустрия предлага феноменална колекция от разкрасяващи, подмладяващи, освежаващи, възстановяващи, отслабващи, стягащи, слънцезащитни, антицелулитни, против бръчки и срещу пъпки, за блестящи зъби и коса, за слънчев загар и срещу напукани пети, и какви ли още не продукти. Наистина не мога да изброя всички, защото най-малкото не съм запозната с тях. **Знаем ли обаче с какво се мажем?** + +Първо да поговорим на кратко за кожата. **Човешката кожа е много интересен орган.** Знаете, че тя служи за бариера срещу външни влияния и пази цялото тяло и неговите мускули, органи и тъкани. Друга важна функция е, че през нея се освобождават част от излишните течности и токсини. Също така, през нея могат да навлязат различни вещества. Това става по два начина: чрез проникване и абсорбиране. +**Проникването** в кожата представлява навлизането на дадено вещество между най-горния (рогов) слой и най-долния (базален) слой. Например пигментът при татуиране. +**Абсорбирането** представлява преминаване на веществото през кожната бариера и навлизането му в кръвта. Това е процес, който се използва в медицината и почти не се използва в козметиката. + +**А какво прониква и какво не в кожата?** Кожата ни е напълно непропусклива за водата и всякакви водни разтвори. Нито навътре, нито навън. Ако това не беше така, вероятно след всяка морска баня щяхме да сме поели няколко литра вода или пък в горещите дни щяхме да сме пресъхнали като стафиди. + +Кожата е пропусклива само за вещества, които са разтворени в масло. Козметичните продукти, които проникват в кожата са на маслена основа: антицелулитни кремове, хидратиращи съставки, различни витамини и антиоксиданти. Има и съставки, които не искаме да проникват въобще: парфюм, консерванти, емулгатори, слънцезащитни съставки. +**Как става проникването на полезните съставки?** Има два начина. Първият е евтин, определено не-натурален и масово се използва от козметичната индустрия. В състава на продукта се слага **разтворител** от рода на пропилен-гликол и той разхлабва връзките между клетките на кожата и улеснява навлизането на съставките. Това разбира се уврежда структурата на кожата и в последствие води до изсушаване, излющване, микроскопични язви и други по-тежки проблеми. +Вторият, добрият начин за проникване в кожата е чрез "опаковане" на активната съставка в миниатюрни сфери с натурален лецитин, т.нар. **липозоми** или **нанозоми**. Продукти с такива съставки са много по-скъпи, но и много по-ефективни и безвредни. +Тук искам да направя една вметка относно **етеричните масла**. Много хора смятат, че тъй като са **натурални** са безвредни. Истината е, че тъй като са масла те проникват и дори могат да се абсорбират през кожата, което означава, че могат да бъдат и опасни. Те не рядко предизвикват алергични реакции и възпаления. Имайте едно на ум, когато ги използвате. Тези при които рискът да дадат реакция е най-голям са и най-силните като аромат: канела, мента, портокал, карамфил и др. Етеричните масла се изписват на опаковките на продуктите с латинските им наименования. Ако в състава на продукта, който ползвате няма парфюм, а мирише силно, то вероятно има доста етерични масла. Това е знак да бъдете внимателни с количествата, които използвате. +**Още от съставките, за които трябва да бъдете бдителни в козметиката, която използвате ще прочетете във втората част на статията.** + +Сигурна съм, че много от вас, също като мен избират **натуралните продукти** не само за тези, които приемаме вътрешно, но и тези, които нанасяме върху кожата си. Тук разбира се отново има маркетингов трик. Думата "натурален" продава! Също и "био", и "растителен". Но ако на етикета е изписано "Натурален", а в състава му откриваме вещества като парафин, петролатум и други вредни за човека и природата съставки, това не е ли незаконно? Ами всъщност не! Търговците имат право да напишат на етикета "натурално" и "растително" ако има **само 1% растителен екстракт** в състава. Затова бъдете внимателни и винаги четете етикетите на кремовете, шампоаните, пастите за зъби, сапуни и др. +А какво да кажем за **"био" продуктите**? Наистина ли те са **по-безвредни** за кожата? Истината е, че не е напълно вярно. Всъщност био и естествените козметични средства могат да бъдат много агресивни, тъй като растителните екстракти често са силни алергени. Т.е. винаги трябва да внимаваме за съставките на продукта и да го тестваме на малки, скрити кожни участъци. **Независимо от сертификатите и цената, която плащаме трябва да следим за реакцията на кожата.** Когато тя го "одобри", тогава означава, че продуктът е добър. + +Надявам се тази статия да ви е харесала и да ви е била полезна. Ако е така, споделете я с приятелите си. **Очаквайте продължението й другата седмица.**;T; +I""

    Кой не иска да е вечно млад и красив? Никой не би отказал, нали? Хубавото е, че съвременната козметична индустрия предлага феноменална колекция от разкрасяващи, подмладяващи, освежаващи, възстановяващи, отслабващи, стягащи, слънцезащитни, антицелулитни, против бръчки и срещу пъпки, за блестящи зъби и коса, за слънчев загар и срещу напукани пети, и какви ли още не продукти. Наистина не мога да изброя всички, защото най-малкото не съм запозната с тях. Знаем ли обаче с какво се мажем?

    + +

    Първо да поговорим на кратко за кожата. Човешката кожа е много интересен орган. Знаете, че тя служи за бариера срещу външни влияния и пази цялото тяло и неговите мускули, органи и тъкани. Друга важна функция е, че през нея се освобождават част от излишните течности и токсини. Също така, през нея могат да навлязат различни вещества. Това става по два начина: чрез проникване и абсорбиране. +Проникването в кожата представлява навлизането на дадено вещество между най-горния (рогов) слой и най-долния (базален) слой. Например пигментът при татуиране. +Абсорбирането представлява преминаване на веществото през кожната бариера и навлизането му в кръвта. Това е процес, който се използва в медицината и почти не се използва в козметиката.

    + +

    А какво прониква и какво не в кожата? Кожата ни е напълно непропусклива за водата и всякакви водни разтвори. Нито навътре, нито навън. Ако това не беше така, вероятно след всяка морска баня щяхме да сме поели няколко литра вода или пък в горещите дни щяхме да сме пресъхнали като стафиди.

    + +

    Кожата е пропусклива само за вещества, които са разтворени в масло. Козметичните продукти, които проникват в кожата са на маслена основа: антицелулитни кремове, хидратиращи съставки, различни витамини и антиоксиданти. Има и съставки, които не искаме да проникват въобще: парфюм, консерванти, емулгатори, слънцезащитни съставки. +Как става проникването на полезните съставки? Има два начина. Първият е евтин, определено не-натурален и масово се използва от козметичната индустрия. В състава на продукта се слага разтворител от рода на пропилен-гликол и той разхлабва връзките между клетките на кожата и улеснява навлизането на съставките. Това разбира се уврежда структурата на кожата и в последствие води до изсушаване, излющване, микроскопични язви и други по-тежки проблеми. +Вторият, добрият начин за проникване в кожата е чрез “опаковане” на активната съставка в миниатюрни сфери с натурален лецитин, т.нар. липозоми или нанозоми. Продукти с такива съставки са много по-скъпи, но и много по-ефективни и безвредни. +Тук искам да направя една вметка относно етеричните масла. Много хора смятат, че тъй като са натурални са безвредни. Истината е, че тъй като са масла те проникват и дори могат да се абсорбират през кожата, което означава, че могат да бъдат и опасни. Те не рядко предизвикват алергични реакции и възпаления. Имайте едно на ум, когато ги използвате. Тези при които рискът да дадат реакция е най-голям са и най-силните като аромат: канела, мента, портокал, карамфил и др. Етеричните масла се изписват на опаковките на продуктите с латинските им наименования. Ако в състава на продукта, който ползвате няма парфюм, а мирише силно, то вероятно има доста етерични масла. Това е знак да бъдете внимателни с количествата, които използвате. +Още от съставките, за които трябва да бъдете бдителни в козметиката, която използвате ще прочетете във втората част на статията.

    + +

    Сигурна съм, че много от вас, също като мен избират натуралните продукти не само за тези, които приемаме вътрешно, но и тези, които нанасяме върху кожата си. Тук разбира се отново има маркетингов трик. Думата “натурален” продава! Също и “био”, и “растителен”. Но ако на етикета е изписано “Натурален”, а в състава му откриваме вещества като парафин, петролатум и други вредни за човека и природата съставки, това не е ли незаконно? Ами всъщност не! Търговците имат право да напишат на етикета “натурално” и “растително” ако има само 1% растителен екстракт в състава. Затова бъдете внимателни и винаги четете етикетите на кремовете, шампоаните, пастите за зъби, сапуни и др. +А какво да кажем за “био” продуктите? Наистина ли те са по-безвредни за кожата? Истината е, че не е напълно вярно. Всъщност био и естествените козметични средства могат да бъдат много агресивни, тъй като растителните екстракти често са силни алергени. Т.е. винаги трябва да внимаваме за съставките на продукта и да го тестваме на малки, скрити кожни участъци. Независимо от сертификатите и цената, която плащаме трябва да следим за реакцията на кожата. Когато тя го “одобри”, тогава означава, че продуктът е добър.

    + +

    Надявам се тази статия да ви е харесала и да ви е била полезна. Ако е така, споделете я с приятелите си. Очаквайте продължението й другата седмица.

    +;T; @I"N/blog/2014-07-12-опасната-козметика-2 (conflicted copy)/;T{;{ ;I"eC + + + + + + + + + Опасната козметика - част 2 + + + + + + + + + + + + + + + +
    +
    +
    +

    + Опасната козметика - част 2 +

    + +
    +
      +
    • + + July 12, 2014 +
    • +
    +
    + + +

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    + +

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    + +

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    + +
      +
    1. +

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. +Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. +Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. +Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. +Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      +
    2. +
    3. +

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. +Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. +Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. +Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      +
    4. +
    5. +

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти +Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата +Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. +Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. +Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      +
    6. +
    7. +

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. +Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. +Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. +Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      +
    8. +
    9. +

      Sodium Lauryl Sulfate(SLS) +Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. +Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.

      +
    10. +
    11. +

      Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените +Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. +Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. +Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      +
    12. +
    + +

    7.Други: + * Всички цифри (80% от тях са рискови съставки) + * Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви. + * Всички С с последващ нечетен номер са синтетични съставки +* Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! +* Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.

    + +

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    + +
    +
    + + +
    + + + + + + + +;T; I"Q0В предишният [пост](/blog/2014-07-05-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0/) по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда. + +Как да разпознаем "лошите" от "добрите" съставки? Много просто! **Трябва да се научите да четете етикетите.** Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис "Био" или "Натурален". Винаги поглеждайте в задния двор! + +Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка: + +1. **Парабени**. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. +**Как да ги откриете**: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. +**Къде се намират**: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. +**Защо да ги избягваме**: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. +**Алтернативи**: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки. + +2. **Петролатум**. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. +**Как и къде да го открием**: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. +**Защо да го избягваме**: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. +Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. +**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum. + +3. **Триклозан** - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти +**Какво пише и къде се намира**: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата +**Защо да го избягваме**: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. +Подобен препарат е и **Хлорхексидинът**, използван масово в зъбната козметика. +**Алтернативи**: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба. + +4. **Пропиленгликолът** е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. +**Как и къде да го открием**: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. +**Защо да го избягваме**: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. +**Алтернативи**: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol + +5. **Sodium Lauryl Sulfate(SLS)** +**Как и къде да го открием**: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. +**Защо да го избягваме**: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. +**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate. + +6. **Формалдехид-отделящи консерванти** - консерванти, които се използват заедно с или вместо парабените +**Как и къде се намират**: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. +**Защо да ги избягваме**: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. **Европейският съюз ограничава** употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като "съдържащи формалдехид". +**Алтерантиви**: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти + +7.**Други**: + * Всички цифри (80% от тях са рискови съставки) + * Думи, които завършват на -one, -thicone, -siloxan: това са **силикони**, които със сигурност нямат място върху кожата ви. + * Всички С с последващ нечетен номер са синтетични съставки +* Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! +* Натуралните продукти са в тъмни, **пастелни цветове**. Искрящо жълтият или ярко розов сапун не е натурален. + +Надявам се тази статия да ви е била **интересна** и най-вече **полезна**. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.;T; +I"2

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    + +

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    + +

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    + +
      +
    1. +

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. +Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. +Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. +Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. +Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      +
    2. +
    3. +

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. +Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. +Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. +Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      +
    4. +
    5. +

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти +Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата +Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. +Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. +Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      +
    6. +
    7. +

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. +Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. +Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. +Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      +
    8. +
    9. +

      Sodium Lauryl Sulfate(SLS) +Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. +Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.

      +
    10. +
    11. +

      Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените +Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. +Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. +Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      +
    12. +
    + +

    7.Други: + * Всички цифри (80% от тях са рискови съставки) + * Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви. + * Всички С с последващ нечетен номер са синтетични съставки +* Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! +* Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.

    + +

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    +;T; @I" + + + + + + + Опасната козметика - част 2 + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Опасната козметика - част 2 +

    + +
    +
      +
    • + + July 12, 2014 +
    • +
    +
    + + +

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    + +

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    + +

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    + +
      +
    1. +

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. +Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. +Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. +Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. +Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      +
    2. +
    3. +

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. +Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. +Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. +Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      +
    4. +
    5. +

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти +Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата +Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. +Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. +Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      +
    6. +
    7. +

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. +Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. +Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. +Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      +
    8. +
    9. +Sodium Lauryl Sulfate(SLS) +Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. +Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.
      +
    10. +
    11. +Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените +Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. +Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. +Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      +
        +
      • +Други +
          +
        • Всички цифри (80% от тях са рискови съставки)
        • +
        • Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви.
        • +
        • Всички С с последващ нечетен номер са синтетични съставки
        • +
        • Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго!
        • +
        • Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.
        • +
        +
      • +
      +
    12. +
    + +

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"h0В предишният [пост](/blog/2014-07-05-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0/) по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда. + +Как да разпознаем "лошите" от "добрите" съставки? Много просто! **Трябва да се научите да четете етикетите.** Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис "Био" или "Натурален". Винаги поглеждайте в задния двор! + +Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка: + +1. **Парабени**. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. +**Как да ги откриете**: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. +**Къде се намират**: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. +**Защо да ги избягваме**: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. +**Алтернативи**: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки. + +2. **Петролатум**. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. +**Как и къде да го открием**: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. +**Защо да го избягваме**: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. +Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. +**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum. + +3. **Триклозан** - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти +**Какво пише и къде се намира**: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата +**Защо да го избягваме**: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. +Подобен препарат е и **Хлорхексидинът**, използван масово в зъбната козметика. +**Алтернативи**: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба. + +4. **Пропиленгликолът** е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. +**Как и къде да го открием**: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. +**Защо да го избягваме**: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. +**Алтернативи**: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol + +5. **Sodium Lauryl Sulfate(SLS)** +**Как и къде да го открием**: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. +**Защо да го избягваме**: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. +**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.
    +6. **Формалдехид-отделящи консерванти** - консерванти, които се използват заедно с или вместо парабените +**Как и къде се намират**: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. +**Защо да ги избягваме**: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. **Европейският съюз ограничава** употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като "съдържащи формалдехид". +**Алтерантиви**: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

    +* **Други** + * Всички цифри (80% от тях са рискови съставки) + * Думи, които завършват на -one, -thicone, -siloxan: това са **силикони**, които със сигурност нямат място върху кожата ви. + * Всички С с последващ нечетен номер са синтетични съставки + * Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! + * Натуралните продукти са в тъмни, **пастелни цветове**. Искрящо жълтият или ярко розов сапун не е натурален. + +Надявам се тази статия да ви е била **интересна** и най-вече **полезна**. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.;T; +I"R3

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    + +

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    + +

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    + +
      +
    1. +

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. +Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. +Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. +Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. +Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      +
    2. +
    3. +

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. +Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. +Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. +Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      +
    4. +
    5. +

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти +Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата +Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. +Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. +Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      +
    6. +
    7. +

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. +Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. +Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. +Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      +
    8. +
    9. +Sodium Lauryl Sulfate(SLS) +Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. +Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. +Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.
      +
    10. +
    11. +Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените +Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. +Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. +Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      +
        +
      • +Други +
          +
        • Всички цифри (80% от тях са рискови съставки)
        • +
        • Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви.
        • +
        • Всички С с последващ нечетен номер са синтетични съставки
        • +
        • Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго!
        • +
        • Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.
        • +
        +
      • +
      +
    12. +
    + +

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    +;T; @I"U/blog/2014-07-27-храната-като-лекарство-черен-дроб/;T{;{ ;I"< + + + + + + + Храната като лекарство: Черен дроб + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Храната като лекарство: Черен дроб +

    + +
    +
      +
    • + + July 27, 2014 +
    • +
    +
    + + +

    Субпродуктите не са много популярна храна в съвременният начин на хранене, за разлика от миналото. Нашите прародители са употребявали всички части на закланото животно включително черен дроб, бъбреци, стомах, сърце, мозък и дори тестиси. Защо? Какво според вас има толкова ценно в тези части, сравнено с мускулното месо, което сме свикнали да ядем? Отговорът е ИМА МНОГО ПОВЕЧЕ ХРАНИТЕЛНИ ВЕЩЕСТВА!

    + +

    В труда на Д-р Уестън Прайс, за който можете да си припомните тук и тук често можете да срещнете племена и култури, които изяждат първо органите на животното, а мускулното месо се разпределя като храна за хората, за кучетата и за запаси. Освен това в немалко култури най-ценните органи са предоставяни на членовете на племето със специални нужди - бременни жени, деца, шаманите или пък ловците.

    + +

    Черният дроб и другите органни меса са най-концентрираният източник на витамини, минерали, полезни мазнини и незаменими аминокиселини.

    + +

    Сравнено с мускулното месо, органите са с далеч по-висока хранителна плътност и са по-богати на който и да е нутриент. Те включват в състава си големи дози витамини от групата В: В2, В6, В9(фолиева киселина) и много важният витамин В12. Субпродуктите също така съдържат минерали като фосфор, желязо, мед, магнезий, йод, калций, селен, калий, натрий, цинк, манган и доставят важните мастно-разтворими витамини A, D, E и K. В животинските органи се съдържа най-голямо количество лесно усвоим витамин D в сравнение със всеки друг източник. С тази питателна храна си набавяме и голямо количество есенциални мастни киселини, вкл. арахидонова киселина и Омега-3 киселините EPA и DHA.

    + +

    Черният дроб е най-концентрираният източник на витамин А, в сравнение с всички храни. Ето някои данни:

    + +
    +

    Черен дроб от риба треска - Vitamin А 100 000IU/ 100гр

    +
    + +
    +

    Черен дроб от теле, кърмаче - Vitamin A 70559IU/100гр

    +
    + +
    +

    Черен дроб от възрастно теле, пасящо - Vitamin A 31718IU/100гр

    +
    + +
    +

    Агнешки дроб - Vitamin A 24943 IU/100гр

    +
    + +
    +

    Свински дроб - Vitamin A 17998 IU/100гр

    +
    + +
    +

    Пилешки дроб - Vitamin A 13328 IU/100гр

    +
    + +

    За витамин А съм писала и преди. Той е изключително важен за здрави зъби и кости, но децата и хора, засегнати от определени състояния не могат да го преработват от растителни източници. За тях е задължителна употребата на черен дроб веднъж или два пъти седмично. Разбира се, консумацията на чернен дроб има и други важни ползи за човешкото тяло: той е източник на витамин D, Витамин B12(и други витамини от групата В), мед, магнезий, фосфор, манган и желязо, които са във възможно най-лесно усвоимата си форма.

    + +

    Бъбреците са богати на витамин В12, селен, желязо, мед, фосфор и цинк.

    + +

    Въпреки че сърцето е мускул, то също доставя богат набор от полезни вещества на човека. То е много концентриран източник на Коензим Q10, който е важен за здравето на нашето сърце и за силен имунитет. Сърцето съдържа витамин А, В12, фолиева киселина, желязо, селен, фосфор, цинк и е най-богатият източник на мед. От сърцето можем да си набавим два пъти повече колаген и еластин, спрямо обикновенното мускулно месо. Това е така, защото то е богато на аминокиселините глицин и пролин, които са важни за здрава съединителна тъкан, здрави стави и добро храносмилане.

    + +

    Още една причина да ядем повече черен дроб и субпродукти е, че те са много по-евтини, а всъщност дават много повече на организма. Най-добрият вариант е да купувате храната си директно от животновъди, които хранят животните си с паша и сено. Но дори и да се налага да купувате храната си от супермаркетите, все пак органните меса ще ви донесат много от гореизброените ползи.

    + +

    Разбира се, напълно на ясно съм, че следващата стъпка, а именно приготвянето на това месо, би могла да е препъни-камък по пътя, но с доза ентусиазъм и нужното търпение, съм сигурна, че ще успеете да намерите рецептата, която допада на вкуса на вашето семейство. Например черен дроб, приготвен като пастет е любимо ястие на много възрастни и деца. Ето и още варианти.

    + +

    Надявам се да съм ви убедила в полезността от консумацията на животински органи и да започнете да го включвате в менюто си, в случай че не го правите сега. Моята препоръка е да имате две хранения седмично, съдържащи някои от тези толкова полезни за човешкото тяло храни.

    + + + + + +
    + + +
    +
    + + +
    + + + + + + + + + +;T; I"8Субпродуктите не са много популярна храна в съвременният начин на хранене, за разлика от миналото. Нашите прародители са употребявали всички части на закланото животно включително черен дроб, бъбреци, стомах, сърце, мозък и дори тестиси. Защо? Какво според вас има толкова ценно в тези части, сравнено с мускулното месо, което сме свикнали да ядем? Отговорът е ИМА МНОГО ПОВЕЧЕ ХРАНИТЕЛНИ ВЕЩЕСТВА! + +В труда на Д-р Уестън Прайс, за който можете да си припомните [тук](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/) и [тук](/blog/2014-03-03-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-2/) често можете да срещнете племена и култури, които изяждат първо органите на животното, а мускулното месо се разпределя като храна за хората, за кучетата и за запаси. Освен това в немалко култури най-ценните органи са предоставяни на членовете на племето със специални нужди - бременни жени, деца, шаманите или пък ловците. + +**Черният дроб и другите органни меса са най-концентрираният източник на витамини, минерали, полезни мазнини и незаменими аминокиселини.** + +Сравнено с мускулното месо, органите са с далеч по-висока хранителна плътност и са по-богати на който и да е нутриент. Те включват в състава си големи дози витамини от групата В: В2, В6, В9(фолиева киселина) и много важният витамин В12. Субпродуктите също така съдържат минерали като фосфор, желязо, мед, магнезий, йод, калций, селен, калий, натрий, цинк, манган и доставят важните мастно-разтворими витамини A, D, E и K. В животинските органи се съдържа най-голямо количество лесно усвоим витамин D в сравнение със всеки друг източник. С тази питателна храна си набавяме и голямо количество есенциални мастни киселини, вкл. арахидонова киселина и Омега-3 киселините EPA и DHA. + +**Черният дроб** е най-концентрираният източник на витамин А, в сравнение с всички храни. Ето някои данни: + +>Черен дроб от риба треска - Vitamin А 100 000IU/ 100гр + +>Черен дроб от теле, кърмаче - Vitamin A 70559IU/100гр + +>Черен дроб от възрастно теле, пасящо - Vitamin A 31718IU/100гр + +>Агнешки дроб - Vitamin A 24943 IU/100гр + +>Свински дроб - Vitamin A 17998 IU/100гр + +>Пилешки дроб - Vitamin A 13328 IU/100гр + +За витамин А съм [писала](/blog/2014-06-02-%D0%BA%D0%B0%D0%BA-%D0%BC%D0%B0%D1%80%D0%B8%D1%8F-%D1%81%D0%B8-%D0%B2%D1%8A%D1%80%D0%BD%D0%B0-%D1%83%D1%81%D0%BC%D0%B8%D0%B2%D0%BA%D0%B0%D1%82%D0%B0/) и преди. Той е изключително важен за здрави зъби и кости, но децата и хора, засегнати от определени състояния не могат да го преработват от растителни източници. За тях е задължителна употребата на черен дроб веднъж или два пъти седмично. Разбира се, консумацията на чернен дроб има и други важни ползи за човешкото тяло: той е източник на витамин D, Витамин B12(и други витамини от групата В), мед, магнезий, фосфор, манган и желязо, които са във възможно най-лесно усвоимата си форма. + +**Бъбреците** са богати на витамин В12, селен, желязо, мед, фосфор и цинк. + +Въпреки че **сърцето** е мускул, то също доставя богат набор от полезни вещества на човека. То е много концентриран източник на Коензим Q10, който е важен за здравето на нашето сърце и за силен имунитет. Сърцето съдържа витамин А, В12, фолиева киселина, желязо, селен, фосфор, цинк и е най-богатият източник на мед. От сърцето можем да си набавим два пъти повече колаген и еластин, спрямо обикновенното мускулно месо. Това е така, защото то е богато на аминокиселините глицин и пролин, които са важни за здрава съединителна тъкан, здрави стави и добро храносмилане. + +Още една причина да ядем повече черен дроб и субпродукти е, че те са много по-евтини, а всъщност дават много повече на организма. Най-добрият вариант е да купувате храната си директно от животновъди, които хранят животните си с паша и сено. Но дори и да се налага да купувате храната си от супермаркетите, все пак органните меса ще ви донесат много от гореизброените ползи. + +Разбира се, напълно на ясно съм, че следващата стъпка, а именно приготвянето на това месо, би могла да е препъни-камък по пътя, но с доза ентусиазъм и нужното търпение, съм сигурна, че ще успеете да намерите рецептата, която допада на вкуса на вашето семейство. Например черен дроб, приготвен като пастет е любимо ястие на много възрастни и деца. [Ето](http://pep-4o.blogspot.com/2009/10/4-800-1-200-200.html) и [още](http://pep-4o.blogspot.com/2012/11/blog-post_25.html) варианти. + +Надявам се да съм ви убедила в полезността от консумацията на животински органи и да започнете да го включвате в менюто си, в случай че не го правите сега. Моята препоръка е да имате две хранения седмично, съдържащи някои от тези толкова полезни за човешкото тяло храни.;T; +I"

    Субпродуктите не са много популярна храна в съвременният начин на хранене, за разлика от миналото. Нашите прародители са употребявали всички части на закланото животно включително черен дроб, бъбреци, стомах, сърце, мозък и дори тестиси. Защо? Какво според вас има толкова ценно в тези части, сравнено с мускулното месо, което сме свикнали да ядем? Отговорът е ИМА МНОГО ПОВЕЧЕ ХРАНИТЕЛНИ ВЕЩЕСТВА!

    + +

    В труда на Д-р Уестън Прайс, за който можете да си припомните тук и тук често можете да срещнете племена и култури, които изяждат първо органите на животното, а мускулното месо се разпределя като храна за хората, за кучетата и за запаси. Освен това в немалко култури най-ценните органи са предоставяни на членовете на племето със специални нужди - бременни жени, деца, шаманите или пък ловците.

    + +

    Черният дроб и другите органни меса са най-концентрираният източник на витамини, минерали, полезни мазнини и незаменими аминокиселини.

    + +

    Сравнено с мускулното месо, органите са с далеч по-висока хранителна плътност и са по-богати на който и да е нутриент. Те включват в състава си големи дози витамини от групата В: В2, В6, В9(фолиева киселина) и много важният витамин В12. Субпродуктите също така съдържат минерали като фосфор, желязо, мед, магнезий, йод, калций, селен, калий, натрий, цинк, манган и доставят важните мастно-разтворими витамини A, D, E и K. В животинските органи се съдържа най-голямо количество лесно усвоим витамин D в сравнение със всеки друг източник. С тази питателна храна си набавяме и голямо количество есенциални мастни киселини, вкл. арахидонова киселина и Омега-3 киселините EPA и DHA.

    + +

    Черният дроб е най-концентрираният източник на витамин А, в сравнение с всички храни. Ето някои данни:

    + +
    +

    Черен дроб от риба треска - Vitamin А 100 000IU/ 100гр

    +
    + +
    +

    Черен дроб от теле, кърмаче - Vitamin A 70559IU/100гр

    +
    + +
    +

    Черен дроб от възрастно теле, пасящо - Vitamin A 31718IU/100гр

    +
    + +
    +

    Агнешки дроб - Vitamin A 24943 IU/100гр

    +
    + +
    +

    Свински дроб - Vitamin A 17998 IU/100гр

    +
    + +
    +

    Пилешки дроб - Vitamin A 13328 IU/100гр

    +
    + +

    За витамин А съм писала и преди. Той е изключително важен за здрави зъби и кости, но децата и хора, засегнати от определени състояния не могат да го преработват от растителни източници. За тях е задължителна употребата на черен дроб веднъж или два пъти седмично. Разбира се, консумацията на чернен дроб има и други важни ползи за човешкото тяло: той е източник на витамин D, Витамин B12(и други витамини от групата В), мед, магнезий, фосфор, манган и желязо, които са във възможно най-лесно усвоимата си форма.

    + +

    Бъбреците са богати на витамин В12, селен, желязо, мед, фосфор и цинк.

    + +

    Въпреки че сърцето е мускул, то също доставя богат набор от полезни вещества на човека. То е много концентриран източник на Коензим Q10, който е важен за здравето на нашето сърце и за силен имунитет. Сърцето съдържа витамин А, В12, фолиева киселина, желязо, селен, фосфор, цинк и е най-богатият източник на мед. От сърцето можем да си набавим два пъти повече колаген и еластин, спрямо обикновенното мускулно месо. Това е така, защото то е богато на аминокиселините глицин и пролин, които са важни за здрава съединителна тъкан, здрави стави и добро храносмилане.

    + +

    Още една причина да ядем повече черен дроб и субпродукти е, че те са много по-евтини, а всъщност дават много повече на организма. Най-добрият вариант е да купувате храната си директно от животновъди, които хранят животните си с паша и сено. Но дори и да се налага да купувате храната си от супермаркетите, все пак органните меса ще ви донесат много от гореизброените ползи.

    + +

    Разбира се, напълно на ясно съм, че следващата стъпка, а именно приготвянето на това месо, би могла да е препъни-камък по пътя, но с доза ентусиазъм и нужното търпение, съм сигурна, че ще успеете да намерите рецептата, която допада на вкуса на вашето семейство. Например черен дроб, приготвен като пастет е любимо ястие на много възрастни и деца. Ето и още варианти.

    + +

    Надявам се да съм ви убедила в полезността от консумацията на животински органи и да започнете да го включвате в менюто си, в случай че не го правите сега. Моята препоръка е да имате две хранения седмично, съдържащи някои от тези толкова полезни за човешкото тяло храни.

    +;T; @I"/blog/all_posts/;T{;{ ;I" +;T; I": +<%= render '_posts_small', :posts => posts_list %> + +;T; +I"p +
  • Documentation added to Forknote
  • + +;T; @I"&/static/images/facebook-icon.png/;T{;{I")/static/images/facebook-icon@2x.png/;T{;{I"/blog/feed/;T{;{;I"N + + + http://bezkaries.com/ + Forknote: Blog + 2015-10-11T21:00:00Z + + + + forknote + http://forknote.net/blog/ + + + tag:bezkaries.com,2015-10-12:/blog/2015-10-12-documentation-added-to-forknote/ + Documentation added to Forknote + 2015-10-11T21:00:00Z + 2015-10-11T21:00:00Z + + pmitchev + http://forknote.net/blog/ + + + +<p>Documentation was added for:</p> + +<ul> + <li><a href="/documentation/daemon/">Daemon</a></li> + <li><a href="/documentation/simplewallet/">Simplewallet</a></li> + <li><a href="/documentation/payment-gateway/">Payment gateway</a></li> +</ul> + +<p>Guides for the most common questions were created:</p> + +<ul> + <li><a href="/guide/getting-started/">Getting started</a></li> + <li><a href="/guide/create-coin/">Create coin</a></li> + <li><a href="/guide/starting-seed-node/">Starting seed node</a></li> +</ul> + + + + + +;T; I"= +<%= atom_feed :limit => 30, :articles => posts_list %> +;T; +@I" /CNAME/;T{;{I" +/404/;T{;{ ;I" + + + + + + + 404 error | Forknote.net + + + + + + + + + + + +
    + +
    + + + +
    +
    + +

    404 error

    + +The page you are looking for does not exist. + +
    +
    +
    +
    + + + + + + + + +;T; I" +
    +
    + +

    404 error

    + +The page you are looking for does not exist. + +
    +
    ;T; +I" +
    +
    + +

    404 error

    + +The page you are looking for does not exist. + +
    +
    +
    +
    +;T; @I"/contact/error/;T{;{ ;I"& + + + + + + + За контакти - грешка | BezKaries.com + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Форма за контакт

    + +

    Имаше проблем с изпращането на вашето запитване. Моля, изпратете ни email на адрес info@bezkaries.com.

    + +
    + + + +
    + + + + + + + +;T; I" +# Форма за контакт + +Имаше проблем с изпращането на вашето запитване. Моля, изпратете ни email на адрес info@bezkaries.com.;T; +I"  +

    Форма за контакт

    + +

    Имаше проблем с изпращането на вашето запитване. Моля, изпратете ни email на адрес info@bezkaries.com.

    +;T; @I"/contact/success/;T{;{ ;I" + + + + + + + За контакти - успешно изпратено | BezKaries.com + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Форма за контакт

    + +

    Вашето запитване беше изпратено успешно!

    + +
    + + + +
    + + + + + + + +;T; I"s +# Форма за контакт + +Вашето запитване беше изпратено успешно!;T; +I" +

    Форма за контакт

    + +

    Вашето запитване беше изпратено успешно!

    +;T; @I"/contact/invalid_field/;T{;{ ;I"H + + + + + + + За контакти - невалидно поле | BezKaries.com + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Форма за контакт

    + +

    Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си.

    + +
    + + + +
    + + + + + + + +;T; I" +# Форма за контакт + +Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си.;T; +I" +

    Форма за контакт

    + +

    Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си.

    +;T; @I"!/static/assets/js/base58.js/;T{;{I""/static/assets/js/cn_util.js/;T{;{I"!/static/assets/js/config.js/;T{;{I"!/static/assets/js/crypto.js/;T{;{I")/static/assets/js/lib/biginteger.js/;T{;{I"#/static/assets/js/mnemonic.js/;T{;{I"%/static/dist/ng-google-chart.js/;T{;{I"$/static/dist/showErrors.min.js/;T{;{I""/static/partials/create.html/;T{;{I" /static/partials/create.js/;T{;{I"'/static/images/forknote-large.png/;T{;{I"*/static/images/forknote-large@2x.png/;T{;{I"'/static/images/forknote-small.png/;T{;{I"*/static/images/forknote-small@2x.png/;T{;{I" /coins/;T{;{ ;I"T0 + + + + + + + Existing coins | Forknote + + + + + + + + + + + +
    + +
    + + + + + +
    +
    +

    Join the Forknote Community.

    +

    The easiest way to create Cryptonote coins. Learn more.

    +
    +
    + +
    +
      +
    • + +

      Bytecoin

      +

      The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

      +
    • +
    • + +

      Dashcoin

      +

      The original idea for cloning the core features of Bytecoin started with Dashcoin.

      +
    • +
    • + +

      OneEvilCoin

      +

      OneEvilCoin is the first coin joined the Forknote familly

      +
    • +
    +
    +
    +
      +
    • + E +

      Ethanolium

      +

      +
    • +
    • + +

      Add Your Coin

      +

      Contact us to get your Forknote coin added to this list.

      +
    • +
    • +   +

       

      +

      +
    • +
    +
    + +
    +
    + +

    New to Forknote?

    +

    A few tips you start:

    + +
    + +
    + +

    Want to create your own cryptocurrency?

    +

    Visit the developer section or go streight to the documentation:

    + +
    +
    + + + + +

    </div>

    + + + + +

    </div>

    + + + + +

    </div>

    + + + + +

    </div>

    + + + + + + + + + + + +;T; I"&$ + + +
    +
    +

    Join the Forknote Community.

    +

    The easiest way to create Cryptonote coins. Learn more.

    +
    +
    + +
    +
      +
    • + +

      Bytecoin

      +

      The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

      +
    • +
    • + +

      Dashcoin

      +

      The original idea for cloning the core features of Bytecoin started with Dashcoin.

      +
    • +
    • + +

      OneEvilCoin

      +

      OneEvilCoin is the first coin joined the Forknote familly

      +
    • +
    +
    +
    +
      +
    • + E +

      Ethanolium

      +

      +
    • +
    • + +

      Add Your Coin

      +

      Contact us to get your Forknote coin added to this list.

      +
    • +
    • +   +

       

      +

      +
    • +
    +
    + +
    +
    + +

    New to Forknote?

    +

    A few tips you start:

    + +
    + +
    + +

    Want to create your own cryptocurrency?

    +

    Visit the developer section or go streight to the documentation:

    + +
    +
    + + + +
    + + + +
    + + + + + + + + + +;T; +I"$ + + +
    +
    +

    Join the Forknote Community.

    +

    The easiest way to create Cryptonote coins. Learn more.

    +
    +
    + +
    +
      +
    • + +

      Bytecoin

      +

      The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

      +
    • +
    • + +

      Dashcoin

      +

      The original idea for cloning the core features of Bytecoin started with Dashcoin.

      +
    • +
    • + +

      OneEvilCoin

      +

      OneEvilCoin is the first coin joined the Forknote familly

      +
    • +
    +
    +
    +
      +
    • + E +

      Ethanolium

      +

      +
    • +
    • + +

      Add Your Coin

      +

      Contact us to get your Forknote coin added to this list.

      +
    • +
    • +   +

       

      +

      +
    • +
    +
    + +
    +
    + +

    New to Forknote?

    +

    A few tips you start:

    + +
    + +
    + +

    Want to create your own cryptocurrency?

    +

    Visit the developer section or go streight to the documentation:

    + +
    +
    + + + + +

    </div>

    + + + + +

    </div>

    + + + + +

    </div>

    + + + + +

    </div>

    + + + +;T; @I"/download/;T{;{ ;I" + + + + + + + Download | Forknote + + + + + + + + + + + +
    + +
    + + + +
    +
    +

    Join the Forknote Community.

    +

    The easiest way to create Cryptonote coins. Learn more.

    +
    +
    + +
    +
      +
    • + +

      Windows CLI

      +

      Daemon, simplewallet and payment gateway for Windows (64bit)

      +
    • +
    • + +

      Linux CLI

      +

      Daemon, simplewallet and payment gateway for Ubuntu (64bit)

      +
    • +
    • + +

      Mac CLI

      +

      Daemon, simplewallet and payment gateway for Mac (64bit)

      +
    • +
    +
    + +
    +
    + +

    Want to connect to existing Forknote network?

    +

    Awesome! A few tips you may find useful:

    + +
    + +
    + +

    Want to create your own cryptocurrency?

    +

    Follow our guides and launch in a few minutes:

    + +
    +
    + + + + + + + + +;T; I" +
    +
    +

    Join the Forknote Community.

    +

    The easiest way to create Cryptonote coins. Learn more.

    +
    +
    + +
    +
      +
    • + +

      Windows CLI

      +

      Daemon, simplewallet and payment gateway for Windows (64bit)

      +
    • +
    • + +

      Linux CLI

      +

      Daemon, simplewallet and payment gateway for Ubuntu (64bit)

      +
    • +
    • + +

      Mac CLI

      +

      Daemon, simplewallet and payment gateway for Mac (64bit)

      +
    • +
    +
    + +
    +
    + +

    Want to connect to existing Forknote network?

    +

    Awesome! A few tips you may find useful:

    + +
    + +
    + +

    Want to create your own cryptocurrency?

    +

    Follow our guides and launch in a few minutes:

    + +
    +
    +;T; +I" +
    +
    +

    Join the Forknote Community.

    +

    The easiest way to create Cryptonote coins. Learn more.

    +
    +
    + +
    +
      +
    • + +

      Windows CLI

      +

      Daemon, simplewallet and payment gateway for Windows (64bit)

      +
    • +
    • + +

      Linux CLI

      +

      Daemon, simplewallet and payment gateway for Ubuntu (64bit)

      +
    • +
    • + +

      Mac CLI

      +

      Daemon, simplewallet and payment gateway for Mac (64bit)

      +
    • +
    +
    + +
    +
    + +

    Want to connect to existing Forknote network?

    +

    Awesome! A few tips you may find useful:

    + +
    + +
    + +

    Want to create your own cryptocurrency?

    +

    Follow our guides and launch in a few minutes:

    + +
    +
    +;T; @I"%/static/images/twitter-icon.png/;T{;{I"(/static/images/twitter-icon@2x.png/;T{;{I"'/static/images/coins/bytecoin.png/;T{;{I"*/static/images/coins/bytecoin@2x.png/;T{;{I"+/static/images/coins/bytecoin@org.png/;T{;{I"'/static/images/coins/dashcoin.png/;T{;{I"*/static/images/coins/dashcoin@2x.png/;T{;{I"+/static/images/coins/dashcoin@org.png/;T{;{I"*/static/images/coins/oneevilcoin.png/;T{;{I"-/static/images/coins/oneevilcoin@2x.png/;T{;{I"./static/images/coins/oneevilcoin@org.png/;T{;{I"/developers/;T{;{ ;I"U + + + + + + + Developers | Forknote + + + + + + + + + + + +
    + +
    + + + +
    +
    +

    Create Cryptonote cryptocurrencies fast and easy.

    +

    All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

    + Create now +
    +
    + +
    + +
    + +
    +
    + +

    Already have a configuration file?

    +

    We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

    + +
    + +
    + +

    Ready to start a Forknote-based service?

    +

    Helpful resources for individual developers and companies:

    + +
    +
    + + + + + + + + +;T; I" +
    +
    +

    Create Cryptonote cryptocurrencies fast and easy.

    +

    All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

    + Create now +
    +
    + +
    + +
    + +
    +
    + +

    Already have a configuration file?

    +

    We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

    + +
    + +
    + +

    Ready to start a Forknote-based service?

    +

    Helpful resources for individual developers and companies:

    + +
    +
    +;T; +I" +
    +
    +

    Create Cryptonote cryptocurrencies fast and easy.

    +

    All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

    + Create now +
    +
    + +
    + +
    + +
    +
    + +

    Already have a configuration file?

    +

    We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

    + +
    + +
    + +

    Ready to start a Forknote-based service?

    +

    Helpful resources for individual developers and companies:

    + +
    +
    +;T; @FI" /create/;T{;{ ;I" + + + + + + + Create Cryptonote coin | Forknote + + + + + + + + + + + +
    + +
    + + + +
    + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;T; I"L +
    + + + + +
    + + +
    + + + + + + + + + + + + + + + + +;T; +I"[ +
    + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;T; @LI"/static/js/app_create.js/;T{;{I",/coins/guides/create-coin-with-premine/;T{;{ ;I"_ + + + + + + + Create coin with premine | Forknote + + + + + + + + + + + +
    + +
    + + +
    +
    + +

    Getting Started

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Overview

    + +

    Most applications will use an existing wrapper library in the language +of your choice, but it’s important to familiarize yourself with the underlying API +HTTP methods first.

    + +

    There’s no easier way to kick the tires than through cURL.

    + +

    Hello World

    + +

    Let’s start by testing our setup. Open up a command prompt and enter the +following command (without the $):

    + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +

    The response will be a random selection from our design philosophies.

    + +

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    There are a few interesting bits in the response headers. As expected, the +Content-Type is application/json.

    + +

    Any headers beginning with X- are custom headers, and are not included in the +HTTP spec. Let’s take a look at a few of them:

    + +
      +
    • +X-GitHub-Media-Type has a value of github.v3. This lets us know the media type +for the response. Media types have helped us version our output in API v3. We’ll +talk more about that later.
    • +
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This +pair of headers indicate how many requests a client can make in +a rolling time period (typically an hour) and how many of those requests the +client has already spent.
    • +
    + +

    Authentication

    + +

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to +authenticate. In fact, doing anything interesting with the GitHub API requires +authentication.

    + +

    Basic

    + +

    The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication.

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +

    The -u flag sets the username, and cURL will prompt you for the password. You +can use -u "username:password" to avoid the prompt, but this leaves your +password in shell history and isn’t recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +X-RateLimit-Limit header.

    + +

    In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API.

    + +

    Two-factor authentication

    + +

    If you have two-factor authentication enabled, the API will return a +401 Unauthorized error code for the above request (and every other API request):

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +

    The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +OAuth section below for more information.

    + +

    Get your own user profile

    + +

    When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +your own user profile:

    + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +

    This time, in addition to the same set of public information we +retrieved for @defunkt earlier, you should also see the non-public +information for your user profile. For example, you’ll see a plan object +in the response which gives details about the GitHub plan for the account.

    + +

    OAuth

    + +

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use OAuth.

    + +

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big +features:

    + +
      +
    • +Revokable access: users can revoke authorization to third party apps at any time
    • +
    • +Limited access: users can review the specific access that a token +will provide before authorizing a third party app
    • +
    + +

    Normally, tokens are created via a web flow. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it’s authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application:

    + +

    GitHub's OAuth Prompt

    + +

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to create a personal access token via your +Personal access tokens settings page:

    + +

    Personal Token selection

    + +

    Also, the Authorizations API makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command:

    + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +

    There’s a lot going on in this one little call, so let’s break it down. First, +the -d flag indicates we’re doing a POST, using the +application/x-www-form-urlencoded content type (as opposed to GET). All POST +requests to the GitHub API should be in JSON.

    + +

    Next, let’s look at the scopes we’re sending over in this call. When creating +a new token, we include an optional array of scopes, or access +levels, that indicate what information this token can access. In this case, +we’re setting up the token with repo access, which grants access to read and +write to public and private repositories, and user scope, which grants read +and write access to public and private user profile data. See +the scopes docs for a full list of +scopes. You should only request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The 201 +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token.

    + +

    If you have two-factor authentication enabled, the API will +return the previously described 401 Unauthorized error code +for the above request. You can get around that error by providing a 2FA OTP code +in the X-GitHub-OTP request header:

    + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you’ll receive an SMS with your OTP code after making a request to +this endpoint.

    + +

    Now, we can use the forty character token instead of a username and password +in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +

    Treat OAuth tokens like passwords! Don’t share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent.

    + +

    Now that we’ve got the hang of making authenticated calls, let’s move along to +the Repositories API.

    + +

    Repositories

    + +

    Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can GET repository details in the same way we fetched user +details earlier:

    + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +

    In the same way, we can view repositories for the authenticated user:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +

    Or, we can list repositories for another user:

    + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +

    Or, we can list repositories for an organization:

    + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +

    The information returned from these calls will depend on how we authenticate:

    + +
      +
    • Using Basic Authentication, the response includes all repositories the +the user has access to see on github.com.
    • +
    • Using OAuth, private repositories are only returned if the OAuth token +contains the repo scope.
    • +
    + +

    As the docs indicate, these methods take a type parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team.

    + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +

    In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string.

    + +

    Create a repository

    + +

    Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To create a repository, +we need to POST some JSON containing the details and configuration options.

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +

    In this minimal example, we create a new repository for our blog (to be served +on GitHub Pages, perhaps). Though the blog will be public, we’ve made +the repository private. In this single step, we’ll also initialize it with +a README and a nanoc-flavored .gitignore template.

    + +

    The resulting repository will be found at https://github.com/<your_username>/blog. +To create a repository under an organization for which you’re +an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    + +

    Next, let’s fetch our newly created repository:

    + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +

    Oh noes! Where did it go? Since we created the repository as private, we need +to authenticate in order to see it. If you’re a grizzled HTTP user, you might +expect a 403 instead. Since we don’t want to leak information about private +repositories, the GitHub API returns a 404 in this case, as if to say “we can +neither confirm nor deny the existence of this repository.”

    + +

    Issues

    + +

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while +staying out of your way. With the GitHub Issues API, you can pull +data out or create issues from other tools to create a workflow that works for +your team.

    + +

    Just like github.com, the API provides a few methods to view issues for the +authenticated user. To see all your issues, call GET /issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +

    To get only the issues under one of your GitHub organizations, call GET +/orgs/<org>/issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +

    We can also get all the issues under a single repository:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +

    Pagination

    + +

    A project the size of Rails has thousands of issues. We’ll need to paginate, +making multiple API calls to get the data. Let’s repeat that last call, this +time taking note of the response headers:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +

    The Link header provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results.

    + +

    Creating an issue

    + +

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from +the API.

    + +

    To create an issue, we need to be authenticated, so we’ll pass an +OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON +body to the /issues path underneath the repository in which we want to create +the issue:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +

    The response gives us a couple of pointers to the newly created issue, both in +the Location response header and the url field of the JSON response.

    + +

    Conditional requests

    + +

    A big part of being a good API citizen is respecting rate limits by +caching information that hasn’t changed. The API supports conditional +requests and helps you do the right thing. Consider the +first call we made to get defunkt’s profile:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +

    In addition to the JSON body, take note of the HTTP status code of 200 and +the ETag header. +The ETag is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed:

    + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +

    The 304 status indicates that the resource hasn’t changed since the last time +we asked for it and the response will contain no body. As a bonus, 304 +responses don’t count against your rate limit.

    + +

    Woot! Now you know the basics of the GitHub API!

    + +
      +
    • Basic & OAuth authentication
    • +
    • Fetching and creating repositories and issues
    • +
    • Conditional requests
    • +
    + +

    Keep learning with the next API guide Basics of Authentication!

    + + +
    +
    + + + + + + + +;T; I"L +# Getting Started + +* TOC +{:toc} + +Let's walk through core API concepts as we tackle some everyday use cases. + +## Overview + +Most applications will use an existing [wrapper library][wrappers] in the language +of your choice, but it's important to familiarize yourself with the underlying API +HTTP methods first. + +There's no easier way to kick the tires than through [cURL][curl]. + +### Hello World + +Let's start by testing our setup. Open up a command prompt and enter the +following command (without the `$`): + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +The response will be a random selection from our design philosophies. + +Next, let's `GET` [Chris Wanstrath's][defunkt github] [GitHub profile][users api]: + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +Mmmmm, tastes like [JSON][json]. Let's add the `-i` flag to include headers: + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +There are a few interesting bits in the response headers. As expected, the +`Content-Type` is `application/json`. + +Any headers beginning with `X-` are custom headers, and are not included in the +HTTP spec. Let's take a look at a few of them: + +* `X-GitHub-Media-Type` has a value of `github.v3`. This lets us know the [media type][media types] +for the response. Media types have helped us version our output in API v3. We'll +talk more about that later. +* Take note of the `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers. This +pair of headers indicate [how many requests a client can make][rate limiting] in +a rolling time period (typically an hour) and how many of those requests the +client has already spent. + +## Authentication + +Unauthenticated clients can make 60 requests per hour. To get more, we'll need to +_authenticate_. In fact, doing anything interesting with the GitHub API requires +[authentication][authentication]. + +### Basic + +The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication. + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +The `-u` flag sets the username, and cURL will prompt you for the password. You +can use `-u "username:password"` to avoid the prompt, but this leaves your +password in shell history and isn't recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +`X-RateLimit-Limit` header. + +In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API. + +### Two-factor authentication + +If you have [two-factor authentication][2fa] enabled, the API will return a +`401 Unauthorized` error code for the above request (and every other API request): + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +[OAuth section][oauth section] below for more information. + +### Get your own user profile + +When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +[your own user profile][auth user api]: + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +This time, in addition to the same set of public information we +retrieved for [@defunkt][defunkt github] earlier, you should also see the non-public +information for your user profile. For example, you'll see a `plan` object +in the response which gives details about the GitHub plan for the account. + +### OAuth + +While convenient, Basic Authentication isn't ideal because you shouldn't give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use [OAuth][oauth]. + +Instead of usernames and passwords, OAuth uses _tokens_. Tokens provide two big +features: + +* **Revokable access**: users can revoke authorization to third party apps at any time +* **Limited access**: users can review the specific access that a token + will provide before authorizing a third party app + +Normally, tokens are created via a [web flow][webflow]. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it's authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application: + +![GitHub's OAuth Prompt](/images/oauth_prompt.png) + +However, you don't need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to [create a **personal access token**][personal token] via your +[Personal access tokens settings page][tokens settings]: + +![Personal Token selection](/images/personal_token.png) + +Also, the [**Authorizations API**][authorizations api] makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command: + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +There's a lot going on in this one little call, so let's break it down. First, +the `-d` flag indicates we're doing a `POST`, using the +`application/x-www-form-urlencoded` content type (as opposed to `GET`). All `POST` +requests to the GitHub API should be in JSON. + +Next, let's look at the `scopes` we're sending over in this call. When creating +a new token, we include an optional array of [_scopes_][scopes], or access +levels, that indicate what information this token can access. In this case, +we're setting up the token with _repo_ access, which grants access to read and +write to public and private repositories, and _user_ scope, which grants read +and write access to public and private user profile data. See +[the scopes docs][scopes] for a full list of +scopes. You should **only** request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The `201` +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token. + +If you have [two-factor authentication][2fa] enabled, the API will +return the [previously described `401 Unauthorized` error code][2fa section] +for the above request. You can get around that error by providing a 2FA OTP code +in the [X-GitHub-OTP request header][2fa header]: + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you'll receive an SMS with your OTP code after making a request to +this endpoint. + +Now, we can use the forty character `token` instead of a username and password +in the rest of our examples. Let's grab our own user info again, using OAuth this time: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +**Treat OAuth tokens like passwords!** Don't share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent. + +Now that we've got the hang of making authenticated calls, let's move along to +the [Repositories API][repos-api]. + +## Repositories + +Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can [`GET` repository details][get repo] in the same way we fetched user +details earlier: + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +In the same way, we can [view repositories for the authenticated user][user repos api]: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +Or, we can [list repositories for another user][other user repos api]: + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +Or, we can [list repositories for an organization][org repos api]: + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +The information returned from these calls will depend on how we authenticate: + +* Using Basic Authentication, the response includes all repositories the + the user has access to see on github.com. +* Using OAuth, private repositories are only returned if the OAuth token + contains the `repo` [scope][scopes]. + +As the [docs][repos-api] indicate, these methods take a `type` parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team. + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string. + +### Create a repository + +Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To [create a repository][create repo], +we need to `POST` some JSON containing the details and configuration options. + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +In this minimal example, we create a new repository for our blog (to be served +on [GitHub Pages][pages], perhaps). Though the blog will be public, we've made +the repository private. In this single step, we'll also initialize it with +a README and a [nanoc][nanoc]-flavored [.gitignore template][gitignore +templates]. + +The resulting repository will be found at `https://github.com//blog`. +To create a repository under an organization for which you're +an owner, just change the API method from `/user/repos` to `/orgs//repos`. + +Next, let's fetch our newly created repository: + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +Oh noes! Where did it go? Since we created the repository as _private_, we need +to authenticate in order to see it. If you're a grizzled HTTP user, you might +expect a `403` instead. Since we don't want to leak information about private +repositories, the GitHub API returns a `404` in this case, as if to say "we can +neither confirm nor deny the existence of this repository." + +## Issues + +The UI for Issues on GitHub aims to provide 'just enough' workflow while +staying out of your way. With the GitHub [Issues API][issues-api], you can pull +data out or create issues from other tools to create a workflow that works for +your team. + +Just like github.com, the API provides a few methods to view issues for the +authenticated user. To [see all your issues][get issues api], call `GET /issues`: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +To get only the [issues under one of your GitHub organizations][get issues api], call `GET +/orgs//issues`: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +We can also get [all the issues under a single repository][repo issues api]: + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +### Pagination + +A project the size of Rails has thousands of issues. We'll need to [paginate][pagination], +making multiple API calls to get the data. Let's repeat that last call, this +time taking note of the response headers: + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +The [`Link` header][link-header] provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results. + +### Creating an issue + +Now that we've seen how to paginate lists of issues, let's [create an issue][create issue] from +the API. + +To create an issue, we need to be authenticated, so we'll pass an +OAuth token in the header. Also, we'll pass the title, body, and labels in the JSON +body to the `/issues` path underneath the repository in which we want to create +the issue: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +The response gives us a couple of pointers to the newly created issue, both in +the `Location` response header and the `url` field of the JSON response. + +## Conditional requests + +A big part of being a good API citizen is respecting rate limits by +caching information that hasn't changed. The API supports [conditional +requests][conditional-requests] and helps you do the right thing. Consider the +first call we made to get defunkt's profile: + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +In addition to the JSON body, take note of the HTTP status code of `200` and +the `ETag` header. +The [ETag][etag] is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed: + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +The `304` status indicates that the resource hasn't changed since the last time +we asked for it and the response will contain no body. As a bonus, `304` +responses don't count against your [rate limit][rate-limiting]. + +Woot! Now you know the basics of the GitHub API! + +* Basic & OAuth authentication +* Fetching and creating repositories and issues +* Conditional requests + +Keep learning with the next API guide [Basics of Authentication][auth guide]! + + +[wrappers]: /libraries/ +[curl]: http://curl.haxx.se/ +[media types]: /v3/media/ +[oauth]: /v3/oauth/ +[webflow]: /v3/oauth/#web-application-flow +[authorizations api]: /v3/oauth_authorizations/#create-a-new-authorization +[scopes]: /v3/oauth/#scopes +[repos-api]: /v3/repos/ +[pages]: http://pages.github.com +[nanoc]: http://nanoc.ws/ +[gitignore templates]: https://github.com/github/gitignore +[issues-api]: /v3/issues/ +[link-header]: http://www.w3.org/wiki/LinkHeader/ +[conditional-requests]: /v3/#conditional-requests +[rate-limiting]: /v3/#rate-limiting +[users api]: /v3/users/#get-a-single-user +[auth user api]: /v3/users/#get-the-authenticated-user +[defunkt github]: https://github.com/defunkt +[json]: http://en.wikipedia.org/wiki/JSON +[rate limiting]: /v3/#rate-limiting +[authentication]: /v3/#authentication +[2fa]: https://help.github.com/articles/about-two-factor-authentication +[2fa header]: /v3/auth/#working-with-two-factor-authentication +[oauth section]: /guides/getting-started/#oauth +[personal token]: https://help.github.com/articles/creating-an-access-token-for-command-line-use +[tokens settings]: https://github.com/settings/tokens +[pagination]: /v3/#pagination +[get repo]: /v3/repos/#get +[create repo]: /v3/repos/#create +[create issue]: /v3/issues/#create-an-issue +[auth guide]: /guides/basics-of-authentication +[user repos api]: /v3/repos/#list-your-repositories +[other user repos api]: /v3/repos/#list-user-repositories +[org repos api]: /v3/repos/#list-organization-repositories +[get issues api]: /v3/issues/#list-issues +[repo issues api]: /v3/issues/#list-issues-for-a-repository +[etag]: http://en.wikipedia.org/wiki/HTTP_ETag +[2fa section]: /guides/getting-started/#two-factor-authentication +;T; +I"=S +

    Getting Started

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Overview

    + +

    Most applications will use an existing wrapper library in the language +of your choice, but it’s important to familiarize yourself with the underlying API +HTTP methods first.

    + +

    There’s no easier way to kick the tires than through cURL.

    + +

    Hello World

    + +

    Let’s start by testing our setup. Open up a command prompt and enter the +following command (without the $):

    + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +

    The response will be a random selection from our design philosophies.

    + +

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    There are a few interesting bits in the response headers. As expected, the +Content-Type is application/json.

    + +

    Any headers beginning with X- are custom headers, and are not included in the +HTTP spec. Let’s take a look at a few of them:

    + +
      +
    • +X-GitHub-Media-Type has a value of github.v3. This lets us know the media type +for the response. Media types have helped us version our output in API v3. We’ll +talk more about that later.
    • +
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This +pair of headers indicate how many requests a client can make in +a rolling time period (typically an hour) and how many of those requests the +client has already spent.
    • +
    + +

    Authentication

    + +

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to +authenticate. In fact, doing anything interesting with the GitHub API requires +authentication.

    + +

    Basic

    + +

    The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication.

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +

    The -u flag sets the username, and cURL will prompt you for the password. You +can use -u "username:password" to avoid the prompt, but this leaves your +password in shell history and isn’t recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +X-RateLimit-Limit header.

    + +

    In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API.

    + +

    Two-factor authentication

    + +

    If you have two-factor authentication enabled, the API will return a +401 Unauthorized error code for the above request (and every other API request):

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +

    The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +OAuth section below for more information.

    + +

    Get your own user profile

    + +

    When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +your own user profile:

    + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +

    This time, in addition to the same set of public information we +retrieved for @defunkt earlier, you should also see the non-public +information for your user profile. For example, you’ll see a plan object +in the response which gives details about the GitHub plan for the account.

    + +

    OAuth

    + +

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use OAuth.

    + +

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big +features:

    + +
      +
    • +Revokable access: users can revoke authorization to third party apps at any time
    • +
    • +Limited access: users can review the specific access that a token +will provide before authorizing a third party app
    • +
    + +

    Normally, tokens are created via a web flow. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it’s authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application:

    + +

    GitHub's OAuth Prompt

    + +

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to create a personal access token via your +Personal access tokens settings page:

    + +

    Personal Token selection

    + +

    Also, the Authorizations API makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command:

    + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +

    There’s a lot going on in this one little call, so let’s break it down. First, +the -d flag indicates we’re doing a POST, using the +application/x-www-form-urlencoded content type (as opposed to GET). All POST +requests to the GitHub API should be in JSON.

    + +

    Next, let’s look at the scopes we’re sending over in this call. When creating +a new token, we include an optional array of scopes, or access +levels, that indicate what information this token can access. In this case, +we’re setting up the token with repo access, which grants access to read and +write to public and private repositories, and user scope, which grants read +and write access to public and private user profile data. See +the scopes docs for a full list of +scopes. You should only request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The 201 +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token.

    + +

    If you have two-factor authentication enabled, the API will +return the previously described 401 Unauthorized error code +for the above request. You can get around that error by providing a 2FA OTP code +in the X-GitHub-OTP request header:

    + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you’ll receive an SMS with your OTP code after making a request to +this endpoint.

    + +

    Now, we can use the forty character token instead of a username and password +in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +

    Treat OAuth tokens like passwords! Don’t share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent.

    + +

    Now that we’ve got the hang of making authenticated calls, let’s move along to +the Repositories API.

    + +

    Repositories

    + +

    Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can GET repository details in the same way we fetched user +details earlier:

    + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +

    In the same way, we can view repositories for the authenticated user:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +

    Or, we can list repositories for another user:

    + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +

    Or, we can list repositories for an organization:

    + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +

    The information returned from these calls will depend on how we authenticate:

    + +
      +
    • Using Basic Authentication, the response includes all repositories the +the user has access to see on github.com.
    • +
    • Using OAuth, private repositories are only returned if the OAuth token +contains the repo scope.
    • +
    + +

    As the docs indicate, these methods take a type parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team.

    + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +

    In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string.

    + +

    Create a repository

    + +

    Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To create a repository, +we need to POST some JSON containing the details and configuration options.

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +

    In this minimal example, we create a new repository for our blog (to be served +on GitHub Pages, perhaps). Though the blog will be public, we’ve made +the repository private. In this single step, we’ll also initialize it with +a README and a nanoc-flavored .gitignore template.

    + +

    The resulting repository will be found at https://github.com/<your_username>/blog. +To create a repository under an organization for which you’re +an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    + +

    Next, let’s fetch our newly created repository:

    + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +

    Oh noes! Where did it go? Since we created the repository as private, we need +to authenticate in order to see it. If you’re a grizzled HTTP user, you might +expect a 403 instead. Since we don’t want to leak information about private +repositories, the GitHub API returns a 404 in this case, as if to say “we can +neither confirm nor deny the existence of this repository.”

    + +

    Issues

    + +

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while +staying out of your way. With the GitHub Issues API, you can pull +data out or create issues from other tools to create a workflow that works for +your team.

    + +

    Just like github.com, the API provides a few methods to view issues for the +authenticated user. To see all your issues, call GET /issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +

    To get only the issues under one of your GitHub organizations, call GET +/orgs/<org>/issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +

    We can also get all the issues under a single repository:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +

    Pagination

    + +

    A project the size of Rails has thousands of issues. We’ll need to paginate, +making multiple API calls to get the data. Let’s repeat that last call, this +time taking note of the response headers:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +

    The Link header provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results.

    + +

    Creating an issue

    + +

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from +the API.

    + +

    To create an issue, we need to be authenticated, so we’ll pass an +OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON +body to the /issues path underneath the repository in which we want to create +the issue:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +

    The response gives us a couple of pointers to the newly created issue, both in +the Location response header and the url field of the JSON response.

    + +

    Conditional requests

    + +

    A big part of being a good API citizen is respecting rate limits by +caching information that hasn’t changed. The API supports conditional +requests and helps you do the right thing. Consider the +first call we made to get defunkt’s profile:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +

    In addition to the JSON body, take note of the HTTP status code of 200 and +the ETag header. +The ETag is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed:

    + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +

    The 304 status indicates that the resource hasn’t changed since the last time +we asked for it and the response will contain no body. As a bonus, 304 +responses don’t count against your rate limit.

    + +

    Woot! Now you know the basics of the GitHub API!

    + +
      +
    • Basic & OAuth authentication
    • +
    • Fetching and creating repositories and issues
    • +
    • Conditional requests
    • +
    + +

    Keep learning with the next API guide Basics of Authentication!

    + +;T; @UI"&/coins/guides/create-simple-coin/;T{;{ ;I"_ + + + + + + + Create simple coin | Forknote + + + + + + + + + + + +
    + +
    + + +
    +
    + +

    Getting Started

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Overview

    + +

    Most applications will use an existing wrapper library in the language +of your choice, but it’s important to familiarize yourself with the underlying API +HTTP methods first.

    + +

    There’s no easier way to kick the tires than through cURL.

    + +

    Hello World

    + +

    Let’s start by testing our setup. Open up a command prompt and enter the +following command (without the $):

    + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +

    The response will be a random selection from our design philosophies.

    + +

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    There are a few interesting bits in the response headers. As expected, the +Content-Type is application/json.

    + +

    Any headers beginning with X- are custom headers, and are not included in the +HTTP spec. Let’s take a look at a few of them:

    + +
      +
    • +X-GitHub-Media-Type has a value of github.v3. This lets us know the media type +for the response. Media types have helped us version our output in API v3. We’ll +talk more about that later.
    • +
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This +pair of headers indicate how many requests a client can make in +a rolling time period (typically an hour) and how many of those requests the +client has already spent.
    • +
    + +

    Authentication

    + +

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to +authenticate. In fact, doing anything interesting with the GitHub API requires +authentication.

    + +

    Basic

    + +

    The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication.

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +

    The -u flag sets the username, and cURL will prompt you for the password. You +can use -u "username:password" to avoid the prompt, but this leaves your +password in shell history and isn’t recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +X-RateLimit-Limit header.

    + +

    In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API.

    + +

    Two-factor authentication

    + +

    If you have two-factor authentication enabled, the API will return a +401 Unauthorized error code for the above request (and every other API request):

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +

    The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +OAuth section below for more information.

    + +

    Get your own user profile

    + +

    When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +your own user profile:

    + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +

    This time, in addition to the same set of public information we +retrieved for @defunkt earlier, you should also see the non-public +information for your user profile. For example, you’ll see a plan object +in the response which gives details about the GitHub plan for the account.

    + +

    OAuth

    + +

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use OAuth.

    + +

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big +features:

    + +
      +
    • +Revokable access: users can revoke authorization to third party apps at any time
    • +
    • +Limited access: users can review the specific access that a token +will provide before authorizing a third party app
    • +
    + +

    Normally, tokens are created via a web flow. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it’s authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application:

    + +

    GitHub's OAuth Prompt

    + +

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to create a personal access token via your +Personal access tokens settings page:

    + +

    Personal Token selection

    + +

    Also, the Authorizations API makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command:

    + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +

    There’s a lot going on in this one little call, so let’s break it down. First, +the -d flag indicates we’re doing a POST, using the +application/x-www-form-urlencoded content type (as opposed to GET). All POST +requests to the GitHub API should be in JSON.

    + +

    Next, let’s look at the scopes we’re sending over in this call. When creating +a new token, we include an optional array of scopes, or access +levels, that indicate what information this token can access. In this case, +we’re setting up the token with repo access, which grants access to read and +write to public and private repositories, and user scope, which grants read +and write access to public and private user profile data. See +the scopes docs for a full list of +scopes. You should only request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The 201 +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token.

    + +

    If you have two-factor authentication enabled, the API will +return the previously described 401 Unauthorized error code +for the above request. You can get around that error by providing a 2FA OTP code +in the X-GitHub-OTP request header:

    + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you’ll receive an SMS with your OTP code after making a request to +this endpoint.

    + +

    Now, we can use the forty character token instead of a username and password +in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +

    Treat OAuth tokens like passwords! Don’t share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent.

    + +

    Now that we’ve got the hang of making authenticated calls, let’s move along to +the Repositories API.

    + +

    Repositories

    + +

    Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can GET repository details in the same way we fetched user +details earlier:

    + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +

    In the same way, we can view repositories for the authenticated user:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +

    Or, we can list repositories for another user:

    + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +

    Or, we can list repositories for an organization:

    + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +

    The information returned from these calls will depend on how we authenticate:

    + +
      +
    • Using Basic Authentication, the response includes all repositories the +the user has access to see on github.com.
    • +
    • Using OAuth, private repositories are only returned if the OAuth token +contains the repo scope.
    • +
    + +

    As the docs indicate, these methods take a type parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team.

    + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +

    In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string.

    + +

    Create a repository

    + +

    Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To create a repository, +we need to POST some JSON containing the details and configuration options.

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +

    In this minimal example, we create a new repository for our blog (to be served +on GitHub Pages, perhaps). Though the blog will be public, we’ve made +the repository private. In this single step, we’ll also initialize it with +a README and a nanoc-flavored .gitignore template.

    + +

    The resulting repository will be found at https://github.com/<your_username>/blog. +To create a repository under an organization for which you’re +an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    + +

    Next, let’s fetch our newly created repository:

    + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +

    Oh noes! Where did it go? Since we created the repository as private, we need +to authenticate in order to see it. If you’re a grizzled HTTP user, you might +expect a 403 instead. Since we don’t want to leak information about private +repositories, the GitHub API returns a 404 in this case, as if to say “we can +neither confirm nor deny the existence of this repository.”

    + +

    Issues

    + +

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while +staying out of your way. With the GitHub Issues API, you can pull +data out or create issues from other tools to create a workflow that works for +your team.

    + +

    Just like github.com, the API provides a few methods to view issues for the +authenticated user. To see all your issues, call GET /issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +

    To get only the issues under one of your GitHub organizations, call GET +/orgs/<org>/issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +

    We can also get all the issues under a single repository:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +

    Pagination

    + +

    A project the size of Rails has thousands of issues. We’ll need to paginate, +making multiple API calls to get the data. Let’s repeat that last call, this +time taking note of the response headers:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +

    The Link header provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results.

    + +

    Creating an issue

    + +

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from +the API.

    + +

    To create an issue, we need to be authenticated, so we’ll pass an +OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON +body to the /issues path underneath the repository in which we want to create +the issue:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +

    The response gives us a couple of pointers to the newly created issue, both in +the Location response header and the url field of the JSON response.

    + +

    Conditional requests

    + +

    A big part of being a good API citizen is respecting rate limits by +caching information that hasn’t changed. The API supports conditional +requests and helps you do the right thing. Consider the +first call we made to get defunkt’s profile:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +

    In addition to the JSON body, take note of the HTTP status code of 200 and +the ETag header. +The ETag is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed:

    + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +

    The 304 status indicates that the resource hasn’t changed since the last time +we asked for it and the response will contain no body. As a bonus, 304 +responses don’t count against your rate limit.

    + +

    Woot! Now you know the basics of the GitHub API!

    + +
      +
    • Basic & OAuth authentication
    • +
    • Fetching and creating repositories and issues
    • +
    • Conditional requests
    • +
    + +

    Keep learning with the next API guide Basics of Authentication!

    + + +
    +
    + + + + + + + +;T; I"L +# Getting Started + +* TOC +{:toc} + +Let's walk through core API concepts as we tackle some everyday use cases. + +## Overview + +Most applications will use an existing [wrapper library][wrappers] in the language +of your choice, but it's important to familiarize yourself with the underlying API +HTTP methods first. + +There's no easier way to kick the tires than through [cURL][curl]. + +### Hello World + +Let's start by testing our setup. Open up a command prompt and enter the +following command (without the `$`): + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +The response will be a random selection from our design philosophies. + +Next, let's `GET` [Chris Wanstrath's][defunkt github] [GitHub profile][users api]: + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +Mmmmm, tastes like [JSON][json]. Let's add the `-i` flag to include headers: + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +There are a few interesting bits in the response headers. As expected, the +`Content-Type` is `application/json`. + +Any headers beginning with `X-` are custom headers, and are not included in the +HTTP spec. Let's take a look at a few of them: + +* `X-GitHub-Media-Type` has a value of `github.v3`. This lets us know the [media type][media types] +for the response. Media types have helped us version our output in API v3. We'll +talk more about that later. +* Take note of the `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers. This +pair of headers indicate [how many requests a client can make][rate limiting] in +a rolling time period (typically an hour) and how many of those requests the +client has already spent. + +## Authentication + +Unauthenticated clients can make 60 requests per hour. To get more, we'll need to +_authenticate_. In fact, doing anything interesting with the GitHub API requires +[authentication][authentication]. + +### Basic + +The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication. + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +The `-u` flag sets the username, and cURL will prompt you for the password. You +can use `-u "username:password"` to avoid the prompt, but this leaves your +password in shell history and isn't recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +`X-RateLimit-Limit` header. + +In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API. + +### Two-factor authentication + +If you have [two-factor authentication][2fa] enabled, the API will return a +`401 Unauthorized` error code for the above request (and every other API request): + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +[OAuth section][oauth section] below for more information. + +### Get your own user profile + +When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +[your own user profile][auth user api]: + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +This time, in addition to the same set of public information we +retrieved for [@defunkt][defunkt github] earlier, you should also see the non-public +information for your user profile. For example, you'll see a `plan` object +in the response which gives details about the GitHub plan for the account. + +### OAuth + +While convenient, Basic Authentication isn't ideal because you shouldn't give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use [OAuth][oauth]. + +Instead of usernames and passwords, OAuth uses _tokens_. Tokens provide two big +features: + +* **Revokable access**: users can revoke authorization to third party apps at any time +* **Limited access**: users can review the specific access that a token + will provide before authorizing a third party app + +Normally, tokens are created via a [web flow][webflow]. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it's authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application: + +![GitHub's OAuth Prompt](/images/oauth_prompt.png) + +However, you don't need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to [create a **personal access token**][personal token] via your +[Personal access tokens settings page][tokens settings]: + +![Personal Token selection](/images/personal_token.png) + +Also, the [**Authorizations API**][authorizations api] makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command: + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +There's a lot going on in this one little call, so let's break it down. First, +the `-d` flag indicates we're doing a `POST`, using the +`application/x-www-form-urlencoded` content type (as opposed to `GET`). All `POST` +requests to the GitHub API should be in JSON. + +Next, let's look at the `scopes` we're sending over in this call. When creating +a new token, we include an optional array of [_scopes_][scopes], or access +levels, that indicate what information this token can access. In this case, +we're setting up the token with _repo_ access, which grants access to read and +write to public and private repositories, and _user_ scope, which grants read +and write access to public and private user profile data. See +[the scopes docs][scopes] for a full list of +scopes. You should **only** request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The `201` +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token. + +If you have [two-factor authentication][2fa] enabled, the API will +return the [previously described `401 Unauthorized` error code][2fa section] +for the above request. You can get around that error by providing a 2FA OTP code +in the [X-GitHub-OTP request header][2fa header]: + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you'll receive an SMS with your OTP code after making a request to +this endpoint. + +Now, we can use the forty character `token` instead of a username and password +in the rest of our examples. Let's grab our own user info again, using OAuth this time: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +**Treat OAuth tokens like passwords!** Don't share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent. + +Now that we've got the hang of making authenticated calls, let's move along to +the [Repositories API][repos-api]. + +## Repositories + +Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can [`GET` repository details][get repo] in the same way we fetched user +details earlier: + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +In the same way, we can [view repositories for the authenticated user][user repos api]: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +Or, we can [list repositories for another user][other user repos api]: + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +Or, we can [list repositories for an organization][org repos api]: + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +The information returned from these calls will depend on how we authenticate: + +* Using Basic Authentication, the response includes all repositories the + the user has access to see on github.com. +* Using OAuth, private repositories are only returned if the OAuth token + contains the `repo` [scope][scopes]. + +As the [docs][repos-api] indicate, these methods take a `type` parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team. + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string. + +### Create a repository + +Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To [create a repository][create repo], +we need to `POST` some JSON containing the details and configuration options. + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +In this minimal example, we create a new repository for our blog (to be served +on [GitHub Pages][pages], perhaps). Though the blog will be public, we've made +the repository private. In this single step, we'll also initialize it with +a README and a [nanoc][nanoc]-flavored [.gitignore template][gitignore +templates]. + +The resulting repository will be found at `https://github.com//blog`. +To create a repository under an organization for which you're +an owner, just change the API method from `/user/repos` to `/orgs//repos`. + +Next, let's fetch our newly created repository: + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +Oh noes! Where did it go? Since we created the repository as _private_, we need +to authenticate in order to see it. If you're a grizzled HTTP user, you might +expect a `403` instead. Since we don't want to leak information about private +repositories, the GitHub API returns a `404` in this case, as if to say "we can +neither confirm nor deny the existence of this repository." + +## Issues + +The UI for Issues on GitHub aims to provide 'just enough' workflow while +staying out of your way. With the GitHub [Issues API][issues-api], you can pull +data out or create issues from other tools to create a workflow that works for +your team. + +Just like github.com, the API provides a few methods to view issues for the +authenticated user. To [see all your issues][get issues api], call `GET /issues`: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +To get only the [issues under one of your GitHub organizations][get issues api], call `GET +/orgs//issues`: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +We can also get [all the issues under a single repository][repo issues api]: + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +### Pagination + +A project the size of Rails has thousands of issues. We'll need to [paginate][pagination], +making multiple API calls to get the data. Let's repeat that last call, this +time taking note of the response headers: + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +The [`Link` header][link-header] provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results. + +### Creating an issue + +Now that we've seen how to paginate lists of issues, let's [create an issue][create issue] from +the API. + +To create an issue, we need to be authenticated, so we'll pass an +OAuth token in the header. Also, we'll pass the title, body, and labels in the JSON +body to the `/issues` path underneath the repository in which we want to create +the issue: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +The response gives us a couple of pointers to the newly created issue, both in +the `Location` response header and the `url` field of the JSON response. + +## Conditional requests + +A big part of being a good API citizen is respecting rate limits by +caching information that hasn't changed. The API supports [conditional +requests][conditional-requests] and helps you do the right thing. Consider the +first call we made to get defunkt's profile: + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +In addition to the JSON body, take note of the HTTP status code of `200` and +the `ETag` header. +The [ETag][etag] is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed: + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +The `304` status indicates that the resource hasn't changed since the last time +we asked for it and the response will contain no body. As a bonus, `304` +responses don't count against your [rate limit][rate-limiting]. + +Woot! Now you know the basics of the GitHub API! + +* Basic & OAuth authentication +* Fetching and creating repositories and issues +* Conditional requests + +Keep learning with the next API guide [Basics of Authentication][auth guide]! + + +[wrappers]: /libraries/ +[curl]: http://curl.haxx.se/ +[media types]: /v3/media/ +[oauth]: /v3/oauth/ +[webflow]: /v3/oauth/#web-application-flow +[authorizations api]: /v3/oauth_authorizations/#create-a-new-authorization +[scopes]: /v3/oauth/#scopes +[repos-api]: /v3/repos/ +[pages]: http://pages.github.com +[nanoc]: http://nanoc.ws/ +[gitignore templates]: https://github.com/github/gitignore +[issues-api]: /v3/issues/ +[link-header]: http://www.w3.org/wiki/LinkHeader/ +[conditional-requests]: /v3/#conditional-requests +[rate-limiting]: /v3/#rate-limiting +[users api]: /v3/users/#get-a-single-user +[auth user api]: /v3/users/#get-the-authenticated-user +[defunkt github]: https://github.com/defunkt +[json]: http://en.wikipedia.org/wiki/JSON +[rate limiting]: /v3/#rate-limiting +[authentication]: /v3/#authentication +[2fa]: https://help.github.com/articles/about-two-factor-authentication +[2fa header]: /v3/auth/#working-with-two-factor-authentication +[oauth section]: /guides/getting-started/#oauth +[personal token]: https://help.github.com/articles/creating-an-access-token-for-command-line-use +[tokens settings]: https://github.com/settings/tokens +[pagination]: /v3/#pagination +[get repo]: /v3/repos/#get +[create repo]: /v3/repos/#create +[create issue]: /v3/issues/#create-an-issue +[auth guide]: /guides/basics-of-authentication +[user repos api]: /v3/repos/#list-your-repositories +[other user repos api]: /v3/repos/#list-user-repositories +[org repos api]: /v3/repos/#list-organization-repositories +[get issues api]: /v3/issues/#list-issues +[repo issues api]: /v3/issues/#list-issues-for-a-repository +[etag]: http://en.wikipedia.org/wiki/HTTP_ETag +[2fa section]: /guides/getting-started/#two-factor-authentication +;T; +I"=S +

    Getting Started

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Overview

    + +

    Most applications will use an existing wrapper library in the language +of your choice, but it’s important to familiarize yourself with the underlying API +HTTP methods first.

    + +

    There’s no easier way to kick the tires than through cURL.

    + +

    Hello World

    + +

    Let’s start by testing our setup. Open up a command prompt and enter the +following command (without the $):

    + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +

    The response will be a random selection from our design philosophies.

    + +

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    There are a few interesting bits in the response headers. As expected, the +Content-Type is application/json.

    + +

    Any headers beginning with X- are custom headers, and are not included in the +HTTP spec. Let’s take a look at a few of them:

    + +
      +
    • +X-GitHub-Media-Type has a value of github.v3. This lets us know the media type +for the response. Media types have helped us version our output in API v3. We’ll +talk more about that later.
    • +
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This +pair of headers indicate how many requests a client can make in +a rolling time period (typically an hour) and how many of those requests the +client has already spent.
    • +
    + +

    Authentication

    + +

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to +authenticate. In fact, doing anything interesting with the GitHub API requires +authentication.

    + +

    Basic

    + +

    The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication.

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +

    The -u flag sets the username, and cURL will prompt you for the password. You +can use -u "username:password" to avoid the prompt, but this leaves your +password in shell history and isn’t recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +X-RateLimit-Limit header.

    + +

    In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API.

    + +

    Two-factor authentication

    + +

    If you have two-factor authentication enabled, the API will return a +401 Unauthorized error code for the above request (and every other API request):

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +

    The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +OAuth section below for more information.

    + +

    Get your own user profile

    + +

    When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +your own user profile:

    + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +

    This time, in addition to the same set of public information we +retrieved for @defunkt earlier, you should also see the non-public +information for your user profile. For example, you’ll see a plan object +in the response which gives details about the GitHub plan for the account.

    + +

    OAuth

    + +

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use OAuth.

    + +

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big +features:

    + +
      +
    • +Revokable access: users can revoke authorization to third party apps at any time
    • +
    • +Limited access: users can review the specific access that a token +will provide before authorizing a third party app
    • +
    + +

    Normally, tokens are created via a web flow. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it’s authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application:

    + +

    GitHub's OAuth Prompt

    + +

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to create a personal access token via your +Personal access tokens settings page:

    + +

    Personal Token selection

    + +

    Also, the Authorizations API makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command:

    + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +

    There’s a lot going on in this one little call, so let’s break it down. First, +the -d flag indicates we’re doing a POST, using the +application/x-www-form-urlencoded content type (as opposed to GET). All POST +requests to the GitHub API should be in JSON.

    + +

    Next, let’s look at the scopes we’re sending over in this call. When creating +a new token, we include an optional array of scopes, or access +levels, that indicate what information this token can access. In this case, +we’re setting up the token with repo access, which grants access to read and +write to public and private repositories, and user scope, which grants read +and write access to public and private user profile data. See +the scopes docs for a full list of +scopes. You should only request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The 201 +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token.

    + +

    If you have two-factor authentication enabled, the API will +return the previously described 401 Unauthorized error code +for the above request. You can get around that error by providing a 2FA OTP code +in the X-GitHub-OTP request header:

    + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you’ll receive an SMS with your OTP code after making a request to +this endpoint.

    + +

    Now, we can use the forty character token instead of a username and password +in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +

    Treat OAuth tokens like passwords! Don’t share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent.

    + +

    Now that we’ve got the hang of making authenticated calls, let’s move along to +the Repositories API.

    + +

    Repositories

    + +

    Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can GET repository details in the same way we fetched user +details earlier:

    + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +

    In the same way, we can view repositories for the authenticated user:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +

    Or, we can list repositories for another user:

    + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +

    Or, we can list repositories for an organization:

    + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +

    The information returned from these calls will depend on how we authenticate:

    + +
      +
    • Using Basic Authentication, the response includes all repositories the +the user has access to see on github.com.
    • +
    • Using OAuth, private repositories are only returned if the OAuth token +contains the repo scope.
    • +
    + +

    As the docs indicate, these methods take a type parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team.

    + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +

    In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string.

    + +

    Create a repository

    + +

    Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To create a repository, +we need to POST some JSON containing the details and configuration options.

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +

    In this minimal example, we create a new repository for our blog (to be served +on GitHub Pages, perhaps). Though the blog will be public, we’ve made +the repository private. In this single step, we’ll also initialize it with +a README and a nanoc-flavored .gitignore template.

    + +

    The resulting repository will be found at https://github.com/<your_username>/blog. +To create a repository under an organization for which you’re +an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    + +

    Next, let’s fetch our newly created repository:

    + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +

    Oh noes! Where did it go? Since we created the repository as private, we need +to authenticate in order to see it. If you’re a grizzled HTTP user, you might +expect a 403 instead. Since we don’t want to leak information about private +repositories, the GitHub API returns a 404 in this case, as if to say “we can +neither confirm nor deny the existence of this repository.”

    + +

    Issues

    + +

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while +staying out of your way. With the GitHub Issues API, you can pull +data out or create issues from other tools to create a workflow that works for +your team.

    + +

    Just like github.com, the API provides a few methods to view issues for the +authenticated user. To see all your issues, call GET /issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +

    To get only the issues under one of your GitHub organizations, call GET +/orgs/<org>/issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +

    We can also get all the issues under a single repository:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +

    Pagination

    + +

    A project the size of Rails has thousands of issues. We’ll need to paginate, +making multiple API calls to get the data. Let’s repeat that last call, this +time taking note of the response headers:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +

    The Link header provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results.

    + +

    Creating an issue

    + +

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from +the API.

    + +

    To create an issue, we need to be authenticated, so we’ll pass an +OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON +body to the /issues path underneath the repository in which we want to create +the issue:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +

    The response gives us a couple of pointers to the newly created issue, both in +the Location response header and the url field of the JSON response.

    + +

    Conditional requests

    + +

    A big part of being a good API citizen is respecting rate limits by +caching information that hasn’t changed. The API supports conditional +requests and helps you do the right thing. Consider the +first call we made to get defunkt’s profile:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +

    In addition to the JSON body, take note of the HTTP status code of 200 and +the ETag header. +The ETag is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed:

    + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +

    The 304 status indicates that the resource hasn’t changed since the last time +we asked for it and the response will contain no body. As a bonus, 304 +responses don’t count against your rate limit.

    + +

    Woot! Now you know the basics of the GitHub API!

    + +
      +
    • Basic & OAuth authentication
    • +
    • Fetching and creating repositories and issues
    • +
    • Conditional requests
    • +
    + +

    Keep learning with the next API guide Basics of Authentication!

    + +;T; @[I"#/coins/guides/getting-started/;T{;{ ;I" + + + + + + + Getting Started | Forknote + + + + + + + + + + + +
    + +
    + + +
    +
    + +

    Getting Started

    + + + +

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    + +

    Overview

    + +

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    + +

    Starting the daemon for preconfigured networks

    + +

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    + +

    Connecting to Dashcoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    + +

    Connecting to Bytecoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted --config-file configs/bytecoin.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Starting the daemon for custom networks

    + +

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    + +

    Next, let’s start the daemon itself:

    + +
    +$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    + +

    Starting simplewallet

    + +

    Simplewallet uses the same configuration file as the daemon.

    + +

    To start simplewallet:

    + +
    +$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +forknote wallet v1.0.8.608()
    +Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    +What do you want to do?
    +[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    +
    + +

    Press g to create new wallet and type your wallet’s name and password.

    + +

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    +For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    + +

    Don’t forget to backup your wallet.

    + + +
    +
    + + + + + + + +;T; I" +# Getting Started + +* TOC +{:toc} + +Let's walk through core Forknote concepts as we tackle a simple use case. + +## Overview + +Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must [download][download] the latest version of Forknote. + +## Starting the daemon for preconfigured networks + +Forknote comes preconfigured with 2 networks - Dashcoin and [Bytecoin][bytecoin]. + +### Connecting to Dashcoin + +To connect to Dashcoin open up a command prompt and enter the +following command (without the `$`): + +
    +$ ./forknoted
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +By default, Forknote will load the Dashcoin configuration file (`configs/-.conf`), if no configuration file is passed as option. + +### Connecting to Bytecoin + +To connect to Dashcoin open up a command prompt and enter the +following command (without the `$`): + +
    +$ ./forknoted --config-file configs/bytecoin.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +## Starting the daemon for custom networks + +To connect to custom networks, you must save the configuraton file in the `configs` subfolder of Forknote. + +Next, let's start the daemon itself: + +
    +$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +Please note you have to change `CUSTOM_NETWORK` with appropriate file name. + +## Starting simplewallet + +Simplewallet uses the same configuration file as the daemon. + +To start simplewallet: + +
    +$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +forknote wallet v1.0.8.608()
    +Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    +What do you want to do?
    +[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    +
    + +Press `g` to create new wallet and type your wallet's name and password. + +A good practice for naming your wallet is to add `NETWORK.` prefix to your name.
    +For example, for Dashcoin wallet use the `dashcoin.` prefix - `dashcoin.example_wallet` + +Don't forget to backup your wallet. + + +[download]: /download/ +[bytecoin]: https://bytecoin.org/;T; +I" +

    Getting Started

    + + + +

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    + +

    Overview

    + +

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    + +

    Starting the daemon for preconfigured networks

    + +

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    + +

    Connecting to Dashcoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    + +

    Connecting to Bytecoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted --config-file configs/bytecoin.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Starting the daemon for custom networks

    + +

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    + +

    Next, let’s start the daemon itself:

    + +
    +$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    + +

    Starting simplewallet

    + +

    Simplewallet uses the same configuration file as the daemon.

    + +

    To start simplewallet:

    + +
    +$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +forknote wallet v1.0.8.608()
    +Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    +What do you want to do?
    +[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    +
    + +

    Press g to create new wallet and type your wallet’s name and password.

    + +

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    +For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    + +

    Don’t forget to backup your wallet.

    + +;T; @aI"/coins/guides/;T{;{ ;I" + + + + + + + Development Guides | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + + +
    + + +
    + + + + + + + +;T; I" +# Development Guides + +This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes. + + +;T; +I"' +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + +;T; @gI"#/coins/guides/troubleshooting/;T{;{ ;I"_ + + + + + + + Getting Started | GitHub API + + + + + + + + + + + +
    + +
    + + +
    +
    + +

    Getting Started

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Overview

    + +

    Most applications will use an existing wrapper library in the language +of your choice, but it’s important to familiarize yourself with the underlying API +HTTP methods first.

    + +

    There’s no easier way to kick the tires than through cURL.

    + +

    Hello World

    + +

    Let’s start by testing our setup. Open up a command prompt and enter the +following command (without the $):

    + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +

    The response will be a random selection from our design philosophies.

    + +

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    There are a few interesting bits in the response headers. As expected, the +Content-Type is application/json.

    + +

    Any headers beginning with X- are custom headers, and are not included in the +HTTP spec. Let’s take a look at a few of them:

    + +
      +
    • +X-GitHub-Media-Type has a value of github.v3. This lets us know the media type +for the response. Media types have helped us version our output in API v3. We’ll +talk more about that later.
    • +
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This +pair of headers indicate how many requests a client can make in +a rolling time period (typically an hour) and how many of those requests the +client has already spent.
    • +
    + +

    Authentication

    + +

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to +authenticate. In fact, doing anything interesting with the GitHub API requires +authentication.

    + +

    Basic

    + +

    The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication.

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +

    The -u flag sets the username, and cURL will prompt you for the password. You +can use -u "username:password" to avoid the prompt, but this leaves your +password in shell history and isn’t recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +X-RateLimit-Limit header.

    + +

    In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API.

    + +

    Two-factor authentication

    + +

    If you have two-factor authentication enabled, the API will return a +401 Unauthorized error code for the above request (and every other API request):

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +

    The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +OAuth section below for more information.

    + +

    Get your own user profile

    + +

    When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +your own user profile:

    + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +

    This time, in addition to the same set of public information we +retrieved for @defunkt earlier, you should also see the non-public +information for your user profile. For example, you’ll see a plan object +in the response which gives details about the GitHub plan for the account.

    + +

    OAuth

    + +

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use OAuth.

    + +

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big +features:

    + +
      +
    • +Revokable access: users can revoke authorization to third party apps at any time
    • +
    • +Limited access: users can review the specific access that a token +will provide before authorizing a third party app
    • +
    + +

    Normally, tokens are created via a web flow. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it’s authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application:

    + +

    GitHub's OAuth Prompt

    + +

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to create a personal access token via your +Personal access tokens settings page:

    + +

    Personal Token selection

    + +

    Also, the Authorizations API makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command:

    + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +

    There’s a lot going on in this one little call, so let’s break it down. First, +the -d flag indicates we’re doing a POST, using the +application/x-www-form-urlencoded content type (as opposed to GET). All POST +requests to the GitHub API should be in JSON.

    + +

    Next, let’s look at the scopes we’re sending over in this call. When creating +a new token, we include an optional array of scopes, or access +levels, that indicate what information this token can access. In this case, +we’re setting up the token with repo access, which grants access to read and +write to public and private repositories, and user scope, which grants read +and write access to public and private user profile data. See +the scopes docs for a full list of +scopes. You should only request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The 201 +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token.

    + +

    If you have two-factor authentication enabled, the API will +return the previously described 401 Unauthorized error code +for the above request. You can get around that error by providing a 2FA OTP code +in the X-GitHub-OTP request header:

    + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you’ll receive an SMS with your OTP code after making a request to +this endpoint.

    + +

    Now, we can use the forty character token instead of a username and password +in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +

    Treat OAuth tokens like passwords! Don’t share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent.

    + +

    Now that we’ve got the hang of making authenticated calls, let’s move along to +the Repositories API.

    + +

    Repositories

    + +

    Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can GET repository details in the same way we fetched user +details earlier:

    + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +

    In the same way, we can view repositories for the authenticated user:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +

    Or, we can list repositories for another user:

    + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +

    Or, we can list repositories for an organization:

    + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +

    The information returned from these calls will depend on how we authenticate:

    + +
      +
    • Using Basic Authentication, the response includes all repositories the +the user has access to see on github.com.
    • +
    • Using OAuth, private repositories are only returned if the OAuth token +contains the repo scope.
    • +
    + +

    As the docs indicate, these methods take a type parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team.

    + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +

    In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string.

    + +

    Create a repository

    + +

    Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To create a repository, +we need to POST some JSON containing the details and configuration options.

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +

    In this minimal example, we create a new repository for our blog (to be served +on GitHub Pages, perhaps). Though the blog will be public, we’ve made +the repository private. In this single step, we’ll also initialize it with +a README and a nanoc-flavored .gitignore template.

    + +

    The resulting repository will be found at https://github.com/<your_username>/blog. +To create a repository under an organization for which you’re +an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    + +

    Next, let’s fetch our newly created repository:

    + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +

    Oh noes! Where did it go? Since we created the repository as private, we need +to authenticate in order to see it. If you’re a grizzled HTTP user, you might +expect a 403 instead. Since we don’t want to leak information about private +repositories, the GitHub API returns a 404 in this case, as if to say “we can +neither confirm nor deny the existence of this repository.”

    + +

    Issues

    + +

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while +staying out of your way. With the GitHub Issues API, you can pull +data out or create issues from other tools to create a workflow that works for +your team.

    + +

    Just like github.com, the API provides a few methods to view issues for the +authenticated user. To see all your issues, call GET /issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +

    To get only the issues under one of your GitHub organizations, call GET +/orgs/<org>/issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +

    We can also get all the issues under a single repository:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +

    Pagination

    + +

    A project the size of Rails has thousands of issues. We’ll need to paginate, +making multiple API calls to get the data. Let’s repeat that last call, this +time taking note of the response headers:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +

    The Link header provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results.

    + +

    Creating an issue

    + +

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from +the API.

    + +

    To create an issue, we need to be authenticated, so we’ll pass an +OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON +body to the /issues path underneath the repository in which we want to create +the issue:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +

    The response gives us a couple of pointers to the newly created issue, both in +the Location response header and the url field of the JSON response.

    + +

    Conditional requests

    + +

    A big part of being a good API citizen is respecting rate limits by +caching information that hasn’t changed. The API supports conditional +requests and helps you do the right thing. Consider the +first call we made to get defunkt’s profile:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +

    In addition to the JSON body, take note of the HTTP status code of 200 and +the ETag header. +The ETag is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed:

    + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +

    The 304 status indicates that the resource hasn’t changed since the last time +we asked for it and the response will contain no body. As a bonus, 304 +responses don’t count against your rate limit.

    + +

    Woot! Now you know the basics of the GitHub API!

    + +
      +
    • Basic & OAuth authentication
    • +
    • Fetching and creating repositories and issues
    • +
    • Conditional requests
    • +
    + +

    Keep learning with the next API guide Basics of Authentication!

    + + +
    +
    + + + + + + + +;T; I"L +# Getting Started + +* TOC +{:toc} + +Let's walk through core API concepts as we tackle some everyday use cases. + +## Overview + +Most applications will use an existing [wrapper library][wrappers] in the language +of your choice, but it's important to familiarize yourself with the underlying API +HTTP methods first. + +There's no easier way to kick the tires than through [cURL][curl]. + +### Hello World + +Let's start by testing our setup. Open up a command prompt and enter the +following command (without the `$`): + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +The response will be a random selection from our design philosophies. + +Next, let's `GET` [Chris Wanstrath's][defunkt github] [GitHub profile][users api]: + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +Mmmmm, tastes like [JSON][json]. Let's add the `-i` flag to include headers: + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +There are a few interesting bits in the response headers. As expected, the +`Content-Type` is `application/json`. + +Any headers beginning with `X-` are custom headers, and are not included in the +HTTP spec. Let's take a look at a few of them: + +* `X-GitHub-Media-Type` has a value of `github.v3`. This lets us know the [media type][media types] +for the response. Media types have helped us version our output in API v3. We'll +talk more about that later. +* Take note of the `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers. This +pair of headers indicate [how many requests a client can make][rate limiting] in +a rolling time period (typically an hour) and how many of those requests the +client has already spent. + +## Authentication + +Unauthenticated clients can make 60 requests per hour. To get more, we'll need to +_authenticate_. In fact, doing anything interesting with the GitHub API requires +[authentication][authentication]. + +### Basic + +The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication. + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +The `-u` flag sets the username, and cURL will prompt you for the password. You +can use `-u "username:password"` to avoid the prompt, but this leaves your +password in shell history and isn't recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +`X-RateLimit-Limit` header. + +In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API. + +### Two-factor authentication + +If you have [two-factor authentication][2fa] enabled, the API will return a +`401 Unauthorized` error code for the above request (and every other API request): + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +[OAuth section][oauth section] below for more information. + +### Get your own user profile + +When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +[your own user profile][auth user api]: + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +This time, in addition to the same set of public information we +retrieved for [@defunkt][defunkt github] earlier, you should also see the non-public +information for your user profile. For example, you'll see a `plan` object +in the response which gives details about the GitHub plan for the account. + +### OAuth + +While convenient, Basic Authentication isn't ideal because you shouldn't give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use [OAuth][oauth]. + +Instead of usernames and passwords, OAuth uses _tokens_. Tokens provide two big +features: + +* **Revokable access**: users can revoke authorization to third party apps at any time +* **Limited access**: users can review the specific access that a token + will provide before authorizing a third party app + +Normally, tokens are created via a [web flow][webflow]. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it's authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application: + +![GitHub's OAuth Prompt](/images/oauth_prompt.png) + +However, you don't need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to [create a **personal access token**][personal token] via your +[Personal access tokens settings page][tokens settings]: + +![Personal Token selection](/images/personal_token.png) + +Also, the [**Authorizations API**][authorizations api] makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command: + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +There's a lot going on in this one little call, so let's break it down. First, +the `-d` flag indicates we're doing a `POST`, using the +`application/x-www-form-urlencoded` content type (as opposed to `GET`). All `POST` +requests to the GitHub API should be in JSON. + +Next, let's look at the `scopes` we're sending over in this call. When creating +a new token, we include an optional array of [_scopes_][scopes], or access +levels, that indicate what information this token can access. In this case, +we're setting up the token with _repo_ access, which grants access to read and +write to public and private repositories, and _user_ scope, which grants read +and write access to public and private user profile data. See +[the scopes docs][scopes] for a full list of +scopes. You should **only** request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The `201` +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token. + +If you have [two-factor authentication][2fa] enabled, the API will +return the [previously described `401 Unauthorized` error code][2fa section] +for the above request. You can get around that error by providing a 2FA OTP code +in the [X-GitHub-OTP request header][2fa header]: + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you'll receive an SMS with your OTP code after making a request to +this endpoint. + +Now, we can use the forty character `token` instead of a username and password +in the rest of our examples. Let's grab our own user info again, using OAuth this time: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +**Treat OAuth tokens like passwords!** Don't share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent. + +Now that we've got the hang of making authenticated calls, let's move along to +the [Repositories API][repos-api]. + +## Repositories + +Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can [`GET` repository details][get repo] in the same way we fetched user +details earlier: + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +In the same way, we can [view repositories for the authenticated user][user repos api]: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +Or, we can [list repositories for another user][other user repos api]: + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +Or, we can [list repositories for an organization][org repos api]: + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +The information returned from these calls will depend on how we authenticate: + +* Using Basic Authentication, the response includes all repositories the + the user has access to see on github.com. +* Using OAuth, private repositories are only returned if the OAuth token + contains the `repo` [scope][scopes]. + +As the [docs][repos-api] indicate, these methods take a `type` parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team. + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string. + +### Create a repository + +Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To [create a repository][create repo], +we need to `POST` some JSON containing the details and configuration options. + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +In this minimal example, we create a new repository for our blog (to be served +on [GitHub Pages][pages], perhaps). Though the blog will be public, we've made +the repository private. In this single step, we'll also initialize it with +a README and a [nanoc][nanoc]-flavored [.gitignore template][gitignore +templates]. + +The resulting repository will be found at `https://github.com//blog`. +To create a repository under an organization for which you're +an owner, just change the API method from `/user/repos` to `/orgs//repos`. + +Next, let's fetch our newly created repository: + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +Oh noes! Where did it go? Since we created the repository as _private_, we need +to authenticate in order to see it. If you're a grizzled HTTP user, you might +expect a `403` instead. Since we don't want to leak information about private +repositories, the GitHub API returns a `404` in this case, as if to say "we can +neither confirm nor deny the existence of this repository." + +## Issues + +The UI for Issues on GitHub aims to provide 'just enough' workflow while +staying out of your way. With the GitHub [Issues API][issues-api], you can pull +data out or create issues from other tools to create a workflow that works for +your team. + +Just like github.com, the API provides a few methods to view issues for the +authenticated user. To [see all your issues][get issues api], call `GET /issues`: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +To get only the [issues under one of your GitHub organizations][get issues api], call `GET +/orgs//issues`: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +We can also get [all the issues under a single repository][repo issues api]: + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +### Pagination + +A project the size of Rails has thousands of issues. We'll need to [paginate][pagination], +making multiple API calls to get the data. Let's repeat that last call, this +time taking note of the response headers: + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +The [`Link` header][link-header] provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results. + +### Creating an issue + +Now that we've seen how to paginate lists of issues, let's [create an issue][create issue] from +the API. + +To create an issue, we need to be authenticated, so we'll pass an +OAuth token in the header. Also, we'll pass the title, body, and labels in the JSON +body to the `/issues` path underneath the repository in which we want to create +the issue: + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +The response gives us a couple of pointers to the newly created issue, both in +the `Location` response header and the `url` field of the JSON response. + +## Conditional requests + +A big part of being a good API citizen is respecting rate limits by +caching information that hasn't changed. The API supports [conditional +requests][conditional-requests] and helps you do the right thing. Consider the +first call we made to get defunkt's profile: + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +In addition to the JSON body, take note of the HTTP status code of `200` and +the `ETag` header. +The [ETag][etag] is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed: + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +The `304` status indicates that the resource hasn't changed since the last time +we asked for it and the response will contain no body. As a bonus, `304` +responses don't count against your [rate limit][rate-limiting]. + +Woot! Now you know the basics of the GitHub API! + +* Basic & OAuth authentication +* Fetching and creating repositories and issues +* Conditional requests + +Keep learning with the next API guide [Basics of Authentication][auth guide]! + + +[wrappers]: /libraries/ +[curl]: http://curl.haxx.se/ +[media types]: /v3/media/ +[oauth]: /v3/oauth/ +[webflow]: /v3/oauth/#web-application-flow +[authorizations api]: /v3/oauth_authorizations/#create-a-new-authorization +[scopes]: /v3/oauth/#scopes +[repos-api]: /v3/repos/ +[pages]: http://pages.github.com +[nanoc]: http://nanoc.ws/ +[gitignore templates]: https://github.com/github/gitignore +[issues-api]: /v3/issues/ +[link-header]: http://www.w3.org/wiki/LinkHeader/ +[conditional-requests]: /v3/#conditional-requests +[rate-limiting]: /v3/#rate-limiting +[users api]: /v3/users/#get-a-single-user +[auth user api]: /v3/users/#get-the-authenticated-user +[defunkt github]: https://github.com/defunkt +[json]: http://en.wikipedia.org/wiki/JSON +[rate limiting]: /v3/#rate-limiting +[authentication]: /v3/#authentication +[2fa]: https://help.github.com/articles/about-two-factor-authentication +[2fa header]: /v3/auth/#working-with-two-factor-authentication +[oauth section]: /guides/getting-started/#oauth +[personal token]: https://help.github.com/articles/creating-an-access-token-for-command-line-use +[tokens settings]: https://github.com/settings/tokens +[pagination]: /v3/#pagination +[get repo]: /v3/repos/#get +[create repo]: /v3/repos/#create +[create issue]: /v3/issues/#create-an-issue +[auth guide]: /guides/basics-of-authentication +[user repos api]: /v3/repos/#list-your-repositories +[other user repos api]: /v3/repos/#list-user-repositories +[org repos api]: /v3/repos/#list-organization-repositories +[get issues api]: /v3/issues/#list-issues +[repo issues api]: /v3/issues/#list-issues-for-a-repository +[etag]: http://en.wikipedia.org/wiki/HTTP_ETag +[2fa section]: /guides/getting-started/#two-factor-authentication +;T; +I"=S +

    Getting Started

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Overview

    + +

    Most applications will use an existing wrapper library in the language +of your choice, but it’s important to familiarize yourself with the underlying API +HTTP methods first.

    + +

    There’s no easier way to kick the tires than through cURL.

    + +

    Hello World

    + +

    Let’s start by testing our setup. Open up a command prompt and enter the +following command (without the $):

    + +
    +$ curl https://api.github.com/zen
    +
    +Keep it logically awesome.
    +
    + +

    The response will be a random selection from our design philosophies.

    + +

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    + +
    +# GET /users/defunkt
    +$ curl https://api.github.com/users/defunkt
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +Server: GitHub.com
    +Date: Sun, 11 Nov 2012 18:43:28 GMT
    +Content-Type: application/json; charset=utf-8
    +Connection: keep-alive
    +Status: 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +X-RateLimit-Limit: 60
    +X-RateLimit-Remaining: 57
    +X-RateLimit-Reset: 1352660008
    +X-GitHub-Media-Type: github.v3
    +Vary: Accept
    +Cache-Control: public, max-age=60, s-maxage=60
    +X-Content-Type-Options: nosniff
    +Content-Length: 692
    +Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    +
    +{
    +  "login": "defunkt",
    +  "id": 2,
    +  "url": "https://api.github.com/users/defunkt",
    +  "html_url": "https://github.com/defunkt",
    +  ...
    +}
    +
    + +

    There are a few interesting bits in the response headers. As expected, the +Content-Type is application/json.

    + +

    Any headers beginning with X- are custom headers, and are not included in the +HTTP spec. Let’s take a look at a few of them:

    + +
      +
    • +X-GitHub-Media-Type has a value of github.v3. This lets us know the media type +for the response. Media types have helped us version our output in API v3. We’ll +talk more about that later.
    • +
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This +pair of headers indicate how many requests a client can make in +a rolling time period (typically an hour) and how many of those requests the +client has already spent.
    • +
    + +

    Authentication

    + +

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to +authenticate. In fact, doing anything interesting with the GitHub API requires +authentication.

    + +

    Basic

    + +

    The easiest way to authenticate with the GitHub API is by simply using your GitHub +username and password via Basic Authentication.

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    + +

    The -u flag sets the username, and cURL will prompt you for the password. You +can use -u "username:password" to avoid the prompt, but this leaves your +password in shell history and isn’t recommended. When authenticating, you +should see your rate limit bumped to 5,000 requests an hour, as indicated in the +X-RateLimit-Limit header.

    + +

    In addition to just getting more calls per hour, authentication is the key to +reading and writing private information via the API.

    + +

    Two-factor authentication

    + +

    If you have two-factor authentication enabled, the API will return a +401 Unauthorized error code for the above request (and every other API request):

    + +
    +$ curl -i -u <your_username> https://api.github.com/users/defunkt
    +
    +Enter host password for user '<your_username>':
    +
    +HTTP/1.1 401 Unauthorized
    +X-GitHub-OTP: required; :2fa-type
    +
    +{
    +  "message": "Must specify two-factor authentication OTP code.",
    +  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    +}
    +
    + +

    The easiest way to get around that error is to create an OAuth token and use +OAuth authentication instead of Basic Authentication. See the +OAuth section below for more information.

    + +

    Get your own user profile

    + +

    When properly authenticated, you can take advantage of the permissions +associated with your GitHub account. For example, try getting +your own user profile:

    + +
    +$ curl -i -u <your_username> https://api.github.com/user
    +
    +{
    +  ...
    +  "plan": {
    +    "space": 2516582,
    +    "collaborators": 10,
    +    "private_repos": 20,
    +    "name": "medium"
    +  }
    +  ...
    +}
    +
    + +

    This time, in addition to the same set of public information we +retrieved for @defunkt earlier, you should also see the non-public +information for your user profile. For example, you’ll see a plan object +in the response which gives details about the GitHub plan for the account.

    + +

    OAuth

    + +

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub +username and password to anyone. Applications that need to read or write +private information using the API on behalf of another user should use OAuth.

    + +

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big +features:

    + +
      +
    • +Revokable access: users can revoke authorization to third party apps at any time
    • +
    • +Limited access: users can review the specific access that a token +will provide before authorizing a third party app
    • +
    + +

    Normally, tokens are created via a web flow. An application +sends users to GitHub to log in. GitHub then presents a dialog +indicating the name of the app, as well as the level of access the app +has once it’s authorized by the user. After a user authorizes access, GitHub +redirects the user back to the application:

    + +

    GitHub's OAuth Prompt

    + +

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. +An easier way to get a token is to create a personal access token via your +Personal access tokens settings page:

    + +

    Personal Token selection

    + +

    Also, the Authorizations API makes it simple to use Basic Authentication +to create an OAuth token. Try pasting and running the following command:

    + +
    +$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/authorizations/2
    +Content-Length: 384
    +
    +{
    +  "scopes": [
    +    "repo",
    +    "user"
    +  ],
    +  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    +  "updated_at": "2012-11-14T14:04:24Z",
    +  "url": "https://api.github.com/authorizations/2",
    +  "app": {
    +    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    +    "name": "GitHub API"
    +  },
    +  "created_at": "2012-11-14T14:04:24Z",
    +  "note_url": null,
    +  "id": 2,
    +  "note": "getting-started"
    +}
    +
    + +

    There’s a lot going on in this one little call, so let’s break it down. First, +the -d flag indicates we’re doing a POST, using the +application/x-www-form-urlencoded content type (as opposed to GET). All POST +requests to the GitHub API should be in JSON.

    + +

    Next, let’s look at the scopes we’re sending over in this call. When creating +a new token, we include an optional array of scopes, or access +levels, that indicate what information this token can access. In this case, +we’re setting up the token with repo access, which grants access to read and +write to public and private repositories, and user scope, which grants read +and write access to public and private user profile data. See +the scopes docs for a full list of +scopes. You should only request scopes that your application actually needs, +in order to not frighten users with potentially invasive actions. The 201 +status code tells us that the call was successful, and the JSON returned +contains the details of our new OAuth token.

    + +

    If you have two-factor authentication enabled, the API will +return the previously described 401 Unauthorized error code +for the above request. You can get around that error by providing a 2FA OTP code +in the X-GitHub-OTP request header:

    + +
    +$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    +    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    +    https://api.github.com/authorizations
    +
    + +

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from +your one-time password application on your phone. If you enabled 2FA with text +messages, you’ll receive an SMS with your OTP code after making a request to +this endpoint.

    + +

    Now, we can use the forty character token instead of a username and password +in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user
    +
    + +

    Treat OAuth tokens like passwords! Don’t share them with other users or store +them in insecure places. The tokens in these examples are fake and the names have +been changed to protect the innocent.

    + +

    Now that we’ve got the hang of making authenticated calls, let’s move along to +the Repositories API.

    + +

    Repositories

    + +

    Almost any meaningful use of the GitHub API will involve some level of Repository +information. We can GET repository details in the same way we fetched user +details earlier:

    + +
    +$ curl -i https://api.github.com/repos/twbs/bootstrap
    +
    + +

    In the same way, we can view repositories for the authenticated user:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/user/repos
    +
    + +

    Or, we can list repositories for another user:

    + +
    +$ curl -i https://api.github.com/users/technoweenie/repos
    +
    + +

    Or, we can list repositories for an organization:

    + +
    +$ curl -i https://api.github.com/orgs/mozilla/repos
    +
    + +

    The information returned from these calls will depend on how we authenticate:

    + +
      +
    • Using Basic Authentication, the response includes all repositories the +the user has access to see on github.com.
    • +
    • Using OAuth, private repositories are only returned if the OAuth token +contains the repo scope.
    • +
    + +

    As the docs indicate, these methods take a type parameter that +can filter the repositories returned based on what type of access the user has +for the repository. In this way, we can fetch only directly-owned repositories, +organization repositories, or repositories the user collaborates on via a team.

    + +
    +$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    +
    + +

    In this example, we grab only those repositories that technoweenie owns, not the +ones on which he collaborates. Note the quoted URL above. Depending on your +shell setup, cURL sometimes requires a quoted URL or else it ignores the +query string.

    + +

    Create a repository

    + +

    Fetching information for existing repositories is a common use case, but the +GitHub API supports creating new repositories as well. To create a repository, +we need to POST some JSON containing the details and configuration options.

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +        "name": "blog", \
    +        "auto_init": true, \
    +        "private": true, \
    +        "gitignore_template": "nanoc" \
    +      }' \
    +    https://api.github.com/user/repos
    +
    + +

    In this minimal example, we create a new repository for our blog (to be served +on GitHub Pages, perhaps). Though the blog will be public, we’ve made +the repository private. In this single step, we’ll also initialize it with +a README and a nanoc-flavored .gitignore template.

    + +

    The resulting repository will be found at https://github.com/<your_username>/blog. +To create a repository under an organization for which you’re +an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    + +

    Next, let’s fetch our newly created repository:

    + +
    +$ curl -i https://api.github.com/repos/pengwynn/blog
    +
    +HTTP/1.1 404 Not Found
    +
    +{
    +    "message": "Not Found"
    +}
    +
    + +

    Oh noes! Where did it go? Since we created the repository as private, we need +to authenticate in order to see it. If you’re a grizzled HTTP user, you might +expect a 403 instead. Since we don’t want to leak information about private +repositories, the GitHub API returns a 404 in this case, as if to say “we can +neither confirm nor deny the existence of this repository.”

    + +

    Issues

    + +

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while +staying out of your way. With the GitHub Issues API, you can pull +data out or create issues from other tools to create a workflow that works for +your team.

    + +

    Just like github.com, the API provides a few methods to view issues for the +authenticated user. To see all your issues, call GET /issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/issues
    +
    + +

    To get only the issues under one of your GitHub organizations, call GET +/orgs/<org>/issues:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    https://api.github.com/orgs/rails/issues
    +
    + +

    We can also get all the issues under a single repository:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    + +

    Pagination

    + +

    A project the size of Rails has thousands of issues. We’ll need to paginate, +making multiple API calls to get the data. Let’s repeat that last call, this +time taking note of the response headers:

    + +
    +$ curl -i https://api.github.com/repos/rails/rails/issues
    +
    +HTTP/1.1 200 OK
    +
    +Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    +<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    +
    + +

    The Link header provides a way for a response to link to +external resources, in this case additional pages of data. Since our call found +more than thirty issues (the default page size), the API tells us where we can +find the next page and the last page of results.

    + +

    Creating an issue

    + +

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from +the API.

    + +

    To create an issue, we need to be authenticated, so we’ll pass an +OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON +body to the /issues path underneath the repository in which we want to create +the issue:

    + +
    +$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    +    -d '{ \
    +         "title": "New logo", \
    +         "body": "We should have one", \
    +         "labels": ["design"] \
    +       }' \
    +    https://api.github.com/repos/pengwynn/api-sandbox/issues
    +
    +HTTP/1.1 201 Created
    +Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    +X-RateLimit-Limit: 5000
    +
    +{
    +  "pull_request": {
    +    "patch_url": null,
    +    "html_url": null,
    +    "diff_url": null
    +  },
    +  "created_at": "2012-11-14T15:25:33Z",
    +  "comments": 0,
    +  "milestone": null,
    +  "title": "New logo",
    +  "body": "We should have one",
    +  "user": {
    +    "login": "pengwynn",
    +    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    +    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    +    "id": 865,
    +    "url": "https://api.github.com/users/pengwynn"
    +  },
    +  "closed_at": null,
    +  "updated_at": "2012-11-14T15:25:33Z",
    +  "number": 17,
    +  "closed_by": null,
    +  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    +  "labels": [
    +    {
    +      "color": "ededed",
    +      "name": "design",
    +      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    +    }
    +  ],
    +  "id": 8356941,
    +  "assignee": null,
    +  "state": "open",
    +  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    +}
    +
    + +

    The response gives us a couple of pointers to the newly created issue, both in +the Location response header and the url field of the JSON response.

    + +

    Conditional requests

    + +

    A big part of being a good API citizen is respecting rate limits by +caching information that hasn’t changed. The API supports conditional +requests and helps you do the right thing. Consider the +first call we made to get defunkt’s profile:

    + +
    +$ curl -i https://api.github.com/users/defunkt
    +
    +HTTP/1.1 200 OK
    +ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    +
    + +

    In addition to the JSON body, take note of the HTTP status code of 200 and +the ETag header. +The ETag is a fingerprint of the response. If we pass that on subsequent calls, +we can tell the API to give us the resource again, only if it has changed:

    + +
    +$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    +    https://api.github.com/users/defunkt
    +
    +HTTP/1.1 304 Not Modified
    +
    + +

    The 304 status indicates that the resource hasn’t changed since the last time +we asked for it and the response will contain no body. As a bonus, 304 +responses don’t count against your rate limit.

    + +

    Woot! Now you know the basics of the GitHub API!

    + +
      +
    • Basic & OAuth authentication
    • +
    • Fetching and creating repositories and issues
    • +
    • Conditional requests
    • +
    + +

    Keep learning with the next API guide Basics of Authentication!

    + +;T; @mI"&/guides/create-coin-with-premine/;T{;{ ;I"p + + + + + + + Create coin with premine | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Create coin with premine

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Creating config file

    + +

    Create a configuration file of your coin by using our configuration form.

    + +

    Once you see the configuration file, save it in your machine.

    + +

    For example on Linux/Mac:

    + +

    If you want to dig deeper you can checkout the supported parameters of the configuration file.

    + +

    Creating simplewallet addresses

    + +

    This step is only required if your coin has premine

    + +

    Caution: Don’t forget to backup the wallets

    + +

    Genesis coinbase transaction creation

    + +

    Adding seed nodes

    + +

    You can create

    + + +
    + + +
    + + + + + + + +;T; I" +# Create coin with premine + +* TOC +{:toc} + + +Let's walk through core API concepts as we tackle some everyday use cases. + + +## Creating config file + +Create a configuration file of your coin by using our [configuration form][create]. + +Once you see the configuration file, save it in your machine. + +For example on Linux/Mac: + + + + +If you want to dig deeper you can checkout the [supported parameters][supported-parameters] of the configuration file. + + +## Creating simplewallet addresses + +This step is only required if your coin has premine + + + +*Caution: Don't forget to backup the wallets* + + +## Genesis coinbase transaction creation + + +## Adding seed nodes + +You can create + + + +[supported-parameters]: /create/ +[create]: /create/;T; +I" +

    Create coin with premine

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Creating config file

    + +

    Create a configuration file of your coin by using our configuration form.

    + +

    Once you see the configuration file, save it in your machine.

    + +

    For example on Linux/Mac:

    + +

    If you want to dig deeper you can checkout the supported parameters of the configuration file.

    + +

    Creating simplewallet addresses

    + +

    This step is only required if your coin has premine

    + +

    Caution: Don’t forget to backup the wallets

    + +

    Genesis coinbase transaction creation

    + +

    Adding seed nodes

    + +

    You can create

    + +;T; @sI" /guides/create-simple-coin/;T{;{ ;I" + + + + + + + Create simple coin | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Create simple coin

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Creating config file

    + +

    configuration create

    + +

    Genesis coinbase transaction creation

    + +

    To create the

    + +

    Adding seed nodes

    + +

    You can create

    + + +
    + + +
    + + + + + + + +;T; I" +# Create simple coin + +* TOC +{:toc} + + +Let's walk through core API concepts as we tackle some everyday use cases. + +## Creating config file + + [configuration create][create] + +## Genesis coinbase transaction creation + +To create the + + +## Adding seed nodes + +You can create + + +[create]: /create/;T; +I"< +

    Create simple coin

    + + + +

    Let’s walk through core API concepts as we tackle some everyday use cases.

    + +

    Creating config file

    + +

    configuration create

    + +

    Genesis coinbase transaction creation

    + +

    To create the

    + +

    Adding seed nodes

    + +

    You can create

    + +;T; @yI"/guides/getting-started/;T{;{ ;I"R + + + + + + + Getting Started | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Getting Started

    + + + +

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    + +

    Overview

    + +

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    + +

    Starting the daemon for preconfigured networks

    + +

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    + +

    Connecting to Dashcoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    + +

    Connecting to Bytecoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted --config-file configs/bytecoin.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Starting the daemon for custom networks

    + +

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    + +

    Next, let’s start the daemon itself:

    + +
    +$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    + +

    Starting simplewallet

    + +

    Simplewallet uses the same configuration file as the daemon.

    + +

    To start simplewallet:

    + +
    +$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +forknote wallet v1.0.8.608()
    +Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    +What do you want to do?
    +[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    +
    + +

    Press g to create new wallet and type your wallet’s name and password.

    + +

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    +For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    + +

    Don’t forget to backup your wallet.

    + + +
    + + +
    + + + + + + + +;T; I" +# Getting Started + +* TOC +{:toc} + +Let's walk through core Forknote concepts as we tackle a simple use case. + +## Overview + +Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must [download][download] the latest version of Forknote. + +## Starting the daemon for preconfigured networks + +Forknote comes preconfigured with 2 networks - Dashcoin and [Bytecoin][bytecoin]. + +### Connecting to Dashcoin + +To connect to Dashcoin open up a command prompt and enter the +following command (without the `$`): + +
    +$ ./forknoted
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +By default, Forknote will load the Dashcoin configuration file (`configs/-.conf`), if no configuration file is passed as option. + +### Connecting to Bytecoin + +To connect to Dashcoin open up a command prompt and enter the +following command (without the `$`): + +
    +$ ./forknoted --config-file configs/bytecoin.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +## Starting the daemon for custom networks + +To connect to custom networks, you must save the configuraton file in the `configs` subfolder of Forknote. + +Next, let's start the daemon itself: + +
    +$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +Please note you have to change `CUSTOM_NETWORK` with appropriate file name. + +## Starting simplewallet + +Simplewallet uses the same configuration file as the daemon. + +To start simplewallet: + +
    +$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +forknote wallet v1.0.8.608()
    +Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    +What do you want to do?
    +[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    +
    + +Press `g` to create new wallet and type your wallet's name and password. + +A good practice for naming your wallet is to add `NETWORK.` prefix to your name.
    +For example, for Dashcoin wallet use the `dashcoin.` prefix - `dashcoin.example_wallet` + +Don't forget to backup your wallet. + + +[download]: /download/ +[bytecoin]: https://bytecoin.org/;T; +I" +

    Getting Started

    + + + +

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    + +

    Overview

    + +

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    + +

    Starting the daemon for preconfigured networks

    + +

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    + +

    Connecting to Dashcoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    + +

    Connecting to Bytecoin

    + +

    To connect to Dashcoin open up a command prompt and enter the +following command (without the $):

    + +
    +$ ./forknoted --config-file configs/bytecoin.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Starting the daemon for custom networks

    + +

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    + +

    Next, let’s start the daemon itself:

    + +
    +$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +12:34:56.789012 INFO forknote v1.0.8.608()
    +
    + +

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    + +

    Starting simplewallet

    + +

    Simplewallet uses the same configuration file as the daemon.

    + +

    To start simplewallet:

    + +
    +$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    +
    +config path exist
    +forknote wallet v1.0.8.608()
    +Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    +What do you want to do?
    +[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    +
    + +

    Press g to create new wallet and type your wallet’s name and password.

    + +

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    +For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    + +

    Don’t forget to backup your wallet.

    + +;T; @I" /guides/;T{;{ ;I" + + + + + + + Guides | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + + +
    + + +
    + + + + + + + +;T; I" +# Development Guides + +This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes. + + +;T; +I"' +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + +;T; @I"/guides/troubleshooting/;T{;{ ;I" + + + + + + + Troutbleshooting | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Troubleshooting

    + + + +

    A list of problems you may encounter on the way.

    + +

    An existing connection was forcibly closed by the remote host

    + +

    Symptom

    + +

    Nobody can connect to the seed node. forknoted on the seed node prints the following WARNING

    + +
    +2015-Sep-22 22:51:12.627019 WARNING [node_server] [127.0.0.1:55741 INC] Exception in 
    +connectionHandler: TcpConnection::read, WSAGetOverlappedResult failed, result=10054, 
    +An existing connection was forcibly closed by the remote host.
    +
    + +

    Solution

    + +
      +
    • Add the P2P port in “Inbound Rules” in the Windows Firewall on the seed node
    • +
    • If you are behind NAT added --p2p-external-port <PORT> param to forknoted.
    • +
    + +

    Coinbase transaction doesn’t use full amount of block reward

    + +

    Symptom

    + +

    forknoted cannot start and prints the following ERROR

    + +
    +20:41:36.303639 ERROR Coinbase transaction doesn't use full amount of block reward: spent 70.368744177663, block reward is 1844674.407370955160
    +20:41:36.303736 INFO Block <5668876f735d91e7a4b7230dedddfeead0004e83a913eb1d8782101c5f8fc13a> has invalid miner transaction
    +20:41:36.303830 ERROR Failed to add genesis block to blockchain
    +20:41:36.303898 ERROR Failed to initialize blockchain storage
    +20:41:36.303960 ERROR Failed to initialize core
    +
    + +

    This error occurs when the loaded blockchain has different parameters than the configuration file.

    + +

    Solution

    + +

    Delete the blockchain folder.

    + +

    On Windows delete this folder:

    + +
    C:\Users\%user_name%\AppData\Roaming\%yourcoin%\
    + +

    On Linux/OSX:

    + +
    $ rm -rf ~/.YOURCOIN/
    + +
    + + +
    + + + + + + + +;T; I"` +# Troubleshooting + +* TOC +{:toc} + +A list of problems you may encounter on the way. + +##An existing connection was forcibly closed by the remote host + +###Symptom + +Nobody can connect to the seed node. `forknoted` on the seed node prints the following `WARNING` + +
    +2015-Sep-22 22:51:12.627019 WARNING [node_server] [127.0.0.1:55741 INC] Exception in 
    +connectionHandler: TcpConnection::read, WSAGetOverlappedResult failed, result=10054, 
    +An existing connection was forcibly closed by the remote host.
    +
    + +###Solution + +* Add the P2P port in "Inbound Rules" in the Windows Firewall on the seed node +* If you are behind NAT added `--p2p-external-port ` param to forknoted. + + +##Coinbase transaction doesn't use full amount of block reward + +###Symptom + +`forknoted` cannot start and prints the following `ERROR` + +
    +20:41:36.303639 ERROR Coinbase transaction doesn't use full amount of block reward: spent 70.368744177663, block reward is 1844674.407370955160
    +20:41:36.303736 INFO Block <5668876f735d91e7a4b7230dedddfeead0004e83a913eb1d8782101c5f8fc13a> has invalid miner transaction
    +20:41:36.303830 ERROR Failed to add genesis block to blockchain
    +20:41:36.303898 ERROR Failed to initialize blockchain storage
    +20:41:36.303960 ERROR Failed to initialize core
    +
    + +This error occurs when the loaded blockchain has different parameters than the configuration file. + +###Solution + +Delete the blockchain folder. + +On Windows delete this folder: + +
    C:\Users\%user_name%\AppData\Roaming\%yourcoin%\
    + +On Linux/OSX: + +
    $ rm -rf ~/.YOURCOIN/
    +;T; +I" +

    Troubleshooting

    + + + +

    A list of problems you may encounter on the way.

    + +

    An existing connection was forcibly closed by the remote host

    + +

    Symptom

    + +

    Nobody can connect to the seed node. forknoted on the seed node prints the following WARNING

    + +
    +2015-Sep-22 22:51:12.627019 WARNING [node_server] [127.0.0.1:55741 INC] Exception in 
    +connectionHandler: TcpConnection::read, WSAGetOverlappedResult failed, result=10054, 
    +An existing connection was forcibly closed by the remote host.
    +
    + +

    Solution

    + +
      +
    • Add the P2P port in “Inbound Rules” in the Windows Firewall on the seed node
    • +
    • If you are behind NAT added --p2p-external-port <PORT> param to forknoted.
    • +
    + +

    Coinbase transaction doesn’t use full amount of block reward

    + +

    Symptom

    + +

    forknoted cannot start and prints the following ERROR

    + +
    +20:41:36.303639 ERROR Coinbase transaction doesn't use full amount of block reward: spent 70.368744177663, block reward is 1844674.407370955160
    +20:41:36.303736 INFO Block <5668876f735d91e7a4b7230dedddfeead0004e83a913eb1d8782101c5f8fc13a> has invalid miner transaction
    +20:41:36.303830 ERROR Failed to add genesis block to blockchain
    +20:41:36.303898 ERROR Failed to initialize blockchain storage
    +20:41:36.303960 ERROR Failed to initialize core
    +
    + +

    This error occurs when the loaded blockchain has different parameters than the configuration file.

    + +

    Solution

    + +

    Delete the blockchain folder.

    + +

    On Windows delete this folder:

    + +
    C:\Users\%user_name%\AppData\Roaming\%yourcoin%\
    + +

    On Linux/OSX:

    + +
    $ rm -rf ~/.YOURCOIN/
    +;T; @I" /guides/starting-seed-node/;T{;{ ;I" + + + + + + + Getting Started | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Starting seed node

    + + + +

    This guide will walk you through the process of starting a Forknote seed node on a Ubuntu 14.04 VPS.

    + +

    Getting a VPS

    + +

    Run forknoted on a VPS is the cheapest way to get your network started.
    +You can get a VPS at Digital Ocean or Vultr. The 5$ option is what most coins need.

    + +

    Vultr recommended VPS

    + +

    Adding nodes to config file

    + +

    Once you have your VPS, you can see its IP.

    + +

    Vultr IP VPS

    + +

    Add its IP to the seed nodes.

    + +

    Create cryptonote coin form - seed

    + +

    Installing Forknote

    + +

    Once you connect to the VPS, create and log into user fork.

    + +
    $ useradd -m fork
    +$ su fork
    +$ cd ~
    +
    + +

    Now you can download Forknote.

    + +
    $ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
    +
    +--2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
    +Resolving github.com (github.com)... 192.30.252.32
    +
    +
    + +

    Unarchive the downloaded file.

    + +
    $ tar -zxvf forknote-linux.tar.gz 
    +
    +forknote-linux/
    +forknote-linux/configs/
    +forknote-linux/forknoted
    +forknote-linux/simplewallet
    +forknote-linux/walletd
    +forknote-linux/configs/-.conf
    +forknote-linux/configs/bytecoin.conf
    +
    + +

    Saving the configuration file

    + +

    Log into the forknote directory

    + +
    $ cd forknote-linux
    + +

    Write your configuration file

    + +
    $ cat >configs/testcoin.conf 
    +
    +EMISSION_SPEED_FACTOR=18
    +DIFFICULTY_TARGET=120
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +MONEY_SUPPLY=18446744073709551615
    +PREMINED_PERCENT=0
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +p2p-bind-port=13539
    +rpc-bind-port=13540
    +BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    +CRYPTONOTE_NAME=testcoin
    +UPGRADE_HEIGHT=1
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    +seed-node=45.32.238.88:13539
    +
    +
    + +

    Starting in upstart

    + +

    Log with root user and change the directory to /etc/init/.

    + +
    $ cd /etc/init
    +
    + +

    Create the upstart config file.

    + +
    $ cat >forknote-testcoin-daemon.conf 
    +
    +description "testcoin daemon"
    +
    +start on runlevel [23]
    +stop on shutdown
    +
    +exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
    +
    +post-stop exec sleep 30
    +
    +respawn
    +respawn limit 5 30
    +
    +
    + +

    Start the service.

    + +
    $ start forknote-testcoin-daemon 
    +
    + +

    You now have your seed node up and running. It will automatically restart if something goes wrong.

    + + +
    + + +
    + + + + + + + +;T; I" +# Starting seed node + +* TOC +{:toc} + +This guide will walk you through the process of starting a Forknote seed node on a **Ubuntu 14.04** VPS. + +## Getting a VPS + +Run forknoted on a VPS is the cheapest way to get your network started.
    +You can get a VPS at [Digital Ocean][ditital-ocean] or [Vultr][vultr]. The 5$ option is what most coins need. + +[![Vultr recommended VPS](/images/documentation/vps-vultr-recommended.png)][vultr] + + +## Adding nodes to config file + +Once you have your VPS, you can see its IP. + +![Vultr IP VPS](/images/documentation/vps-vultr-ip.png) + +Add its IP to the seed nodes. + +![Create cryptonote coin form - seed](/images/documentation/create-form-seed.png) + + +## Installing Forknote + +Once you connect to the VPS, create and log into user `fork`. + +
    $ useradd -m fork
    +$ su fork
    +$ cd ~
    +
    + +Now you can download Forknote. + +
    $ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
    +
    +--2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
    +Resolving github.com (github.com)... 192.30.252.32
    +
    +
    + +Unarchive the downloaded file. + +
    $ tar -zxvf forknote-linux.tar.gz 
    +
    +forknote-linux/
    +forknote-linux/configs/
    +forknote-linux/forknoted
    +forknote-linux/simplewallet
    +forknote-linux/walletd
    +forknote-linux/configs/-.conf
    +forknote-linux/configs/bytecoin.conf
    +
    + + +## Saving the configuration file + +Log into the forknote directory + +
    $ cd forknote-linux
    + +Write your configuration file + +
    $ cat >configs/testcoin.conf 
    +
    +EMISSION_SPEED_FACTOR=18
    +DIFFICULTY_TARGET=120
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +MONEY_SUPPLY=18446744073709551615
    +PREMINED_PERCENT=0
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +p2p-bind-port=13539
    +rpc-bind-port=13540
    +BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    +CRYPTONOTE_NAME=testcoin
    +UPGRADE_HEIGHT=1
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    +seed-node=45.32.238.88:13539
    +
    +
    + + +## Starting in upstart + +Log with `root` user and change the directory to `/etc/init/`. + +
    $ cd /etc/init
    +
    + +Create the upstart config file. + +
    $ cat >forknote-testcoin-daemon.conf 
    +
    +description "testcoin daemon"
    +
    +start on runlevel [23]
    +stop on shutdown
    +
    +exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
    +
    +post-stop exec sleep 30
    +
    +respawn
    +respawn limit 5 30
    +
    +
    + +Start the service. + +
    $ start forknote-testcoin-daemon 
    +
    + +You now have your seed node up and running. It will automatically restart if something goes wrong. + +[ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 +[vultr]: http://www.vultr.com/?ref=6832621;T; +I" +

    Starting seed node

    + + + +

    This guide will walk you through the process of starting a Forknote seed node on a Ubuntu 14.04 VPS.

    + +

    Getting a VPS

    + +

    Run forknoted on a VPS is the cheapest way to get your network started.
    +You can get a VPS at Digital Ocean or Vultr. The 5$ option is what most coins need.

    + +

    Vultr recommended VPS

    + +

    Adding nodes to config file

    + +

    Once you have your VPS, you can see its IP.

    + +

    Vultr IP VPS

    + +

    Add its IP to the seed nodes.

    + +

    Create cryptonote coin form - seed

    + +

    Installing Forknote

    + +

    Once you connect to the VPS, create and log into user fork.

    + +
    $ useradd -m fork
    +$ su fork
    +$ cd ~
    +
    + +

    Now you can download Forknote.

    + +
    $ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
    +
    +--2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
    +Resolving github.com (github.com)... 192.30.252.32
    +
    +
    + +

    Unarchive the downloaded file.

    + +
    $ tar -zxvf forknote-linux.tar.gz 
    +
    +forknote-linux/
    +forknote-linux/configs/
    +forknote-linux/forknoted
    +forknote-linux/simplewallet
    +forknote-linux/walletd
    +forknote-linux/configs/-.conf
    +forknote-linux/configs/bytecoin.conf
    +
    + +

    Saving the configuration file

    + +

    Log into the forknote directory

    + +
    $ cd forknote-linux
    + +

    Write your configuration file

    + +
    $ cat >configs/testcoin.conf 
    +
    +EMISSION_SPEED_FACTOR=18
    +DIFFICULTY_TARGET=120
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +MONEY_SUPPLY=18446744073709551615
    +PREMINED_PERCENT=0
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +p2p-bind-port=13539
    +rpc-bind-port=13540
    +BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    +CRYPTONOTE_NAME=testcoin
    +UPGRADE_HEIGHT=1
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    +seed-node=45.32.238.88:13539
    +
    +
    + +

    Starting in upstart

    + +

    Log with root user and change the directory to /etc/init/.

    + +
    $ cd /etc/init
    +
    + +

    Create the upstart config file.

    + +
    $ cat >forknote-testcoin-daemon.conf 
    +
    +description "testcoin daemon"
    +
    +start on runlevel [23]
    +stop on shutdown
    +
    +exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
    +
    +post-stop exec sleep 30
    +
    +respawn
    +respawn limit 5 30
    +
    +
    + +

    Start the service.

    + +
    $ start forknote-testcoin-daemon 
    +
    + +

    You now have your seed node up and running. It will automatically restart if something goes wrong.

    + +;T; @I"/documentation/;T{;{ ;I"! + + + + + + + Documentation | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Forknote command line client overview

    + +

    Forknote works through 2 separate binary files operated through command line:

    + +
      +
    • +

      forknoted – daemon to synchronize the block chain and mine cryptonote tokens.

      +
    • +
    • +

      simplewallet – wallet to receive and send funds.

      +
    • +
    + +

    Install Forknote

    + +
      +
    1. Unzip the archive to one separate folder
    2. +
    + +

    Launch Forknote

    + +
      +
    1. Open forknoted. For downloadable Linux archive use: +
      +  ./forknoted --config-file <path_to_config_file>
      + 
      +
    2. +
    3. +

      Wait until forknoted is synchronized. You will be notified with several green “SYNCHRONIZED OK” messages.

      +
    4. +
    5. Open simplewallet. For downloadable Linux archive use: +
      +  ./simplewallet --config-file <path_to_config_file>
      + 
      +
    6. +
    + +

    Daemon: synchronization & mining

    + +

    Main article: Daemon configuration and commands

    + +

    After forknoted is launched you will have to wait until it is synchronized with the network. You will be notified with several green “SYNCHRONIZED OK” messages. Here are the most important daemon commands:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescription
    start_mining <wallet_address> [threads=1]Start mining in several threads to a given wallet address
    stop_miningStop mining
    show_hrShow current mining hashrate
    hide_hrStop showing current mining hashrate
    helpShow all daemon commands
    exitExit forknoted
    + +

    Wallet: send and receive payments

    + +

    Main article: Simplewallet configuration and commands

    + +

    Simplewallet can only be used after the daemon is launched and synchronized. Simlewallet automatically synchronizes with forknoted. Here are the most important wallet commands:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescription
    addressShow your wallet address
    balanceShow current wallet balance
    transfer <mixin_count> <address> <amount>Send money to <address> with a mixing degree of <mixin_count>
    start_mining <threads>Start mining in daemon with several threads to the current wallet address
    stop_miningStop mining in daemon
    helpShow all wallet commands
    exitExit simplewallet
    + + + + + + + + + + + + + +;T; I" +# Forknote command line client overview + +Forknote works through 2 separate binary files operated through command line: + +* **forknoted** – daemon to synchronize the block chain and mine cryptonote tokens. + +* **simplewallet** – wallet to receive and send funds. + + +## Install Forknote + +1. Unzip the archive to one separate folder + + +## Launch Forknote + +1. Open forknoted. For downloadable Linux archive use: +
    +     ./forknoted --config-file <path_to_config_file>
    +    
    + +2. Wait until forknoted is synchronized. You will be notified with several green "SYNCHRONIZED OK" messages. + +3. Open simplewallet. For downloadable Linux archive use: +
    +     ./simplewallet --config-file <path_to_config_file>
    +    
    + +## Daemon: synchronization & mining + +*Main article: [Daemon configuration and commands][daemon_commands]* + +After forknoted is launched you will have to wait until it is synchronized with the network. You will be notified with several green "SYNCHRONIZED OK" messages. Here are the most important daemon commands: + + +Command | Description +-----------|-----------| +start_mining <wallet_address> [threads=1] | Start mining in several threads to a given wallet address +stop_mining | Stop mining +show_hr | Show current mining hashrate +hide_hr | Stop showing current mining hashrate +help | Show all daemon commands +exit | Exit forknoted + + +## Wallet: send and receive payments + +*Main article: [Simplewallet configuration and commands][simplewallet_commands]* + +Simplewallet can only be used after the daemon is launched and synchronized. Simlewallet automatically synchronizes with forknoted. Here are the most important wallet commands: + + +Command | Description +-----------|-----------| +address | Show your wallet address +balance | Show current wallet balance +transfer <mixin_count> <address> <amount> | Send money to <address> with a mixing degree of <mixin_count> +start_mining <threads> | Start mining in daemon with several threads to the current wallet address +stop_mining | Stop mining in daemon +help | Show all wallet commands +exit | Exit simplewallet + + +[daemon_commands]: /documentation/daemon/ +[simplewallet_commands]: /documentation/simplewallet/;T; +I") +

    Forknote command line client overview

    + +

    Forknote works through 2 separate binary files operated through command line:

    + +
      +
    • +

      forknoted – daemon to synchronize the block chain and mine cryptonote tokens.

      +
    • +
    • +

      simplewallet – wallet to receive and send funds.

      +
    • +
    + +

    Install Forknote

    + +
      +
    1. Unzip the archive to one separate folder
    2. +
    + +

    Launch Forknote

    + +
      +
    1. Open forknoted. For downloadable Linux archive use: +
      +  ./forknoted --config-file <path_to_config_file>
      + 
      +
    2. +
    3. +

      Wait until forknoted is synchronized. You will be notified with several green “SYNCHRONIZED OK” messages.

      +
    4. +
    5. Open simplewallet. For downloadable Linux archive use: +
      +  ./simplewallet --config-file <path_to_config_file>
      + 
      +
    6. +
    + +

    Daemon: synchronization & mining

    + +

    Main article: Daemon configuration and commands

    + +

    After forknoted is launched you will have to wait until it is synchronized with the network. You will be notified with several green “SYNCHRONIZED OK” messages. Here are the most important daemon commands:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescription
    start_mining <wallet_address> [threads=1]Start mining in several threads to a given wallet address
    stop_miningStop mining
    show_hrShow current mining hashrate
    hide_hrStop showing current mining hashrate
    helpShow all daemon commands
    exitExit forknoted
    + +

    Wallet: send and receive payments

    + +

    Main article: Simplewallet configuration and commands

    + +

    Simplewallet can only be used after the daemon is launched and synchronized. Simlewallet automatically synchronizes with forknoted. Here are the most important wallet commands:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescription
    addressShow your wallet address
    balanceShow current wallet balance
    transfer <mixin_count> <address> <amount>Send money to <address> with a mixing degree of <mixin_count>
    start_mining <threads>Start mining in daemon with several threads to the current wallet address
    stop_miningStop mining in daemon
    helpShow all wallet commands
    exitExit simplewallet
    + +;T; @I")/documentation/cryptonote_generator/;T{;{ ;I"P + + + + + + + Cryptonote generator overview | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Cryptonote generator overview

    + +

    This section describes the purpose of the Cryptonote Generator. The Cryptonote Generator is used for source code creation, based on the latest version of Bytecoin. It eases the creation and . The generated code is fully compatible with Forknote

    + +

    Dependencies

    + +

    Configuration parameters

    + +

    The core parameters of the Cryptonote Generator are the same as the currency defining parameters of Forknote

    + +

    Example configuration

    + +

    Source creating and building

    + + +
    + + +
    + + + + + + + +;T; I" +# Cryptonote generator overview + +This section describes the purpose of the Cryptonote Generator. The Cryptonote Generator is used for source code creation, based on the latest version of Bytecoin. It eases the creation and . The generated code is fully compatible with Forknote + +## Dependencies + + +## Configuration parameters + +The core parameters of the Cryptonote Generator are the same as the currency defining parameters of Forknote + + +## Example configuration + + +## Source creating and building + + +;T; +I" +

    Cryptonote generator overview

    + +

    This section describes the purpose of the Cryptonote Generator. The Cryptonote Generator is used for source code creation, based on the latest version of Bytecoin. It eases the creation and . The generated code is fully compatible with Forknote

    + +

    Dependencies

    + +

    Configuration parameters

    + +

    The core parameters of the Cryptonote Generator are the same as the currency defining parameters of Forknote

    + +

    Example configuration

    + +

    Source creating and building

    + +;T; @I"/documentation/daemon/;T{;{ ;I"G + + + + + + + Daemon configuration and commands| Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Daemon configuration and commands

    + + + +

    Command line options

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +  --os-version 
    +  --data-dir arg (=/Users/USER/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +
    + +

    Command line options and settings options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    + +

    Example of a config file

    + +
    $ cat ./notrealcoin.conf 
    +
    +CRYPTONOTE_NAME=notrealcoin
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +
    + +

    Daemon commands

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    + +
    + + +
    + + + + + + + +;T; I"y +# Daemon configuration and commands + +* TOC +{:toc} + +##Command line options + + --help Produce help message + --version Output version information + --os-version + --data-dir arg (=/Users/USER/.forknote) + Specify data directory + --config-file arg (=./configs/-.conf) Specify configuration file + + +##Command line options and settings options: + + +Option | Description |   Config Example   |   Console Example   +-----------|-----------|-----------|-----------| +log-file | A name of log file that you want to use for logging. | log-file = mylog.log | --log-file mylog.log +log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 +no-console | Disable daemon console commands | no-console | --no-console +testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet | --testnet +rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 | --rpc-bind-ip 127.0.0.1 +rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 | --rpc-bind-port 29081 +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 +allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port +P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 +extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt | --extra-messages-file message.txt +start-mining | Specify wallet address to mining for | start-mining = FPM...yR | --start-mining FPM...yR +mining-threads | Specify mining threads count | mining-threads = 1 | --mining-threads 1 +GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a +CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 +CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 +MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin | --CRYPTONOTE_NAME dashcoin +CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 | --CHECKPOINT 10:70d..f8 +print-genesis-tx | Prints genesis block transaction hex and exits | | --print-genesis-tx +PREMINED_PERCENT | Percent of premined coins from all coins coming into existence | PREMINED_PERCENT = 10 | --PREMINED_PERCENT 10 +genesis-block-reward-address | The premined coins will be sent to this address. Multiple addresses can be used | | --genesis-block-reward-address FPM...yR + + +##Example of a config file + +
    $ cat ./notrealcoin.conf 
    +
    +CRYPTONOTE_NAME=notrealcoin
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +
    + +##Daemon commands + +Command | Description | Arg 1 | Arg 2 +-----------|-----------|-----------|-----------| +help | print forknoted commands | - | - +start_mining | Start mining in several threads to a given wallet address | [string] wallet_address | [uint] threads +stop_mining | Stop mining | - | - +show_hr | Show current mining hashrate | - | - +hide_hr | Stop showing current mining hashrate | - | - +exit | Exit forknoted | - | - +print_bc | Print blockchain info in a given blocks range | [uint] begin_height | [uint] end_height (optional) +print_block | Print block | [string] block_hash or [uint] block_height | - +print_cn | Print connections | - | - +print_pl | Print peer list | - | - +print_pool | Print transaction pool (long format) | - | - +print_pool_sh | Print transaction pool (short format) | - | - +set_log | Change current log detailization level | [uint] log level (0 - 4) | - +print_tx | Print transaction | [string] transaction_hash | - +;T; +I"*3 +

    Daemon configuration and commands

    + + + +

    Command line options

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +  --os-version 
    +  --data-dir arg (=/Users/USER/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +
    + +

    Command line options and settings options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    + +

    Example of a config file

    + +
    $ cat ./notrealcoin.conf 
    +
    +CRYPTONOTE_NAME=notrealcoin
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +
    + +

    Daemon commands

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    +;T; @I"$/documentation/payment_gateway/;T{;{ ;I"a + + + + + + + Payment gateway overview and configuration | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Payment gateway overview and configuration

    + + + +

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    + +

    Configure Forknote RPC Wallet

    + +

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf
    +
    + +

    To get help on available options run:

    + +
     $ ./walletd -h
    +
    + +

    Please note, Forknote RPC Wallet config file may consist only of these options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    + +

    Example of a config file

    + +
    $ cat ./notrealcoin.conf 
    +
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +wallet-file = mywallet
    +wallet-password = mypassword
    +daemon-port = 17100
    +bind-port = 9090
    +
    +
    + +

    Note: config file’s path is relative to current working directory, not server root.

    + +

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    + +

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    + +

    Generate a new wallet

    + +

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    + +

    To generate a new wallet you should run the following command:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    +
    + +

    where:

    + +
      +
    • +<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • +
    • +<mypass> is a secret password for the new wallet file. Whichever you like;
    • +
    • +–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • +
    + +

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    + +

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    + +

    Start Forknote RPC Wallet

    + +

    There are two ways to start Forknote RPC Wallet:

    + +

    Start with a remote connection to the Daemon

    + +

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    + +
      +
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • +
    • For remote daemons specify the remote daemon’s IP address.
    • +
    + +

    Default Forknote daemon ports are 8080 and 8081.

    + +

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    + +
    daemon-address=<remote_ip>
    +daemon-port=8080
    +
    + +

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    + +

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    + +

    Start as in-process node

    + +

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    + +

    Use the following command to start Forknote RPC Wallet with an in-process node

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    +
    + +

    Run Forknote RPC Wallet

    + +

    Forknote RPC wallet can be started in both daemon and console modes.

    + +
      +
    • +

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      +
    • +
    • +

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      +
    • +
    + +

    Forknote RPC wallet starts in console mode by default.

    + +

    Start as daemon (UNIX only)

    + +

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    + +
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    +
    + +

    Note: it’s a common practice for daemons to set server root directory.

    + +

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    + +

    Start as service (Windows only)

    + +

    To run RPC wallet as a service on Windows you have to do the following:

    + +
      +
    1. +

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      + +

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      +
    2. +
    3. +

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      + +
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      +
      +
    4. +
    5. +

      After you see message about successful service registration you can run it in your Services panel.

      +
    6. +
    + +

    Uninstall service (Windows only)

    + +

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    + +
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    +
    + +

    Forknote RPC Wallet JSON RPC API

    + +

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    + +
      +
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. +
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. +
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. +
    7. Fund these amounts to the corresponding user accounts.
    8. +
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. +
    + +

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    + + +
    + + +
    + + + + + + + +;T; I"q7 +# Payment gateway overview and configuration + +* TOC +{:toc} + +This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] and much more. [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] page contains detailed description of every method. + + +##Configure Forknote RPC Wallet + +To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use "--config" option further. The command below launches Forknote RPC Wallet with a specific config file: + + $ ./walletd --config /home/Downloads/myconfig.conf + +To get help on available options run: + + $ ./walletd -h + +Please note, Forknote RPC Wallet config file may consist only of these options: + +Option | Description | Config Example | Console Example +-----------|-----------|-----------|-----------| +bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 | --bind-address 127.0.0.1 +bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 | --bind-port 8071 +daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 | --daemon-address 127.0.0.1 +daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 | --daemon-port 8080 +wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet | --wallet-file mywallet +wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword | --wallet-password mypassword +generate-wallet | Generate new wallet | | --generate-wallet +log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log | --log-file mylog.log +server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet | --server-root /home/Downloads/RPCWallet +log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 +testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no | --testnet no +local | Option that allows you to start Forknote RPC Wallet as an in-process node | local | --local +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 +allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port +P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 +GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a +CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 +CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 +MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 + + +##Example of a config file + +
    $ cat ./notrealcoin.conf 
    +
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +wallet-file = mywallet
    +wallet-password = mypassword
    +daemon-port = 17100
    +bind-port = 9090
    +
    +
    + +Note: config file's path is relative to current working directory, not server root. + +Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode). + +Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory. + + +##Generate a new wallet + +To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly. + +To generate a new wallet you should run the following command: + + $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet + +where: + +* **<mywallet>** is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet's name will result in new *.wallet file located in the same folder as RPC Wallet +* **<mypass>** is a secret password for the new wallet file. Whichever you like; +* **--generate-wallet** option tells RPC wallet to generate wallet file and exit. + +Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name. + +If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down. + + +##Start Forknote RPC Wallet + +There are two ways to start Forknote RPC Wallet: + +###Start with a remote connection to the Daemon + +Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server. + +* For local daemons use localhost or 127.0.0.1 as an IP address. +* For remote daemons specify the remote daemon's IP address. + +Default Forknote daemon ports are 8080 and 8081. + +Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection: + + daemon-address= + daemon-port=8080 + +Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode. + +Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users. + +###Start as in-process node + +You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don't have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance. + +Use the following command to start Forknote RPC Wallet with an in-process node + + $ ./walletd --config /home/Downloads/myconfig.conf --local + +##Run Forknote RPC Wallet + +Forknote RPC wallet can be started in both daemon and console modes. + +* **Daemon mode** - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window. + +* **Console mode** - Forknote RPC Wallet is launched and prints log messages on the screen. + +Forknote RPC wallet starts in console mode by default. + +###Start as daemon (UNIX only) + +To start RPC wallet as daemon just set "--daemon" (or short "-d") option. + + ./walletd --config /home/Downloads/myconfig.conf --daemon + +Note: it's a common practice for daemons to set server root directory. + +Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory. + +###Start as service (Windows only) + +To run RPC wallet as a service on Windows you have to do the following: + +1. Create a config file and place it in the same directory as your RPC wallet's executable resides in. + + A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root); + +2. Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR: + + walletd.exe --config /home/Downloads/myconfig.conf --register-service + +3. After you see message about successful service registration you can run it in your Services panel. + + +###Uninstall service (Windows only) + +If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR: + + walletd.exe --config /home/Downloads/myconfig.conf --unregister-service + +##Forknote RPC Wallet JSON RPC API + +Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme: + +1. Create a unique address for each user to identify his particular deposits with **create_address()** method. +2. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run **get_transaction_count()** method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed. +3. Run **get_transaction()** method to receive amounts and addresses of new incoming transactions. +4. Fund these amounts to the corresponding user accounts. +5. Withdraw with **send_transaction()** method that allows you to send transaction to one or several addresses. + +Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] + + +[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment_gateway/json_rpc_api/ +;T; +I"*K +

    Payment gateway overview and configuration

    + + + +

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    + +

    Configure Forknote RPC Wallet

    + +

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf
    +
    + +

    To get help on available options run:

    + +
     $ ./walletd -h
    +
    + +

    Please note, Forknote RPC Wallet config file may consist only of these options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    + +

    Example of a config file

    + +
    $ cat ./notrealcoin.conf 
    +
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +wallet-file = mywallet
    +wallet-password = mypassword
    +daemon-port = 17100
    +bind-port = 9090
    +
    +
    + +

    Note: config file’s path is relative to current working directory, not server root.

    + +

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    + +

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    + +

    Generate a new wallet

    + +

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    + +

    To generate a new wallet you should run the following command:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    +
    + +

    where:

    + +
      +
    • +<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • +
    • +<mypass> is a secret password for the new wallet file. Whichever you like;
    • +
    • +–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • +
    + +

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    + +

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    + +

    Start Forknote RPC Wallet

    + +

    There are two ways to start Forknote RPC Wallet:

    + +

    Start with a remote connection to the Daemon

    + +

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    + +
      +
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • +
    • For remote daemons specify the remote daemon’s IP address.
    • +
    + +

    Default Forknote daemon ports are 8080 and 8081.

    + +

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    + +
    daemon-address=<remote_ip>
    +daemon-port=8080
    +
    + +

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    + +

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    + +

    Start as in-process node

    + +

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    + +

    Use the following command to start Forknote RPC Wallet with an in-process node

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    +
    + +

    Run Forknote RPC Wallet

    + +

    Forknote RPC wallet can be started in both daemon and console modes.

    + +
      +
    • +

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      +
    • +
    • +

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      +
    • +
    + +

    Forknote RPC wallet starts in console mode by default.

    + +

    Start as daemon (UNIX only)

    + +

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    + +
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    +
    + +

    Note: it’s a common practice for daemons to set server root directory.

    + +

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    + +

    Start as service (Windows only)

    + +

    To run RPC wallet as a service on Windows you have to do the following:

    + +
      +
    1. +

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      + +

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      +
    2. +
    3. +

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      + +
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      +
      +
    4. +
    5. +

      After you see message about successful service registration you can run it in your Services panel.

      +
    6. +
    + +

    Uninstall service (Windows only)

    + +

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    + +
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    +
    + +

    Forknote RPC Wallet JSON RPC API

    + +

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    + +
      +
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. +
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. +
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. +
    7. Fund these amounts to the corresponding user accounts.
    8. +
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. +
    + +

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    + +;T; @I"!/documentation/simplewallet/;T{;{ ;I"A + + + + + + + Simplewallet configuration and commands | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Simplewallet configuration and commands

    + + + +

    General options

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +  --data-dir arg (=/Users/USER/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +  --command arg                         Specify command
    +
    + +

    Wallet options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionConfig ExampleConsole Example
    wallet-fileUse wallet <arg>wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet
    –wallet-file /home/USERNAME/
    forknote-linux/dashcoin.wallet
    generate-new-walletGenerate new wallet and save it to <arg> –generate-new-wallet /home/USERNAME/
    forknote-linux/dashcoin.wallet
    passwordWallet passwordpassword = PASSWORD–password PASSWORD
    daemon-addressUse daemon instance at <host>:<port>daemon-address = 127.0.0.1:29081–daemon-address 127.0.0.1:29081
    daemon-hostUse daemon instance at host <arg> instead of localhostdaemon-host = 127.0.0.1–daemon-host 127.0.0.1
    daemon-portUse daemon instance at port <arg> instead of 8081daemon-port = 29081–daemon-port 29081
    set_logLevel of logging. Default is 1.set_log = 4–set_log 4
    testnetUsed to deploy test nets. The daemon must be launched with –testnet flag –testnet
    wallet-rpc-bind-ipSpecify ip to bind rpc serverwallet-rpc-bind-ip = 127.0.0.1–wallet-rpc-bind-ip 127.0.0.1
    wallet-rpc-bind-portStarts wallet as rpc server for wallet operations, sets bind port for serverwallet-rpc-bind-port = 29082–wallet-rpc-bind-port 29082
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    DEFAULT_FEEDefault fee of the transactions sent through simplewalletDEFAULT_FEE–DEFAULT_FEE 1000000000
    SYNC_FROM_ZEROSync from block 0. Use for premine wallet or brainwalletSYNC_FROM_ZERO–SYNC_FROM_ZERO
    + +

    Example of a config file

    + +

    You can use the same configuration file as the daemon

    + +
    $ cat ./notrealcoin.conf 
    +
    +CRYPTONOTE_NAME=notrealcoin
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +
    +wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
    +password=FAKE_PASSWORD
    +wallet-rpc-bind-port=17102
    +
    + +

    Wallet commands

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    + + +
    + + +
    + + + + + + + +;T; I"x +# Simplewallet configuration and commands + +* TOC +{:toc} + +##General options + + --help Produce help message + --version Output version information + --data-dir arg (=/Users/USER/.forknote) + Specify data directory + --config-file arg (=./configs/-.conf) Specify configuration file + --command arg Specify command + + +##Wallet options + +Option | Description | Config Example | Console Example +-----------|-----------|-----------|-----------| +wallet-file | Use wallet <arg> | wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet | --wallet-file /home/USERNAME/
    forknote-linux/dashcoin.wallet +generate-new-wallet | Generate new wallet and save it to <arg> | | --generate-new-wallet /home/USERNAME/
    forknote-linux/dashcoin.wallet +password | Wallet password | password = PASSWORD | --password PASSWORD +daemon-address | Use daemon instance at <host>:<port> | daemon-address = 127.0.0.1:29081 | --daemon-address 127.0.0.1:29081 +daemon-host | Use daemon instance at host <arg> instead of localhost | daemon-host = 127.0.0.1 | --daemon-host 127.0.0.1 +daemon-port | Use daemon instance at port <arg> instead of 8081 | daemon-port = 29081 | --daemon-port 29081 +set_log | Level of logging. Default is 1. | set_log = 4 | --set_log 4 +testnet | Used to deploy test nets. The daemon must be launched with --testnet flag | | --testnet +wallet-rpc-bind-ip | Specify ip to bind rpc server | wallet-rpc-bind-ip = 127.0.0.1 | --wallet-rpc-bind-ip 127.0.0.1 +wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server | wallet-rpc-bind-port = 29082 | --wallet-rpc-bind-port 29082 +GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a +CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 +CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 +MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 +DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE | --DEFAULT_FEE 1000000000 +SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet | SYNC_FROM_ZERO | --SYNC_FROM_ZERO + + +##Example of a config file + +You can use the same configuration file as the daemon + +
    $ cat ./notrealcoin.conf 
    +
    +CRYPTONOTE_NAME=notrealcoin
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +
    +wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
    +password=FAKE_PASSWORD
    +wallet-rpc-bind-port=17102
    +
    + + +##Wallet commands + +Command | Description | Arg 1 | Arg 2 | Arg 3 | Arg 4 | Arg 5 +-----------|-----------|-----------|-----------|-----------|-----------|-----------| +address | Show current wallet public address | - | - | - | - | - +balance | Show current wallet balance | - | - | - | - | - +bc_height | Show blockchain height | - | - | - | - | - +help | Print help on wallet commands | - | - | - | - | - +incoming_transfers | Show incoming transfers | - | - | - | - | - +list_transfers | Show all known transfers | - | - | - | - | - +payments | Show payments with the corresponding payment_id's. You may indicate more than one payment_id. | [string] payment_id | - | - | - | - +reset | Discard cache data and start synchronizing from scratch | - | - | - | - | - +save | Save wallet synchronized data | - | - | - | - | - +set_log | Change current log detailization level | [uint] log level (0 - 4) | - | - | - | - +start_mining | Start mining in daemon | - | - | - | - | - +stop_mining | Stop mining in daemon | - | - | - | - | - +transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count | [string] address | [double] amount | [string] -p payment_id | [double] -f fee + +;T; +I"- +

    Simplewallet configuration and commands

    + + + +

    General options

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +  --data-dir arg (=/Users/USER/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +  --command arg                         Specify command
    +
    + +

    Wallet options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionConfig ExampleConsole Example
    wallet-fileUse wallet <arg>wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet
    –wallet-file /home/USERNAME/
    forknote-linux/dashcoin.wallet
    generate-new-walletGenerate new wallet and save it to <arg> –generate-new-wallet /home/USERNAME/
    forknote-linux/dashcoin.wallet
    passwordWallet passwordpassword = PASSWORD–password PASSWORD
    daemon-addressUse daemon instance at <host>:<port>daemon-address = 127.0.0.1:29081–daemon-address 127.0.0.1:29081
    daemon-hostUse daemon instance at host <arg> instead of localhostdaemon-host = 127.0.0.1–daemon-host 127.0.0.1
    daemon-portUse daemon instance at port <arg> instead of 8081daemon-port = 29081–daemon-port 29081
    set_logLevel of logging. Default is 1.set_log = 4–set_log 4
    testnetUsed to deploy test nets. The daemon must be launched with –testnet flag –testnet
    wallet-rpc-bind-ipSpecify ip to bind rpc serverwallet-rpc-bind-ip = 127.0.0.1–wallet-rpc-bind-ip 127.0.0.1
    wallet-rpc-bind-portStarts wallet as rpc server for wallet operations, sets bind port for serverwallet-rpc-bind-port = 29082–wallet-rpc-bind-port 29082
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    DEFAULT_FEEDefault fee of the transactions sent through simplewalletDEFAULT_FEE–DEFAULT_FEE 1000000000
    SYNC_FROM_ZEROSync from block 0. Use for premine wallet or brainwalletSYNC_FROM_ZERO–SYNC_FROM_ZERO
    + +

    Example of a config file

    + +

    You can use the same configuration file as the daemon

    + +
    $ cat ./notrealcoin.conf 
    +
    +CRYPTONOTE_NAME=notrealcoin
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +
    +wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
    +password=FAKE_PASSWORD
    +wallet-rpc-bind-port=17102
    +
    + +

    Wallet commands

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    + +;T; @I"$/documentation/daemon/commands/;T{;{ ;I"lM + + + + + + + Daemon command line arguments and commands | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Daemon command line arguments and commands

    + + + +

    Command line options

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +  --os-version 
    +  --data-dir arg (=/Users/USER/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +
    + +

    Command line options and settings options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    + +

    Example of a config file

    +
    $ cat ./-.conf 
    +
    +CRYPTONOTE_NAME=dashcoin
    +seed-node=108.61.188.93:7610
    +seed-node=128.199.146.243:29080
    +seed-node=195.154.181.121:7280
    +seed-node=93.77.229.33:29080
    +seed-node=144.76.59.211:29080
    +seed-node=176.9.147.178:7280
    +seed-node=176.9.47.243:7280
    +seed-node=84.200.76.33:29080
    +seed-node=98.115.76.178:29080
    +seed-node=195.154.181.121:7280
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=29080
    +rpc-bind-port=29081
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    +BYTECOIN_NETWORK=12112111-1110-4101-1311-001212110110
    +CHECKPOINT=28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +CHECKPOINT=55000:5289fe9f2dce8f51441019b9fbc85c70ad85ff49a666ef0109f3269890c6af6d
    +CHECKPOINT=70000:193e335f34b8b8f1fab3857111cb668c2720340e80176a25155071e573481acb
    +CHECKPOINT=87500:cce8a035f34457ec1098ab41e5949cac3db00ebff3503e26f36bfa057543095a
    +CHECKPOINT=200000:bb5b339991347c3b06431b233d3dbf9201e9176ddf4349ee46c60473725d5c98
    +CHECKPOINT=250000:c5b6064258237e911300cdcb6f937b37a6c17932e2bfdcba0ff12a48694709e0
    +CHECKPOINT=298000:5b1f21234c911eb755abce6fa66358558b380526f606222d042eb8b7ce993ae8
    +P2P_STAT_TRUSTED_PUB_KEY=4d26c4df7f4ca7037950ad026f9ab36dd05d881952662992f2e4dcfcafbe57eb
    +UPGRADE_HEIGHT=91452
    +MAX_BLOCK_SIZE_INITIAL=25600
    +DEFAULT_FEE=1000000000
    +MAX_TRANSACTION_SIZE_LIMIT=19400
    +
    + +

    Daemon commands

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    + +
    + + +
    + + + + + + + +;T; I"# +# Daemon command line arguments and commands + +* TOC +{:toc} + +##Command line options + + --help Produce help message + --version Output version information + --os-version + --data-dir arg (=/Users/USER/.forknote) + Specify data directory + --config-file arg (=./configs/-.conf) Specify configuration file + + +##Command line options and settings options: + + +Option | Description |   Config Example   |   Console Example   +-----------|-----------|-----------|-----------| +log-file | A name of log file that you want to use for logging. | log-file = mylog.log | --log-file mylog.log +log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 +no-console | Disable daemon console commands | no-console | --no-console +testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet | --testnet +rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 | --rpc-bind-ip 127.0.0.1 +rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 | --rpc-bind-port 29081 +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 +allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port +P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 +extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt | --extra-messages-file message.txt +start-mining | Specify wallet address to mining for | start-mining = FPM...yR | --start-mining FPM...yR +mining-threads | Specify mining threads count | mining-threads = 1 | --mining-threads 1 +GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a +CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 +CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 +MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin | --CRYPTONOTE_NAME dashcoin +CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 | --CHECKPOINT 10:70d..f8 +print-genesis-tx | Prints genesis block transaction hex and exits | | --print-genesis-tx +PREMINED_PERCENT | Percent of premined coins from all coins coming into existence | PREMINED_PERCENT = 10 | --PREMINED_PERCENT 10 +genesis-block-reward-address | The premined coins will be sent to this address. Multiple addresses can be used | | --genesis-block-reward-address FPM...yR + + +##Example of a config file +
    $ cat ./-.conf 
    +
    +CRYPTONOTE_NAME=dashcoin
    +seed-node=108.61.188.93:7610
    +seed-node=128.199.146.243:29080
    +seed-node=195.154.181.121:7280
    +seed-node=93.77.229.33:29080
    +seed-node=144.76.59.211:29080
    +seed-node=176.9.147.178:7280
    +seed-node=176.9.47.243:7280
    +seed-node=84.200.76.33:29080
    +seed-node=98.115.76.178:29080
    +seed-node=195.154.181.121:7280
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=29080
    +rpc-bind-port=29081
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    +BYTECOIN_NETWORK=12112111-1110-4101-1311-001212110110
    +CHECKPOINT=28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +CHECKPOINT=55000:5289fe9f2dce8f51441019b9fbc85c70ad85ff49a666ef0109f3269890c6af6d
    +CHECKPOINT=70000:193e335f34b8b8f1fab3857111cb668c2720340e80176a25155071e573481acb
    +CHECKPOINT=87500:cce8a035f34457ec1098ab41e5949cac3db00ebff3503e26f36bfa057543095a
    +CHECKPOINT=200000:bb5b339991347c3b06431b233d3dbf9201e9176ddf4349ee46c60473725d5c98
    +CHECKPOINT=250000:c5b6064258237e911300cdcb6f937b37a6c17932e2bfdcba0ff12a48694709e0
    +CHECKPOINT=298000:5b1f21234c911eb755abce6fa66358558b380526f606222d042eb8b7ce993ae8
    +P2P_STAT_TRUSTED_PUB_KEY=4d26c4df7f4ca7037950ad026f9ab36dd05d881952662992f2e4dcfcafbe57eb
    +UPGRADE_HEIGHT=91452
    +MAX_BLOCK_SIZE_INITIAL=25600
    +DEFAULT_FEE=1000000000
    +MAX_TRANSACTION_SIZE_LIMIT=19400
    +
    + +##Daemon commands + +Command | Description | Arg 1 | Arg 2 +-----------|-----------|-----------|-----------| +help | print forknoted commands | - | - +start_mining | Start mining in several threads to a given wallet address | [string] wallet_address | [uint] threads +stop_mining | Stop mining | - | - +show_hr | Show current mining hashrate | - | - +hide_hr | Stop showing current mining hashrate | - | - +exit | Exit forknoted | - | - +print_bc | Print blockchain info in a given blocks range | [uint] begin_height | [uint] end_height (optional) +print_block | Print block | [string] block_hash or [uint] block_height | - +print_cn | Print connections | - | - +print_pl | Print peer list | - | - +print_pool | Print transaction pool (long format) | - | - +print_pool_sh | Print transaction pool (short format) | - | - +set_log | Change current log detailization level | [uint] log level (0 - 4) | - +print_tx | Print transaction | [string] transaction_hash | - +;T; +I"O6 +

    Daemon command line arguments and commands

    + + + +

    Command line options

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +  --os-version 
    +  --data-dir arg (=/Users/USER/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +
    + +

    Command line options and settings options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    + +

    Example of a config file

    +
    $ cat ./-.conf 
    +
    +CRYPTONOTE_NAME=dashcoin
    +seed-node=108.61.188.93:7610
    +seed-node=128.199.146.243:29080
    +seed-node=195.154.181.121:7280
    +seed-node=93.77.229.33:29080
    +seed-node=144.76.59.211:29080
    +seed-node=176.9.147.178:7280
    +seed-node=176.9.47.243:7280
    +seed-node=84.200.76.33:29080
    +seed-node=98.115.76.178:29080
    +seed-node=195.154.181.121:7280
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=29080
    +rpc-bind-port=29081
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    +BYTECOIN_NETWORK=12112111-1110-4101-1311-001212110110
    +CHECKPOINT=28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +CHECKPOINT=55000:5289fe9f2dce8f51441019b9fbc85c70ad85ff49a666ef0109f3269890c6af6d
    +CHECKPOINT=70000:193e335f34b8b8f1fab3857111cb668c2720340e80176a25155071e573481acb
    +CHECKPOINT=87500:cce8a035f34457ec1098ab41e5949cac3db00ebff3503e26f36bfa057543095a
    +CHECKPOINT=200000:bb5b339991347c3b06431b233d3dbf9201e9176ddf4349ee46c60473725d5c98
    +CHECKPOINT=250000:c5b6064258237e911300cdcb6f937b37a6c17932e2bfdcba0ff12a48694709e0
    +CHECKPOINT=298000:5b1f21234c911eb755abce6fa66358558b380526f606222d042eb8b7ce993ae8
    +P2P_STAT_TRUSTED_PUB_KEY=4d26c4df7f4ca7037950ad026f9ab36dd05d881952662992f2e4dcfcafbe57eb
    +UPGRADE_HEIGHT=91452
    +MAX_BLOCK_SIZE_INITIAL=25600
    +DEFAULT_FEE=1000000000
    +MAX_TRANSACTION_SIZE_LIMIT=19400
    +
    + +

    Daemon commands

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    +;T; @I"*/documentation/simplewallet/commands/;T{;{ ;I"/ + + + + + + + Simplewallet command line arguments and commands | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Simplewallet command line arguments and commands

    + +

    General options:

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +
    + +

    Wallet options:

    + +
      --wallet-file arg                     Use wallet <arg>
    +  --generate-new-wallet arg             Generate new wallet and save it to 
    +                                        <arg>
    +  --password arg                        Wallet password
    +  --daemon-address arg                  Use daemon instance at <host>:<port>
    +  --daemon-host arg                     Use daemon instance at host <arg> 
    +                                        instead of localhost
    +  --daemon-port arg (=0)                Use daemon instance at port <arg> 
    +                                        instead of 8081
    +  --command arg
    +  --set_log arg
    +  --testnet                             Used to deploy test nets. The daemon 
    +                                        must be launched with --testnet flag
    +  --wallet-rpc-bind-ip arg (=127.0.0.1) Specify ip to bind rpc server
    +  --wallet-rpc-bind-port arg            Starts wallet as rpc server for wallet 
    +                                        operations, sets bind port for server
    +  --MAX_TRANSACTION_SIZE_LIMIT arg (=24400)
    +                                        Max transaction limit size
    +  --data-dir arg (=/Users/pmitchev/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +  --GENESIS_COINBASE_TX_HEX arg (=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a)
    +                                        Genesis transaction hex
    +  --CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX arg (=6)
    +                                        uint64_t
    +  --MONEY_SUPPLY arg (=18446744073709551615)
    +                                        uint64_t
    +  --EMISSION_SPEED_FACTOR arg (=18)     unsigned int
    +  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE arg (=20000)
    +                                        uint64_t
    +  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 arg (=10000)
    +                                        uint64_t
    +  --CRYPTONOTE_DISPLAY_DECIMAL_POINT arg (=8)
    +                                        size_t
    +  --MINIMUM_FEE arg (=1000000)          uint64_t
    +  --DEFAULT_DUST_THRESHOLD arg (=1000000)
    +                                        uint64_t
    +  --DIFFICULTY_TARGET arg (=120)        uint64_t
    +  --CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW arg (=10)
    +                                        size_t
    +  --MAX_BLOCK_SIZE_INITIAL arg (=20480) uint64_t
    +  --EXPECTED_NUMBER_OF_BLOCKS_PER_DAY arg (=0)
    +                                        uint64_t
    +  --UPGRADE_HEIGHT arg (=0)             uint64_t
    +  --DIFFICULTY_CUT arg (=60)            uint64_t
    +  --DIFFICULTY_LAG arg (=15)            uint64_t
    +  --rpc-bind-port arg (=8081)
    +  --SYNC_FROM_ZERO                      Sync from block 0. Use for premine 
    +                                        wallet or brainwallet
    +  --DEFAULT_FEE arg (=1000000)          Default fee
    +
    + +

    Wallet commands:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    + + +
    + + +
    + + + + + + + +;T; I" +# Simplewallet command line arguments and commands + +**General options:** + + --help Produce help message + --version Output version information + + +**Wallet options:** + + --wallet-file arg Use wallet + --generate-new-wallet arg Generate new wallet and save it to + + --password arg Wallet password + --daemon-address arg Use daemon instance at : + --daemon-host arg Use daemon instance at host + instead of localhost + --daemon-port arg (=0) Use daemon instance at port + instead of 8081 + --command arg + --set_log arg + --testnet Used to deploy test nets. The daemon + must be launched with --testnet flag + --wallet-rpc-bind-ip arg (=127.0.0.1) Specify ip to bind rpc server + --wallet-rpc-bind-port arg Starts wallet as rpc server for wallet + operations, sets bind port for server + --MAX_TRANSACTION_SIZE_LIMIT arg (=24400) + Max transaction limit size + --data-dir arg (=/Users/pmitchev/.forknote) + Specify data directory + --config-file arg (=./configs/-.conf) Specify configuration file + --GENESIS_COINBASE_TX_HEX arg (=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a) + Genesis transaction hex + --CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX arg (=6) + uint64_t + --MONEY_SUPPLY arg (=18446744073709551615) + uint64_t + --EMISSION_SPEED_FACTOR arg (=18) unsigned int + --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE arg (=20000) + uint64_t + --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 arg (=10000) + uint64_t + --CRYPTONOTE_DISPLAY_DECIMAL_POINT arg (=8) + size_t + --MINIMUM_FEE arg (=1000000) uint64_t + --DEFAULT_DUST_THRESHOLD arg (=1000000) + uint64_t + --DIFFICULTY_TARGET arg (=120) uint64_t + --CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW arg (=10) + size_t + --MAX_BLOCK_SIZE_INITIAL arg (=20480) uint64_t + --EXPECTED_NUMBER_OF_BLOCKS_PER_DAY arg (=0) + uint64_t + --UPGRADE_HEIGHT arg (=0) uint64_t + --DIFFICULTY_CUT arg (=60) uint64_t + --DIFFICULTY_LAG arg (=15) uint64_t + --rpc-bind-port arg (=8081) + --SYNC_FROM_ZERO Sync from block 0. Use for premine + wallet or brainwallet + --DEFAULT_FEE arg (=1000000) Default fee + + +**Wallet commands:** + +Command | Description | Arg 1 | Arg 2 | Arg 3 | Arg 4 | Arg 5 +-----------|-----------|-----------|-----------|-----------|-----------|-----------| +address | Show current wallet public address | - | - | - | - | - +balance | Show current wallet balance | - | - | - | - | - +bc_height | Show blockchain height | - | - | - | - | - +help | Print help on wallet commands | - | - | - | - | - +incoming_transfers | Show incoming transfers | - | - | - | - | - +list_transfers | Show all known transfers | - | - | - | - | - +payments | Show payments with the corresponding payment_id's. You may indicate more than one payment_id. | [string] payment_id | - | - | - | - +reset | Discard cache data and start synchronizing from scratch | - | - | - | - | - +save | Save wallet synchronized data | - | - | - | - | - +set_log | Change current log detailization level | [uint] log level (0 - 4) | - | - | - | - +start_mining | Start mining in daemon | - | - | - | - | - +stop_mining | Stop mining in daemon | - | - | - | - | - +transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count | [string] address | [double] amount | [string] -p payment_id | [double] -f fee + +;T; +I" +

    Simplewallet command line arguments and commands

    + +

    General options:

    + +
      --help                                Produce help message
    +  --version                             Output version information
    +
    + +

    Wallet options:

    + +
      --wallet-file arg                     Use wallet <arg>
    +  --generate-new-wallet arg             Generate new wallet and save it to 
    +                                        <arg>
    +  --password arg                        Wallet password
    +  --daemon-address arg                  Use daemon instance at <host>:<port>
    +  --daemon-host arg                     Use daemon instance at host <arg> 
    +                                        instead of localhost
    +  --daemon-port arg (=0)                Use daemon instance at port <arg> 
    +                                        instead of 8081
    +  --command arg
    +  --set_log arg
    +  --testnet                             Used to deploy test nets. The daemon 
    +                                        must be launched with --testnet flag
    +  --wallet-rpc-bind-ip arg (=127.0.0.1) Specify ip to bind rpc server
    +  --wallet-rpc-bind-port arg            Starts wallet as rpc server for wallet 
    +                                        operations, sets bind port for server
    +  --MAX_TRANSACTION_SIZE_LIMIT arg (=24400)
    +                                        Max transaction limit size
    +  --data-dir arg (=/Users/pmitchev/.forknote)
    +                                        Specify data directory
    +  --config-file arg (=./configs/-.conf) Specify configuration file
    +  --GENESIS_COINBASE_TX_HEX arg (=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a)
    +                                        Genesis transaction hex
    +  --CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX arg (=6)
    +                                        uint64_t
    +  --MONEY_SUPPLY arg (=18446744073709551615)
    +                                        uint64_t
    +  --EMISSION_SPEED_FACTOR arg (=18)     unsigned int
    +  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE arg (=20000)
    +                                        uint64_t
    +  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 arg (=10000)
    +                                        uint64_t
    +  --CRYPTONOTE_DISPLAY_DECIMAL_POINT arg (=8)
    +                                        size_t
    +  --MINIMUM_FEE arg (=1000000)          uint64_t
    +  --DEFAULT_DUST_THRESHOLD arg (=1000000)
    +                                        uint64_t
    +  --DIFFICULTY_TARGET arg (=120)        uint64_t
    +  --CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW arg (=10)
    +                                        size_t
    +  --MAX_BLOCK_SIZE_INITIAL arg (=20480) uint64_t
    +  --EXPECTED_NUMBER_OF_BLOCKS_PER_DAY arg (=0)
    +                                        uint64_t
    +  --UPGRADE_HEIGHT arg (=0)             uint64_t
    +  --DIFFICULTY_CUT arg (=60)            uint64_t
    +  --DIFFICULTY_LAG arg (=15)            uint64_t
    +  --rpc-bind-port arg (=8081)
    +  --SYNC_FROM_ZERO                      Sync from block 0. Use for premine 
    +                                        wallet or brainwallet
    +  --DEFAULT_FEE arg (=1000000)          Default fee
    +
    + +

    Wallet commands:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    + +;T; @I"(/documentation/daemon/html_rpc_api/;T{;{ ;I" + + + + + + + Daemon HTTP RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Daemon HTTP RPC API

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    + +
    + + +
    + + + + + + + +;T; I" +# Daemon HTTP RPC API + +URL | Description | Format | Arg 1 | Arg 2 | Return value +-----------|-----------|-----------|-----------|-----------|-----------| +/getheight | Returns current chain height | JSON | - | - | [int] height +/getknownblockids | Returns list of known block ids | JSON | - | - | [list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids +/start_mine | Starts mining threads | JSON | [string] wallet address | [int] number of threads | [string] status +/stop_mine | Stops mining threads | JSON | - | - | [string] status +/gettransactions | Returns transactions as serialized blobs | JSON | [list] tx ids | - | [list] transactions as hex
    [list] missing tx ids
    [string] status +/sendrawtransactions | Send transaction to the network | JSON | [string] serialized transaction in hex form | - | [string] status +/getblocks.bin | Returns blocks in binary form | BIN | [list] block ids | - | [list] blocks
    [int] start height
    [int] current height
    [string] status +/get_o_indexes.bin |Get global output indicies | BIN | [hash] transaction id | - | [vector] output indicies
    [string] status +/getrandom_outs.bin | Get random output indicies
    for a given amount
    (purpose: for ring signatures) | BIN | [list] amounts | [int] count | [vector]
    { [int] amount; [list] outs }
    output entries +;T; +I"b +

    Daemon HTTP RPC API

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    +;T; @I"(/documentation/daemon/json_rpc_api/;T{;{ ;I"X + + + + + + + Daemon JSON RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Daemon JSON RPC API

    + + + +

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit rpc-bind-port in your configuration file

    + +
    rpc-bind-port=29081
    +
    + +

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit your configuration file

    + +
    rpc-bind-port=29081
    +rpc-bind-ip=0.0.0.0
    +
    + +

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29081/json_rpc
    + http://localhost:29081/json_rpc
    +
    + +

    getblockcount

    + +

    Returns current chain height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "count" : {
    +                    "type" : "integer",
    +                    "minimum": 0,
    +                    "description": ""
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +        "required": ["count", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockcount)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockcount"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "count": 123456,
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockhash

    + +

    Returns block hash by its height

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "string",
    +            "description": ""
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id": "test",
    +    "method": "on_getblockhash",
    +    "params": {
    +        "height": 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": "a7428..."
    + }
    +
    + +

    getblocktemplate

    + +

    Returns blocktemplate with an empty “hole” for nonce.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "reserve_size" : {
    +            "type" : "integer"
    +        },
    +        "wallet_address" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    + }
    +
    + +

    Return value schema

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "result" : {
    +            "difficulty" : {
    +                "type" : "integer"
    +            },
    +            "height" : {
    +                "type" :"integer"
    +            },
    +            "reserved_offset" : {
    +                "type" : "integer"
    +            },
    +            "blocktemplate_blob" : {
    +                "type" : "string"
    +            },
    +            "status" : {
    +                "type" : "string"
    +            }
    +        },
    +    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    +    }
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblocktemplate)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblocktemplate",
    +    "params": {
    +        "reserve_size": 200,
    +        "wallet_address": "28j5g2Hbe1..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "blocktemplate_blob": "0100de...",
    +        "difficulty": 65563,
    +        "height": 123456,
    +        "reserved_offset": 395,
    +        "status": ""
    +    }
    + }
    +
    + +

    submitblock

    + +

    Submits mined block.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "block" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "block"]
    + } 
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "status" : {
    +                "type" : "string",
    +                "description": ""
    +            },
    +            "required": ["status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (submitblock)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "submitblock",
    +    "params": ["0100b...."]
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "status" : "OK"
    +    }
    + }
    +
    + +

    getlastblockheader

    + +

    Returns last block header.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "block_header : {
    +                    "type" : "object",
    +                    "properties" : {
    +                        "major_version" :    {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "minor_version" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                            },
    +                        "timestamp" : {
    +                            "type" : "integer",
    +                            "description" : "UNIX timestamp"
    +                        },
    +                        "prev_hash" : {
    +                            "type" : "string",
    +                            "description" : "previous block's hash"
    +                        },
    +                        "nonce" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "orphan_status" : {
    +                            "type" : "boolean",
    +                            "description" : "True if the block was marked as orphaned"
    +                        },
    +                        "height" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "depth" : {
    +                            "type" : "integer",
    +                            "description" : "last_block_height - this_block_height"
    +                        },
    +                        "hash" : {
    +                            "type" : "string",
    +                            "description" : ""
    +                        },
    +                        "difficulty" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "reward" : {
    +                            "type" : "integer",
    +                            "description" : "Reward for the block in atomic units"
    +                        }
    +                    },
    +                    "required": [
    +                        "major_version", 
    +                        "minor_version", 
    +                        "timestamp", 
    +                        "prev_hash", 
    +                        "nonce",
    +                        "orphan_status",
    +                        "height",
    +                        "depth",
    +                        "hash",
    +                        "difficulty",
    +                        "reward"
    +                    ]
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "required": ["block_header", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getlastblockheader)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getlastblockheader"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyhash

    + +

    Returns last block header by given hash.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "hash" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "hash"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyhash",
    +    "params": {
    +        "hash" : "9a8be8..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyheight

    + +

    Returns block header by given block height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyheight)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyheight",
    +    "params": {
    +        "height" : 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +            },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getcurrencyId

    + +

    Returns unique currency identifier.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "currency_id_blob" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (getcurrencyId)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getcurrencyid"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "currency_id_blob" : "a7..."
    +    }
    + }
    +
    + +
    + + +
    + + + + + + + +;T; I"> +# Daemon JSON RPC API + +* TOC +{:toc} + +To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon's arguments). You can choose any free port. To do that execute the following command from the command line: + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    +
    + +Atlernatively, you can edit *rpc-bind-port* in your configuration file + + rpc-bind-port=29081 + + +If you want Daemon to be accessed from other computer not only yours you should also use a --rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line: + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    +
    + +Atlernatively, you can edit your configuration file + + rpc-bind-port=29081 + rpc-bind-ip=0.0.0.0 + +Having done that you're ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100): + + http://126.0.1.100:29081/json_rpc + http://localhost:29081/json_rpc + + +## getblockcount + +Returns current chain height. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "object", + "properties" : { + "count" : { + "type" : "integer", + "minimum": 0, + "description": "" + }, + "status" : { + "type" : "string" + } + }, + "required": ["count", "status"] + } + }, + "required": ["result"] + } + +### Example (getblockcount) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockcount" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "count": 123456, + "status": "OK" + } + } + + +##getblockhash + +Returns block hash by its height + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "height" : { + "type" : "integer" + } + }, + "required" : ["jsonrpc", "method", "height"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "string", + "description": "" + } + }, + "required": ["result"] + } + +###Example (getblockhash) + +Input: + + { + "jsonrpc": "2.0", + "id": "test", + "method": "on_getblockhash", + "params": { + "height": 123456 + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": "a7428..." + } + + +##getblocktemplate + +Returns blocktemplate with an empty “hole” for nonce. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "reserve_size" : { + "type" : "integer" + }, + "wallet_address" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] + } + +Return value schema + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "difficulty" : { + "type" : "integer" + }, + "height" : { + "type" :"integer" + }, + "reserved_offset" : { + "type" : "integer" + }, + "blocktemplate_blob" : { + "type" : "string" + }, + "status" : { + "type" : "string" + } + }, + "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"] + } + "required": ["result"] + } + +###Example (getblocktemplate) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblocktemplate", + "params": { + "reserve_size": 200, + "wallet_address": "28j5g2Hbe1..." + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "blocktemplate_blob": "0100de...", + "difficulty": 65563, + "height": 123456, + "reserved_offset": 395, + "status": "" + } + } + + +##submitblock + +Submits mined block. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "block" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "block"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "status" : { + "type" : "string", + "description": "" + }, + "required": ["status"] + } + }, + "required": ["result"] + } + +### Example (submitblock) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "submitblock", + "params": ["0100b...."] + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "status" : "OK" + } + } + + +##getlastblockheader + +Returns last block header. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "object", + "properties" : { + "block_header : { + "type" : "object", + "properties" : { + "major_version" : { + "type" : "integer", + "description" : "" + }, + "minor_version" : { + "type" : "integer", + "description" : "" + }, + "timestamp" : { + "type" : "integer", + "description" : "UNIX timestamp" + }, + "prev_hash" : { + "type" : "string", + "description" : "previous block's hash" + }, + "nonce" : { + "type" : "integer", + "description" : "" + }, + "orphan_status" : { + "type" : "boolean", + "description" : "True if the block was marked as orphaned" + }, + "height" : { + "type" : "integer", + "description" : "" + }, + "depth" : { + "type" : "integer", + "description" : "last_block_height - this_block_height" + }, + "hash" : { + "type" : "string", + "description" : "" + }, + "difficulty" : { + "type" : "integer", + "description" : "" + }, + "reward" : { + "type" : "integer", + "description" : "Reward for the block in atomic units" + } + }, + "required": [ + "major_version", + "minor_version", + "timestamp", + "prev_hash", + "nonce", + "orphan_status", + "height", + "depth", + "hash", + "difficulty", + "reward" + ] + }, + "status" : { + "type" : "string" + } + }, + "required": ["block_header", "status"] + } + }, + "required": ["result"] + } + +### Example (getlastblockheader) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getlastblockheader" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getblockheaderbyhash + +Returns last block header by given hash. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "hash" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "hash"] + } + +Return value schema: + +*See [getlastblockheader](#getlastblockheader) above* + +### Example (getblockheaderbyhash) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockheaderbyhash", + "params": { + "hash" : "9a8be8..." + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getblockheaderbyheight + +Returns block header by given block height. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "height" : { + "type" : "integer" + } + }, + "required" : ["jsonrpc", "method", "height"] + } + +Return value schema: + +*See [getlastblockheader](#getlastblockheader) above* + +### Example (getblockheaderbyheight) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockheaderbyheight", + "params": { + "height" : 123456 + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getcurrencyId + +Returns unique currency identifier. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "currency_id_blob" : { + "type" : "string" + } + } + } + +### Example (getcurrencyId) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getcurrencyid" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "currency_id_blob" : "a7..." + } + } +;T; +I"A +

    Daemon JSON RPC API

    + + + +

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit rpc-bind-port in your configuration file

    + +
    rpc-bind-port=29081
    +
    + +

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit your configuration file

    + +
    rpc-bind-port=29081
    +rpc-bind-ip=0.0.0.0
    +
    + +

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29081/json_rpc
    + http://localhost:29081/json_rpc
    +
    + +

    getblockcount

    + +

    Returns current chain height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "count" : {
    +                    "type" : "integer",
    +                    "minimum": 0,
    +                    "description": ""
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +        "required": ["count", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockcount)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockcount"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "count": 123456,
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockhash

    + +

    Returns block hash by its height

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "string",
    +            "description": ""
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id": "test",
    +    "method": "on_getblockhash",
    +    "params": {
    +        "height": 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": "a7428..."
    + }
    +
    + +

    getblocktemplate

    + +

    Returns blocktemplate with an empty “hole” for nonce.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "reserve_size" : {
    +            "type" : "integer"
    +        },
    +        "wallet_address" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    + }
    +
    + +

    Return value schema

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "result" : {
    +            "difficulty" : {
    +                "type" : "integer"
    +            },
    +            "height" : {
    +                "type" :"integer"
    +            },
    +            "reserved_offset" : {
    +                "type" : "integer"
    +            },
    +            "blocktemplate_blob" : {
    +                "type" : "string"
    +            },
    +            "status" : {
    +                "type" : "string"
    +            }
    +        },
    +    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    +    }
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblocktemplate)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblocktemplate",
    +    "params": {
    +        "reserve_size": 200,
    +        "wallet_address": "28j5g2Hbe1..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "blocktemplate_blob": "0100de...",
    +        "difficulty": 65563,
    +        "height": 123456,
    +        "reserved_offset": 395,
    +        "status": ""
    +    }
    + }
    +
    + +

    submitblock

    + +

    Submits mined block.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "block" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "block"]
    + } 
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "status" : {
    +                "type" : "string",
    +                "description": ""
    +            },
    +            "required": ["status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (submitblock)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "submitblock",
    +    "params": ["0100b...."]
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "status" : "OK"
    +    }
    + }
    +
    + +

    getlastblockheader

    + +

    Returns last block header.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "block_header : {
    +                    "type" : "object",
    +                    "properties" : {
    +                        "major_version" :    {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "minor_version" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                            },
    +                        "timestamp" : {
    +                            "type" : "integer",
    +                            "description" : "UNIX timestamp"
    +                        },
    +                        "prev_hash" : {
    +                            "type" : "string",
    +                            "description" : "previous block's hash"
    +                        },
    +                        "nonce" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "orphan_status" : {
    +                            "type" : "boolean",
    +                            "description" : "True if the block was marked as orphaned"
    +                        },
    +                        "height" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "depth" : {
    +                            "type" : "integer",
    +                            "description" : "last_block_height - this_block_height"
    +                        },
    +                        "hash" : {
    +                            "type" : "string",
    +                            "description" : ""
    +                        },
    +                        "difficulty" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "reward" : {
    +                            "type" : "integer",
    +                            "description" : "Reward for the block in atomic units"
    +                        }
    +                    },
    +                    "required": [
    +                        "major_version", 
    +                        "minor_version", 
    +                        "timestamp", 
    +                        "prev_hash", 
    +                        "nonce",
    +                        "orphan_status",
    +                        "height",
    +                        "depth",
    +                        "hash",
    +                        "difficulty",
    +                        "reward"
    +                    ]
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "required": ["block_header", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getlastblockheader)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getlastblockheader"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyhash

    + +

    Returns last block header by given hash.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "hash" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "hash"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyhash",
    +    "params": {
    +        "hash" : "9a8be8..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyheight

    + +

    Returns block header by given block height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyheight)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyheight",
    +    "params": {
    +        "height" : 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +            },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getcurrencyId

    + +

    Returns unique currency identifier.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "currency_id_blob" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (getcurrencyId)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getcurrencyid"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "currency_id_blob" : "a7..."
    +    }
    + }
    +
    +;T; @I"./documentation/simplewallet/json_rpc_api/;T{;{ ;I"E + + + + + + + Simplewallet JSON RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Simplewallet JSON RPC API

    + + + +

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    +
    + +

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29082/json_rpc
    + http://localhost:29082/json_rpc
    +
    + +

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    + +

    getbalance

    + +

    Return balance.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "locked_amount" : {
    +            "type" : "integer"
    +        },
    +        "available_balance" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (getbalance)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "getbalance", 
    +    "params": {}
    + }
    +
    + +

    transfer

    + +

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    + +

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "destinations" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "address" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "minItems" : 1
    +        },
    + 
    +        "payment_id": {
    +            "type" : "string"
    +        }
    +    
    +        "fee" : {
    +            "type" : "integer"
    +        },
    +        
    +        "mixin" : {
    +            "type" : "integer"
    +        },
    +        
    +        "unlock_time" : { 
    +            "type" : "integer"
    +            "description" : "Unix timestamp"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "tx_hash" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (transfer)

    + +

    Please note, payment_id is an optional argument and can be left out.

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"transfer",
    +    "params":{
    +        "destinations":[
    +        {
    +            "amount":11111,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        },
    +        {
    +            "amount":22222,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        }
    +        ],
    +        "payment_id":"", 
    +        "fee":1000000,
    +        "mixin":0,
    +        "unlock_time":0
    +    }
    + }
    +
    + +

    store

    + +

    Store wallet data.

    + +

    URL:

    + +
      /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (store)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "store", 
    +    "params": {}
    + }
    +
    + +

    get_payments

    + +

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    + 
    +        "payment_id" :  {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "payments" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "block_height" : {
    +                    "type" : "integer"
    +                },
    +                "tx_hash" : {
    +                    "type" : "string"
    +                },
    +                "unlock_time" : {
    +                    "type" : "integer"
    +                }
    +            }
    +        }
    +    }
    + }
    +
    + +

    Example (get_payments)

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"get_payments",
    +    "params":{
    +        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    +    }
    + }
    +
    + +

    get_transfers

    + +

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input: + { + “$schema”: “http://json-schema.org/draft-04/schema#”, + “title”: “Bytecoin wallet api”, + “description”: “Schema for transfer method in Bytecoin wallet”, + “type”: “object”,

    + +
        "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "transfers"
    +            "transfers" : {
    +                "type" : "array",
    +                "items" : {
    +                    "address" : {
    +                        "type" : "string"
    +                    },
    +                    "amount" : {
    +                        "type" : "integer"
    +                    },
    +                    "blockIndex" : {
    +                        "type" : "integer"
    +                    },
    +                    "fee" : {
    +                        "type" : "integer"
    +                    },
    +                    "output" : {
    +                        "type" : "boolean"
    +                    },
    +                    "paymentId" : {
    +                        "type" : "string"
    +                    },
    +                    "time" : {
    +                        "type" : "integer"
    +                    },
    +                    "transactionHash" : {
    +                        "type" : "string"
    +                    },
    +                    "unlockTime" : {
    +                        "type" : "integer"
    +                    },
    +                }               
    +            }               
    +        }
    +    }
    + }
    +
    + +

    Example (get_transfers)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_transfers", 
    +    "params": {}
    + }
    +
    + +

    get_height

    + +

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (get_height)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_height", 
    +    "params": {}
    + }
    +
    + +

    reset

    + +

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (reset)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "reset", 
    +    "params": {}
    + }
    +
    + +
    + + +
    + + + + + + + +;T; I"p, +# Simplewallet JSON RPC API + +* TOC +{:toc} + +To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet's arguments). You can choose any free port. To do that execute the following command from the command line: + + simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082 + +Having done that you're ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100): + + http://126.0.1.100:29082/json_rpc + http://localhost:29082/json_rpc + +Please note, there is no "refresh" RPC method. RPC wallet refresh is performed automatically each 20 seconds. + + +##getbalance + +Return balance. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "locked_amount" : { + "type" : "integer" + }, + "available_balance" : { + "type" : "integer" + } + } + } + +###Example (getbalance) + + { + "jsonrpc": "2.0", + "method": "getbalance", + "params": {} + } + + +##transfer + +Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time. + +Please note: fee param is a mandatory and should not be less than 0.01 BCN + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "destinations" : { + "type" : "array", + "items" : { + "amount" : { + "type" : "integer" + }, + "address" : { + "type" : "string" + } + }, + "minItems" : 1 + }, + + "payment_id": { + "type" : "string" + } + + "fee" : { + "type" : "integer" + }, + + "mixin" : { + "type" : "integer" + }, + + "unlock_time" : { + "type" : "integer" + "description" : "Unix timestamp" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "tx_hash" : { + "type" : "string" + } + } + } + +###Example (transfer) + +Please note, payment_id is an optional argument and can be left out. + + { + "jsonrpc":"2.0", + "method":"transfer", + "params":{ + "destinations":[ + { + "amount":11111, + "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" + }, + { + "amount":22222, + "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" + } + ], + "payment_id":"", + "fee":1000000, + "mixin":0, + "unlock_time":0 + } + } + + +##store + +Store wallet data. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : {} + } + +###Example (store) + + { + "jsonrpc": "2.0", + "method": "store", + "params": {} + } + + +##get_payments + +Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + + "payment_id" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "payments" : { + "type" : "array", + "items" : { + "amount" : { + "type" : "integer" + }, + "block_height" : { + "type" : "integer" + }, + "tx_hash" : { + "type" : "string" + }, + "unlock_time" : { + "type" : "integer" + } + } + } + } + } + +###Example (get_payments) + + { + "jsonrpc":"2.0", + "method":"get_payments", + "params":{ + "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9" + } + } + + +##get_transfers + +Returns the list of all the wallet's incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change). + +URL: + + /json_rpc + +Input: + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "result" : { + "type" : "transfers" + "transfers" : { + "type" : "array", + "items" : { + "address" : { + "type" : "string" + }, + "amount" : { + "type" : "integer" + }, + "blockIndex" : { + "type" : "integer" + }, + "fee" : { + "type" : "integer" + }, + "output" : { + "type" : "boolean" + }, + "paymentId" : { + "type" : "string" + }, + "time" : { + "type" : "integer" + }, + "transactionHash" : { + "type" : "string" + }, + "unlockTime" : { + "type" : "integer" + }, + } + } + } + } + } + +###Example (get_transfers) + + { + "jsonrpc": "2.0", + "method": "get_transfers", + "params": {} + } + + +##get_height + +Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "height" : { + "type" : "integer" + } + } + } + +###Example (get_height) + + { + "jsonrpc": "2.0", + "method": "get_height", + "params": {} + } + + +##reset + +Erases simplewallet's internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : {} + } + +###Example (reset) + + { + "jsonrpc": "2.0", + "method": "reset", + "params": {} + } +;T; +I". +

    Simplewallet JSON RPC API

    + + + +

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    +
    + +

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29082/json_rpc
    + http://localhost:29082/json_rpc
    +
    + +

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    + +

    getbalance

    + +

    Return balance.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "locked_amount" : {
    +            "type" : "integer"
    +        },
    +        "available_balance" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (getbalance)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "getbalance", 
    +    "params": {}
    + }
    +
    + +

    transfer

    + +

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    + +

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "destinations" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "address" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "minItems" : 1
    +        },
    + 
    +        "payment_id": {
    +            "type" : "string"
    +        }
    +    
    +        "fee" : {
    +            "type" : "integer"
    +        },
    +        
    +        "mixin" : {
    +            "type" : "integer"
    +        },
    +        
    +        "unlock_time" : { 
    +            "type" : "integer"
    +            "description" : "Unix timestamp"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "tx_hash" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (transfer)

    + +

    Please note, payment_id is an optional argument and can be left out.

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"transfer",
    +    "params":{
    +        "destinations":[
    +        {
    +            "amount":11111,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        },
    +        {
    +            "amount":22222,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        }
    +        ],
    +        "payment_id":"", 
    +        "fee":1000000,
    +        "mixin":0,
    +        "unlock_time":0
    +    }
    + }
    +
    + +

    store

    + +

    Store wallet data.

    + +

    URL:

    + +
      /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (store)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "store", 
    +    "params": {}
    + }
    +
    + +

    get_payments

    + +

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    + 
    +        "payment_id" :  {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "payments" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "block_height" : {
    +                    "type" : "integer"
    +                },
    +                "tx_hash" : {
    +                    "type" : "string"
    +                },
    +                "unlock_time" : {
    +                    "type" : "integer"
    +                }
    +            }
    +        }
    +    }
    + }
    +
    + +

    Example (get_payments)

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"get_payments",
    +    "params":{
    +        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    +    }
    + }
    +
    + +

    get_transfers

    + +

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input: + { + “$schema”: “http://json-schema.org/draft-04/schema#”, + “title”: “Bytecoin wallet api”, + “description”: “Schema for transfer method in Bytecoin wallet”, + “type”: “object”,

    + +
        "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "transfers"
    +            "transfers" : {
    +                "type" : "array",
    +                "items" : {
    +                    "address" : {
    +                        "type" : "string"
    +                    },
    +                    "amount" : {
    +                        "type" : "integer"
    +                    },
    +                    "blockIndex" : {
    +                        "type" : "integer"
    +                    },
    +                    "fee" : {
    +                        "type" : "integer"
    +                    },
    +                    "output" : {
    +                        "type" : "boolean"
    +                    },
    +                    "paymentId" : {
    +                        "type" : "string"
    +                    },
    +                    "time" : {
    +                        "type" : "integer"
    +                    },
    +                    "transactionHash" : {
    +                        "type" : "string"
    +                    },
    +                    "unlockTime" : {
    +                        "type" : "integer"
    +                    },
    +                }               
    +            }               
    +        }
    +    }
    + }
    +
    + +

    Example (get_transfers)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_transfers", 
    +    "params": {}
    + }
    +
    + +

    get_height

    + +

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (get_height)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_height", 
    +    "params": {}
    + }
    +
    + +

    reset

    + +

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (reset)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "reset", 
    +    "params": {}
    + }
    +
    +;T; @I",/documentation/simplewallet/index copy/;T{;{ ;I"' + + + + + + + Documentation | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + + +
    + + +
    + + + + + + + +;T; I" +# Development Guides + +This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes. + + +;T; +I"' +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + +;T; @I"1/documentation/payment_gateway/json_rpc_api/;T{;{ ;I"P + + + + + + + Payment gateway JSON RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Payment gateway JSON RPC API

    + + + +

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    + +

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    + +

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    + +
    http://<service address>:<service port>/json_rpc
    +
    + +

    Where:

    + +
      +
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • +
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • +
    + +

    send_transaction

    + +

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    +
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    + +

    Input Example:

    + +
     {
    +    "params": {
    +        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    +        "fee": 1000000000, 
    +        "unlock_time": 0, 
    +        "mixin": 0, 
    +        "destinations": [ 
    +            {
    +            "amount": 10000000000, 
    +            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +            },
    +            {
    +            "amount": 500000, 
    +            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +            }
    +        ]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "send_transaction"
    + }
    +
    + +

    Return value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transaction_id":470
    +    }
    + }
    +
    + +

    get_address

    + +

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "get_address",
    +    "params": {
    +        "index": 42
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    create_address

    + +

    create_address() method creates an additional address in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input value example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "create_address",
    +    "params": {
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    get_address_count

    + +

    get_address_count() method returns a number of addresses in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_address_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "count":2
    +    }
    + }
    +
    + +

    delete_address

    + +

    delete_address() method deletes a specified address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + +

    In case of success returns an empty JSON object.

    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "delete_address"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {}
    + }
    +
    + +

    get_actual_balance

    + +

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +    { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_actual_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "actual_balance":32340960388304977
    +    }
    + }
    +
    + +

    get_pending_balance

    + +

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        },  
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_pending_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "pending_balance": 10000
    +    }
    + }
    +
    + +

    get_transactions_count

    + +

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    + +

    Input example:

    + +
     {
    +    "params": {},
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transactions_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "transactions_count":471
    +    }
    + }
    +
    + +

    get_transfers_count

    + +

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfers_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transfers_count":2
    +    }
    + }
    +
    + +

    get_transaction_id_by_transfer_id

    + +

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transaction_id_by_transfer_id"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result":{
    +        "transaction_id":469
    +    }
    + }
    +
    + +

    get_transaction

    + +

    get_transaction() method returns information about a particular transaction.

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transaction_id": 1
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": 
    +    "get_transaction"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transaction_info": { 
    +            "block_height":2,
    +            "extra":"2jh1iak...123yh1g4g",
    +            "fee":0,
    +            "first_transfer_id":103,
    +            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    +            "timestamp":1409833412,
    +            "total_amount":7036820,
    +            "transfer_count":0,
    +            "transfers": 
    +            [
    +                {
    +                    "amount": 10000000000, 
    +                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                },
    +                {
    +                    "amount": 500000, 
    +                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +                }   
    +            ]
    +        }
    +    }
    + }
    +
    + +

    get_transfer

    + +

    get_transfer() method returns a transfer that corresponds to the requested identifier

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfer"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transfer_info": {
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    +            "amount":100000
    +        }
    +    }
    + }
    +
    + +

    get_incoming_payments

    + +

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    +
    arraySee below
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_incoming_payments"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "payments": [
    +            {
    +                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    +                "payments": 
    +                [ 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    +                        "unlock_time":0
    +                    },
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    +                        "unlock_time":0
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + +

    list_transactions

    + +

    list_transactions() method returns an array of transactions starting from a particular id.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below.
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "starting_transaction_id": 100,
    +        "max_transaction_count": 50
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "list_transactions"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transactions": [
    +            { 
    +                "block_height":2,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            },
    +            { 
    +                "block_height":3,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + + +
    + + +
    + + + + + + + +;T; I"RS +# Payment gateway JSON RPC API + +* TOC +{:toc} + +On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method. + +More on how to start and operate Forknote RPC Wallet can be found here: [Forknote RPC Wallet][Forknote_RPC_Wallet] + +To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this: + + http://:/json_rpc + +Where: + +* <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost +* <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this [here][Configure_Forknote_RPC_Wallet]. + + +##send_transaction + +**send_transaction()** method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +payment_id | No | 64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service. | string | 96A3..A5BB +fee | Yes | Transaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000 | uint64 | 1000000 +unlock_time | No | Height of the block until which transaction is going to be locked for spending. | uint64 | 0 +mixin | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 +destinations | Yes | Array that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    | array | "amount": 10000000000,
    "address": "288Ck..Zv" | + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transaction_id | Identifier of the sent transaction. Identifier indicates a number of the transaction in your wallet. | uint64 | 25 + + +Input Example: + + { + "params": { + "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional + "fee": 1000000000, + "unlock_time": 0, + "mixin": 0, + "destinations": [ + { + "amount": 10000000000, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + }, + { + "amount": 500000, + "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + ] + }, + "jsonrpc": "2.0", + "id": "1", + "method": "send_transaction" + } + + +Return value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transaction_id":470 + } + } + + +##get_address + +**get_address()** method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out "15" in the methods body. The first address created on wallet generation has id 0. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +index | No | ID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address. | uint64 | 20 + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +address | Corresponding address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw + + + +Input example: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "get_address", + "params": { + "index": 42 + } + } + +Output value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + } + + +##create_address + +**create_address()** method creates an additional address in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +address | Created address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw + + +Input value example: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "create_address", + "params": { + } + } + +Output value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + } + + +##get_address_count + +**get_address_count()** method returns a number of addresses in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +count | A number of addresses in your wallet | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_address_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "count":2 + } + } + + +##delete_address + +**delete_address()** method deletes a specified address. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | An address to be deleted. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +In case of success returns an empty JSON object. + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "delete_address" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": {} + } + + + +##get_actual_balance + +**get_actual_balance()** method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address. + +* Actual Balance — your wallet's balance that is available for spending immediately +* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | Specify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +actual_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_actual_balance" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "actual_balance":32340960388304977 + } + } + + +##get_pending_balance + +**get_pending_balance()** method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address. + +* Actual Balance — your wallet's balance that is available for spending immediately +* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | Specify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +pending_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_pending_balance" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "pending_balance": 10000 + } + } + + +##get_transactions_count + +**get_transactions_count()** method returns a cumulative number of transactions in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transactions_count | A number of transactions | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transactions_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transactions_count":471 + } + } + + +##get_transfers_count + +**get_transfers_count()** method returns a cumulative number of transfers in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transfers_count | A number of transfers | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transfers_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transfers_count":2 + } + } + + +##get_transaction_id_by_transfer_id + +**get_transaction_id_by_transfer_id()** method returns and id of a transaction containing this particular transfer. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transfer_id | Yes | Transfer identifier | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transaction_id | Corresponding transaction id | uint64 | 21 + + +Input example: + + { + "params": { + "transfer_id": 0 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transaction_id_by_transfer_id" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result":{ + "transaction_id":469 + } + } + + +##get_transaction + +**get_transaction()** method returns information about a particular transaction. + +Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transaction_id | Yes | Requested transaction id | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +found | Is found or not | bool | True / False +transaction_info | Contains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction's hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below + + +Input example: + + { + "params": { + "transaction_id": 1 + }, + "jsonrpc": "2.0", + "id": "1", + "method": + "get_transaction" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "found":true, + "transaction_info": { + "block_height":2, + "extra":"2jh1iak...123yh1g4g", + "fee":0, + "first_transfer_id":103, + "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0, + "transfers": + [ + { + "amount": 10000000000, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + }, + { + "amount": 500000, + "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + ] + } + } + } + + +##get_transfer + +**get_transfer()** method returns a transfer that corresponds to the requested identifier + +Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transfer_id | Yes | Requested transfer | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +found | Is found or not | bool | true / false +transfer_info | Returns transfer_info object containing:
    * amount - uint64
    * address - string | object | See below + + +Input example: + + { + "params": { + "transfer_id": 0 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transfer" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "found":true, + "transfer_info": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw", + "amount":100000 + } + } + } + + +##get_incoming_payments + +**get_incoming_payments()** method returns payments with a requested payment_id. This method will be depreciated soon. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +payments | Yes | Contains strings of payment_id's | array | 96A3937D88E210..B1FE9C0487A5BB + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +payments | Contains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    | array | See below + + +Input example: + + { + "params": { + "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"] + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_incoming_payments" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "payments": [ + { + "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", + "payments": + [ + { + "amount":10000000000, + "block_height":728, + "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "unlock_time":0 + } + ] + } + ] + } + } + + +##list_transactions + +**list_transactions()** method returns an array of transactions starting from a particular id. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +starting_transaction_id | Yes | Identifier of a starting transaction | uint32 | 20 +max_transaction_count | Yes | Maximum number of returned consecutive transactions | uint32 | 20 + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transactions | An array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction's hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below. + + +Input example: + + { + "params": { + "starting_transaction_id": 100, + "max_transaction_count": 50 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "list_transactions" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transactions": [ + { + "block_height":2, + "extra":"01e3...70f3acfc4", + "fee":0, + "first_transfer_id":-1, + "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0 + "transfers": [ + { + "amount": 102002, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + } + ] + }, + { + "block_height":3, + "extra":"01e3...70f3acfc4", + "fee":0, + "first_transfer_id":-1, + "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0 + "transfers": [ + { + "amount": 102002, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + } + ] + } + ] + } + } + + +[Forknote_RPC_Wallet]: /documentation/payment_gateway/ +[Configure_Forknote_RPC_Wallet]: /documentation/payment_gateway/#configure-forknote-rpc-wallet +;T; +I"k +

    Payment gateway JSON RPC API

    + + + +

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    + +

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    + +

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    + +
    http://<service address>:<service port>/json_rpc
    +
    + +

    Where:

    + +
      +
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • +
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • +
    + +

    send_transaction

    + +

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    +
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    + +

    Input Example:

    + +
     {
    +    "params": {
    +        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    +        "fee": 1000000000, 
    +        "unlock_time": 0, 
    +        "mixin": 0, 
    +        "destinations": [ 
    +            {
    +            "amount": 10000000000, 
    +            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +            },
    +            {
    +            "amount": 500000, 
    +            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +            }
    +        ]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "send_transaction"
    + }
    +
    + +

    Return value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transaction_id":470
    +    }
    + }
    +
    + +

    get_address

    + +

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "get_address",
    +    "params": {
    +        "index": 42
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    create_address

    + +

    create_address() method creates an additional address in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input value example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "create_address",
    +    "params": {
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    get_address_count

    + +

    get_address_count() method returns a number of addresses in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_address_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "count":2
    +    }
    + }
    +
    + +

    delete_address

    + +

    delete_address() method deletes a specified address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + +

    In case of success returns an empty JSON object.

    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "delete_address"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {}
    + }
    +
    + +

    get_actual_balance

    + +

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +    { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_actual_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "actual_balance":32340960388304977
    +    }
    + }
    +
    + +

    get_pending_balance

    + +

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        },  
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_pending_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "pending_balance": 10000
    +    }
    + }
    +
    + +

    get_transactions_count

    + +

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    + +

    Input example:

    + +
     {
    +    "params": {},
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transactions_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "transactions_count":471
    +    }
    + }
    +
    + +

    get_transfers_count

    + +

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfers_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transfers_count":2
    +    }
    + }
    +
    + +

    get_transaction_id_by_transfer_id

    + +

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transaction_id_by_transfer_id"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result":{
    +        "transaction_id":469
    +    }
    + }
    +
    + +

    get_transaction

    + +

    get_transaction() method returns information about a particular transaction.

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transaction_id": 1
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": 
    +    "get_transaction"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transaction_info": { 
    +            "block_height":2,
    +            "extra":"2jh1iak...123yh1g4g",
    +            "fee":0,
    +            "first_transfer_id":103,
    +            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    +            "timestamp":1409833412,
    +            "total_amount":7036820,
    +            "transfer_count":0,
    +            "transfers": 
    +            [
    +                {
    +                    "amount": 10000000000, 
    +                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                },
    +                {
    +                    "amount": 500000, 
    +                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +                }   
    +            ]
    +        }
    +    }
    + }
    +
    + +

    get_transfer

    + +

    get_transfer() method returns a transfer that corresponds to the requested identifier

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfer"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transfer_info": {
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    +            "amount":100000
    +        }
    +    }
    + }
    +
    + +

    get_incoming_payments

    + +

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    +
    arraySee below
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_incoming_payments"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "payments": [
    +            {
    +                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    +                "payments": 
    +                [ 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    +                        "unlock_time":0
    +                    },
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    +                        "unlock_time":0
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + +

    list_transactions

    + +

    list_transactions() method returns an array of transactions starting from a particular id.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below.
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "starting_transaction_id": 100,
    +        "max_transaction_count": 50
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "list_transactions"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transactions": [
    +            { 
    +                "block_height":2,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            },
    +            { 
    +                "block_height":3,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + +;T; @I"2/documentation/cryptonote_generator/forknote/;T{;{ ;I" + + + + + + + Documentation | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + + +
    + + +
    + + + + + + + +;T; I" +# Development Guides + +This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes. + + +;T; +I"' +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + +;T; @I"5/documentation/cryptonote_generator/simple-coin/;T{;{ ;I" + + + + + + + Documentation | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + + +
    + + +
    + + + + + + + +;T; I" +# Development Guides + +This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes. + + +;T; +I"' +

    Development Guides

    + +

    This section of the documentation is intended to get you up-and-running with +real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from +configuration, to creating premined coins, to running seed nodes.

    + +;T; @I"#/static/css/bootstrap.min.css/;T{;{I"!/static/js/bootstrap.min.js/;T{;{I" /creat2/;T{;{ ;I"j + + + + + + + Create Cryptonote coin | Forknote + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + + +;T; I"S + + +
    +
    +
    + + + + + + + + + + + + + + +;T; +I"c + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +;T; @I"#/static/partials/create2.html/;T{;{I"'/static/css/bootstrap.min.css.old/;T{;{I"%/static/js/bootstrap.min.js.old/;T{;{I")/static/css/bootstrap-theme.min.css/;T{;{I"/guides/create-coin/;T{;{ ;I"% + + + + + + + Create Cryptonote coin guide | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Create coin

    + + + +

    Let’s walk through the process of creating a configuration file for your coin.

    + +

    Creating config file

    + +

    Create the configuration file of your coin by using our configuration form.

    + +

    Create cryptonote coin form

    + +

    Save the resulted configuration in the configs folder of Forknote.

    + +

    Example on Linux/Mac:

    + +
    $ cat >testcoin.conf 
    +
    +EMISSION_SPEED_FACTOR=18
    +DIFFICULTY_TARGET=120
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +MONEY_SUPPLY=18446744073709551615
    +PREMINED_PERCENT=0
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +p2p-bind-port=13539
    +rpc-bind-port=13540
    +BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    +CRYPTONOTE_NAME=testcoin
    +UPGRADE_HEIGHT=1
    +
    + +

    If you want to learn more you can checkout the supported parameters of the configuration file.

    + +

    Creating simplewallet addresses

    + +

    This step is only required if your coin has premine

    + +
    $ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
    +
    +config path exist
    +forknote wallet v1.0.8.1.614()
    +Sync from timestamp: 1444336575
    +Error: wallet failed to connect to daemon (http://localhost:13540).
    +Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
    +view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
    +
    +
    + +

    Caution: Don’t forget to backup the wallets

    + +

    Genesis coinbase transaction creation

    + +

    For coins without premine

    + +
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
    +
    +config path exist
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    +
    +
    + +

    For coins with premine

    + +
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
    + --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    + --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    +
    +config path exist
    +outs: 922337203685477580
    +outs: 922337203685477580
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    +
    +
    + +

    You have to add GENESIS_COINBASE_TX_HEX to your configuration file.

    + +

    Alternatively, you can add it into the configuration form and save the config file again.

    + +

    Create cryptonote coin form - genesis

    + +

    Using simplewallet for wallets, containing premined coins:

    + +

    You must use the SYNC_FROM_ZERO option of simplewallet to see the premined coins.

    + +
    $ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
    +
    + +

    Adding seed nodes

    + +

    After you have all set in the configuration file, you can start the seed nodes.

    + +

    We recommend you use Digital Ocean or Vultr. The 5$ or 10$ option should be enough for most of the cases. +You can use our guide about seed node creation to get started fast.

    + +

    After you know the IP of the VPS, you have to add seed-node to your configuration file.

    + +
    seed-node=1.1.1.1:40741
    +
    + +

    Alternatively, you can add it into the configuration form and save the config file again.

    + +

    Create cryptonote coin form - seed

    + + +
    + + +
    + + + + + + + +;T; I" +# Create coin + +* TOC +{:toc} + + +Let's walk through the process of creating a configuration file for your coin. + + +## Creating config file + +Create the configuration file of your coin by using our [configuration form][create]. + +[![Create cryptonote coin form](/images/documentation/create-form.png)][create] + +Save the resulted configuration in the `configs` folder of Forknote. + +###Example on Linux/Mac: + +
    $ cat >testcoin.conf 
    +
    +EMISSION_SPEED_FACTOR=18
    +DIFFICULTY_TARGET=120
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +MONEY_SUPPLY=18446744073709551615
    +PREMINED_PERCENT=0
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +p2p-bind-port=13539
    +rpc-bind-port=13540
    +BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    +CRYPTONOTE_NAME=testcoin
    +UPGRADE_HEIGHT=1
    +
    + + +If you want to learn more you can checkout the [supported parameters][supported-parameters] of the configuration file. + + +## Creating simplewallet addresses + +*This step is only required if your coin has premine* + +
    $ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
    +
    +config path exist
    +forknote wallet v1.0.8.1.614()
    +Sync from timestamp: 1444336575
    +Error: wallet failed to connect to daemon (http://localhost:13540).
    +Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
    +view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
    +
    +
    + +**Caution: Don't forget to backup the wallets** + + +## Genesis coinbase transaction creation + +### For coins without premine + +
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
    +
    +config path exist
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    +
    +
    + +###For coins with premine + +
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
    + --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    + --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    +
    +config path exist
    +outs: 922337203685477580
    +outs: 922337203685477580
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    +
    +
    + +You have to add `GENESIS_COINBASE_TX_HEX` to your configuration file. + +Alternatively, you can add it into the [configuration form][create] and save the config file again. + +[![Create cryptonote coin form - genesis](/images/documentation/create-form-genesis.png)][create] + +### Using simplewallet for wallets, containing premined coins: + +You must use the `SYNC_FROM_ZERO` option of simplewallet to see the premined coins. + +
    $ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
    +
    + + +## Adding seed nodes + +After you have all set in the configuration file, you can start the seed nodes. + +We recommend you use [Digital Ocean][ditital-ocean] or [Vultr][vultr]. The 5$ or 10$ option should be enough for most of the cases. +You can use our [guide about seed node creation][seed-node-guide] to get started fast. + +After you know the IP of the VPS, you have to add `seed-node` to your configuration file. + +
    seed-node=1.1.1.1:40741
    +
    + +Alternatively, you can add it into the [configuration form][create] and save the config file again. + +[![Create cryptonote coin form - seed](/images/documentation/create-form-seed.png)][create] + + +[supported-parameters]: /documentation/daemon/#command-line-options-and-settings-options +[create]: /create/ +[seed-node-guide]: /guides/starting-seed-node/ +[ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 +[vultr]: http://www.vultr.com/?ref=6832621;T; +I" +

    Create coin

    + + + +

    Let’s walk through the process of creating a configuration file for your coin.

    + +

    Creating config file

    + +

    Create the configuration file of your coin by using our configuration form.

    + +

    Create cryptonote coin form

    + +

    Save the resulted configuration in the configs folder of Forknote.

    + +

    Example on Linux/Mac:

    + +
    $ cat >testcoin.conf 
    +
    +EMISSION_SPEED_FACTOR=18
    +DIFFICULTY_TARGET=120
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +MONEY_SUPPLY=18446744073709551615
    +PREMINED_PERCENT=0
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +p2p-bind-port=13539
    +rpc-bind-port=13540
    +BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    +CRYPTONOTE_NAME=testcoin
    +UPGRADE_HEIGHT=1
    +
    + +

    If you want to learn more you can checkout the supported parameters of the configuration file.

    + +

    Creating simplewallet addresses

    + +

    This step is only required if your coin has premine

    + +
    $ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
    +
    +config path exist
    +forknote wallet v1.0.8.1.614()
    +Sync from timestamp: 1444336575
    +Error: wallet failed to connect to daemon (http://localhost:13540).
    +Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
    +view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
    +
    +
    + +

    Caution: Don’t forget to backup the wallets

    + +

    Genesis coinbase transaction creation

    + +

    For coins without premine

    + +
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
    +
    +config path exist
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    +
    +
    + +

    For coins with premine

    + +
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
    + --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    + --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    +
    +config path exist
    +outs: 922337203685477580
    +outs: 922337203685477580
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    +
    +
    + +

    You have to add GENESIS_COINBASE_TX_HEX to your configuration file.

    + +

    Alternatively, you can add it into the configuration form and save the config file again.

    + +

    Create cryptonote coin form - genesis

    + +

    Using simplewallet for wallets, containing premined coins:

    + +

    You must use the SYNC_FROM_ZERO option of simplewallet to see the premined coins.

    + +
    $ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
    +
    + +

    Adding seed nodes

    + +

    After you have all set in the configuration file, you can start the seed nodes.

    + +

    We recommend you use Digital Ocean or Vultr. The 5$ or 10$ option should be enough for most of the cases. +You can use our guide about seed node creation to get started fast.

    + +

    After you know the IP of the VPS, you have to add seed-node to your configuration file.

    + +
    seed-node=1.1.1.1:40741
    +
    + +

    Alternatively, you can add it into the configuration form and save the config file again.

    + +

    Create cryptonote coin form - seed

    + +;T; @I"9/static/images/documentation/create-form-screen.png/;T{;{I"A/static/images/documentation/create-form-genesis-screen.png/;T{;{I">/static/images/documentation/create-form-seed-screen.png/;T{;{I":/static/images/documentation/create-form-genesis.png/;T{;{I"7/static/images/documentation/create-form-seed.png/;T{;{I"2/static/images/documentation/create-form.png/;T{;{I" + + + + + + + Daemon HTTP RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Daemon HTTP RPC API

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    + +
    + + +
    + + + + + + + +;T; I" +# Daemon HTTP RPC API + +URL | Description | Format | Arg 1 | Arg 2 | Return value +-----------|-----------|-----------|-----------|-----------|-----------| +/getheight | Returns current chain height | JSON | - | - | [int] height +/getknownblockids | Returns list of known block ids | JSON | - | - | [list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids +/start_mine | Starts mining threads | JSON | [string] wallet address | [int] number of threads | [string] status +/stop_mine | Stops mining threads | JSON | - | - | [string] status +/gettransactions | Returns transactions as serialized blobs | JSON | [list] tx ids | - | [list] transactions as hex
    [list] missing tx ids
    [string] status +/sendrawtransactions | Send transaction to the network | JSON | [string] serialized transaction in hex form | - | [string] status +/getblocks.bin | Returns blocks in binary form | BIN | [list] block ids | - | [list] blocks
    [int] start height
    [int] current height
    [string] status +/get_o_indexes.bin |Get global output indicies | BIN | [hash] transaction id | - | [vector] output indicies
    [string] status +/getrandom_outs.bin | Get random output indicies
    for a given amount
    (purpose: for ring signatures) | BIN | [list] amounts | [int] count | [vector]
    { [int] amount; [list] outs }
    output entries +;T; +I"b +

    Daemon HTTP RPC API

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    +;T; @!I"(/documentation/daemon/json-rpc-api/;T{;{ ;I"pV + + + + + + + Daemon JSON RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Daemon JSON RPC API

    + + + +

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit rpc-bind-port in your configuration file

    + +
    rpc-bind-port=29081
    +
    + +

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit your configuration file

    + +
    rpc-bind-port=29081
    +rpc-bind-ip=0.0.0.0
    +
    + +

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29081/json_rpc
    + http://localhost:29081/json_rpc
    +
    + +

    getblockcount

    + +

    Returns current chain height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "count" : {
    +                    "type" : "integer",
    +                    "minimum": 0,
    +                    "description": ""
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +        "required": ["count", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockcount)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockcount"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "count": 123456,
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockhash

    + +

    Returns block hash by its height

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "string",
    +            "description": ""
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id": "test",
    +    "method": "on_getblockhash",
    +    "params": {
    +        "height": 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": "a7428..."
    + }
    +
    + +

    getblocktemplate

    + +

    Returns blocktemplate with an empty “hole” for nonce.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "reserve_size" : {
    +            "type" : "integer"
    +        },
    +        "wallet_address" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    + }
    +
    + +

    Return value schema

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "result" : {
    +            "difficulty" : {
    +                "type" : "integer"
    +            },
    +            "height" : {
    +                "type" :"integer"
    +            },
    +            "reserved_offset" : {
    +                "type" : "integer"
    +            },
    +            "blocktemplate_blob" : {
    +                "type" : "string"
    +            },
    +            "status" : {
    +                "type" : "string"
    +            }
    +        },
    +    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    +    }
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblocktemplate)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblocktemplate",
    +    "params": {
    +        "reserve_size": 200,
    +        "wallet_address": "28j5g2Hbe1..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "blocktemplate_blob": "0100de...",
    +        "difficulty": 65563,
    +        "height": 123456,
    +        "reserved_offset": 395,
    +        "status": ""
    +    }
    + }
    +
    + +

    submitblock

    + +

    Submits mined block.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "block" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "block"]
    + } 
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "status" : {
    +                "type" : "string",
    +                "description": ""
    +            },
    +            "required": ["status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (submitblock)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "submitblock",
    +    "params": ["0100b...."]
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "status" : "OK"
    +    }
    + }
    +
    + +

    getlastblockheader

    + +

    Returns last block header.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "block_header : {
    +                    "type" : "object",
    +                    "properties" : {
    +                        "major_version" :    {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "minor_version" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                            },
    +                        "timestamp" : {
    +                            "type" : "integer",
    +                            "description" : "UNIX timestamp"
    +                        },
    +                        "prev_hash" : {
    +                            "type" : "string",
    +                            "description" : "previous block's hash"
    +                        },
    +                        "nonce" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "orphan_status" : {
    +                            "type" : "boolean",
    +                            "description" : "True if the block was marked as orphaned"
    +                        },
    +                        "height" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "depth" : {
    +                            "type" : "integer",
    +                            "description" : "last_block_height - this_block_height"
    +                        },
    +                        "hash" : {
    +                            "type" : "string",
    +                            "description" : ""
    +                        },
    +                        "difficulty" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "reward" : {
    +                            "type" : "integer",
    +                            "description" : "Reward for the block in atomic units"
    +                        }
    +                    },
    +                    "required": [
    +                        "major_version", 
    +                        "minor_version", 
    +                        "timestamp", 
    +                        "prev_hash", 
    +                        "nonce",
    +                        "orphan_status",
    +                        "height",
    +                        "depth",
    +                        "hash",
    +                        "difficulty",
    +                        "reward"
    +                    ]
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "required": ["block_header", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getlastblockheader)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getlastblockheader"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyhash

    + +

    Returns last block header by given hash.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "hash" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "hash"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyhash",
    +    "params": {
    +        "hash" : "9a8be8..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyheight

    + +

    Returns block header by given block height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyheight)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyheight",
    +    "params": {
    +        "height" : 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +            },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getcurrencyId

    + +

    Returns unique currency identifier.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "currency_id_blob" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (getcurrencyId)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getcurrencyid"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "currency_id_blob" : "a7..."
    +    }
    + }
    +
    + +
    + + +
    + + + + + + + +;T; I"> +# Daemon JSON RPC API + +* TOC +{:toc} + +To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon's arguments). You can choose any free port. To do that execute the following command from the command line: + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    +
    + +Atlernatively, you can edit *rpc-bind-port* in your configuration file + + rpc-bind-port=29081 + + +If you want Daemon to be accessed from other computer not only yours you should also use a --rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line: + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    +
    + +Atlernatively, you can edit your configuration file + + rpc-bind-port=29081 + rpc-bind-ip=0.0.0.0 + +Having done that you're ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100): + + http://126.0.1.100:29081/json_rpc + http://localhost:29081/json_rpc + + +## getblockcount + +Returns current chain height. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "object", + "properties" : { + "count" : { + "type" : "integer", + "minimum": 0, + "description": "" + }, + "status" : { + "type" : "string" + } + }, + "required": ["count", "status"] + } + }, + "required": ["result"] + } + +### Example (getblockcount) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockcount" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "count": 123456, + "status": "OK" + } + } + + +##getblockhash + +Returns block hash by its height + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "height" : { + "type" : "integer" + } + }, + "required" : ["jsonrpc", "method", "height"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "string", + "description": "" + } + }, + "required": ["result"] + } + +###Example (getblockhash) + +Input: + + { + "jsonrpc": "2.0", + "id": "test", + "method": "on_getblockhash", + "params": { + "height": 123456 + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": "a7428..." + } + + +##getblocktemplate + +Returns blocktemplate with an empty “hole” for nonce. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "reserve_size" : { + "type" : "integer" + }, + "wallet_address" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] + } + +Return value schema + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "difficulty" : { + "type" : "integer" + }, + "height" : { + "type" :"integer" + }, + "reserved_offset" : { + "type" : "integer" + }, + "blocktemplate_blob" : { + "type" : "string" + }, + "status" : { + "type" : "string" + } + }, + "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"] + } + "required": ["result"] + } + +###Example (getblocktemplate) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblocktemplate", + "params": { + "reserve_size": 200, + "wallet_address": "28j5g2Hbe1..." + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "blocktemplate_blob": "0100de...", + "difficulty": 65563, + "height": 123456, + "reserved_offset": 395, + "status": "" + } + } + + +##submitblock + +Submits mined block. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "block" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "block"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "status" : { + "type" : "string", + "description": "" + }, + "required": ["status"] + } + }, + "required": ["result"] + } + +### Example (submitblock) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "submitblock", + "params": ["0100b...."] + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "status" : "OK" + } + } + + +##getlastblockheader + +Returns last block header. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "result" : { + "type" : "object", + "properties" : { + "block_header : { + "type" : "object", + "properties" : { + "major_version" : { + "type" : "integer", + "description" : "" + }, + "minor_version" : { + "type" : "integer", + "description" : "" + }, + "timestamp" : { + "type" : "integer", + "description" : "UNIX timestamp" + }, + "prev_hash" : { + "type" : "string", + "description" : "previous block's hash" + }, + "nonce" : { + "type" : "integer", + "description" : "" + }, + "orphan_status" : { + "type" : "boolean", + "description" : "True if the block was marked as orphaned" + }, + "height" : { + "type" : "integer", + "description" : "" + }, + "depth" : { + "type" : "integer", + "description" : "last_block_height - this_block_height" + }, + "hash" : { + "type" : "string", + "description" : "" + }, + "difficulty" : { + "type" : "integer", + "description" : "" + }, + "reward" : { + "type" : "integer", + "description" : "Reward for the block in atomic units" + } + }, + "required": [ + "major_version", + "minor_version", + "timestamp", + "prev_hash", + "nonce", + "orphan_status", + "height", + "depth", + "hash", + "difficulty", + "reward" + ] + }, + "status" : { + "type" : "string" + } + }, + "required": ["block_header", "status"] + } + }, + "required": ["result"] + } + +### Example (getlastblockheader) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getlastblockheader" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getblockheaderbyhash + +Returns last block header by given hash. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "hash" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method", "hash"] + } + +Return value schema: + +*See [getlastblockheader](#getlastblockheader) above* + +### Example (getblockheaderbyhash) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockheaderbyhash", + "params": { + "hash" : "9a8be8..." + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getblockheaderbyheight + +Returns block header by given block height. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "height" : { + "type" : "integer" + } + }, + "required" : ["jsonrpc", "method", "height"] + } + +Return value schema: + +*See [getlastblockheader](#getlastblockheader) above* + +### Example (getblockheaderbyheight) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getblockheaderbyheight", + "params": { + "height" : 123456 + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block_header": { + "depth": 1, + "difficulty": 65198, + "hash": "9a8be83...", + "height": 123456, + "major_version": 1, + "minor_version": 0, + "nonce": 2358499061, + "orphan_status": false, + "prev_hash": "dde56b7e...", + "reward": 44090506423186, + "timestamp": 1356589561 + }, + "status": "OK" + } + } + + +##getcurrencyId + +Returns unique currency identifier. + +URL: + + /json_rpc + +Input arguments: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + }, + "required" : ["jsonrpc", "method"] + } + +Return value schema: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BCN JSON RPC API", + "type": "object", + + "properties" : { + "currency_id_blob" : { + "type" : "string" + } + } + } + +### Example (getcurrencyId) + +Input: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "getcurrencyid" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "currency_id_blob" : "a7..." + } + } +;T; +I"A +

    Daemon JSON RPC API

    + + + +

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit rpc-bind-port in your configuration file

    + +
    rpc-bind-port=29081
    +
    + +

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    + +
    + forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    +
    + +

    Atlernatively, you can edit your configuration file

    + +
    rpc-bind-port=29081
    +rpc-bind-ip=0.0.0.0
    +
    + +

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29081/json_rpc
    + http://localhost:29081/json_rpc
    +
    + +

    getblockcount

    + +

    Returns current chain height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "count" : {
    +                    "type" : "integer",
    +                    "minimum": 0,
    +                    "description": ""
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +        "required": ["count", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockcount)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockcount"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "count": 123456,
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockhash

    + +

    Returns block hash by its height

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "string",
    +            "description": ""
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblockhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id": "test",
    +    "method": "on_getblockhash",
    +    "params": {
    +        "height": 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": "a7428..."
    + }
    +
    + +

    getblocktemplate

    + +

    Returns blocktemplate with an empty “hole” for nonce.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "reserve_size" : {
    +            "type" : "integer"
    +        },
    +        "wallet_address" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    + }
    +
    + +

    Return value schema

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "result" : {
    +            "difficulty" : {
    +                "type" : "integer"
    +            },
    +            "height" : {
    +                "type" :"integer"
    +            },
    +            "reserved_offset" : {
    +                "type" : "integer"
    +            },
    +            "blocktemplate_blob" : {
    +                "type" : "string"
    +            },
    +            "status" : {
    +                "type" : "string"
    +            }
    +        },
    +    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    +    }
    +    "required": ["result"]
    + }
    +
    + +

    Example (getblocktemplate)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblocktemplate",
    +    "params": {
    +        "reserve_size": 200,
    +        "wallet_address": "28j5g2Hbe1..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "blocktemplate_blob": "0100de...",
    +        "difficulty": 65563,
    +        "height": 123456,
    +        "reserved_offset": 395,
    +        "status": ""
    +    }
    + }
    +
    + +

    submitblock

    + +

    Submits mined block.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "block" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "block"]
    + } 
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "status" : {
    +                "type" : "string",
    +                "description": ""
    +            },
    +            "required": ["status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (submitblock)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "submitblock",
    +    "params": ["0100b...."]
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "status" : "OK"
    +    }
    + }
    +
    + +

    getlastblockheader

    + +

    Returns last block header.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "result" : {
    +            "type" : "object",
    +            "properties" : {
    +                "block_header : {
    +                    "type" : "object",
    +                    "properties" : {
    +                        "major_version" :    {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "minor_version" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                            },
    +                        "timestamp" : {
    +                            "type" : "integer",
    +                            "description" : "UNIX timestamp"
    +                        },
    +                        "prev_hash" : {
    +                            "type" : "string",
    +                            "description" : "previous block's hash"
    +                        },
    +                        "nonce" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "orphan_status" : {
    +                            "type" : "boolean",
    +                            "description" : "True if the block was marked as orphaned"
    +                        },
    +                        "height" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "depth" : {
    +                            "type" : "integer",
    +                            "description" : "last_block_height - this_block_height"
    +                        },
    +                        "hash" : {
    +                            "type" : "string",
    +                            "description" : ""
    +                        },
    +                        "difficulty" : {
    +                            "type" : "integer",
    +                            "description" : ""
    +                        },
    +                        "reward" : {
    +                            "type" : "integer",
    +                            "description" : "Reward for the block in atomic units"
    +                        }
    +                    },
    +                    "required": [
    +                        "major_version", 
    +                        "minor_version", 
    +                        "timestamp", 
    +                        "prev_hash", 
    +                        "nonce",
    +                        "orphan_status",
    +                        "height",
    +                        "depth",
    +                        "hash",
    +                        "difficulty",
    +                        "reward"
    +                    ]
    +                },
    +                "status" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "required": ["block_header", "status"]
    +        }
    +    },
    +    "required": ["result"]
    + }
    +
    + +

    Example (getlastblockheader)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getlastblockheader"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyhash

    + +

    Returns last block header by given hash.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "hash" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "hash"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyhash)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyhash",
    +    "params": {
    +        "hash" : "9a8be8..."
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +        },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getblockheaderbyheight

    + +

    Returns block header by given block height.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method", "height"]
    + }
    +
    + +

    Return value schema:

    + +

    See getlastblockheader above

    + +

    Example (getblockheaderbyheight)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getblockheaderbyheight",
    +    "params": {
    +        "height" : 123456
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "block_header": {
    +            "depth": 1,
    +            "difficulty": 65198,
    +            "hash": "9a8be83...",
    +            "height": 123456,
    +            "major_version": 1,
    +            "minor_version": 0,
    +            "nonce": 2358499061,
    +            "orphan_status": false,
    +            "prev_hash": "dde56b7e...",
    +            "reward": 44090506423186,
    +            "timestamp": 1356589561
    +            },
    +        "status": "OK"
    +    }
    + }
    +
    + +

    getcurrencyId

    + +

    Returns unique currency identifier.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input arguments:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    },
    +    "required" : ["jsonrpc", "method"]
    + }
    +
    + +

    Return value schema:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "BCN JSON RPC API",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "currency_id_blob" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (getcurrencyId)

    + +

    Input:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "getcurrencyid"
    + }
    +
    + +

    Output:

    + +
     {
    +    "id": "test",
    +    "jsonrpc": "2.0",
    +    "result": {
    +        "currency_id_blob" : "a7..."
    +    }
    + }
    +
    +;T; @'I"$/documentation/payment-gateway/;T{;{ ;I"_ + + + + + + + Payment gateway overview and configuration | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Payment gateway overview and configuration

    + + + +

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    + +

    Configure Forknote RPC Wallet

    + +

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf
    +
    + +

    To get help on available options run:

    + +
     $ ./walletd -h
    +
    + +

    Please note, Forknote RPC Wallet config file may consist only of these options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    + +

    Example of a config file

    + +
    $ cat ./notrealcoin.conf 
    +
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +wallet-file = mywallet
    +wallet-password = mypassword
    +daemon-port = 17100
    +bind-port = 9090
    +
    +
    + +

    Note: config file’s path is relative to current working directory, not server root.

    + +

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    + +

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    + +

    Generate a new wallet

    + +

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    + +

    To generate a new wallet you should run the following command:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    +
    + +

    where:

    + +
      +
    • +<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • +
    • +<mypass> is a secret password for the new wallet file. Whichever you like;
    • +
    • +–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • +
    + +

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    + +

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    + +

    Start Forknote RPC Wallet

    + +

    There are two ways to start Forknote RPC Wallet:

    + +

    Start with a remote connection to the Daemon

    + +

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    + +
      +
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • +
    • For remote daemons specify the remote daemon’s IP address.
    • +
    + +

    Default Forknote daemon ports are 8080 and 8081.

    + +

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    + +
    daemon-address=<remote_ip>
    +daemon-port=8080
    +
    + +

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    + +

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    + +

    Start as in-process node

    + +

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    + +

    Use the following command to start Forknote RPC Wallet with an in-process node

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    +
    + +

    Run Forknote RPC Wallet

    + +

    Forknote RPC wallet can be started in both daemon and console modes.

    + +
      +
    • +

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      +
    • +
    • +

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      +
    • +
    + +

    Forknote RPC wallet starts in console mode by default.

    + +

    Start as daemon (UNIX only)

    + +

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    + +
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    +
    + +

    Note: it’s a common practice for daemons to set server root directory.

    + +

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    + +

    Start as service (Windows only)

    + +

    To run RPC wallet as a service on Windows you have to do the following:

    + +
      +
    1. +

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      + +

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      +
    2. +
    3. +

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      + +
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      +
      +
    4. +
    5. +

      After you see message about successful service registration you can run it in your Services panel.

      +
    6. +
    + +

    Uninstall service (Windows only)

    + +

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    + +
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    +
    + +

    Forknote RPC Wallet JSON RPC API

    + +

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    + +
      +
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. +
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. +
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. +
    7. Fund these amounts to the corresponding user accounts.
    8. +
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. +
    + +

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    + + +
    + + +
    + + + + + + + +;T; I"q7 +# Payment gateway overview and configuration + +* TOC +{:toc} + +This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] and much more. [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] page contains detailed description of every method. + + +##Configure Forknote RPC Wallet + +To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use "--config" option further. The command below launches Forknote RPC Wallet with a specific config file: + + $ ./walletd --config /home/Downloads/myconfig.conf + +To get help on available options run: + + $ ./walletd -h + +Please note, Forknote RPC Wallet config file may consist only of these options: + +Option | Description | Config Example | Console Example +-----------|-----------|-----------|-----------| +bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 | --bind-address 127.0.0.1 +bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 | --bind-port 8071 +daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 | --daemon-address 127.0.0.1 +daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 | --daemon-port 8080 +wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet | --wallet-file mywallet +wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword | --wallet-password mypassword +generate-wallet | Generate new wallet | | --generate-wallet +log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log | --log-file mylog.log +server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet | --server-root /home/Downloads/RPCWallet +log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 +testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no | --testnet no +local | Option that allows you to start Forknote RPC Wallet as an in-process node | local | --local +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 +allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port +P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 +GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a +CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 +EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 +CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 +DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 +CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 +MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 +MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 + + +##Example of a config file + +
    $ cat ./notrealcoin.conf 
    +
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +wallet-file = mywallet
    +wallet-password = mypassword
    +daemon-port = 17100
    +bind-port = 9090
    +
    +
    + +Note: config file's path is relative to current working directory, not server root. + +Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode). + +Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory. + + +##Generate a new wallet + +To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly. + +To generate a new wallet you should run the following command: + + $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet + +where: + +* **<mywallet>** is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet's name will result in new *.wallet file located in the same folder as RPC Wallet +* **<mypass>** is a secret password for the new wallet file. Whichever you like; +* **--generate-wallet** option tells RPC wallet to generate wallet file and exit. + +Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name. + +If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down. + + +##Start Forknote RPC Wallet + +There are two ways to start Forknote RPC Wallet: + +###Start with a remote connection to the Daemon + +Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server. + +* For local daemons use localhost or 127.0.0.1 as an IP address. +* For remote daemons specify the remote daemon's IP address. + +Default Forknote daemon ports are 8080 and 8081. + +Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection: + + daemon-address= + daemon-port=8080 + +Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode. + +Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users. + +###Start as in-process node + +You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don't have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance. + +Use the following command to start Forknote RPC Wallet with an in-process node + + $ ./walletd --config /home/Downloads/myconfig.conf --local + +##Run Forknote RPC Wallet + +Forknote RPC wallet can be started in both daemon and console modes. + +* **Daemon mode** - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window. + +* **Console mode** - Forknote RPC Wallet is launched and prints log messages on the screen. + +Forknote RPC wallet starts in console mode by default. + +###Start as daemon (UNIX only) + +To start RPC wallet as daemon just set "--daemon" (or short "-d") option. + + ./walletd --config /home/Downloads/myconfig.conf --daemon + +Note: it's a common practice for daemons to set server root directory. + +Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory. + +###Start as service (Windows only) + +To run RPC wallet as a service on Windows you have to do the following: + +1. Create a config file and place it in the same directory as your RPC wallet's executable resides in. + + A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root); + +2. Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR: + + walletd.exe --config /home/Downloads/myconfig.conf --register-service + +3. After you see message about successful service registration you can run it in your Services panel. + + +###Uninstall service (Windows only) + +If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR: + + walletd.exe --config /home/Downloads/myconfig.conf --unregister-service + +##Forknote RPC Wallet JSON RPC API + +Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme: + +1. Create a unique address for each user to identify his particular deposits with **create_address()** method. +2. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run **get_transaction_count()** method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed. +3. Run **get_transaction()** method to receive amounts and addresses of new incoming transactions. +4. Fund these amounts to the corresponding user accounts. +5. Withdraw with **send_transaction()** method that allows you to send transaction to one or several addresses. + +Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] + + +[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment_gateway/json_rpc_api/ +;T; +I"*K +

    Payment gateway overview and configuration

    + + + +

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    + +

    Configure Forknote RPC Wallet

    + +

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf
    +
    + +

    To get help on available options run:

    + +
     $ ./walletd -h
    +
    + +

    Please note, Forknote RPC Wallet config file may consist only of these options:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    + +

    Example of a config file

    + +
    $ cat ./notrealcoin.conf 
    +
    +seed-node=1.1.1.1:17100
    +seed-node=2.2.2.2:17100
    +seed-node=seed.notarealcoin.com:17100
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +p2p-bind-port=17100
    +rpc-bind-port=17101
    +MONEY_SUPPLY=18446744073709551615
    +DEFAULT_DUST_THRESHOLD=1000000
    +MINIMUM_FEE=1000000
    +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    +CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    +CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT=1
    +wallet-file = mywallet
    +wallet-password = mypassword
    +daemon-port = 17100
    +bind-port = 9090
    +
    +
    + +

    Note: config file’s path is relative to current working directory, not server root.

    + +

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    + +

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    + +

    Generate a new wallet

    + +

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    + +

    To generate a new wallet you should run the following command:

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    +
    + +

    where:

    + +
      +
    • +<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • +
    • +<mypass> is a secret password for the new wallet file. Whichever you like;
    • +
    • +–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • +
    + +

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    + +

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    + +

    Start Forknote RPC Wallet

    + +

    There are two ways to start Forknote RPC Wallet:

    + +

    Start with a remote connection to the Daemon

    + +

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    + +
      +
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • +
    • For remote daemons specify the remote daemon’s IP address.
    • +
    + +

    Default Forknote daemon ports are 8080 and 8081.

    + +

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    + +
    daemon-address=<remote_ip>
    +daemon-port=8080
    +
    + +

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    + +

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    + +

    Start as in-process node

    + +

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    + +

    Use the following command to start Forknote RPC Wallet with an in-process node

    + +
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    +
    + +

    Run Forknote RPC Wallet

    + +

    Forknote RPC wallet can be started in both daemon and console modes.

    + +
      +
    • +

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      +
    • +
    • +

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      +
    • +
    + +

    Forknote RPC wallet starts in console mode by default.

    + +

    Start as daemon (UNIX only)

    + +

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    + +
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    +
    + +

    Note: it’s a common practice for daemons to set server root directory.

    + +

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    + +

    Start as service (Windows only)

    + +

    To run RPC wallet as a service on Windows you have to do the following:

    + +
      +
    1. +

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      + +

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      +
    2. +
    3. +

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      + +
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      +
      +
    4. +
    5. +

      After you see message about successful service registration you can run it in your Services panel.

      +
    6. +
    + +

    Uninstall service (Windows only)

    + +

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    + +
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    +
    + +

    Forknote RPC Wallet JSON RPC API

    + +

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    + +
      +
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. +
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. +
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. +
    7. Fund these amounts to the corresponding user accounts.
    8. +
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. +
    + +

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    + +;T; @-I"1/documentation/payment-gateway/json-rpc-api/;T{;{ ;I". + + + + + + + Payment gateway JSON RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Payment gateway JSON RPC API

    + + + +

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    + +

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    + +

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    + +
    http://<service address>:<service port>/json_rpc
    +
    + +

    Where:

    + +
      +
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • +
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • +
    + +

    send_transaction

    + +

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    +
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    + +

    Input Example:

    + +
     {
    +    "params": {
    +        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    +        "fee": 1000000000, 
    +        "unlock_time": 0, 
    +        "mixin": 0, 
    +        "destinations": [ 
    +            {
    +            "amount": 10000000000, 
    +            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +            },
    +            {
    +            "amount": 500000, 
    +            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +            }
    +        ]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "send_transaction"
    + }
    +
    + +

    Return value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transaction_id":470
    +    }
    + }
    +
    + +

    get_address

    + +

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "get_address",
    +    "params": {
    +        "index": 42
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    create_address

    + +

    create_address() method creates an additional address in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input value example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "create_address",
    +    "params": {
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    get_address_count

    + +

    get_address_count() method returns a number of addresses in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_address_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "count":2
    +    }
    + }
    +
    + +

    delete_address

    + +

    delete_address() method deletes a specified address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + +

    In case of success returns an empty JSON object.

    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "delete_address"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {}
    + }
    +
    + +

    get_actual_balance

    + +

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +    { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_actual_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "actual_balance":32340960388304977
    +    }
    + }
    +
    + +

    get_pending_balance

    + +

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        },  
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_pending_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "pending_balance": 10000
    +    }
    + }
    +
    + +

    get_transactions_count

    + +

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    + +

    Input example:

    + +
     {
    +    "params": {},
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transactions_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "transactions_count":471
    +    }
    + }
    +
    + +

    get_transfers_count

    + +

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfers_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transfers_count":2
    +    }
    + }
    +
    + +

    get_transaction_id_by_transfer_id

    + +

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transaction_id_by_transfer_id"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result":{
    +        "transaction_id":469
    +    }
    + }
    +
    + +

    get_transaction

    + +

    get_transaction() method returns information about a particular transaction.

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transaction_id": 1
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": 
    +    "get_transaction"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transaction_info": { 
    +            "block_height":2,
    +            "extra":"2jh1iak...123yh1g4g",
    +            "fee":0,
    +            "first_transfer_id":103,
    +            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    +            "timestamp":1409833412,
    +            "total_amount":7036820,
    +            "transfer_count":0,
    +            "transfers": 
    +            [
    +                {
    +                    "amount": 10000000000, 
    +                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                },
    +                {
    +                    "amount": 500000, 
    +                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +                }   
    +            ]
    +        }
    +    }
    + }
    +
    + +

    get_transfer

    + +

    get_transfer() method returns a transfer that corresponds to the requested identifier

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfer"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transfer_info": {
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    +            "amount":100000
    +        }
    +    }
    + }
    +
    + +

    get_incoming_payments

    + +

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    +
    arraySee below
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_incoming_payments"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "payments": [
    +            {
    +                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    +                "payments": 
    +                [ 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    +                        "unlock_time":0
    +                    },
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    +                        "unlock_time":0
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + +

    list_transactions

    + +

    list_transactions() method returns an array of transactions starting from a particular id.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below.
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "starting_transaction_id": 100,
    +        "max_transaction_count": 50
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "list_transactions"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transactions": [
    +            { 
    +                "block_height":2,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            },
    +            { 
    +                "block_height":3,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + + +
    + + +
    + + + + + + + +;T; I"RS +# Payment gateway JSON RPC API + +* TOC +{:toc} + +On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method. + +More on how to start and operate Forknote RPC Wallet can be found here: [Forknote RPC Wallet][Forknote_RPC_Wallet] + +To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this: + + http://:/json_rpc + +Where: + +* <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost +* <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this [here][Configure_Forknote_RPC_Wallet]. + + +##send_transaction + +**send_transaction()** method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +payment_id | No | 64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service. | string | 96A3..A5BB +fee | Yes | Transaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000 | uint64 | 1000000 +unlock_time | No | Height of the block until which transaction is going to be locked for spending. | uint64 | 0 +mixin | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 +destinations | Yes | Array that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    | array | "amount": 10000000000,
    "address": "288Ck..Zv" | + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transaction_id | Identifier of the sent transaction. Identifier indicates a number of the transaction in your wallet. | uint64 | 25 + + +Input Example: + + { + "params": { + "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional + "fee": 1000000000, + "unlock_time": 0, + "mixin": 0, + "destinations": [ + { + "amount": 10000000000, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + }, + { + "amount": 500000, + "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + ] + }, + "jsonrpc": "2.0", + "id": "1", + "method": "send_transaction" + } + + +Return value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transaction_id":470 + } + } + + +##get_address + +**get_address()** method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out "15" in the methods body. The first address created on wallet generation has id 0. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +index | No | ID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address. | uint64 | 20 + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +address | Corresponding address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw + + + +Input example: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "get_address", + "params": { + "index": 42 + } + } + +Output value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + } + + +##create_address + +**create_address()** method creates an additional address in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +address | Created address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw + + +Input value example: + + { + "jsonrpc": "2.0", + "id" : "test", + "method": "create_address", + "params": { + } + } + +Output value example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + } + + +##get_address_count + +**get_address_count()** method returns a number of addresses in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +count | A number of addresses in your wallet | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_address_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "count":2 + } + } + + +##delete_address + +**delete_address()** method deletes a specified address. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | An address to be deleted. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +In case of success returns an empty JSON object. + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "delete_address" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": {} + } + + + +##get_actual_balance + +**get_actual_balance()** method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address. + +* Actual Balance — your wallet's balance that is available for spending immediately +* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | Specify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +actual_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_actual_balance" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "actual_balance":32340960388304977 + } + } + + +##get_pending_balance + +**get_pending_balance()** method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address. + +* Actual Balance — your wallet's balance that is available for spending immediately +* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +address | Yes | Specify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +pending_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 + + +Input example: + + { + "params": + { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_pending_balance" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "pending_balance": 10000 + } + } + + +##get_transactions_count + +**get_transactions_count()** method returns a cumulative number of transactions in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transactions_count | A number of transactions | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transactions_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transactions_count":471 + } + } + + +##get_transfers_count + +**get_transfers_count()** method returns a cumulative number of transfers in your wallet. + + +No input. + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transfers_count | A number of transfers | uint64 | 21 + + +Input example: + + { + "params": {}, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transfers_count" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transfers_count":2 + } + } + + +##get_transaction_id_by_transfer_id + +**get_transaction_id_by_transfer_id()** method returns and id of a transaction containing this particular transfer. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transfer_id | Yes | Transfer identifier | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transaction_id | Corresponding transaction id | uint64 | 21 + + +Input example: + + { + "params": { + "transfer_id": 0 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transaction_id_by_transfer_id" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result":{ + "transaction_id":469 + } + } + + +##get_transaction + +**get_transaction()** method returns information about a particular transaction. + +Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transaction_id | Yes | Requested transaction id | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +found | Is found or not | bool | True / False +transaction_info | Contains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction's hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below + + +Input example: + + { + "params": { + "transaction_id": 1 + }, + "jsonrpc": "2.0", + "id": "1", + "method": + "get_transaction" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "found":true, + "transaction_info": { + "block_height":2, + "extra":"2jh1iak...123yh1g4g", + "fee":0, + "first_transfer_id":103, + "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0, + "transfers": + [ + { + "amount": 10000000000, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + }, + { + "amount": 500000, + "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" + } + ] + } + } + } + + +##get_transfer + +**get_transfer()** method returns a transfer that corresponds to the requested identifier + +Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +transfer_id | Yes | Requested transfer | uint64 | 20 + + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +found | Is found or not | bool | true / false +transfer_info | Returns transfer_info object containing:
    * amount - uint64
    * address - string | object | See below + + +Input example: + + { + "params": { + "transfer_id": 0 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_transfer" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "found":true, + "transfer_info": { + "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw", + "amount":100000 + } + } + } + + +##get_incoming_payments + +**get_incoming_payments()** method returns payments with a requested payment_id. This method will be depreciated soon. + + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +payments | Yes | Contains strings of payment_id's | array | 96A3937D88E210..B1FE9C0487A5BB + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +payments | Contains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    | array | See below + + +Input example: + + { + "params": { + "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"] + }, + "jsonrpc": "2.0", + "id": "1", + "method": "get_incoming_payments" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "payments": [ + { + "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", + "payments": + [ + { + "amount":10000000000, + "block_height":728, + "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", + "unlock_time":0 + }, + { + "amount":10000000000, + "block_height":728, + "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "unlock_time":0 + } + ] + } + ] + } + } + + +##list_transactions + +**list_transactions()** method returns an array of transactions starting from a particular id. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +starting_transaction_id | Yes | Identifier of a starting transaction | uint32 | 20 +max_transaction_count | Yes | Maximum number of returned consecutive transactions | uint32 | 20 + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transactions | An array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction's hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below. + + +Input example: + + { + "params": { + "starting_transaction_id": 100, + "max_transaction_count": 50 + }, + "jsonrpc": "2.0", + "id": "1", + "method": "list_transactions" + } + +Output example: + + { + "id":"1", + "jsonrpc":"2.0", + "result": { + "transactions": [ + { + "block_height":2, + "extra":"01e3...70f3acfc4", + "fee":0, + "first_transfer_id":-1, + "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0 + "transfers": [ + { + "amount": 102002, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + } + ] + }, + { + "block_height":3, + "extra":"01e3...70f3acfc4", + "fee":0, + "first_transfer_id":-1, + "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", + "timestamp":1409833412, + "total_amount":7036820, + "transfer_count":0 + "transfers": [ + { + "amount": 102002, + "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" + } + ] + } + ] + } + } + + +[Forknote_RPC_Wallet]: /documentation/payment_gateway/ +[Configure_Forknote_RPC_Wallet]: /documentation/payment_gateway/#configure-forknote-rpc-wallet +;T; +I"k +

    Payment gateway JSON RPC API

    + + + +

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    + +

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    + +

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    + +
    http://<service address>:<service port>/json_rpc
    +
    + +

    Where:

    + +
      +
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • +
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • +
    + +

    send_transaction

    + +

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    +
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    + +

    Input Example:

    + +
     {
    +    "params": {
    +        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    +        "fee": 1000000000, 
    +        "unlock_time": 0, 
    +        "mixin": 0, 
    +        "destinations": [ 
    +            {
    +            "amount": 10000000000, 
    +            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +            },
    +            {
    +            "amount": 500000, 
    +            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +            }
    +        ]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "send_transaction"
    + }
    +
    + +

    Return value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transaction_id":470
    +    }
    + }
    +
    + +

    get_address

    + +

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "get_address",
    +    "params": {
    +        "index": 42
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    create_address

    + +

    create_address() method creates an additional address in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    + +

    Input value example:

    + +
     {
    +    "jsonrpc": "2.0",
    +    "id" : "test",
    +    "method": "create_address",
    +    "params": {
    +    }
    + }
    +
    + +

    Output value example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +    }
    + }
    +
    + +

    get_address_count

    + +

    get_address_count() method returns a number of addresses in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_address_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "count":2
    +    }
    + }
    +
    + +

    delete_address

    + +

    delete_address() method deletes a specified address.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + +

    In case of success returns an empty JSON object.

    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "delete_address"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {}
    + }
    +
    + +

    get_actual_balance

    + +

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +    { 
    +        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_actual_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "actual_balance":32340960388304977
    +    }
    + }
    +
    + +

    get_pending_balance

    + +

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    + +
      +
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • +
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • +
    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    + +

    Input example:

    + +
     {
    +    "params": 
    +        { 
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    +        },  
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_pending_balance"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "pending_balance": 10000
    +    }
    + }
    +
    + +

    get_transactions_count

    + +

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    + +

    Input example:

    + +
     {
    +    "params": {},
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transactions_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": { 
    +        "transactions_count":471
    +    }
    + }
    +
    + +

    get_transfers_count

    + +

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    + +

    No input.

    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    + +

    Input example:

    + +
     {
    +    "params": {}, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfers_count"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transfers_count":2
    +    }
    + }
    +
    + +

    get_transaction_id_by_transfer_id

    + +

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transaction_id_by_transfer_id"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result":{
    +        "transaction_id":469
    +    }
    + }
    +
    + +

    get_transaction

    + +

    get_transaction() method returns information about a particular transaction.

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transaction_id": 1
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": 
    +    "get_transaction"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transaction_info": { 
    +            "block_height":2,
    +            "extra":"2jh1iak...123yh1g4g",
    +            "fee":0,
    +            "first_transfer_id":103,
    +            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    +            "timestamp":1409833412,
    +            "total_amount":7036820,
    +            "transfer_count":0,
    +            "transfers": 
    +            [
    +                {
    +                    "amount": 10000000000, 
    +                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                },
    +                {
    +                    "amount": 500000, 
    +                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    +                }   
    +            ]
    +        }
    +    }
    + }
    +
    + +

    get_transfer

    + +

    get_transfer() method returns a transfer that corresponds to the requested identifier

    + +

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    + +

    Output:

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "transfer_id": 0
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_transfer"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "found":true,
    +        "transfer_info": {
    +            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    +            "amount":100000
    +        }
    +    }
    + }
    +
    + +

    get_incoming_payments

    + +

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    +
    arraySee below
    + +

    Input example:

    + +
     {
    +    "params": { 
    +        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "get_incoming_payments"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "payments": [
    +            {
    +                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    +                "payments": 
    +                [ 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    +                        "unlock_time":0
    +                    },
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    +                        "unlock_time":0
    +                    }, 
    +                    {
    +                        "amount":10000000000, 
    +                        "block_height":728, 
    +                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    +                        "unlock_time":0
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + +

    list_transactions

    + +

    list_transactions() method returns an array of transactions starting from a particular id.

    + +

    Input:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    + +

    Output:

    + + + + + + + + + + + + + + + + + + +
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    +
    objectSee below.
    + +

    Input example:

    + +
     {
    +    "params": {
    +        "starting_transaction_id": 100,
    +        "max_transaction_count": 50
    +    }, 
    +    "jsonrpc": "2.0", 
    +    "id": "1", 
    +    "method": "list_transactions"
    + }
    +
    + +

    Output example:

    + +
     {
    +    "id":"1",
    +    "jsonrpc":"2.0",
    +    "result": {
    +        "transactions": [
    +            { 
    +                "block_height":2,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            },
    +            { 
    +                "block_height":3,
    +                "extra":"01e3...70f3acfc4",
    +                "fee":0,
    +                "first_transfer_id":-1,
    +                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    +                "timestamp":1409833412,
    +                "total_amount":7036820,
    +                "transfer_count":0
    +                "transfers": [
    +                    {
    +                        "amount": 102002,
    +                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    +                    }
    +                ]
    +            }
    +        ]
    +    }
    + }
    +
    + +;T; @3I"./documentation/simplewallet/json-rpc-api/;T{;{ ;I"sC + + + + + + + Simplewallet JSON RPC API | Forknote + + + + + + + + + + + +
    + +
    + + + + +
    +
    + +

    Simplewallet JSON RPC API

    + + + +

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    +
    + +

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29082/json_rpc
    + http://localhost:29082/json_rpc
    +
    + +

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    + +

    getbalance

    + +

    Return balance.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "locked_amount" : {
    +            "type" : "integer"
    +        },
    +        "available_balance" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (getbalance)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "getbalance", 
    +    "params": {}
    + }
    +
    + +

    transfer

    + +

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    + +

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "destinations" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "address" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "minItems" : 1
    +        },
    + 
    +        "payment_id": {
    +            "type" : "string"
    +        }
    +    
    +        "fee" : {
    +            "type" : "integer"
    +        },
    +        
    +        "mixin" : {
    +            "type" : "integer"
    +        },
    +        
    +        "unlock_time" : { 
    +            "type" : "integer"
    +            "description" : "Unix timestamp"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "tx_hash" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (transfer)

    + +

    Please note, payment_id is an optional argument and can be left out.

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"transfer",
    +    "params":{
    +        "destinations":[
    +        {
    +            "amount":11111,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        },
    +        {
    +            "amount":22222,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        }
    +        ],
    +        "payment_id":"", 
    +        "fee":1000000,
    +        "mixin":0,
    +        "unlock_time":0
    +    }
    + }
    +
    + +

    store

    + +

    Store wallet data.

    + +

    URL:

    + +
      /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (store)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "store", 
    +    "params": {}
    + }
    +
    + +

    get_payments

    + +

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    + 
    +        "payment_id" :  {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "payments" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "block_height" : {
    +                    "type" : "integer"
    +                },
    +                "tx_hash" : {
    +                    "type" : "string"
    +                },
    +                "unlock_time" : {
    +                    "type" : "integer"
    +                }
    +            }
    +        }
    +    }
    + }
    +
    + +

    Example (get_payments)

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"get_payments",
    +    "params":{
    +        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    +    }
    + }
    +
    + +

    get_transfers

    + +

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input: + { + “$schema”: “http://json-schema.org/draft-04/schema#”, + “title”: “Bytecoin wallet api”, + “description”: “Schema for transfer method in Bytecoin wallet”, + “type”: “object”,

    + +
        "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "transfers"
    +            "transfers" : {
    +                "type" : "array",
    +                "items" : {
    +                    "address" : {
    +                        "type" : "string"
    +                    },
    +                    "amount" : {
    +                        "type" : "integer"
    +                    },
    +                    "blockIndex" : {
    +                        "type" : "integer"
    +                    },
    +                    "fee" : {
    +                        "type" : "integer"
    +                    },
    +                    "output" : {
    +                        "type" : "boolean"
    +                    },
    +                    "paymentId" : {
    +                        "type" : "string"
    +                    },
    +                    "time" : {
    +                        "type" : "integer"
    +                    },
    +                    "transactionHash" : {
    +                        "type" : "string"
    +                    },
    +                    "unlockTime" : {
    +                        "type" : "integer"
    +                    },
    +                }               
    +            }               
    +        }
    +    }
    + }
    +
    + +

    Example (get_transfers)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_transfers", 
    +    "params": {}
    + }
    +
    + +

    get_height

    + +

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (get_height)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_height", 
    +    "params": {}
    + }
    +
    + +

    reset

    + +

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (reset)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "reset", 
    +    "params": {}
    + }
    +
    + +
    + + +
    + + + + + + + +;T; I"p, +# Simplewallet JSON RPC API + +* TOC +{:toc} + +To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet's arguments). You can choose any free port. To do that execute the following command from the command line: + + simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082 + +Having done that you're ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100): + + http://126.0.1.100:29082/json_rpc + http://localhost:29082/json_rpc + +Please note, there is no "refresh" RPC method. RPC wallet refresh is performed automatically each 20 seconds. + + +##getbalance + +Return balance. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "locked_amount" : { + "type" : "integer" + }, + "available_balance" : { + "type" : "integer" + } + } + } + +###Example (getbalance) + + { + "jsonrpc": "2.0", + "method": "getbalance", + "params": {} + } + + +##transfer + +Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time. + +Please note: fee param is a mandatory and should not be less than 0.01 BCN + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + "destinations" : { + "type" : "array", + "items" : { + "amount" : { + "type" : "integer" + }, + "address" : { + "type" : "string" + } + }, + "minItems" : 1 + }, + + "payment_id": { + "type" : "string" + } + + "fee" : { + "type" : "integer" + }, + + "mixin" : { + "type" : "integer" + }, + + "unlock_time" : { + "type" : "integer" + "description" : "Unix timestamp" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "tx_hash" : { + "type" : "string" + } + } + } + +###Example (transfer) + +Please note, payment_id is an optional argument and can be left out. + + { + "jsonrpc":"2.0", + "method":"transfer", + "params":{ + "destinations":[ + { + "amount":11111, + "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" + }, + { + "amount":22222, + "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" + } + ], + "payment_id":"", + "fee":1000000, + "mixin":0, + "unlock_time":0 + } + } + + +##store + +Store wallet data. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : {} + } + +###Example (store) + + { + "jsonrpc": "2.0", + "method": "store", + "params": {} + } + + +##get_payments + +Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + }, + + "payment_id" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "payments" : { + "type" : "array", + "items" : { + "amount" : { + "type" : "integer" + }, + "block_height" : { + "type" : "integer" + }, + "tx_hash" : { + "type" : "string" + }, + "unlock_time" : { + "type" : "integer" + } + } + } + } + } + +###Example (get_payments) + + { + "jsonrpc":"2.0", + "method":"get_payments", + "params":{ + "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9" + } + } + + +##get_transfers + +Returns the list of all the wallet's incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change). + +URL: + + /json_rpc + +Input: + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "result" : { + "type" : "transfers" + "transfers" : { + "type" : "array", + "items" : { + "address" : { + "type" : "string" + }, + "amount" : { + "type" : "integer" + }, + "blockIndex" : { + "type" : "integer" + }, + "fee" : { + "type" : "integer" + }, + "output" : { + "type" : "boolean" + }, + "paymentId" : { + "type" : "string" + }, + "time" : { + "type" : "integer" + }, + "transactionHash" : { + "type" : "string" + }, + "unlockTime" : { + "type" : "integer" + }, + } + } + } + } + } + +###Example (get_transfers) + + { + "jsonrpc": "2.0", + "method": "get_transfers", + "params": {} + } + + +##get_height + +Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "height" : { + "type" : "integer" + } + } + } + +###Example (get_height) + + { + "jsonrpc": "2.0", + "method": "get_height", + "params": {} + } + + +##reset + +Erases simplewallet's internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state. + +URL: + + /json_rpc + +Input: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : { + "jsonrpc" : { + "type" : "string" + }, + "method" : { + "type" : "string" + } + } + } + +Output: + + { + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Bytecoin wallet api", + "description": "Schema for transfer method in Bytecoin wallet", + "type": "object", + + "properties" : {} + } + +###Example (reset) + + { + "jsonrpc": "2.0", + "method": "reset", + "params": {} + } +;T; +I". +

    Simplewallet JSON RPC API

    + + + +

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    + +
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    +
    + +

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    + +
     http://126.0.1.100:29082/json_rpc
    + http://localhost:29082/json_rpc
    +
    + +

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    + +

    getbalance

    + +

    Return balance.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "locked_amount" : {
    +            "type" : "integer"
    +        },
    +        "available_balance" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (getbalance)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "getbalance", 
    +    "params": {}
    + }
    +
    + +

    transfer

    + +

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    + +

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    +        "destinations" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "address" : {
    +                    "type" : "string"
    +                }
    +            },
    +            "minItems" : 1
    +        },
    + 
    +        "payment_id": {
    +            "type" : "string"
    +        }
    +    
    +        "fee" : {
    +            "type" : "integer"
    +        },
    +        
    +        "mixin" : {
    +            "type" : "integer"
    +        },
    +        
    +        "unlock_time" : { 
    +            "type" : "integer"
    +            "description" : "Unix timestamp"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "tx_hash" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Example (transfer)

    + +

    Please note, payment_id is an optional argument and can be left out.

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"transfer",
    +    "params":{
    +        "destinations":[
    +        {
    +            "amount":11111,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        },
    +        {
    +            "amount":22222,
    +            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    +        }
    +        ],
    +        "payment_id":"", 
    +        "fee":1000000,
    +        "mixin":0,
    +        "unlock_time":0
    +    }
    + }
    +
    + +

    store

    + +

    Store wallet data.

    + +

    URL:

    + +
      /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (store)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "store", 
    +    "params": {}
    + }
    +
    + +

    get_payments

    + +

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object", 
    + 
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        },
    + 
    +        "payment_id" :  {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "payments" : {
    +            "type" : "array",
    +            "items" : {
    +                "amount" : {
    +                    "type" : "integer"
    +                },
    +                "block_height" : {
    +                    "type" : "integer"
    +                },
    +                "tx_hash" : {
    +                    "type" : "string"
    +                },
    +                "unlock_time" : {
    +                    "type" : "integer"
    +                }
    +            }
    +        }
    +    }
    + }
    +
    + +

    Example (get_payments)

    + +
     {
    +    "jsonrpc":"2.0",
    +    "method":"get_payments",
    +    "params":{
    +        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    +    }
    + }
    +
    + +

    get_transfers

    + +

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input: + { + “$schema”: “http://json-schema.org/draft-04/schema#”, + “title”: “Bytecoin wallet api”, + “description”: “Schema for transfer method in Bytecoin wallet”, + “type”: “object”,

    + +
        "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    + 
    +    "properties" : {
    +        "result" : {
    +            "type" : "transfers"
    +            "transfers" : {
    +                "type" : "array",
    +                "items" : {
    +                    "address" : {
    +                        "type" : "string"
    +                    },
    +                    "amount" : {
    +                        "type" : "integer"
    +                    },
    +                    "blockIndex" : {
    +                        "type" : "integer"
    +                    },
    +                    "fee" : {
    +                        "type" : "integer"
    +                    },
    +                    "output" : {
    +                        "type" : "boolean"
    +                    },
    +                    "paymentId" : {
    +                        "type" : "string"
    +                    },
    +                    "time" : {
    +                        "type" : "integer"
    +                    },
    +                    "transactionHash" : {
    +                        "type" : "string"
    +                    },
    +                    "unlockTime" : {
    +                        "type" : "integer"
    +                    },
    +                }               
    +            }               
    +        }
    +    }
    + }
    +
    + +

    Example (get_transfers)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_transfers", 
    +    "params": {}
    + }
    +
    + +

    get_height

    + +

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "height" : {
    +            "type" : "integer"
    +        }
    +    }
    + }
    +
    + +

    Example (get_height)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "get_height", 
    +    "params": {}
    + }
    +
    + +

    reset

    + +

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    + +

    URL:

    + +
     /json_rpc
    +
    + +

    Input:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {
    +        "jsonrpc" : {
    +            "type" : "string"
    +        }, 
    +        "method" : {
    +            "type" : "string"
    +        }
    +    }
    + }
    +
    + +

    Output:

    + +
     {
    +    "$schema": "http://json-schema.org/draft-04/schema#",
    +    "title": "Bytecoin wallet api",
    +    "description": "Schema for transfer method in Bytecoin wallet",
    +    "type": "object",
    +    
    +    "properties" : {}
    + }
    +
    + +

    Example (reset)

    + +
     {
    +    "jsonrpc": "2.0", 
    +    "method": "reset", 
    +    "params": {}
    + }
    +
    +;T; @9I"6/blog/2015-10-11-documentation-added-to-forknote/;T{;{ ;I"! + + + + + + + Documentation added to Forknote + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Documentation added to Forknote +

    + +
    +
      +
    • + + October 11, 2015 +
    • +
    • + Avatar for pmitchev + pmitchev +
    • +
    +
    + + + +

    Documentation was added for:

    + + + +

    Guides for the most common questions were created:

    + + + + + + + + +
    + + +
    +
    + + + +
    + + + + + + + +;T; I" +Documentation was added for: + +* [Daemon][documentation-daemon] +* [Simplewallet][documentation-simplewallet] +* [Payment gateway][documentation-payment-gateway] + +Guides for the most common questions were created: + +* [Getting started][guide-get-started] +* [Create coin][guide-create-coin] +* [Starting seed node][guide-starting-seed-node] + + +[documentation-daemon]: /documentation/daemon/ +[documentation-simplewallet]: /documentation/simplewallet/ +[documentation-payment-gateway]: /documentation/payment-gateway/ +[guide-get-started]: /guide/getting-started/ +[guide-create-coin]: /guide/create-coin/ +[guide-starting-seed-node]: /guide/starting-seed-node/ + + + + + +;T; +I" +

    Documentation was added for:

    + + + +

    Guides for the most common questions were created:

    + + + +;T; @?I"6/blog/2015-10-12-documentation-added-to-forknote/;T{;{ ;I"! + + + + + + + Documentation added to Forknote + + + + + + + + + + + +
    + + +
    + +
    + + +
    +
    +
    +

    + Documentation added to Forknote +

    + +
    +
      +
    • + + October 12, 2015 +
    • +
    • + Avatar for pmitchev + pmitchev +
    • +
    +
    + + + +

    Documentation was added for:

    + + + +

    Guides for the most common questions were created:

    + + + + + + + + +
    + + +
    +
    + + + +
    + + + + + + + +;T; I" +Documentation was added for: + +* [Daemon][documentation-daemon] +* [Simplewallet][documentation-simplewallet] +* [Payment gateway][documentation-payment-gateway] + +Guides for the most common questions were created: + +* [Getting started][guide-get-started] +* [Create coin][guide-create-coin] +* [Starting seed node][guide-starting-seed-node] + + +[documentation-daemon]: /documentation/daemon/ +[documentation-simplewallet]: /documentation/simplewallet/ +[documentation-payment-gateway]: /documentation/payment-gateway/ +[guide-get-started]: /guide/getting-started/ +[guide-create-coin]: /guide/create-coin/ +[guide-starting-seed-node]: /guide/starting-seed-node/ + + + + + +;T; +I" +

    Documentation was added for:

    + + + +

    Guides for the most common questions were created:

    + + + +;T; @E: versioni \ No newline at end of file diff --git a/tmp/dependencies b/tmp/dependencies new file mode 100644 index 0000000000000000000000000000000000000000..394a663bc2c3ca432dfab0442f7f928f9c2f9d27 GIT binary patch literal 7498 zcmb8z`B&4-8o+VSd+uQ``@Zk1Y1lzP1rZfxQNb0pZ)iiACQV8bK+gT=@8nBclC&uI zm!W4q&ph)?)(QWq`fuf0bxQLz`L{+-rFHk@pWS~>D#au5NVXOEwvyjfwAHjVvaJ+; zPo?mCDuv%uMSPX;-|x>-ht{EW zXdPNd&KMd)V`vPGq4j7zT94MF^=JdyfHt5FXam}aHlmGaBie{Ip-pHL+JrWt&1f^) zj5edqXbakcwxBI&3)+gdqOE8v+KRTJZDJ!lWwi}s?uXfN7}_Mv@fAKHiZq5Wt- z+K=|5{pbKXfDWJo=m0v14x)qTAUcQ+p+o2pI)o0P!{{(Nj1Hs2=mI*CrAljtNmiB6$Y=oC7IPNCE2 zG&+q=qtoaNI)l!jGw2NZ7=4UBMjxY(Q3X{{1yxW5jiYfij>geAs-h~YqAIGQv*;{3 zi_W66=o~tS&Y^SY96FEAqx0xII*%@(3+Mv6fG(hm=pwp^E~1O*61s#gp-bozx{NNP z%jhz?jIN+7=nA@muAr;vD!PiUqO0f=^a=U|eS$tg*U&X|4P8Um&~lNU33@SMc<-t(YNSZ^ey@heTTk7-=Xi&J#-J!vWK;@Gp*lThXqx`Ch{^c0sHbh9ZItaf zD)McM>=B}swvD!(wu82lwu`o#wwJb#wx4!@c2Kq%a%Mywzx~-W%$^bc>>1(Do)Jy7 z&9wgP8D`H2fA);A|!ZHDk`GlXB8L2U-L8PsM_n?Y>`wHefAP@5tA+6-zl zsLh}@gW3$?*JcR6HiNTfP@73@CbgN=W>T9;Z6>vu)MiqfNo^*znbc-dn@MdZwVBjr zQkzL_CbgN=W>T9;Z6>vu)MiqfNo^*zWvMMoPnI5wIxXt4sK+9|MFxuuHlu7t<@lY; z|Msup3wkbC#RaRlU=fZb_M&Rp#cEl%2fH>XxT@ z!nPDGmC{p+XDes6V_3GQs}<|j`LS)cV>Q!EA#0LH#yG^hfS5vYKl|!RK6H3PfzPkIDDiuJZt$ExJcd;n3VU?sXRWe z=V-ZjR#jDC0M)`iRtQK5*Hh&+ zpSJC^sVm8IdFh8w&uA!AUclEo{xj6&1cffku0rIQcI6-PxNOR;PGmLte?c{=SxMcD z=R$Ww@zjNaHs^mw;wB1n72l;)m4xSB%n zL#rvqmsV4LxwfV2SHdh)kWzNJf%wvz;(r}dTGm=*Oy~|SJe%bfA*-ZyOLv7EImjyy z9`DL0ab)oPLkCC3E&OrZRnAqeE=|u-L@qLLx_t5)3b$?ej*O-b#g?Xy-oXC$tz6pT6DVJCF|IUa z^zJHbBNbC~(t6~mMKAtv@c)tA&B_hQLz5F+n!NZx&oA;^*HZF589u<#BX%29nyfE! zJ;*(`9Z5A;Tzt>T zcZ`bFTvFw#Q@kCZ`((X?bdM<^-x&w(a7nizobH6*f z+~{dxFCNsKe9a2YENn^R{+>VZsw|$zXk2Jn#q)T3ZWJLOBERK?@*CoI)3jD=YB%w;~Cghv`;EL!hrwE%}a< zDZ*cDvZLgii@ub8rpZTXAl*HmC^9;xp2@SV7eC~f#lLR?qhsprjTGo=q{|fY?Gos1 zP;L30dnNSiKxdsA`W%%Lw5YE9h&a_8g|FTGwp4<=y7CaZastWPiV3@ja4X!T` PeQR~H5?6jRi|YRYhE6w4 literal 0 HcmV?d00001 diff --git a/tmp/rule_memory b/tmp/rule_memory new file mode 100644 index 0000000000000000000000000000000000000000..1e167c08ee4ad6df1d116e3340bd41520d9ef795 GIT binary patch literal 38013 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 Date: Mon, 12 Oct 2015 19:10:08 +0300 Subject: [PATCH 02/56] README changed --- README.md | 4 ++-- content/CNAME | 1 - static/CNAME | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 content/CNAME create mode 100644 static/CNAME diff --git a/README.md b/README.md index 6cde9f2..8d287f5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# developer.github.com +# forknote.net -This is a GitHub API resource built with [nanoc][nanoc]. +This is a Forknote API resource built with [nanoc][nanoc]. All submissions are welcome. To submit a change, fork this repo, commit your changes, and send us a [pull request](http://help.github.com/send-pull-requests/). diff --git a/content/CNAME b/content/CNAME deleted file mode 100644 index 13c09a7..0000000 --- a/content/CNAME +++ /dev/null @@ -1 +0,0 @@ -forknote.net diff --git a/static/CNAME b/static/CNAME new file mode 100644 index 0000000..04b94ff --- /dev/null +++ b/static/CNAME @@ -0,0 +1 @@ +forknote.net \ No newline at end of file From 2f1c480bc465e37989b4bf03b8d2b9ff0e2bff5c Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Tue, 13 Oct 2015 01:21:26 +0300 Subject: [PATCH 03/56] localhost used as seed node if no seed nodes are entered --- .gitignore | 2 +- Gemfile | 2 +- content/coins/index.md | 4 ---- static/partials/create.js | 5 ++++- tmp/checksums | 6 +++--- tmp/compiled_content | 38 +++++++++++++------------------------- tmp/dependencies | Bin 7498 -> 7499 bytes tmp/rule_memory | Bin 38013 -> 38059 bytes 8 files changed, 22 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 6940556..d80be00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .DS_Store -/output +output/ Gemfile.lock crash.log diff --git a/Gemfile b/Gemfile index 7a4b3f3..64969aa 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source "http://rubygems.org" -ruby '2.1.6' +ruby '2.2.1' gem 'builder' gem 'coderay' diff --git a/content/coins/index.md b/content/coins/index.md index 1d63bdd..021824d 100644 --- a/content/coins/index.md +++ b/content/coins/index.md @@ -118,7 +118,6 @@ body_class: coins - @@ -157,7 +156,6 @@ body_class: coins - @@ -183,7 +181,6 @@ body_class: coins - @@ -209,7 +206,6 @@ body_class: coins - diff --git a/static/partials/create.js b/static/partials/create.js index 4fb44fa..20a5ef3 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -486,7 +486,10 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$timeout', fu } } } - $scope.coin_daemon_config += "UPGRADE_HEIGHT=1"; + $scope.coin_daemon_config += "UPGRADE_HEIGHT=1" + "\n"; + if(!$scope.coin.core['SEED_NODES'].length) { + $scope.coin_daemon_config += "seed_nodes=127.0.0.1:" + $scope.coin.core['P2P_DEFAULT_PORT']; + } } diff --git a/tmp/checksums b/tmp/checksums index 268c1ed..c800228 100644 --- a/tmp/checksums +++ b/tmp/checksums @@ -1,3 +1,3 @@ -{: data{[: itemI"/:ETI"!n/R6wBDp8Jl01K/BujNcwAtE6yE=;F[;I"#/static/css/documentation.css/;TI"!qXpHSniHnadPnyRn4sAOrQkArc4=;F[;I""/static/css/Octicons LICENSE/;TI"!yarr1bEZisvhguDDzkzfkT/eEG8=;F[;I"/static/css/octicons.css/;TI"!R4zRWIdc/YIwdZuBxR03R2btl8M=;F[;I"/static/css/octicons.eot/;TI"!wcZHegIKQ26XxQnEt0mkCIfq3gc=;F[;I"/static/css/octicons.svg/;TI"!+aJ3kNuxWQTrmrwrMSfISkDC0+M=;F[;I"/static/css/octicons.ttf/;TI"!JBadIa622Rj8p9twGvtxu2eq13A=;F[;I"/static/css/octicons.woff/;TI"!aZ8AIpal91pGuXI04FOukq9viOw=;F[;I"/static/css/pygments.css/;TI"!00JMCc3CMhiXp7Zz2UDxbNbIhrc=;F[;I"/static/css/reset.css/;TI"!hOCI7rZb3VpviiPGclfqNl4nNVc=;F[;I"/static/favicon.ico/;TI"!WH5fxYLwVN6H05wHb0PY0j1yEqQ=;F[;I"/static/images/cancel.png/;TI"!Db0OPZuGus0DUu3T7AlGTMg09BA=;F[;I""/static/images/cancel@2x.png/;TI"!165/uAzx6C8vXTQfOh8WtzUg5f0=;F[;I"&/static/images/expand-arrows.png/;TI"!GeIcKKtSapziduolSPVdc7PScoM=;F[;I")/static/images/expand-arrows@2x.png/;TI"!Oir5HlwZ0WwL6I8RNfVJ9EMyfT4=;F[;I""/static/images/feed-icon.png/;TI"!0WJVdamkMxFuTaxOUEs6dRkobHw=;F[;I"%/static/images/feed-icon@2x.png/;TI"!hCXxQnPkt3xevfhfH342LRGIE7E=;F[;I"/static/images/header.png/;TI"!9ucTImTUWufPUqXkDDOP+JVpqO0=;F[;I""/static/images/header@2x.png/;TI"!yZeGPGr7NHOJB7f3kAiDqTvsHW8=;F[;I"'/static/images/logo_developer.png/;TI"!aMgx9IpZmJJ2P9bIGMeLM9soGac=;F[;I"*/static/images/logo_developer@2x.png/;TI"!PjMQmMzeemXkNqDwomSFfgJarTU=;F[;I" /static/images/mark@2x.png/;TI"!IfY3UuDSQQF5NxbZNODlJ8EIE0Y=;F[;I"/static/images/search.png/;TI"!q8CUIJSg0diBOLGZYs+trVIBCSY=;F[;I""/static/images/search@2x.png/;TI"!R/I68UXs7uHAV90ZHDH37X4je4g=;F[;I")/static/images/status-icon-good.png/;TI"!w0jknd5FyYaoo5V9rDXuabKMpWc=;F[;I",/static/images/status-icon-good@2x.png/;TI"!sd1zNo/Js/QR3zxOjNMNSTEYCqQ=;F[;I"*/static/images/status-icon-major.png/;TI"!S3w4XOmkWp8ezmkcRCPmUni9Ckc=;F[;I"-/static/images/status-icon-major@2x.png/;TI"!7I1aqP1kOQJkv/8cngChCC0axm4=;F[;I"*/static/images/status-icon-minor.png/;TI"!XAF1nAgPA9kcGIoBGSZ5etyHPmc=;F[;I"-/static/images/status-icon-minor@2x.png/;TI"!JfEsTn0qboiOtgsYvmcz6Q7Wrkw=;F[;I",/static/images/status-icon-unknown.png/;TI"!7kbF5YbpxmBKLp4OlHZ30vCkHvQ=;F[;I"//static/images/status-icon-unknown@2x.png/;TI"!WvlxgO7pf0b7Y0oVoTGARbvrDX0=;F[;I"/static/js/dev_mode.js/;TI"!O71WUnwGgr8UQoaUqeTvis7HIIQ=;F[;I"!/static/js/documentation.js/;TI"!w8nvbBf0GWevQvIS0MXsEC2Mn/U=;F[;I"/static/js/jquery.js/;TI"!ImuWzfo0qWHboBsgmoFg9ANEgkA=;F[;I"/static/js/retina.js/;TI"!gacZeZGpJ/hd3P73/afsGm9661w=;F[;I"/static/search-index.json/;TI"!5IBnx2P5LGQYfns6Z3QJlvDWT4g=;F[: layoutI" /blog/;TI"!KZpjevmrTWc4p1IcBeinOKHx8Ys=;F[;I"/default/;TI"!DBWy0DCZKruEUh7Oi7hHFJv03ZA=;F[;I" /footer/;TI"!OydrUTrP3TxP2/fv4/rcgoEJgQA=;F[;I" /head/;TI"!gxxSP3pbBMPpa/ZAOFEiaVmHl88=;F[;I" /header/;TI"!5JnFml/4nOEANQ12xMwoTS+1040=;F[;I"/headlines/;TI"!tEszD0FzfIfTYtLX8jViVWLxtEw=;F[;I"/overview/;TI"!QOZFTXh90z9kUHLINDA66t392q8=;F[;I"/sidebar/;TI"!KKfy1JBO/bmqJxWvekJq3UU1aOA=;F[:code_snippetI"lib/default.rb;TI"!yTBhn0BxSgflAFqAmcOZ+irgGRA=;F[; I"lib/search_generator.rb;TI"!N+DVntbdaPARj3TTYneq+5RT3aM=;F[; I"lib/static.rb;TI"!V1bWoV4huzpkL9D57TBf1YD4R1w=;F[; I"lib/tip_filter.rb;TI"!e/PRlt/AMevywm+mX9fQmO4sadk=;F: configI"!2UOO8/5hT6Q6bHr1nKzWX+CPjlk=;F: -rulesI"!r3ygHiFPANlfASMaAXf2CUS+V2w=;F[;I"/contact/;TI"!eQMhDfP0tWxE7o/FOKfUZo4B2Rk=;F[;I"/services/;TI"!fuEDUcST8G8aQ0Tb7+aiTINak4I=;F[;I" /about/;TI"!cM+NO66WMpBX+DM2X9NPnxw9oRw=;F[;I"/about/mission/;TI"!gY+MGITFHeSli4ViQc91lQaiPKE=;F[;I" /about/;TI"!z2rycOQH4XvEPlI6IDlJV77HxCU=;F[;I"/information/;TI"!f3WnHEFbe3Ycdwn6FR3lJ+Q1ULA=;F[;I"/services/;TI"!WCMg/QE0jpxgpgt+XQ3lOEPrcE4=;F[;I"/services/mission/;TI"!/WdK/cyNxHHOwkuRwpUQFPyeWD0=;F[;I"!/services/private-reception/;TI"!/SNUoGxXQ65fChqVg240boi0za0=;F[;I"$/services/virtual-consultation/;TI"!S/4TFnH6jI0g1f6MZD03RkuV1Tg=;F[;I"/information/;TI"!jpUJAtUZZIWtRxId6HPlPB7Whxc=;F[;I"/contact/;TI"!Ez2kc/Lc+UMee6FROpdpSHgPLuQ=;F[;I"/static/images/logo.png/;TI"!reJBcU50Xz/ydClPAW73Dpc0aPc=;F[;I" /static/images/logo@2x.png/;TI"!qoTRQsaRfD1uf20Iw0+rbSwEymM=;F[;I"$/static/images/tooth-fairy.jpg/;TI"!eBri1vTKZlLcDHmGyR5mQv1yLxU=;F[;I"$/static/images/tooth-fairy.png/;TI"!IRDwFijOTLVgL4YZ4w525VV5HCQ=;F[;I",/static/images/tooth-fairy-reverse.png/;TI"!7jlQZA9P5YrqAcLSrP4aCHhXXjk=;F[;I"F/blog/2015-09-03-ensure-your-app-is-ready-for-protected-branches/;TI"!tLhRQ7KnpCFlNdpVB1Wycojhoyg=;F[;I" /blog/;TI"!77ATGIJZd4u8urTxrXBW3/N//AM=;F[;I" /_meta/;TI"!YHyTHHEaLKWrurc010/ua07n8oA=;F[;I" /_posts/;TI"!mdbNjg3AE4+JbOf453aZG0vAB4M=;F[; I"lib/blog_helper.rb;TI"!WGEGnXJwpbl0+aRoJr/DTEJ50Gc=;F[;I"3/blog/2014-07-09-status-contexts-are-official/;TI"!nV47pC+QFhoXJpGV8Bl2LAwZuPc=;F[;I"B/blog/2014-07-28-assignee-and-label-actions-for-issue-events/;TI"!gR3INpDNGkm+mB1HWUC+w33c5lw=;F[;I"+/blog/2014-08-05-team-memberships-api/;TI"!bViezBivTo4z6sWlvVuyZ4RpDlk=;F[;I"/_changes/;TI"!1j0OUxy6fLcVWdOf9/mgrT9782Q=;F[;I"!/blog/2015-06-02-experiment/;TI"!HxkU6fou8FYuz8/OpVEaHLGydF4=;F[;I"//blog/2015-07-01-паста-за-зъби/;TI"!jdh43+lUkCQf4/M4PGtgOaFC4Ts=;F[;I"!/blog/2015-07-29-успех/;TI"!AuXlrd64Xbm4e4h4w/SMB+yJjvM=;F[;I"H/blog/2015-04-07-какво-не-казва-зъболекарят/;TI"!IkXz0jtPU/ltsh99v57b+rvSoqM=;F[;I"H/blog/2015-05-05-хранене-за-бъдещи-родители/;TI"!kG8Y7AHspUW2kqD72w2lIxlJT3M=;F[;I"/blog/2015-05-12-apple/;TI"!NCKjGefP6iXyQaivbwVnEnkcPMk=;F[;I":/blog/2015-01-05-ново-аз-нова-година/;TI"!B78bU7q7sVbf/rUlr3S7KiUR/QA=;F[;I"*/blog/2015-01-12-обяд-навън/;TI"!cer1RDkc9FAMCPzBfv9cbzpUi+0=;F[;I"1/blog/2015-01-21-съвети-лош-дъх/;TI"!M++OIHyvgAKxY4bGZk6b+J+cAK4=;F[;I"%/blog/2015-01-27-шоколад/;TI"!zZqHvJqgs5fZSiisR5AC5PytGkE=;F[;I"(/blog/2015-02-03-аутопсия1/;TI"!O2XWzXe6t1bAANSLQxLE3u8tv5M=;F[;I"%/blog/2015-02-08-ваксини/;TI"!Qe6erczFabVdjQFgjIB4SCxqors=;F[;I"(/blog/2015-03-25-без-болка/;TI"!iYtpDEreMDn8fivVEAi4WmIgd6Q=;F[;I"(/static/images/posts/Antiaging.jpg/;TI"!qgGZdQ7bqa2aJhlTSfadGednqAU=;F[;I"&/static/images/posts/Banana1.jpg/;TI"!t2IUvO3Jo+ZJq1iOl0u0soFbFgg=;F[;I"&/static/images/posts/Banana2.jpg/;TI"!eeistoiPEIcoCSUurAq+N81ohp4=;F[;I"$/static/images/posts/Beets.jpg/;TI"!xr4OfqvwfCgJjCaT8B8uF77KLeo=;F[;I"&/static/images/posts/Berries.jpg/;TI"!t07+pnXyuKi8BU/XDlB8Pozmkao=;F[;I"$/static/images/posts/Bread.jpg/;TI"!rJGMw2T/I8QurprzCvmfanlq1MY=;F[;I"%/static/images/posts/carbo3.jpg/;TI"!NzSvAnwQT75NvIGNNs0avysb0dA=;F[;I"%/static/images/posts/carbo4.jpg/;TI"!qS09r3v0JAezxNVeukKxVnjeA84=;F[;I"$/static/images/posts/Choco.jpg/;TI"!WwZjammYRwdXlZ+dCpfeP5VUpX0=;F[;I"$/static/images/posts/Clock.jpg/;TI"!yqPi9fZZrMCQiwI48SECchC1SIw=;F[;I"%/static/images/posts/Coffee.jpg/;TI"!f1gS8UgD5XdcKbZRZJeTMWXrxr0=;F[;I"#/static/images/posts/Cold.jpg/;TI"!ZqW3qNiVn845uMvKqbsR6sISTQ0=;F[;I"'/static/images/posts/Cravings.jpg/;TI"!615koEfTPLpro3z2jMTE0oUcNxM=;F[;I"#/static/images/posts/Diet.jpg/;TI"!+JW5m3dR/hIz38ILXc3DFPxcKck=;F[;I""/static/images/posts/Dog.jpg/;TI"!SF7YODvYuf9SHsej+mDGLu6GWMQ=;F[;I"#/static/images/posts/eggs.jpg/;TI"!dLqfZGaMJgiJ8a3xNUlEvYPwSgk=;F[;I"#/static/images/posts/Fats.jpg/;TI"!9h/dXntFuVD9vH3DdxTR9vIM07M=;F[;I"(/static/images/posts/Fivesteps.jpg/;TI"!Jsix+kiz0QBjOgqe7gT9bAml3MY=;F[;I"%/static/images/posts/Garlic.jpg/;TI"!5zCGbRxK1k4Nd+/XaVvDFlt0Ifo=;F[;I"$/static/images/posts/Gifts.jpg/;TI"!AluKJbT/g8FZBLE51loJG+UF5j8=;F[;I"$/static/images/posts/Honey.jpg/;TI"!p7kbo8BhiRNff/xd4FDnUSPTgXo=;F[;I"*/static/images/posts/Ingredients.jpg/;TI"!yvDBfLlDI0wqLSmL/UEzel4BUT8=;F[;I"'/static/images/posts/Lunchbox.jpg/;TI"!9vysVzeUBOAvctdsZw2ykE+LvHg=;F[;I"&/static/images/posts/Newyear.jpg/;TI"!SH/EL7CYZ4wiN/3uZhqgQmZ1K1k=;F[;I"$/static/images/posts/Paste.jpg/;TI"!qdSXCcJNkZtH9UWvYntPdg1K7OA=;F[;I""/static/images/posts/Pig.jpg/;TI"!osfAw2Uc+IT7mSOflVtInYRhfo0=;F[;I"#/static/images/posts/Preg.jpg/;TI"!395tz47gcDXcE+6jT98OYBNUyvg=;F[;I"&/static/images/posts/Pyramid.jpg/;TI"!0Uwy0S/jMjARPFtBhG5753X5Gkg=;F[;I"'/static/images/posts/Raya-blw.jpg/;TI"!nL875Fc8Gk/TauW+6bkMA2Dplhs=;F[;I"$/static/images/posts/Smell.jpg/;TI"!XXSFQiortGq0FOmG9i/6Giy3ats=;F[;I"#/static/images/posts/Snow.jpg/;TI"!c3GjPErrJN03kjPXAJh1+1cQDr0=;F[;I"%/static/images/posts/Stress.jpg/;TI"!kzjWKMaAXM+nwCyfiiP8yad0q00=;F[;I"&/static/images/posts/Tooth10.jpg/;TI"!0+JGVRNMpOG0KYfhQ3EGk2umusY=;F[;I"&/static/images/posts/Tooth11.jpg/;TI"!Q86N63H6pFoXBDMHoKDgXy0XOug=;F[;I"&/static/images/posts/Tooth12.jpg/;TI"!0k15mRb0FtmB9DkC4ENHO1/eOUM=;F[;I"&/static/images/posts/Tooth13.jpg/;TI"!lRoPFsPDcwg/imSc9REaC+Dyguc=;F[;I"&/static/images/posts/Tooth14.jpg/;TI"!xBBxWSf79JsZkxeXOL0uqRx1U/s=;F[;I"&/static/images/posts/Tooth15.jpg/;TI"!DICZdhufwJUl/vgDWw6FJY0D5QE=;F[;I"&/static/images/posts/Tooth16.jpg/;TI"!LfmLRfDjVccqA7LIqZ1qIeZOfcU=;F[;I"&/static/images/posts/Tooth17.jpg/;TI"!pe4yN2rrZeAz55rRRQ6+PvLv2Ig=;F[;I"%/static/images/posts/Tooth5.jpg/;TI"!7+42ju44LINFgE1JUrnShj9pZL8=;F[;I"%/static/images/posts/Tooth6.jpg/;TI"!dmye/dhfw6KjGMKl6iGoQRGYNiM=;F[;I"%/static/images/posts/Tooth7.jpg/;TI"!i0ph20Sp2Y6wL3MYhG4I7f4wbaI=;F[;I"%/static/images/posts/Tooth8.jpg/;TI"!MUzlAZES+cn7EdrzYq++FiohKzA=;F[;I"%/static/images/posts/Tooth9.jpg/;TI"!mc3Kcw6HaFEcLINM08dFWC534xY=;F[;I"&/static/images/posts/Veggies.jpg/;TI"!ACdG8LXkK9TbF//da6vaIMBpqBg=;F[;I"#/static/images/posts/Zele.jpg/;TI"!lMIcd6+wZ1vb0V8ytit3r9fZUVM=;F[;I"Y/blog/2014-08-02-пет-стъпки-към-здравословно-хранене/;TI"!ZkGhgzjjDXTGvE9O8MLbprpVme0=;F[;I")/blog/2014-08-10-зеленчуци/;TI"!cClbBQDE16+9zEzPVaT30LaPOG0=;F[;I",/blog/2014-08-17-вкусно-лято/;TI"!kGGZYKbYnjQzpMZ/1vaNDi7d+Ws=;F[;I"8/blog/2014-08-24-пълнозърнест-хляб/;TI"!v1gcF7pkvz2k0riae9h9onuASp0=;F[;I")/blog/2014-08-29-пшеницата/;TI"!VSWD5rpHtEUYNKrgkoTvvS30huc=;F[;I"!/blog/2014-09-14-чесън/;TI"!zWWYSw7uVXUqtkjnhQpx4GVmDr0=;F[;I"3/blog/2014-09-22-настинка-и-грип/;TI"!/0up+cGPCqYwiUz2G1YkHhILO2k=;F[;I"+/blog/2014-09-30-отслабване/;TI"!JtHkLmTdFOowAbVNPV8GNhIcTm0=;F[;I"2/blog/2014-10-07-червено-цвекло/;TI"!fgq5nx930POKoh3gt7pp6hqwZtA=;F[;I":/blog/2014-10-14-ферментирали-храни/;TI"!GCfre1jP1RlvYaeoxaKot0z38uc=;F[;I"G/blog/2014-10-19-за-какво-гладува-тялото-ви/;TI"!QX8Y+j7vxkNVUhlp+2qdR/U+opw=;F[;I"7/blog/2014-10-28-липса-на-движение/;TI"!cX01omlRAXx08jx1ynklmikzjcM=;F[;I"-/blog/2014-11-04-антиейджинг/;TI"!08WJce2ZYZBDKX1gAqqe14ASPxA=;F[;I"T/blog/2014-11-04-как-да-заличим-следите-на-времето/;TI"!cLxun7aEO1WESaYckqMWd3M9o18=;F[;I"%/blog/2014-11-11-закуска/;TI"!tFiEa14uyPWuJGN8A0qR/OJgXw0=;F[;I"/blog/2014-11-17-мед/;TI"!CcTJ+dN77IQEUzTFG0+uoksUGxk=;F[;I"(/blog/2014-11-25-на-бюджет/;TI"!JzpXbVFzENqGdyALrzWhECquGcw=;F[;I":/blog/2014-12-01-бананови-палачинки/;TI"!drDBJUTPWbtWVfgqc8rySN53/Mc=;F[;I"'/blog/2014-12-09-подаръци/;TI"!d5rImDzDSsccBp+x06rdp9J4vxY=;F[;I"6/blog/2014-12-16-празнични-съвети/;TI"!e2mdGCtb+Cn740lHpgQZLDqbfqk=;F[;I"_/blog/2014-02-19-кои-са-най-добрите-четка-и-паста-за-зъби/;TI"!wxBoMb/If9kpNnDrdBk20GKyhgw=;F[;I"Q/blog/2014-02-24-вижте-тайната-за-перфектни-зъби/;TI"!bgD/u3NxzWAvJEOqjDEYy9qO70c=;F[;I"G/blog/2014-02-27-храни-за-здрави-зъби-част-1/;TI"!cQp+gvdMilgQjkfN4ErSbBS0ipk=;F[;I"G/blog/2014-03-03-храни-за-здрави-зъби-част-2/;TI"!ecjp6XZHhWQVDWwGYWWsSRo1aWE=;F[;I")/blog/2014-03-07-избелване/;TI"!TA2arNqQBceXumSKVZqwa/hl9Do=;F[;I"'/blog/2014-03-12-витамини/;TI"!DdNtRgs4Gtk/Ox8K89oAjTXAik0=;F[;I"/static/images/documentation/create-form-seed-screen.png/;TI"!yow2a9w9quompUOrsf9m6AXTJZk=;F[;I":/static/images/documentation/create-form-genesis.png/;TI"!KXpC5KrLzWtpaYjjVAg9OfpdqQc=;F[;I"7/static/images/documentation/create-form-seed.png/;TI"!I3Cs0nVocm1gM5XskO22388fILM=;F[;I"2/static/images/documentation/create-form.png/;TI"!qJGU3bPfYIaMiOTrx8vLqcEIp00=;F[;I"/static/images/documentation/create-form-seed-screen.png/;TI"!yow2a9w9quompUOrsf9m6AXTJZk=;F[;I":/static/images/documentation/create-form-genesis.png/;TI"!mt8k3CCyznkgWgV1yMdRI55+gP0=;F[;I"7/static/images/documentation/create-form-seed.png/;TI"!TbaYPFTTVfDdsPhzTWZdItI4tlE=;F[;I"2/static/images/documentation/create-form.png/;TI"!y6pAsR55Qy3yzShOqgWD0WuLrhM=;F[;I" +{: data{I"/:ET{: default{ : lastI"t @@ -18315,7 +18315,7 @@ I"

    Форма за контакт

    Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си.

    -;T; @I"!/static/assets/js/base58.js/;T{;{I""/static/assets/js/cn_util.js/;T{;{I"!/static/assets/js/config.js/;T{;{I"!/static/assets/js/crypto.js/;T{;{I")/static/assets/js/lib/biginteger.js/;T{;{I"#/static/assets/js/mnemonic.js/;T{;{I"%/static/dist/ng-google-chart.js/;T{;{I"$/static/dist/showErrors.min.js/;T{;{I""/static/partials/create.html/;T{;{I" /static/partials/create.js/;T{;{I"'/static/images/forknote-large.png/;T{;{I"*/static/images/forknote-large@2x.png/;T{;{I"'/static/images/forknote-small.png/;T{;{I"*/static/images/forknote-small@2x.png/;T{;{I" /coins/;T{;{ ;I"T0 +;T; @I"!/static/assets/js/base58.js/;T{;{I""/static/assets/js/cn_util.js/;T{;{I"!/static/assets/js/config.js/;T{;{I"!/static/assets/js/crypto.js/;T{;{I")/static/assets/js/lib/biginteger.js/;T{;{I"#/static/assets/js/mnemonic.js/;T{;{I"%/static/dist/ng-google-chart.js/;T{;{I"$/static/dist/showErrors.min.js/;T{;{I""/static/partials/create.html/;T{;{I" /static/partials/create.js/;T{;{I"'/static/images/forknote-large.png/;T{;{I"*/static/images/forknote-large@2x.png/;T{;{I"'/static/images/forknote-small.png/;T{;{I"*/static/images/forknote-small@2x.png/;T{;{I" /coins/;T{;{ ;I"/ @@ -18472,12 +18472,11 @@ I" - -

    </div>

    + -

    </div>

    + -

    </div>

    + -

    </div>

    + @@ -18617,7 +18613,7 @@ I" -;T; I"&$ +;T; I"#
    @@ -18732,7 +18728,6 @@ I" -
    @@ -18771,7 +18766,6 @@ I" - @@ -18797,7 +18791,6 @@ I" - @@ -18823,13 +18816,12 @@ I" - ;T; -I"$ +I"#
    @@ -18944,12 +18936,11 @@ I"$ -
    -

    </div>

    + -

    </div>

    + -

    </div>

    + -

    </div>

    + @@ -49547,4 +49535,4 @@ I"
  • Starting seed node
  • -;T; @E: versioni \ No newline at end of file +;T; @EI"/static/CNAME/;T{;{: versioni \ No newline at end of file diff --git a/tmp/dependencies b/tmp/dependencies index 394a663bc2c3ca432dfab0442f7f928f9c2f9d27..7b78bbeab78cd45c930afba65ffe87a43343a8e4 100644 GIT binary patch delta 245 zcmX?Qb=qozD5J+lu`|q@Uod}QQ{{|iz*kjw_lW`kw3Gr1=}=Wd={#v{ZIQk?_j zH}f=47UGqY2l4YVxxu6Wm=pw)QeaYHvOljTqtN7HUR};2u!%*P(vw&6N>4t;yLxjw e-&$rqVg2Hg#FETpeP=&MU)M=OBAac6c)0;JMMwnz delta 233 zcmX?Yb;@djD5K{_u`|q!44dyVe`S;Bjb_hG&*TG>{9sZ5NM>X*0LjcuhRNT#^i`$6 zY#A^q3nt~jq&%2Z0Fqfim4V#N?22GE+vM}y;*&pd*GYo-*_mu$k{wKP0m&So>P{Yr z>YPlr$?Uw!@;pHCyi7qbDFh~^!6e9pJfIp+Ud_oByc(Q^nIP8`0ZmxRE6rS#sWAB< X?>bgzKSy8J%}IQ_m^YgWiE#q}r(;Ad diff --git a/tmp/rule_memory b/tmp/rule_memory index 1e167c08ee4ad6df1d116e3340bd41520d9ef795..e52db7b4cfbbb11ee772be597f61b50b92286769 100644 GIT binary patch delta 53 zcmeynf@$?iCSDefYIZBml*E$6Y9`5zys1+rH%w;Z5Y{g)Ni4}so_s%9f!m6wEVZaO JGe0kr4FKYW5&QrE delta 36 rcmZ3zlIiaXCSDefYIZBml*E$6Y9@(|ys1;Tt$4~(i;6Sz^D@~0*&GXq From 736dc3c276946a0ec2209e28a35364fae0742f52 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Tue, 13 Oct 2015 01:26:58 +0300 Subject: [PATCH 04/56] Remove temporary files --- .gitignore | 1 + tmp/checksums | 3 - tmp/compiled_content | 49538 ----------------------------------------- tmp/dependencies | Bin 7499 -> 0 bytes tmp/rule_memory | Bin 38059 -> 0 bytes 5 files changed, 1 insertion(+), 49541 deletions(-) delete mode 100644 tmp/checksums delete mode 100644 tmp/compiled_content delete mode 100644 tmp/dependencies delete mode 100644 tmp/rule_memory diff --git a/.gitignore b/.gitignore index d80be00..0b437be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store output/ +tmp/ Gemfile.lock crash.log diff --git a/tmp/checksums b/tmp/checksums deleted file mode 100644 index c800228..0000000 --- a/tmp/checksums +++ /dev/null @@ -1,3 +0,0 @@ -{: data{ [: itemI"/:ETI"!FZBGOnBajsn8OCUQ9BaOAjY1jsg=;F[;I"#/static/css/documentation.css/;TI"!gxhdbNexjhWuPdm/5eSLfED0k0s=;F[;I""/static/css/Octicons LICENSE/;TI"!925TVmaorniHAeQe17DFR4j5deg=;F[;I"/static/css/octicons.css/;TI"!why8kTaRBU5qCluy6+58dc1Lv2k=;F[;I"/static/css/octicons.eot/;TI"!HBIsUb4brdRSV2i5eO0txtaqfJU=;F[;I"/static/css/octicons.svg/;TI"!T2xHbUMMaxWbWLj8yw3RzYen6eA=;F[;I"/static/css/octicons.ttf/;TI"!TkoYFsAjvqCowna+C/r9ptm6SeQ=;F[;I"/static/css/octicons.woff/;TI"!EbbYYoS+wSnnxnj0BiYODlXba3M=;F[;I"/static/css/pygments.css/;TI"!6NX9nNo89Xxx37XlrGIKahDZi/Q=;F[;I"/static/css/reset.css/;TI"!2KL5Sh4Ez426P8InAPhKT1gY0C8=;F[;I"/static/favicon.ico/;TI"!lWMzftsT2BNTDqOg4DwdpTdyRp4=;F[;I"/static/images/cancel.png/;TI"!Q+mNHcp5jySUgpu2aOcBrlWN7KM=;F[;I""/static/images/cancel@2x.png/;TI"!0hL5BzcFQMLzwnH6x9g2bU9MID4=;F[;I"&/static/images/expand-arrows.png/;TI"!64CY1PjlpEK6unDbCV/vtY+rW9o=;F[;I")/static/images/expand-arrows@2x.png/;TI"!pSB6pZ0ly9gsQenITJquFWZQm44=;F[;I""/static/images/feed-icon.png/;TI"!KL0NiAHey5MXJOGqDQlV4nqTt6M=;F[;I"%/static/images/feed-icon@2x.png/;TI"!98uQY5Vd+oKLfApM1HUpz2+O4u4=;F[;I"/static/images/header.png/;TI"!Up33slGPcxLVg3oTv/Nh+EbdvIM=;F[;I""/static/images/header@2x.png/;TI"!GyIXaL3pIFri0KvxyY7nRX31lI4=;F[;I"'/static/images/logo_developer.png/;TI"!aMgx9IpZmJJ2P9bIGMeLM9soGac=;F[;I"*/static/images/logo_developer@2x.png/;TI"!PjMQmMzeemXkNqDwomSFfgJarTU=;F[;I" /static/images/mark@2x.png/;TI"!IfY3UuDSQQF5NxbZNODlJ8EIE0Y=;F[;I"/static/images/search.png/;TI"!HVkxkRoLwr71++1LkwQyNnYySzE=;F[;I""/static/images/search@2x.png/;TI"!cEWWhIT4yTVcUcSwnC4cRalf7mI=;F[;I")/static/images/status-icon-good.png/;TI"!w0jknd5FyYaoo5V9rDXuabKMpWc=;F[;I",/static/images/status-icon-good@2x.png/;TI"!sd1zNo/Js/QR3zxOjNMNSTEYCqQ=;F[;I"*/static/images/status-icon-major.png/;TI"!S3w4XOmkWp8ezmkcRCPmUni9Ckc=;F[;I"-/static/images/status-icon-major@2x.png/;TI"!7I1aqP1kOQJkv/8cngChCC0axm4=;F[;I"*/static/images/status-icon-minor.png/;TI"!XAF1nAgPA9kcGIoBGSZ5etyHPmc=;F[;I"-/static/images/status-icon-minor@2x.png/;TI"!JfEsTn0qboiOtgsYvmcz6Q7Wrkw=;F[;I",/static/images/status-icon-unknown.png/;TI"!7kbF5YbpxmBKLp4OlHZ30vCkHvQ=;F[;I"//static/images/status-icon-unknown@2x.png/;TI"!WvlxgO7pf0b7Y0oVoTGARbvrDX0=;F[;I"/static/js/dev_mode.js/;TI"!gBKB312z8T/JmmJ7eWIg/eAWIAQ=;F[;I"!/static/js/documentation.js/;TI"!Q0ggfvzDkWUxzqnS8YoimVCLv/4=;F[;I"/static/js/jquery.js/;TI"!v/9/3egPGa+x4kQigD2G4PUxpIM=;F[;I"/static/js/retina.js/;TI"!wulLtjhDo4xc2lILvFDmQ1koB0c=;F[;I"/static/search-index.json/;TI"!NQ5Qw+2D9l86LJYydNAC3ZW+OP4=;F[: layoutI" /blog/;TI"!KZpjevmrTWc4p1IcBeinOKHx8Ys=;F[;I"/default/;TI"!DBWy0DCZKruEUh7Oi7hHFJv03ZA=;F[;I" /footer/;TI"!OydrUTrP3TxP2/fv4/rcgoEJgQA=;F[;I" /head/;TI"!gxxSP3pbBMPpa/ZAOFEiaVmHl88=;F[;I" /header/;TI"!5JnFml/4nOEANQ12xMwoTS+1040=;F[;I"/headlines/;TI"!tEszD0FzfIfTYtLX8jViVWLxtEw=;F[;I"/overview/;TI"!QOZFTXh90z9kUHLINDA66t392q8=;F[;I"/sidebar/;TI"!KKfy1JBO/bmqJxWvekJq3UU1aOA=;F[:code_snippetI"lib/default.rb;TI"!yTBhn0BxSgflAFqAmcOZ+irgGRA=;F[; I"lib/search_generator.rb;TI"!N+DVntbdaPARj3TTYneq+5RT3aM=;F[; I"lib/static.rb;TI"!V1bWoV4huzpkL9D57TBf1YD4R1w=;F[; I"lib/tip_filter.rb;TI"!e/PRlt/AMevywm+mX9fQmO4sadk=;F: configI"!2UOO8/5hT6Q6bHr1nKzWX+CPjlk=;F: -rulesI"!r3ygHiFPANlfASMaAXf2CUS+V2w=;F[;I"/contact/;TI"!eQMhDfP0tWxE7o/FOKfUZo4B2Rk=;F[;I"/services/;TI"!fuEDUcST8G8aQ0Tb7+aiTINak4I=;F[;I" /about/;TI"!cM+NO66WMpBX+DM2X9NPnxw9oRw=;F[;I"/about/mission/;TI"!gY+MGITFHeSli4ViQc91lQaiPKE=;F[;I" /about/;TI"!z2rycOQH4XvEPlI6IDlJV77HxCU=;F[;I"/information/;TI"!f3WnHEFbe3Ycdwn6FR3lJ+Q1ULA=;F[;I"/services/;TI"!WCMg/QE0jpxgpgt+XQ3lOEPrcE4=;F[;I"/services/mission/;TI"!/WdK/cyNxHHOwkuRwpUQFPyeWD0=;F[;I"!/services/private-reception/;TI"!/SNUoGxXQ65fChqVg240boi0za0=;F[;I"$/services/virtual-consultation/;TI"!S/4TFnH6jI0g1f6MZD03RkuV1Tg=;F[;I"/information/;TI"!jpUJAtUZZIWtRxId6HPlPB7Whxc=;F[;I"/contact/;TI"!6ZqaU+wlBFOCNAHLPtqWc5fcRbE=;F[;I"/static/images/logo.png/;TI"!RCaD5/wZt+dOUpOFSX2YMut26cA=;F[;I" /static/images/logo@2x.png/;TI"!NiVHGtQ1MDXChj1X7zRK0WId5aU=;F[;I"$/static/images/tooth-fairy.jpg/;TI"!eBri1vTKZlLcDHmGyR5mQv1yLxU=;F[;I"$/static/images/tooth-fairy.png/;TI"!IRDwFijOTLVgL4YZ4w525VV5HCQ=;F[;I",/static/images/tooth-fairy-reverse.png/;TI"!7jlQZA9P5YrqAcLSrP4aCHhXXjk=;F[;I"F/blog/2015-09-03-ensure-your-app-is-ready-for-protected-branches/;TI"!tLhRQ7KnpCFlNdpVB1Wycojhoyg=;F[;I" /blog/;TI"!U88FieqFzeyYYb45UWuERFBUmLY=;F[;I" /_meta/;TI"!YHyTHHEaLKWrurc010/ua07n8oA=;F[;I" /_posts/;TI"!mdbNjg3AE4+JbOf453aZG0vAB4M=;F[; I"lib/blog_helper.rb;TI"!WGEGnXJwpbl0+aRoJr/DTEJ50Gc=;F[;I"3/blog/2014-07-09-status-contexts-are-official/;TI"!nV47pC+QFhoXJpGV8Bl2LAwZuPc=;F[;I"B/blog/2014-07-28-assignee-and-label-actions-for-issue-events/;TI"!gR3INpDNGkm+mB1HWUC+w33c5lw=;F[;I"+/blog/2014-08-05-team-memberships-api/;TI"!bViezBivTo4z6sWlvVuyZ4RpDlk=;F[;I"/_changes/;TI"!1j0OUxy6fLcVWdOf9/mgrT9782Q=;F[;I"!/blog/2015-06-02-experiment/;TI"!HxkU6fou8FYuz8/OpVEaHLGydF4=;F[;I"//blog/2015-07-01-паста-за-зъби/;TI"!jdh43+lUkCQf4/M4PGtgOaFC4Ts=;F[;I"!/blog/2015-07-29-успех/;TI"!AuXlrd64Xbm4e4h4w/SMB+yJjvM=;F[;I"H/blog/2015-04-07-какво-не-казва-зъболекарят/;TI"!IkXz0jtPU/ltsh99v57b+rvSoqM=;F[;I"H/blog/2015-05-05-хранене-за-бъдещи-родители/;TI"!kG8Y7AHspUW2kqD72w2lIxlJT3M=;F[;I"/blog/2015-05-12-apple/;TI"!NCKjGefP6iXyQaivbwVnEnkcPMk=;F[;I":/blog/2015-01-05-ново-аз-нова-година/;TI"!B78bU7q7sVbf/rUlr3S7KiUR/QA=;F[;I"*/blog/2015-01-12-обяд-навън/;TI"!cer1RDkc9FAMCPzBfv9cbzpUi+0=;F[;I"1/blog/2015-01-21-съвети-лош-дъх/;TI"!M++OIHyvgAKxY4bGZk6b+J+cAK4=;F[;I"%/blog/2015-01-27-шоколад/;TI"!zZqHvJqgs5fZSiisR5AC5PytGkE=;F[;I"(/blog/2015-02-03-аутопсия1/;TI"!O2XWzXe6t1bAANSLQxLE3u8tv5M=;F[;I"%/blog/2015-02-08-ваксини/;TI"!Qe6erczFabVdjQFgjIB4SCxqors=;F[;I"(/blog/2015-03-25-без-болка/;TI"!iYtpDEreMDn8fivVEAi4WmIgd6Q=;F[;I"(/static/images/posts/Antiaging.jpg/;TI"!qgGZdQ7bqa2aJhlTSfadGednqAU=;F[;I"&/static/images/posts/Banana1.jpg/;TI"!t2IUvO3Jo+ZJq1iOl0u0soFbFgg=;F[;I"&/static/images/posts/Banana2.jpg/;TI"!eeistoiPEIcoCSUurAq+N81ohp4=;F[;I"$/static/images/posts/Beets.jpg/;TI"!xr4OfqvwfCgJjCaT8B8uF77KLeo=;F[;I"&/static/images/posts/Berries.jpg/;TI"!t07+pnXyuKi8BU/XDlB8Pozmkao=;F[;I"$/static/images/posts/Bread.jpg/;TI"!rJGMw2T/I8QurprzCvmfanlq1MY=;F[;I"%/static/images/posts/carbo3.jpg/;TI"!NzSvAnwQT75NvIGNNs0avysb0dA=;F[;I"%/static/images/posts/carbo4.jpg/;TI"!qS09r3v0JAezxNVeukKxVnjeA84=;F[;I"$/static/images/posts/Choco.jpg/;TI"!WwZjammYRwdXlZ+dCpfeP5VUpX0=;F[;I"$/static/images/posts/Clock.jpg/;TI"!yqPi9fZZrMCQiwI48SECchC1SIw=;F[;I"%/static/images/posts/Coffee.jpg/;TI"!f1gS8UgD5XdcKbZRZJeTMWXrxr0=;F[;I"#/static/images/posts/Cold.jpg/;TI"!ZqW3qNiVn845uMvKqbsR6sISTQ0=;F[;I"'/static/images/posts/Cravings.jpg/;TI"!615koEfTPLpro3z2jMTE0oUcNxM=;F[;I"#/static/images/posts/Diet.jpg/;TI"!+JW5m3dR/hIz38ILXc3DFPxcKck=;F[;I""/static/images/posts/Dog.jpg/;TI"!SF7YODvYuf9SHsej+mDGLu6GWMQ=;F[;I"#/static/images/posts/eggs.jpg/;TI"!dLqfZGaMJgiJ8a3xNUlEvYPwSgk=;F[;I"#/static/images/posts/Fats.jpg/;TI"!9h/dXntFuVD9vH3DdxTR9vIM07M=;F[;I"(/static/images/posts/Fivesteps.jpg/;TI"!Jsix+kiz0QBjOgqe7gT9bAml3MY=;F[;I"%/static/images/posts/Garlic.jpg/;TI"!5zCGbRxK1k4Nd+/XaVvDFlt0Ifo=;F[;I"$/static/images/posts/Gifts.jpg/;TI"!AluKJbT/g8FZBLE51loJG+UF5j8=;F[;I"$/static/images/posts/Honey.jpg/;TI"!p7kbo8BhiRNff/xd4FDnUSPTgXo=;F[;I"*/static/images/posts/Ingredients.jpg/;TI"!yvDBfLlDI0wqLSmL/UEzel4BUT8=;F[;I"'/static/images/posts/Lunchbox.jpg/;TI"!9vysVzeUBOAvctdsZw2ykE+LvHg=;F[;I"&/static/images/posts/Newyear.jpg/;TI"!SH/EL7CYZ4wiN/3uZhqgQmZ1K1k=;F[;I"$/static/images/posts/Paste.jpg/;TI"!qdSXCcJNkZtH9UWvYntPdg1K7OA=;F[;I""/static/images/posts/Pig.jpg/;TI"!osfAw2Uc+IT7mSOflVtInYRhfo0=;F[;I"#/static/images/posts/Preg.jpg/;TI"!395tz47gcDXcE+6jT98OYBNUyvg=;F[;I"&/static/images/posts/Pyramid.jpg/;TI"!0Uwy0S/jMjARPFtBhG5753X5Gkg=;F[;I"'/static/images/posts/Raya-blw.jpg/;TI"!nL875Fc8Gk/TauW+6bkMA2Dplhs=;F[;I"$/static/images/posts/Smell.jpg/;TI"!XXSFQiortGq0FOmG9i/6Giy3ats=;F[;I"#/static/images/posts/Snow.jpg/;TI"!c3GjPErrJN03kjPXAJh1+1cQDr0=;F[;I"%/static/images/posts/Stress.jpg/;TI"!kzjWKMaAXM+nwCyfiiP8yad0q00=;F[;I"&/static/images/posts/Tooth10.jpg/;TI"!0+JGVRNMpOG0KYfhQ3EGk2umusY=;F[;I"&/static/images/posts/Tooth11.jpg/;TI"!Q86N63H6pFoXBDMHoKDgXy0XOug=;F[;I"&/static/images/posts/Tooth12.jpg/;TI"!0k15mRb0FtmB9DkC4ENHO1/eOUM=;F[;I"&/static/images/posts/Tooth13.jpg/;TI"!lRoPFsPDcwg/imSc9REaC+Dyguc=;F[;I"&/static/images/posts/Tooth14.jpg/;TI"!xBBxWSf79JsZkxeXOL0uqRx1U/s=;F[;I"&/static/images/posts/Tooth15.jpg/;TI"!DICZdhufwJUl/vgDWw6FJY0D5QE=;F[;I"&/static/images/posts/Tooth16.jpg/;TI"!LfmLRfDjVccqA7LIqZ1qIeZOfcU=;F[;I"&/static/images/posts/Tooth17.jpg/;TI"!pe4yN2rrZeAz55rRRQ6+PvLv2Ig=;F[;I"%/static/images/posts/Tooth5.jpg/;TI"!7+42ju44LINFgE1JUrnShj9pZL8=;F[;I"%/static/images/posts/Tooth6.jpg/;TI"!dmye/dhfw6KjGMKl6iGoQRGYNiM=;F[;I"%/static/images/posts/Tooth7.jpg/;TI"!i0ph20Sp2Y6wL3MYhG4I7f4wbaI=;F[;I"%/static/images/posts/Tooth8.jpg/;TI"!MUzlAZES+cn7EdrzYq++FiohKzA=;F[;I"%/static/images/posts/Tooth9.jpg/;TI"!mc3Kcw6HaFEcLINM08dFWC534xY=;F[;I"&/static/images/posts/Veggies.jpg/;TI"!ACdG8LXkK9TbF//da6vaIMBpqBg=;F[;I"#/static/images/posts/Zele.jpg/;TI"!lMIcd6+wZ1vb0V8ytit3r9fZUVM=;F[;I"Y/blog/2014-08-02-пет-стъпки-към-здравословно-хранене/;TI"!ZkGhgzjjDXTGvE9O8MLbprpVme0=;F[;I")/blog/2014-08-10-зеленчуци/;TI"!cClbBQDE16+9zEzPVaT30LaPOG0=;F[;I",/blog/2014-08-17-вкусно-лято/;TI"!kGGZYKbYnjQzpMZ/1vaNDi7d+Ws=;F[;I"8/blog/2014-08-24-пълнозърнест-хляб/;TI"!v1gcF7pkvz2k0riae9h9onuASp0=;F[;I")/blog/2014-08-29-пшеницата/;TI"!VSWD5rpHtEUYNKrgkoTvvS30huc=;F[;I"!/blog/2014-09-14-чесън/;TI"!zWWYSw7uVXUqtkjnhQpx4GVmDr0=;F[;I"3/blog/2014-09-22-настинка-и-грип/;TI"!/0up+cGPCqYwiUz2G1YkHhILO2k=;F[;I"+/blog/2014-09-30-отслабване/;TI"!JtHkLmTdFOowAbVNPV8GNhIcTm0=;F[;I"2/blog/2014-10-07-червено-цвекло/;TI"!fgq5nx930POKoh3gt7pp6hqwZtA=;F[;I":/blog/2014-10-14-ферментирали-храни/;TI"!GCfre1jP1RlvYaeoxaKot0z38uc=;F[;I"G/blog/2014-10-19-за-какво-гладува-тялото-ви/;TI"!QX8Y+j7vxkNVUhlp+2qdR/U+opw=;F[;I"7/blog/2014-10-28-липса-на-движение/;TI"!cX01omlRAXx08jx1ynklmikzjcM=;F[;I"-/blog/2014-11-04-антиейджинг/;TI"!08WJce2ZYZBDKX1gAqqe14ASPxA=;F[;I"T/blog/2014-11-04-как-да-заличим-следите-на-времето/;TI"!cLxun7aEO1WESaYckqMWd3M9o18=;F[;I"%/blog/2014-11-11-закуска/;TI"!tFiEa14uyPWuJGN8A0qR/OJgXw0=;F[;I"/blog/2014-11-17-мед/;TI"!CcTJ+dN77IQEUzTFG0+uoksUGxk=;F[;I"(/blog/2014-11-25-на-бюджет/;TI"!JzpXbVFzENqGdyALrzWhECquGcw=;F[;I":/blog/2014-12-01-бананови-палачинки/;TI"!drDBJUTPWbtWVfgqc8rySN53/Mc=;F[;I"'/blog/2014-12-09-подаръци/;TI"!d5rImDzDSsccBp+x06rdp9J4vxY=;F[;I"6/blog/2014-12-16-празнични-съвети/;TI"!e2mdGCtb+Cn740lHpgQZLDqbfqk=;F[;I"_/blog/2014-02-19-кои-са-най-добрите-четка-и-паста-за-зъби/;TI"!wxBoMb/If9kpNnDrdBk20GKyhgw=;F[;I"Q/blog/2014-02-24-вижте-тайната-за-перфектни-зъби/;TI"!bgD/u3NxzWAvJEOqjDEYy9qO70c=;F[;I"G/blog/2014-02-27-храни-за-здрави-зъби-част-1/;TI"!cQp+gvdMilgQjkfN4ErSbBS0ipk=;F[;I"G/blog/2014-03-03-храни-за-здрави-зъби-част-2/;TI"!ecjp6XZHhWQVDWwGYWWsSRo1aWE=;F[;I")/blog/2014-03-07-избелване/;TI"!TA2arNqQBceXumSKVZqwa/hl9Do=;F[;I"'/blog/2014-03-12-витамини/;TI"!DdNtRgs4Gtk/Ox8K89oAjTXAik0=;F[;I"/static/images/documentation/create-form-seed-screen.png/;TI"!yow2a9w9quompUOrsf9m6AXTJZk=;F[;I":/static/images/documentation/create-form-genesis.png/;TI"!mt8k3CCyznkgWgV1yMdRI55+gP0=;F[;I"7/static/images/documentation/create-form-seed.png/;TI"!TbaYPFTTVfDdsPhzTWZdItI4tlE=;F[;I"2/static/images/documentation/create-form.png/;TI"!y6pAsR55Qy3yzShOqgWD0WuLrhM=;F[;I" - - - - - - - Create Cryptonote tokens | Forknote - - - - - - - - - - - -
    - -
    - - - -
    -

    - Leverage the power of
    - Bytecoin in your Coin. -

    -

    Get started with one of our guides, or jump straight into the download section.

    - Download - forknote -
    - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    - -
    - - - - - - - - -;T:rawI"; -
    -

    - Leverage the power of
    - Bytecoin in your Coin. -

    -

    Get started with one of our guides, or jump straight into the download section.

    - Download - forknote -
    - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    - -
    -;T:preI"7 -
    -

    - Leverage the power of
    - Bytecoin in your Coin. -

    -

    Get started with one of our guides, or jump straight into the download section.

    - Download - forknote -
    - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    - -
    -;T: post@ -I"#/static/css/documentation.css/;T{;{I""/static/css/Octicons LICENSE/;T{;{I"/static/css/octicons.css/;T{;{I"/static/css/octicons.eot/;T{;{I"/static/css/octicons.svg/;T{;{I"/static/css/octicons.ttf/;T{;{I"/static/css/octicons.woff/;T{;{I"/static/css/pygments.css/;T{;{I"/static/css/reset.css/;T{;{I"/static/favicon.ico/;T{;{I"/static/images/cancel.png/;T{;{I""/static/images/cancel@2x.png/;T{;{I"&/static/images/expand-arrows.png/;T{;{I")/static/images/expand-arrows@2x.png/;T{;{I""/static/images/feed-icon.png/;T{;{I"%/static/images/feed-icon@2x.png/;T{;{I"/static/images/header.png/;T{;{I""/static/images/header@2x.png/;T{;{I"'/static/images/logo_developer.png/;T{;{I"*/static/images/logo_developer@2x.png/;T{;{I" /static/images/mark@2x.png/;T{;{I"/static/images/search.png/;T{;{I""/static/images/search@2x.png/;T{;{I")/static/images/status-icon-good.png/;T{;{I",/static/images/status-icon-good@2x.png/;T{;{I"*/static/images/status-icon-major.png/;T{;{I"-/static/images/status-icon-major@2x.png/;T{;{I"*/static/images/status-icon-minor.png/;T{;{I"-/static/images/status-icon-minor@2x.png/;T{;{I",/static/images/status-icon-unknown.png/;T{;{I"//static/images/status-icon-unknown@2x.png/;T{;{I"/static/js/dev_mode.js/;T{;{I"!/static/js/documentation.js/;T{;{I"/static/js/jquery.js/;T{;{I"/static/js/retina.js/;T{;{I"/static/search-index.json/;T{;{I" /about/;T{;{ ;I" - - - - - - - Кой стои зад bezkaries.com? | BezKaries.com - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Кой стои зад bezkaries.com?

    - -

    Аз съм д-р Радосвета Симеонова и съм лекар по дентална медицина. Практикувам в гр. Варна от 2010г. насам. Завършила съм висшето си образование в Медицински Университет - София 2004-2010, специалност дентална медицина.

    - -

    Моята мисия е да помагам на хората да подобрят зъбите си и цялото си здраве. Успешно комбинирам научната информация, получена в университета със своята любов към здравословното хранене и холистичен подход към здравето. Като резултат имам голям успех в практиката си с излекуването на редица пациенти, използвайки напълно естествени и научно-доказани методи.

    - -
    - - - -
    - - - - - - - -;T; I"< -# Кой стои зад bezkaries.com? - -Аз съм д-р Радосвета Симеонова и съм лекар по дентална медицина. Практикувам в гр. Варна от 2010г. насам. Завършила съм висшето си образование в Медицински Университет - София 2004-2010, специалност дентална медицина. - -Моята мисия е да помагам на хората да подобрят зъбите си и цялото си здраве. Успешно комбинирам научната информация, получена в университета със своята любов към здравословното хранене и холистичен подход към здравето. Като резултат имам голям успех в практиката си с излекуването на редица пациенти, използвайки напълно естествени и научно-доказани методи. -;T; -I"c -

    Кой стои зад bezkaries.com?

    - -

    Аз съм д-р Радосвета Симеонова и съм лекар по дентална медицина. Практикувам в гр. Варна от 2010г. насам. Завършила съм висшето си образование в Медицински Университет - София 2004-2010, специалност дентална медицина.

    - -

    Моята мисия е да помагам на хората да подобрят зъбите си и цялото си здраве. Успешно комбинирам научната информация, получена в университета със своята любов към здравословното хранене и холистичен подход към здравето. Като резултат имам голям успех в практиката си с излекуването на редица пациенти, използвайки напълно естествени и научно-доказани методи.

    -;T; @|I"/about/mission/;T{;{ ;I"K - - - - - - - Моята мисия | BezKaries.com - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Моята мисия

    - - -

    Бъди промяната, която искаш да видиш в света - Махатма Ганди - това мото винаги ме е водило в делата ми, били житейски или професионални.

    - -

    Интереса ми към профилактиката започна още през годините в Университета. Когато в упражненията по Детска стоматология трябваше да лекуваме кариеси чрез познатата методика изпиляване на кариеса и запълване на зъба с пластичен материал, аз усещах че пропускам нещо, че нещо липсва.

    - -

    Когато по-късно започнах своя практика почти отказвах да работя с деца, тъй като не се чувствах комфортно да причинявам страдание на малките си пациенти. Знаех, че този силен стрес се дължи на високата реактивност на организма, но именно тя може да се използва, за да провокира тялото да подпомогне самолечението си.

    - -

    През последните 10 години натрупах знания за това как влияе храната, стреса и околната среда върху генетичния фонд на човека и парченцата от пъзела започнаха да се нареждат. Разбрах, че най-важното нещо след като излекуваш някого е да го научиш как да не допуска заболяването отново. А още по-ценно е да дадеш напътствия на човека как изобщо да не стига до състояние на болест.

    - -

    В съвременното зъболечение се обръща внимание на профилактиката със синтетични средства (флуорни и хлорни съединения) и тя наистина работи. Аз вярвам, че трябва да има алтернатива и я предлагам на моите пациенти. След отлични резултати и при деца, и при възрастни аз насочих практиката си само към профилактика и лечение на кариес чрез неинвазивни методи и естествени средства. Всички методи и средства, които използвам за реминерализация на зъбите са научно доказани и съобразени с принципите на съвременната медицина.

    - -

    Моята мисия е да споделя всичко, което знам за това как човек може сам да повлияе положително върху здравето на зъбите, устата и дори целият си организъм.

    - -
    - - - -
    - - - - - - - -;T; I" -# Моята мисия - -* TOC -{:toc} - -Бъди промяната, която искаш да видиш в света - Махатма Ганди - това мото винаги ме е водило в делата ми, били житейски или професионални. - -Интереса ми към профилактиката започна още през годините в Университета. Когато в упражненията по Детска стоматология трябваше да лекуваме кариеси чрез познатата методика изпиляване на кариеса и запълване на зъба с пластичен материал, аз усещах че пропускам нещо, че нещо липсва. - -Когато по-късно започнах своя практика почти отказвах да работя с деца, тъй като не се чувствах комфортно да причинявам страдание на малките си пациенти. Знаех, че този силен стрес се дължи на високата реактивност на организма, но именно тя може да се използва, за да провокира тялото да подпомогне самолечението си. - -През последните 10 години натрупах знания за това как влияе храната, стреса и околната среда върху генетичния фонд на човека и парченцата от пъзела започнаха да се нареждат. Разбрах, че най-важното нещо след като излекуваш някого е да го научиш как да не допуска заболяването отново. А още по-ценно е да дадеш напътствия на човека как изобщо да не стига до състояние на болест. - -В съвременното зъболечение се обръща внимание на профилактиката със синтетични средства (флуорни и хлорни съединения) и тя наистина работи. Аз вярвам, че трябва да има алтернатива и я предлагам на моите пациенти. След отлични резултати и при деца, и при възрастни аз насочих практиката си само към профилактика и лечение на кариес чрез неинвазивни методи и естествени средства. Всички методи и средства, които използвам за реминерализация на зъбите са научно доказани и съобразени с принципите на съвременната медицина. - -Моята мисия е да споделя всичко, което знам за това как човек може сам да повлияе положително върху здравето на зъбите, устата и дори целият си организъм. -;T; -I" -

    Моята мисия

    - - -

    Бъди промяната, която искаш да видиш в света - Махатма Ганди - това мото винаги ме е водило в делата ми, били житейски или професионални.

    - -

    Интереса ми към профилактиката започна още през годините в Университета. Когато в упражненията по Детска стоматология трябваше да лекуваме кариеси чрез познатата методика изпиляване на кариеса и запълване на зъба с пластичен материал, аз усещах че пропускам нещо, че нещо липсва.

    - -

    Когато по-късно започнах своя практика почти отказвах да работя с деца, тъй като не се чувствах комфортно да причинявам страдание на малките си пациенти. Знаех, че този силен стрес се дължи на високата реактивност на организма, но именно тя може да се използва, за да провокира тялото да подпомогне самолечението си.

    - -

    През последните 10 години натрупах знания за това как влияе храната, стреса и околната среда върху генетичния фонд на човека и парченцата от пъзела започнаха да се нареждат. Разбрах, че най-важното нещо след като излекуваш някого е да го научиш как да не допуска заболяването отново. А още по-ценно е да дадеш напътствия на човека как изобщо да не стига до състояние на болест.

    - -

    В съвременното зъболечение се обръща внимание на профилактиката със синтетични средства (флуорни и хлорни съединения) и тя наистина работи. Аз вярвам, че трябва да има алтернатива и я предлагам на моите пациенти. След отлични резултати и при деца, и при възрастни аз насочих практиката си само към профилактика и лечение на кариес чрез неинвазивни методи и естествени средства. Всички методи и средства, които използвам за реминерализация на зъбите са научно доказани и съобразени с принципите на съвременната медицина.

    - -

    Моята мисия е да споделя всичко, което знам за това как човек може сам да повлияе положително върху здравето на зъбите, устата и дори целият си организъм.

    -;T; @}I"/information/;T{;{ ;I"= - - - - - - - За денталната профилактика | BezKaries.com - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    За денталната профилактика

    - -

    Съвременният човек се налага да бъде добре информиран по въпросите, свързани със здравето му.

    - - - -

    Кариес 101

    - -

    Замислялили ли сте се какво представлява кариеса? Предполагам, че много от вас имат някаква идея, че е дупка, в която живеят различни микроорганизми и се хранят с попаднали в дупката трохички шоколад. Всъщност не сте далеч от истината, но не сте и много близо. Четете нататък.

    - -

    Кариесът е заболяване, което е разпространено в световен мащаб. Всеки човек, който има зъби, има и кариес. Но трябва да се знае нещо много важно: -Кариесът е два вида - активен и спрял. Много от вас сигурно за пръв път чуват този феномен - спрял (арестед, от англ. arrested) кариес. Какви са разликите между двата? - сигурно се чудите сега.

    - -

    Активният кариес е този с дупката, пълна с гладни бактерии. Те се хранят със захар (общо понятие за храна, която използват микроорганизмите; да не се разбира само бяла, кристална захар), освобождават киселини и разяждат зъбните тъкани. -Спрелият кариес някога е бил активен, но нещо се е променило и е спрял да “дълбае” зъба. Например храната за микроорганизмите е намаляла, толкова, че те са се изселили или умрели.

    - -

    Защита от кариес

    - -

    Ето съвсем на кратко науката, която стои зад понятието кариес:

    - -

    Реминерализацията и деминерализацията са процеси, които са взаимосвързани и се осъществяват в емайла на зъбите. Те са като бодърстването и съня, като приливите и отливите. Те се случват неизбежно при хранене, прием на течности и др.

    - -

    Деминерализацията представлява разтваряне на зъбният емайл в течната среда на устата. Реминерализацията е заздравяването на емайла. При деминерализацията се освобождават молекули, а при реминерализацията се възстановяват по местста си. Нещо като тухлена стена, от която падат случайни тухли (деминерализация) или биват връщани по местата им (реминерализация). -Най-важното условие един зъб да има активен кариес е да има дисбаланс между тях, като деминерализацията преобладава. Т.е. здравето на зъбите е динамично равновесие, а не статично състояние.

    - -

    Възстановяване

    - -

    Какво е нужно да има баланс между деминерализацията (образуването на кариес) и реминерализацията (състояние, в което не се разтваря зъбен емайл и не се образува кариес)?

    - -
      -
    1. Контролирана околна среда, което включва достатъчно количество слюнка, която има подходящо pH -
    2. -
    3. Повече полезни бактерии, които не причиняват кариес, спрямо бактериите, които причиняват кариес.
    4. -
    5. Силен и устойчив зъб, със здрав емайл. -Когато има баланс между горните три фактора, то срещу деминерализацията има адекватно действаща реминерализация и състоянието на здраве се запазва.
    6. -
    - -

    За да имате устойчиви на кариес зъби, трябва трите фактора слюнка-бактерии-устойчив емайл да бъдат в определени граници, нормални за човешкото тяло.

    - -

    Без синтетични средства

    - -

    Само чрез познаване и контролиране на естествените механизми за защита срещу кариес можете да постигнете здрави зъби. Например:

    - -
      -
    1. -

      Слюнката обгръща всеки зъб и облива всяка част и място в устата. Когато киселинността на слюнката достигне стойност 5.5 (т.нар. критично pH) или по-ниска, молекули от емайла на зъба започват да се разтварят в нея. pH 5.5 е нормална стойност за някои части на човешкито тяло като кожата например, но не и във устата.
      -За да се спре разтварянето на емайла трябва да се повиши pH, т.е. средата да се алкализира. Това лесно се постига като увеличим количеството на стимулирана слюнка, например като сдъвчем една дъвка без захар.

      -
    2. -
    3. -

      Стрептококите мутанти (Streptococcus mutans) са набедени за най-големият виновник за кариеса. И те наистина присъстват винаги там където има кариес. Но когато има пожар, винаги има и пожарникари. Значи ли, че те са причина за пожара? Не, не значи. -Бактериите, които са в устата са стотици видове. Всички те живеят в симбиоза, т.е. в равновесие едни с други. Когато Стрептококите Мутанти доминират над другите видове се увеличава риска за развитие на кариес.

      -
    4. -
    5. -

      Най-комплексният фактор е здравият и устойчив зъб. Това е така, защото здравината на зъба се определя от цялостното здраве на организма; от баланса в процесите, които се осъществят във всяка клетка; от хормоните и ензимите, които контролират клетъчните процеси, т.е. здравето на зъба идва от вътре навън.

      -
    6. -
    - -

    Например ниски нива на вит.Д в кръвта могат да нарушат обмяната на Калция. Той е основен градивен елемент в зъбният емайл. Тези нарушения не позволяват Калцият да се върне обратно в емайла, когато условията за реминерализация са подходящи.

    - -

    Подобрете здравето си

    - -

    Днес науката е постигнала изключителен напредък в лечението на кариеса. Време е да положим усилия и да спрем заболяването още преди да се е появило. Сега можете да защитите себе си и децата си от появата на кариес с напълно естествени методи, безболезнено и без нужда от механична намеса със зъболекарска машинка.

    - -

    Профилактиката и неоперативното лечение на кариес използват методи и средства, които стимулират естествените защитни сили на тялото. Цели се подобряване на цялостното здраве, чрез което се въздейства върху устойчивостта на зъбите срещу кариес. Стъпка по стъпка вие можете да постигнете нужният баланс за поддържане на вашето здраве.

    - -

    Без болка

    - -

    Знаете ли, че страхът от зъболекар и стресът от болката по време на процедурите могат да са по-вредни от самият кариес?

    - -

    Страхът и болката вървят ръка за ръка с посещението в зъболекарският кабинет. Но това може да се промени, ако имате доверие на вашият стоматолог. Когато той търпеливо отговори на всички ваши притеснения и въпроси, вие ще сте уверени, че ще получите най-подходящото лечение за вашите зъби.

    - -

    Нерядко кариесите могат да се лекуват без оперативна намеса (без нужда от пробиване на зъба и запълване с пломба) и вие ще получите насоки за това, ако имате мотивация да работите в тази посока, заедно с вашият доверен зъболекар. С упоритост и постоянство, вие можете да имате естествено здрави зъби, без болка и стрес.

    - -
    - - - -
    - - - - - - - -;T; I") -# За денталната профилактика - -Съвременният човек се налага да бъде добре информиран по въпросите, свързани със здравето му. - -* TOC -{:toc} - -##Кариес 101 - -Замислялили ли сте се какво представлява кариеса? Предполагам, че много от вас имат някаква идея, че е дупка, в която живеят различни микроорганизми и се хранят с попаднали в дупката трохички шоколад. Всъщност не сте далеч от истината, но не сте и много близо. Четете нататък. - -Кариесът е заболяване, което е разпространено в световен мащаб. Всеки човек, който има зъби, има и кариес. Но трябва да се знае нещо много важно: -Кариесът е два вида - активен и спрял. Много от вас сигурно за пръв път чуват този феномен - спрял (арестед, от англ. arrested) кариес. Какви са разликите между двата? - сигурно се чудите сега. - -Активният кариес е този с дупката, пълна с гладни бактерии. Те се хранят със захар (общо понятие за храна, която използват микроорганизмите; да не се разбира само бяла, кристална захар), освобождават киселини и разяждат зъбните тъкани. -Спрелият кариес някога е бил активен, но нещо се е променило и е спрял да "дълбае" зъба. Например храната за микроорганизмите е намаляла, толкова, че те са се изселили или умрели. - - -##Защита от кариес - -Ето съвсем на кратко науката, която стои зад понятието кариес: - -Реминерализацията и деминерализацията са процеси, които са взаимосвързани и се осъществяват в емайла на зъбите. Те са като бодърстването и съня, като приливите и отливите. Те се случват неизбежно при хранене, прием на течности и др. - -Деминерализацията представлява разтваряне на зъбният емайл в течната среда на устата. Реминерализацията е заздравяването на емайла. При деминерализацията се освобождават молекули, а при реминерализацията се възстановяват по местста си. Нещо като тухлена стена, от която падат случайни тухли (деминерализация) или биват връщани по местата им (реминерализация). -Най-важното условие един зъб да има активен кариес е да има дисбаланс между тях, като деминерализацията преобладава. Т.е. здравето на зъбите е динамично равновесие, а не статично състояние. - - -##Възстановяване - -Какво е нужно да има баланс между деминерализацията (образуването на кариес) и реминерализацията (състояние, в което не се разтваря зъбен емайл и не се образува кариес)? - -1. Контролирана околна среда, което включва **достатъчно количество слюнка**, която има **подходящо pH** -2. Повече **полезни бактерии**, които не причиняват кариес, спрямо бактериите, които причиняват кариес. -3. Силен и устойчив зъб, със **здрав емайл**. -Когато има баланс между горните три фактора, то срещу деминерализацията има адекватно действаща реминерализация и състоянието на здраве се запазва. - -За да имате устойчиви на кариес зъби, трябва трите фактора слюнка-бактерии-устойчив емайл да бъдат в определени граници, нормални за човешкото тяло. - - -##Без синтетични средства - -Само чрез познаване и контролиране на естествените механизми за защита срещу кариес можете да постигнете здрави зъби. Например: - -1. Слюнката обгръща всеки зъб и облива всяка част и място в устата. Когато киселинността на слюнката достигне стойност 5.5 (т.нар. критично pH) или по-ниска, молекули от емайла на зъба започват да се разтварят в нея. pH 5.5 е нормална стойност за някои части на човешкито тяло като кожата например, но не и във устата.
    -За да се спре разтварянето на емайла трябва да се повиши pH, т.е. средата да се алкализира. Това лесно се постига като увеличим количеството на стимулирана слюнка, например като сдъвчем една дъвка без захар. - -2. Стрептококите мутанти (Streptococcus mutans) са набедени за най-големият виновник за кариеса. И те наистина присъстват винаги там където има кариес. Но когато има пожар, винаги има и пожарникари. Значи ли, че те са причина за пожара? Не, не значи. -Бактериите, които са в устата са стотици видове. Всички те живеят в симбиоза, т.е. в равновесие едни с други. Когато Стрептококите Мутанти доминират над другите видове се **увеличава риска** за развитие на кариес. - -3. Най-комплексният фактор е здравият и устойчив зъб. Това е така, защото здравината на зъба се определя от цялостното здраве на организма; от баланса в процесите, които се осъществят във всяка клетка; от хормоните и ензимите, които контролират клетъчните процеси, т.е. здравето на зъба идва от вътре навън. - -Например ниски нива на вит.Д в кръвта могат да нарушат обмяната на Калция. Той е основен градивен елемент в зъбният емайл. Тези нарушения не позволяват Калцият да се върне обратно в емайла, когато условията за реминерализация са подходящи. - - -## Подобрете здравето си - -Днес науката е постигнала изключителен напредък в лечението на кариеса. Време е да положим усилия и да спрем заболяването още преди да се е появило. Сега можете да защитите себе си и децата си от появата на кариес с напълно естествени методи, безболезнено и без нужда от механична намеса със зъболекарска машинка. - -Профилактиката и неоперативното лечение на кариес използват методи и средства, които стимулират естествените защитни сили на тялото. Цели се подобряване на цялостното здраве, чрез което се въздейства върху устойчивостта на зъбите срещу кариес. Стъпка по стъпка вие можете да постигнете нужният баланс за поддържане на вашето здраве. - - -## Без болка - -Знаете ли, че страхът от зъболекар и стресът от болката по време на процедурите могат да са по-вредни от самият кариес? - -Страхът и болката вървят ръка за ръка с посещението в зъболекарският кабинет. Но това може да се промени, ако имате доверие на вашият стоматолог. Когато той търпеливо отговори на всички ваши притеснения и въпроси, вие ще сте уверени, че ще получите най-подходящото лечение за вашите зъби. - -Нерядко кариесите могат да се лекуват без оперативна намеса (без нужда от пробиване на зъба и запълване с пломба) и вие ще получите насоки за това, ако имате мотивация да работите в тази посока, заедно с вашият доверен зъболекар. С упоритост и постоянство, вие можете да имате естествено здрави зъби, без болка и стрес. -;T; -I"- -

    За денталната профилактика

    - -

    Съвременният човек се налага да бъде добре информиран по въпросите, свързани със здравето му.

    - - - -

    Кариес 101

    - -

    Замислялили ли сте се какво представлява кариеса? Предполагам, че много от вас имат някаква идея, че е дупка, в която живеят различни микроорганизми и се хранят с попаднали в дупката трохички шоколад. Всъщност не сте далеч от истината, но не сте и много близо. Четете нататък.

    - -

    Кариесът е заболяване, което е разпространено в световен мащаб. Всеки човек, който има зъби, има и кариес. Но трябва да се знае нещо много важно: -Кариесът е два вида - активен и спрял. Много от вас сигурно за пръв път чуват този феномен - спрял (арестед, от англ. arrested) кариес. Какви са разликите между двата? - сигурно се чудите сега.

    - -

    Активният кариес е този с дупката, пълна с гладни бактерии. Те се хранят със захар (общо понятие за храна, която използват микроорганизмите; да не се разбира само бяла, кристална захар), освобождават киселини и разяждат зъбните тъкани. -Спрелият кариес някога е бил активен, но нещо се е променило и е спрял да “дълбае” зъба. Например храната за микроорганизмите е намаляла, толкова, че те са се изселили или умрели.

    - -

    Защита от кариес

    - -

    Ето съвсем на кратко науката, която стои зад понятието кариес:

    - -

    Реминерализацията и деминерализацията са процеси, които са взаимосвързани и се осъществяват в емайла на зъбите. Те са като бодърстването и съня, като приливите и отливите. Те се случват неизбежно при хранене, прием на течности и др.

    - -

    Деминерализацията представлява разтваряне на зъбният емайл в течната среда на устата. Реминерализацията е заздравяването на емайла. При деминерализацията се освобождават молекули, а при реминерализацията се възстановяват по местста си. Нещо като тухлена стена, от която падат случайни тухли (деминерализация) или биват връщани по местата им (реминерализация). -Най-важното условие един зъб да има активен кариес е да има дисбаланс между тях, като деминерализацията преобладава. Т.е. здравето на зъбите е динамично равновесие, а не статично състояние.

    - -

    Възстановяване

    - -

    Какво е нужно да има баланс между деминерализацията (образуването на кариес) и реминерализацията (състояние, в което не се разтваря зъбен емайл и не се образува кариес)?

    - -
      -
    1. Контролирана околна среда, което включва достатъчно количество слюнка, която има подходящо pH -
    2. -
    3. Повече полезни бактерии, които не причиняват кариес, спрямо бактериите, които причиняват кариес.
    4. -
    5. Силен и устойчив зъб, със здрав емайл. -Когато има баланс между горните три фактора, то срещу деминерализацията има адекватно действаща реминерализация и състоянието на здраве се запазва.
    6. -
    - -

    За да имате устойчиви на кариес зъби, трябва трите фактора слюнка-бактерии-устойчив емайл да бъдат в определени граници, нормални за човешкото тяло.

    - -

    Без синтетични средства

    - -

    Само чрез познаване и контролиране на естествените механизми за защита срещу кариес можете да постигнете здрави зъби. Например:

    - -
      -
    1. -

      Слюнката обгръща всеки зъб и облива всяка част и място в устата. Когато киселинността на слюнката достигне стойност 5.5 (т.нар. критично pH) или по-ниска, молекули от емайла на зъба започват да се разтварят в нея. pH 5.5 е нормална стойност за някои части на човешкито тяло като кожата например, но не и във устата.
      -За да се спре разтварянето на емайла трябва да се повиши pH, т.е. средата да се алкализира. Това лесно се постига като увеличим количеството на стимулирана слюнка, например като сдъвчем една дъвка без захар.

      -
    2. -
    3. -

      Стрептококите мутанти (Streptococcus mutans) са набедени за най-големият виновник за кариеса. И те наистина присъстват винаги там където има кариес. Но когато има пожар, винаги има и пожарникари. Значи ли, че те са причина за пожара? Не, не значи. -Бактериите, които са в устата са стотици видове. Всички те живеят в симбиоза, т.е. в равновесие едни с други. Когато Стрептококите Мутанти доминират над другите видове се увеличава риска за развитие на кариес.

      -
    4. -
    5. -

      Най-комплексният фактор е здравият и устойчив зъб. Това е така, защото здравината на зъба се определя от цялостното здраве на организма; от баланса в процесите, които се осъществят във всяка клетка; от хормоните и ензимите, които контролират клетъчните процеси, т.е. здравето на зъба идва от вътре навън.

      -
    6. -
    - -

    Например ниски нива на вит.Д в кръвта могат да нарушат обмяната на Калция. Той е основен градивен елемент в зъбният емайл. Тези нарушения не позволяват Калцият да се върне обратно в емайла, когато условията за реминерализация са подходящи.

    - -

    Подобрете здравето си

    - -

    Днес науката е постигнала изключителен напредък в лечението на кариеса. Време е да положим усилия и да спрем заболяването още преди да се е появило. Сега можете да защитите себе си и децата си от появата на кариес с напълно естествени методи, безболезнено и без нужда от механична намеса със зъболекарска машинка.

    - -

    Профилактиката и неоперативното лечение на кариес използват методи и средства, които стимулират естествените защитни сили на тялото. Цели се подобряване на цялостното здраве, чрез което се въздейства върху устойчивостта на зъбите срещу кариес. Стъпка по стъпка вие можете да постигнете нужният баланс за поддържане на вашето здраве.

    - -

    Без болка

    - -

    Знаете ли, че страхът от зъболекар и стресът от болката по време на процедурите могат да са по-вредни от самият кариес?

    - -

    Страхът и болката вървят ръка за ръка с посещението в зъболекарският кабинет. Но това може да се промени, ако имате доверие на вашият стоматолог. Когато той търпеливо отговори на всички ваши притеснения и въпроси, вие ще сте уверени, че ще получите най-подходящото лечение за вашите зъби.

    - -

    Нерядко кариесите могат да се лекуват без оперативна намеса (без нужда от пробиване на зъба и запълване с пломба) и вие ще получите насоки за това, ако имате мотивация да работите в тази посока, заедно с вашият доверен зъболекар. С упоритост и постоянство, вие можете да имате естествено здрави зъби, без болка и стрес.

    -;T; @I"/services/;T{;{ ;I"P& - - - - - - - Предлагани услуги | BezKaries.com - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Предлагани услуги

    - - - -

    Виртуална консултация

    - -

    Д-р Симеонова предлага виртуална консултация, за да ви даде отговори на всички въпроси и притеснения, относно здравето на вашите зъби.

    - -

    Моля, представете подробно описание на вашият случай, споделете въпросите и притесненията, които имате. Ако разполагате с рентгенографски снимки и/или други медицински изследвания ги изпратете на e-mail: info@bezkaries.com с вашето име и заглавие “Онлайн консултация”

    - - - - - - - - - - - - - - - - - - -
    УслугaЦена
    Цена на виртуалната консултация* -70лв
    Такса спешно обаждане** -30лв
    - -

    *В ценатата на виртуалната консултация се включва кореспонденция по електронна поща и един телефонен разговор в рамките на 60мин.
    -**При желание да разговаряте по спешност, до няколко часа.

    - -

    За да си запишете час за виртуална консултация при Д-р Симеонова попълнете формата за контакти. До три работни дни ще получите e-mail за потвърждение на онлайн консултацията и евентуално допълнителни насоки за необходими медицински изследвания, фото снимки и др.

    - -

    Не забравяйте:

    - -
      -
    • Да оставите актуален телефонен номер и e-mail адрес
    • -
    • Да предоставите възможно най-точна и подробна информация, относно вашият проблем, снимки, изследвания и документи които имате.
    • -
    - -

    Диагностициране на кариеси и други дентални състояния и заболявания се извършват само в кабинета, при частен прием. Д-р Симеонова не може да постави диагноза или извърши преглед по телефона.

    - -

    Благодаря за доверието.

    - -

    Частен прием

    - -

    Кабинетът на Д-р Симеонова се намира на адрес гр. Варна, ул. Братя Шкорпил 25
    -Обадете се на тел. 0896044266 или изпратете e-mail на адрес info@bezkaries.com

    - -

    Предлагани услуги

    - -
      -
    • Преглед и диагностика на кариеси
    • -
    • Предложения за лечение на проблемите, които имате по отношение на вашите зъби
    • -
    • Проследяване на процесите на реминерализация и обратимостта на кариозните заболявания
    • -
    • Второ мнение по различни дентални въпроси
    • -
    - -

    Цени

    - - - - - - - - - - - - - - - - - - -
    УслугаЦена
    Тридесет минути настолно време50лв
    Всеки допълнителни тридесет минути40лв
    - -

    Допълнителна информация

    - -

    Ако имате рентгенографски снимки или други медицински изследвания и документи, моля изпратете ги на e-mail info@bezkaries.com с името си ПРЕДИ посещението си в кабинета.

    - -

    Д-р Симеонова не предлага услуги като поставяне на пломби след лечение на кариес, подмяна на стари пломби или пломби от амалгама. Ако желаете тези услуги трябва да си запишете час при друг зъболекар. -Не си записвайте час при Д-р Симеонова, ако искате да ви бъде поставена пломба или да се проведе друг вид ресторативно лечение на вашите зъби.

    - -

    Благодаря за доверието.

    - - -
    - - - -
    - - - - - - - -;T; I" -# Предлагани услуги - -* TOC -{:toc} - - -## Виртуална консултация - -Д-р Симеонова предлага виртуална консултация, за да ви даде отговори на всички въпроси и притеснения, относно здравето на вашите зъби. - -Моля, представете подробно описание на вашият случай, споделете въпросите и притесненията, които имате. Ако разполагате с рентгенографски снимки и/или други медицински изследвания ги изпратете на e-mail: [info@bezkaries.com][email] с вашето име и заглавие "Онлайн консултация" - - -Услугa | Цена ------------|-----------| -Цена на виртуалната консултация* | 70лв -Такса спешно обаждане** | 30лв - -*В ценатата на виртуалната консултация се включва кореспонденция по електронна поща и един телефонен разговор в рамките на 60мин.
    -**При желание да разговаряте по спешност, до няколко часа. - - -За да си запишете час за виртуална консултация при Д-р Симеонова попълнете [формата за контакти][contact]. До три работни дни ще получите e-mail за потвърждение на онлайн консултацията и евентуално допълнителни насоки за необходими медицински изследвания, фото снимки и др. - -Не забравяйте: - -- Да оставите актуален телефонен номер и e-mail адрес -- Да предоставите възможно най-точна и подробна информация, относно вашият проблем, снимки, изследвания и документи които имате. - - -Диагностициране на кариеси и други дентални състояния и заболявания се извършват само в кабинета, при частен прием. Д-р Симеонова не може да постави диагноза или извърши преглед по телефона. - -Благодаря за доверието. - - -## Частен прием - -Кабинетът на Д-р Симеонова се намира на адрес гр. Варна, ул. Братя Шкорпил 25
    -Обадете се на тел. 0896044266 или изпратете e-mail на адрес [info@bezkaries.com][email] - -### Предлагани услуги - -- Преглед и диагностика на кариеси -- Предложения за лечение на проблемите, които имате по отношение на вашите зъби -- Проследяване на процесите на реминерализация и обратимостта на кариозните заболявания -- Второ мнение по различни дентални въпроси - - -### Цени - -Услуга | Цена ------------|-----------| -Тридесет минути настолно време | 50лв -Всеки допълнителни тридесет минути | 40лв - - -### Допълнителна информация - -Ако имате рентгенографски снимки или други медицински изследвания и документи, моля изпратете ги на e-mail [info@bezkaries.com][email] с името си ПРЕДИ посещението си в кабинета. - -Д-р Симеонова не предлага услуги като поставяне на пломби след лечение на кариес, подмяна на стари пломби или пломби от амалгама. Ако желаете тези услуги трябва да си запишете час при друг зъболекар. -Не си записвайте час при Д-р Симеонова, ако искате да ви бъде поставена пломба или да се проведе друг вид ресторативно лечение на вашите зъби. - -Благодаря за доверието. - - -[email]: mailto:info@bezkaries.com -[contact]: /contact/;T; -I"  -

    Предлагани услуги

    - - - -

    Виртуална консултация

    - -

    Д-р Симеонова предлага виртуална консултация, за да ви даде отговори на всички въпроси и притеснения, относно здравето на вашите зъби.

    - -

    Моля, представете подробно описание на вашият случай, споделете въпросите и притесненията, които имате. Ако разполагате с рентгенографски снимки и/или други медицински изследвания ги изпратете на e-mail: info@bezkaries.com с вашето име и заглавие “Онлайн консултация”

    - - - - - - - - - - - - - - - - - - -
    УслугaЦена
    Цена на виртуалната консултация* -70лв
    Такса спешно обаждане** -30лв
    - -

    *В ценатата на виртуалната консултация се включва кореспонденция по електронна поща и един телефонен разговор в рамките на 60мин.
    -**При желание да разговаряте по спешност, до няколко часа.

    - -

    За да си запишете час за виртуална консултация при Д-р Симеонова попълнете формата за контакти. До три работни дни ще получите e-mail за потвърждение на онлайн консултацията и евентуално допълнителни насоки за необходими медицински изследвания, фото снимки и др.

    - -

    Не забравяйте:

    - -
      -
    • Да оставите актуален телефонен номер и e-mail адрес
    • -
    • Да предоставите възможно най-точна и подробна информация, относно вашият проблем, снимки, изследвания и документи които имате.
    • -
    - -

    Диагностициране на кариеси и други дентални състояния и заболявания се извършват само в кабинета, при частен прием. Д-р Симеонова не може да постави диагноза или извърши преглед по телефона.

    - -

    Благодаря за доверието.

    - -

    Частен прием

    - -

    Кабинетът на Д-р Симеонова се намира на адрес гр. Варна, ул. Братя Шкорпил 25
    -Обадете се на тел. 0896044266 или изпратете e-mail на адрес info@bezkaries.com

    - -

    Предлагани услуги

    - -
      -
    • Преглед и диагностика на кариеси
    • -
    • Предложения за лечение на проблемите, които имате по отношение на вашите зъби
    • -
    • Проследяване на процесите на реминерализация и обратимостта на кариозните заболявания
    • -
    • Второ мнение по различни дентални въпроси
    • -
    - -

    Цени

    - - - - - - - - - - - - - - - - - - -
    УслугаЦена
    Тридесет минути настолно време50лв
    Всеки допълнителни тридесет минути40лв
    - -

    Допълнителна информация

    - -

    Ако имате рентгенографски снимки или други медицински изследвания и документи, моля изпратете ги на e-mail info@bezkaries.com с името си ПРЕДИ посещението си в кабинета.

    - -

    Д-р Симеонова не предлага услуги като поставяне на пломби след лечение на кариес, подмяна на стари пломби или пломби от амалгама. Ако желаете тези услуги трябва да си запишете час при друг зъболекар. -Не си записвайте час при Д-р Симеонова, ако искате да ви бъде поставена пломба или да се проведе друг вид ресторативно лечение на вашите зъби.

    - -

    Благодаря за доверието.

    - -;T; @I"/services/mission/;T{;{ ;I" - - - - - - - Моята мисия | BezKaries.com - - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Моята мисия

    - - -

    Бъди промяната, която искаш да видиш в света - Махатма Ганди - това мото винаги ме е водило в делата ми, били житейски или професионални.

    - -

    Интереса ми към профилактиката започна още през годините в Университета. Когато в упражненията по Детска стоматология трябваше да лекуваме кариеси чрез познатата методика изпиляване на кариеса и запълване на зъба с пластичен материал, аз усещах че пропускам нещо, че нещо липсва.

    - -

    Когато по-късно започнах своя практика почти отказвах да работя с деца, тъй като не се чувствах комфортно да причинявам страдание на малките си пациенти. Знаех, че този силен стрес се дължи на високата реактивност на организма, но именно тя може да се използва, за да провокира тялото да подпомогне самолечението си.

    - -

    През последните 10 години натрупах знания за това как влияе храната, стреса и околната среда върху генетичния фонд на човека и парченцата от пъзела започнаха да се нареждат. Разбрах, че най-важното нещо след като излекуваш някого е да го научиш как да не допуска заболяването отново. А още по-ценно е да дадеш напътствия на човека как изобщо да не стига до състояние на болест.

    - -

    В съвременното зъболечение се обръща внимание на профилактиката със синтетични средства (флуорни и хлорни съединения) и тя наистина работи. Аз вярвам, че трябва да има алтернатива и я предлагам на моите пациенти. След отлични резултати и при деца, и при възрастни аз насочих практиката си само към профилактика и лечение на кариес чрез неинвазивни методи и естествени средства. Всички методи и средства, които използвам за реминерализация на зъбите са научно доказани и съобразени с принципите на съвременната медицина.

    - -

    Моята мисия е да споделя всичко, което знам за това как човек може сам да повлияе положително върху здравето на зъбите, устата и дори целият си организъм.

    - -
    - - -
    - - - - - - - - -;T; I" -# Моята мисия - -* TOC -{:toc} - -Бъди промяната, която искаш да видиш в света - Махатма Ганди - това мото винаги ме е водило в делата ми, били житейски или професионални. - -Интереса ми към профилактиката започна още през годините в Университета. Когато в упражненията по Детска стоматология трябваше да лекуваме кариеси чрез познатата методика изпиляване на кариеса и запълване на зъба с пластичен материал, аз усещах че пропускам нещо, че нещо липсва. - -Когато по-късно започнах своя практика почти отказвах да работя с деца, тъй като не се чувствах комфортно да причинявам страдание на малките си пациенти. Знаех, че този силен стрес се дължи на високата реактивност на организма, но именно тя може да се използва, за да провокира тялото да подпомогне самолечението си. - -През последните 10 години натрупах знания за това как влияе храната, стреса и околната среда върху генетичния фонд на човека и парченцата от пъзела започнаха да се нареждат. Разбрах, че най-важното нещо след като излекуваш някого е да го научиш как да не допуска заболяването отново. А още по-ценно е да дадеш напътствия на човека как изобщо да не стига до състояние на болест. - -В съвременното зъболечение се обръща внимание на профилактиката със синтетични средства (флуорни и хлорни съединения) и тя наистина работи. Аз вярвам, че трябва да има алтернатива и я предлагам на моите пациенти. След отлични резултати и при деца, и при възрастни аз насочих практиката си само към профилактика и лечение на кариес чрез неинвазивни методи и естествени средства. Всички методи и средства, които използвам за реминерализация на зъбите са научно доказани и съобразени с принципите на съвременната медицина. - -Моята мисия е да споделя всичко, което знам за това как човек може сам да повлияе положително върху здравето на зъбите, устата и дори целият си организъм. -;T; -I" -

    Моята мисия

    - - -

    Бъди промяната, която искаш да видиш в света - Махатма Ганди - това мото винаги ме е водило в делата ми, били житейски или професионални.

    - -

    Интереса ми към профилактиката започна още през годините в Университета. Когато в упражненията по Детска стоматология трябваше да лекуваме кариеси чрез познатата методика изпиляване на кариеса и запълване на зъба с пластичен материал, аз усещах че пропускам нещо, че нещо липсва.

    - -

    Когато по-късно започнах своя практика почти отказвах да работя с деца, тъй като не се чувствах комфортно да причинявам страдание на малките си пациенти. Знаех, че този силен стрес се дължи на високата реактивност на организма, но именно тя може да се използва, за да провокира тялото да подпомогне самолечението си.

    - -

    През последните 10 години натрупах знания за това как влияе храната, стреса и околната среда върху генетичния фонд на човека и парченцата от пъзела започнаха да се нареждат. Разбрах, че най-важното нещо след като излекуваш някого е да го научиш как да не допуска заболяването отново. А още по-ценно е да дадеш напътствия на човека как изобщо да не стига до състояние на болест.

    - -

    В съвременното зъболечение се обръща внимание на профилактиката със синтетични средства (флуорни и хлорни съединения) и тя наистина работи. Аз вярвам, че трябва да има алтернатива и я предлагам на моите пациенти. След отлични резултати и при деца, и при възрастни аз насочих практиката си само към профилактика и лечение на кариес чрез неинвазивни методи и естествени средства. Всички методи и средства, които използвам за реминерализация на зъбите са научно доказани и съобразени с принципите на съвременната медицина.

    - -

    Моята мисия е да споделя всичко, което знам за това как човек може сам да повлияе положително върху здравето на зъбите, устата и дори целият си организъм.

    -;T; @I"!/services/private-reception/;T{;{ ;I" - - - - - - - Частен прием | BezKaries.com - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Частен прием

    - - - -

    Кабинетът на Д-р Симеонова се намира на адрес гр. Варна, ул. Братя Шкорпил 25
    -Обадете се на тел. 0896044266 или изпратете e-mail на адрес info@bezkaries.com

    - -

    Предлагани услуги

    - -
      -
    • Преглед и диагностика на кариеси
    • -
    • Предложения за лечение на проблемите, които имате по отношение на вашите зъби
    • -
    • Проследяване на процесите на реминерализация и обратимостта на кариозните заболявания
    • -
    • Второ мнение по различни дентални въпроси
    • -
    - -

    Цени

    - - - - - - - - - - - - - - - - - - -
    УслугаЦена
    Тридесет минути настолно време50лв
    Всеки допълнителни тридесет минути40лв
    - -

    Допълнителна информация

    - -

    Ако имате рентгенографски снимки или други медицински изследвания и документи, моля изпратете ги на e-mail info@bezkaries.com с името си ПРЕДИ посещението си в кабинета.

    - -

    Д-р Симеонова не предлага услуги като поставяне на пломби след лечение на кариес, подмяна на стари пломби или пломби от амалгама. Ако желаете тези услуги трябва да си запишете час при друг зъболекар. -Не си записвайте час при Д-р Симеонова, ако искате да ви бъде поставена пломба или да се проведе друг вид ресторативно лечение на вашите зъби.

    - -

    Благодаря за доверието.

    - - -
    - - - -
    - - - - - - - -;T; I" -# Частен прием - -* TOC -{:toc} - -Кабинетът на Д-р Симеонова се намира на адрес гр. Варна, ул. Братя Шкорпил 25
    -Обадете се на тел. 0896044266 или изпратете e-mail на адрес [info@bezkaries.com][email] - -## Предлагани услуги - -- Преглед и диагностика на кариеси -- Предложения за лечение на проблемите, които имате по отношение на вашите зъби -- Проследяване на процесите на реминерализация и обратимостта на кариозните заболявания -- Второ мнение по различни дентални въпроси - - -## Цени - -Услуга| Цена ------------|-----------| -Тридесет минути настолно време | 50лв -Всеки допълнителни тридесет минути | 40лв - - -## Допълнителна информация - -Ако имате рентгенографски снимки или други медицински изследвания и документи, моля изпратете ги на e-mail [info@bezkaries.com][email] с името си ПРЕДИ посещението си в кабинета. - -Д-р Симеонова не предлага услуги като поставяне на пломби след лечение на кариес, подмяна на стари пломби или пломби от амалгама. Ако желаете тези услуги трябва да си запишете час при друг зъболекар. -Не си записвайте час при Д-р Симеонова, ако искате да ви бъде поставена пломба или да се проведе друг вид ресторативно лечение на вашите зъби. - -Благодаря за доверието. - - -[email]: mailto:info@bezkaries.com;T; -I" - -

    Частен прием

    - - - -

    Кабинетът на Д-р Симеонова се намира на адрес гр. Варна, ул. Братя Шкорпил 25
    -Обадете се на тел. 0896044266 или изпратете e-mail на адрес info@bezkaries.com

    - -

    Предлагани услуги

    - -
      -
    • Преглед и диагностика на кариеси
    • -
    • Предложения за лечение на проблемите, които имате по отношение на вашите зъби
    • -
    • Проследяване на процесите на реминерализация и обратимостта на кариозните заболявания
    • -
    • Второ мнение по различни дентални въпроси
    • -
    - -

    Цени

    - - - - - - - - - - - - - - - - - - -
    УслугаЦена
    Тридесет минути настолно време50лв
    Всеки допълнителни тридесет минути40лв
    - -

    Допълнителна информация

    - -

    Ако имате рентгенографски снимки или други медицински изследвания и документи, моля изпратете ги на e-mail info@bezkaries.com с името си ПРЕДИ посещението си в кабинета.

    - -

    Д-р Симеонова не предлага услуги като поставяне на пломби след лечение на кариес, подмяна на стари пломби или пломби от амалгама. Ако желаете тези услуги трябва да си запишете час при друг зъболекар. -Не си записвайте час при Д-р Симеонова, ако искате да ви бъде поставена пломба или да се проведе друг вид ресторативно лечение на вашите зъби.

    - -

    Благодаря за доверието.

    - -;T; @I"$/services/virtual-consultation/;T{;{ ;I" - - - - - - - Виртуална консултация | BezKaries.com - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Виртуална консултация

    - - -

    Д-р Симеонова предлага виртуална консултация, за да ви даде отговори на всички въпроси и притеснения, относно здравето на вашите зъби.

    - -

    Моля, представете подробно описание на вашият случай, споделете въпросите и притесненията, които имате. Ако разполагате с рентгенографски снимки и/или други медицински изследвания ги изпратете на e-mail: info@bezkaries.com с вашето име и заглавие “Онлайн консултация”

    - - - - - - - - - - - - - - - - - - -
    УслугиЦена
    Цена на виртуалната консултация* -70лв
    Такса спешно обаждане** -30лв
    - -

    *В ценатата на виртуалната консултация се включва кореспонденция по електронна поща и един телефонен разговор в рамките на 60мин.
    -**При желание да разговаряте по спешност, до няколко часа.

    - -

    За да си запишете час за виртуална консултация при Д-р Симеонова попълнете формата за контакти. До три работни дни ще получите e-mail за потвърждение на онлайн консултацията и евентуално допълнителни насоки за необходими медицински изследвания, фото снимки и др.

    - -

    Не забравяйте:

    - -
      -
    • Да оставите актуален телефонен номер и e-mail адрес
    • -
    • Да предоставите възможно най-точна и подробна информация, относно вашият проблем, снимки, изследвания и документи които имате.
    • -
    - -

    Диагностициране на кариеси и други дентални състояния и заболявания се извършват само в кабинета, при частен прием. Д-р Симеонова не може да постави диагноза или извърши преглед по телефона.

    - -

    Благодаря за доверието.

    - - -
    - - - -
    - - - - - - - -;T; I" - -# Виртуална консултация - -* TOC -{:toc} - -Д-р Симеонова предлага виртуална консултация, за да ви даде отговори на всички въпроси и притеснения, относно здравето на вашите зъби. - -Моля, представете подробно описание на вашият случай, споделете въпросите и притесненията, които имате. Ако разполагате с рентгенографски снимки и/или други медицински изследвания ги изпратете на e-mail: [info@bezkaries.com][email] с вашето име и заглавие "Онлайн консултация" - - -Услуги | Цена ------------|-----------| -Цена на виртуалната консултация* | 70лв -Такса спешно обаждане** | 30лв - -*В ценатата на виртуалната консултация се включва кореспонденция по електронна поща и един телефонен разговор в рамките на 60мин.
    -**При желание да разговаряте по спешност, до няколко часа. - - -За да си запишете час за виртуална консултация при Д-р Симеонова попълнете [формата за контакти][contact]. До три работни дни ще получите e-mail за потвърждение на онлайн консултацията и евентуално допълнителни насоки за необходими медицински изследвания, фото снимки и др. - -Не забравяйте: - -- Да оставите актуален телефонен номер и e-mail адрес -- Да предоставите възможно най-точна и подробна информация, относно вашият проблем, снимки, изследвания и документи които имате. - - -Диагностициране на кариеси и други дентални състояния и заболявания се извършват само в кабинета, при частен прием. Д-р Симеонова не може да постави диагноза или извърши преглед по телефона. - -Благодаря за доверието. - - -[email]: mailto:info@bezkaries.com -[contact]: /contact/;T; -I" -

    Виртуална консултация

    - - -

    Д-р Симеонова предлага виртуална консултация, за да ви даде отговори на всички въпроси и притеснения, относно здравето на вашите зъби.

    - -

    Моля, представете подробно описание на вашият случай, споделете въпросите и притесненията, които имате. Ако разполагате с рентгенографски снимки и/или други медицински изследвания ги изпратете на e-mail: info@bezkaries.com с вашето име и заглавие “Онлайн консултация”

    - - - - - - - - - - - - - - - - - - -
    УслугиЦена
    Цена на виртуалната консултация* -70лв
    Такса спешно обаждане** -30лв
    - -

    *В ценатата на виртуалната консултация се включва кореспонденция по електронна поща и един телефонен разговор в рамките на 60мин.
    -**При желание да разговаряте по спешност, до няколко часа.

    - -

    За да си запишете час за виртуална консултация при Д-р Симеонова попълнете формата за контакти. До три работни дни ще получите e-mail за потвърждение на онлайн консултацията и евентуално допълнителни насоки за необходими медицински изследвания, фото снимки и др.

    - -

    Не забравяйте:

    - -
      -
    • Да оставите актуален телефонен номер и e-mail адрес
    • -
    • Да предоставите възможно най-точна и подробна информация, относно вашият проблем, снимки, изследвания и документи които имате.
    • -
    - -

    Диагностициране на кариеси и други дентални състояния и заболявания се извършват само в кабинета, при частен прием. Д-р Симеонова не може да постави диагноза или извърши преглед по телефона.

    - -

    Благодаря за доверието.

    - -;T; @I"/contact/;T{;{ ;I" - - - - - - - Contact us | Forknote.net - - - - - - - - - - - -
    - -
    - -
    -
    - - - - - -

    Contact form

    - -
    - - -
    - - -
    - - - -
    - - - - - - - -;T; I" - - - - -# Contact form - -
    - - -
    -;T; -I" - - - - -

    Contact form

    - -
    - - -
    - -;T; @I"/static/images/logo.png/;T{;{I" /static/images/logo@2x.png/;T{;{I"$/static/images/tooth-fairy.jpg/;T{;{I"$/static/images/tooth-fairy.png/;T{;{I",/static/images/tooth-fairy-reverse.png/;T{;{I"F/blog/2015-09-03-ensure-your-app-is-ready-for-protected-branches/;T{;{ ;I" - - - - - - - Ensure your app is ready for Protected Branches - - - - - - - - - - - - - - - -
    -
    - -

    We’ve begun to roll out Protected Branches across GitHub. When you -protect a branch in one of your repositories, you will be prevented from -force pushing to that branch or deleting it. You can also configure required -status checks for your protected branch. When configured, changing a branch to -point at a new commit will fail unless the that commit (or another commit with -the same Git tree) has a Status in the success state for -each required status check.

    - -

    These restrictions apply to branch manipulations performed via the GitHub API -as well. So when you protect a branch, you will no longer be able to delete -the branch via the API or update it to point at a -non-ancestor commit, even with "force": true. And if your branch has required -status checks, you won’t be able to update it or merge pull -requests into that branch until success Statuses have been posted to -the target commit for all required status checks.

    - -

    These restrictions are all represented by 422 errors:

    - -
    -$ curl -i -H 'Authorization: token TOKEN' \
    -    -X DELETE https://api.github.com/repos/octocat/hubot/git/refs/heads/master
    -HTTP/1.1 422 Unprocessable Entity
    -
    -{
    -  "message": "Cannot delete a protected branch",
    -  "documentation_url": "https://help.github.com/articles/about-protected-branches"
    -}
    -
    - -

    Protected branches and required status checks are a great way to ensure your -project’s conventions are followed. For example, you could write a Status -integration that only posts a success Status when the pull request’s author -has signed your project’s Contributor License Agreement. Or you could write one -that only posts a success Status when three or more members of your -@initech/senior-engineers team have left a comment saying they’ve reviewed -the changes. If you configure these integrations as required status checks, you -can be sure that these conditions have been satisfied before a pull request is -merged. See our Status API guide to learn how to create integrations -like these.

    - -

    If you have any questions, please let us know.

    - - -
    - - - -
    - - - - - - - -;T; I"5 - -We’ve begun to [roll out Protected Branches][blog] across GitHub. When you -protect a branch in one of your repositories, you will be prevented from -force pushing to that branch or deleting it. You can also configure required -status checks for your protected branch. When configured, changing a branch to -point at a new commit will fail unless the that commit (or another commit with -the same [Git tree][tree]) has a [Status][statuses] in the `success` state for -each required status check. - -These restrictions apply to branch manipulations performed via the GitHub API -as well. So when you protect a branch, you will no longer be able to [delete -the branch][delete] via the API or [update it][update] to point at a -non-ancestor commit, even with `"force": true`. And if your branch has required -status checks, you won’t be able to [update it][update] or [merge pull -requests][merge] into that branch until `success` Statuses have been posted to -the target commit for all required status checks. - -These restrictions are all represented by 422 errors: - -
    -$ curl -i -H 'Authorization: token TOKEN' \
    -    -X DELETE https://api.github.com/repos/octocat/hubot/git/refs/heads/master
    -HTTP/1.1 422 Unprocessable Entity
    -
    -{
    -  "message": "Cannot delete a protected branch",
    -  "documentation_url": "https://help.github.com/articles/about-protected-branches"
    -}
    -
    - -Protected branches and required status checks are a great way to ensure your -project’s conventions are followed. For example, you could write a Status -integration that only posts a `success` Status when the pull request’s author -has signed your project’s Contributor License Agreement. Or you could write one -that only posts a `success` Status when three or more members of your -`@initech/senior-engineers` team have left a comment saying they’ve reviewed -the changes. If you configure these integrations as required status checks, you -can be sure that these conditions have been satisfied before a pull request is -merged. See our [Status API guide][guide] to learn how to create integrations -like these. - -If you have any questions, please [let us know][contact]. - -[blog]: https://github.com/blog/2051-protected-branches-and-required-status-checks -[statuses]: /v3/repos/statuses/ -[tree]: http://git-scm.com/book/en/v2/Git-Internals-Git-Objects#Tree-Objects -[delete]: /v3/git/refs/#delete-a-reference -[update]: /v3/git/refs/#update-a-reference -[merge]: /v3/pulls/#merge-a-pull-request-merge-button -[contact]: https://github.com/contact?form[subject]=Protected+Branches+in+API+responses -[guide]: /guides/building-a-ci-server/ -;T; -I" - -

    We’ve begun to roll out Protected Branches across GitHub. When you -protect a branch in one of your repositories, you will be prevented from -force pushing to that branch or deleting it. You can also configure required -status checks for your protected branch. When configured, changing a branch to -point at a new commit will fail unless the that commit (or another commit with -the same Git tree) has a Status in the success state for -each required status check.

    - -

    These restrictions apply to branch manipulations performed via the GitHub API -as well. So when you protect a branch, you will no longer be able to delete -the branch via the API or update it to point at a -non-ancestor commit, even with "force": true. And if your branch has required -status checks, you won’t be able to update it or merge pull -requests into that branch until success Statuses have been posted to -the target commit for all required status checks.

    - -

    These restrictions are all represented by 422 errors:

    - -
    -$ curl -i -H 'Authorization: token TOKEN' \
    -    -X DELETE https://api.github.com/repos/octocat/hubot/git/refs/heads/master
    -HTTP/1.1 422 Unprocessable Entity
    -
    -{
    -  "message": "Cannot delete a protected branch",
    -  "documentation_url": "https://help.github.com/articles/about-protected-branches"
    -}
    -
    - -

    Protected branches and required status checks are a great way to ensure your -project’s conventions are followed. For example, you could write a Status -integration that only posts a success Status when the pull request’s author -has signed your project’s Contributor License Agreement. Or you could write one -that only posts a success Status when three or more members of your -@initech/senior-engineers team have left a comment saying they’ve reviewed -the changes. If you configure these integrations as required status checks, you -can be sure that these conditions have been satisfied before a pull request is -merged. See our Status API guide to learn how to create integrations -like these.

    - -

    If you have any questions, please let us know.

    - -;T; @I" /blog/;T{;{ ;I"( - - - - - - - Blog | Forknote - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    - -
    -

    - Documentation added to Forknote -

    - -
    -
      -
    • - - October 12, 2015 -
    • -
    • - Avatar for pmitchev - pmitchev -
    • -
    -
    - - -

    Documentation was added for:

    - - - -

    Guides for the most common questions were created:

    - - - - - -
    - - -
    - - - -
    - - - - - - - -;T; I"4 -<%= render '_posts', :posts => posts_list %> - -;T; -I" -
    -

    - Documentation added to Forknote -

    - -
    -
      -
    • - - October 12, 2015 -
    • -
    • - Avatar for pmitchev - pmitchev -
    • -
    -
    - - -

    Documentation was added for:

    - - - -

    Guides for the most common questions were created:

    - - - - - -
    - -;T; @I"3/blog/2014-07-09-status-contexts-are-official/;T{;{ ;I"9 - - - - - - - The Combined Status API is official - - - - - - - - - - - - - - - -
    -
    - -

    We’re happy to announce that the Combined Status API is officially part -of the GitHub API v3. We now consider it stable for production use.

    - -

    Thanks to everyone who provided feedback during the comment period. We got -some great feedback, and hope this feature helps you build the tools you -need to make GitHub the best place to ship exactly the way you want.

    - -

    Preview media type no longer needed

    - -

    If you used the Combined Status API during the preview period, you needed to -provide a custom media type in the Accept header:

    - -
    application/vnd.github.she-hulk-preview+json
    -
    - -

    Now that the preview period has ended, you no longer need to pass this custom -media type.

    - -

    Instead, we recommend that you specify v3 as the version in the -Accept header:

    - -
    application/vnd.github.v3+json
    -
    - -

    Feedback

    - -

    We’ll never be done listening to you! As always, please don’t hesitate to -share your feedback.

    - - -
    - - - -
    - - - - - - - -;T; I"R -We're happy to announce that the [Combined Status API][docs] is officially part -of the GitHub API v3. We now consider it stable for production use. - -Thanks to everyone who provided feedback during the comment period. We got -some great feedback, and hope this feature helps you build the tools you -need to make GitHub the best place to ship exactly the way you want. - -### Preview media type no longer needed - -If you used the Combined Status API during the preview period, you needed to -provide a custom media type in the `Accept` header: - - application/vnd.github.she-hulk-preview+json - -Now that the preview period has ended, you no longer need to pass this custom -media type. - -Instead, we [recommend][media-types] that you specify `v3` as the version in the -`Accept` header: - - application/vnd.github.v3+json - -### Feedback - -We'll never be done listening to you! As always, please don't hesitate to -[share your feedback][feedback]. - -[docs]: /v3/repos/statuses/#get-the-combined-status-for-a-specific-ref -[media-types]: /v3/media -[feedback]: https://github.com/contact?form[subject]=Combined+Status+API -;T; -I" -

    We’re happy to announce that the Combined Status API is officially part -of the GitHub API v3. We now consider it stable for production use.

    - -

    Thanks to everyone who provided feedback during the comment period. We got -some great feedback, and hope this feature helps you build the tools you -need to make GitHub the best place to ship exactly the way you want.

    - -

    Preview media type no longer needed

    - -

    If you used the Combined Status API during the preview period, you needed to -provide a custom media type in the Accept header:

    - -
    application/vnd.github.she-hulk-preview+json
    -
    - -

    Now that the preview period has ended, you no longer need to pass this custom -media type.

    - -

    Instead, we recommend that you specify v3 as the version in the -Accept header:

    - -
    application/vnd.github.v3+json
    -
    - -

    Feedback

    - -

    We’ll never be done listening to you! As always, please don’t hesitate to -share your feedback.

    - -;T; @I"B/blog/2014-07-28-assignee-and-label-actions-for-issue-events/;T{;{ ;I"h - - - - - - - New assigned/labeled actions for issue and pull request events - - - - - - - - - - - - - - - -
    -
    - -

    As part of the new GitHub Issues, we’ve added new actions to the issues and pull requests webhook events: “labeled”, “unlabeled”, “assigned”, and “unassigned”. The payload will also include the respective assignee or label for these new actions.

    - -

    If you already have a webhook subscribed to the issues or pull_request events, you’ll start seeing these new actions immediately. The new events can also be fetched from the issue events API.

    - -

    For more information, be sure to check out our documentation for the IssuesEvent or PullRequestEvent. If you have any questions or feedback, please drop us a line.

    - - -
    - - - -
    - - - - - - - -;T; I" -As part of the [new GitHub Issues][issues-three], we've added new actions to the issues and pull requests webhook events: "labeled", "unlabeled", "assigned", and "unassigned". The payload will also include the respective assignee or label for these new actions. - -If you already have a [webhook](/webhooks/) subscribed to the `issues` or `pull_request` events, you'll start seeing these new actions immediately. The new events can also be fetched from the [issue events API](/v3/issues/events/). - -For more information, be sure to check out our documentation for the [IssuesEvent](/v3/activity/events/types/#issuesevent) or [PullRequestEvent](/v3/activity/events/types/#pullrequestevent). If you have any questions or feedback, please [drop us a line][contact]. - -[issues-three]: https://github.com/blog/1866-the-new-github-issues -[contact]: https://github.com/contact?form%5Bsubject%5D=New+Assigned+and+Labeled+Actions+for+Issues+and+Pull+Request+Events -;T; -I" - -

    As part of the new GitHub Issues, we’ve added new actions to the issues and pull requests webhook events: “labeled”, “unlabeled”, “assigned”, and “unassigned”. The payload will also include the respective assignee or label for these new actions.

    - -

    If you already have a webhook subscribed to the issues or pull_request events, you’ll start seeing these new actions immediately. The new events can also be fetched from the issue events API.

    - -

    For more information, be sure to check out our documentation for the IssuesEvent or PullRequestEvent. If you have any questions or feedback, please drop us a line.

    - -;T; @I"+/blog/2014-08-05-team-memberships-api/;T{;{ ;I" - - - - - - - We're changing the way you add new members to your organization - - - - - - - - - - - - - - - -
    -
    - -

    Today, we’re announcing a change to the way organization owners add new members to their organization.

    - -

    Previously, if you were an organization owner, you could use the add team member endpoint to add any GitHub user to any team on your organization without any sort of approval from them. Now, we’re increasing user security by sending invitations to users when they’re added to teams on organizations that they aren’t yet a part of.

    - -

    With this change, if you use the add team member endpoint to add a user to a team and that user isn’t already on another team in your organization, the request will fail.

    - -

    The new Team Memberships API

    - -

    You should change all your add team member requests to use the new add team membership endpoint. This new endpoint works exactly the same as the old one, with one important change: if the membership being added is for a user who is unaffiliated with the team’s organization, that user will be sent an invitation via email.

    - -

    Unlike the add team member endpoint, a successful request to the add team membership endpoint does not guarantee that the user is now a member of the team. If you’re trying to migrate to the new endpoint and need to know when a user has been successfully added (not just invited) to a team, please check out TeamAddEvent.

    - -

    Preview period

    - -

    We’re making the new Team Memberships API (and the breaking changes to the add team member API) available today for developers to preview. During this period, we may change aspects of these endpoints. If we do, we will announce the changes on the developer blog, but we will not provide any advance notice.

    - -

    While these new APIs are in their preview period, you’ll need to provide the following custom media type in the Accept header:

    - -
    application/vnd.github.the-wasp-preview+json
    -
    - -

    We expect the preview period to last 30-60 days. At the end of the preview period, the Team Memberships API will become an official component of GitHub API v3, as will the add team member API’s breaking changes.

    - -

    If you have any questions or feedback, please get in touch with us!

    - - -
    - - - -
    - - - - - - - -;T; I"3 -Today, we're announcing a change to the way organization owners add new members to their organization. - -Previously, if you were an organization owner, you could use the [add team member][add-team-member] endpoint to add any GitHub user to any team on your organization without any sort of approval from them. Now, we're increasing user security by sending [invitations][org-invitations] to users when they're added to teams on organizations that they aren't yet a part of. - -With this change, if you use the [add team member][add-team-member] endpoint to add a user to a team and that user isn't already on another team in your organization, the request will fail. - -### The new Team Memberships API - -You should change all your [add team member][add-team-member] requests to use the new [add team membership][add-team-membership] endpoint. This new endpoint works exactly the same as the old one, with one important change: if the membership being added is for a user who is unaffiliated with the team's organization, that user will be sent an invitation via email. - -Unlike the [add team member][add-team-member] endpoint, a successful request to the [add team membership][add-team-membership] endpoint does *not* guarantee that the user is now a member of the team. If you're trying to migrate to the new endpoint and need to know when a user has been successfully added (not just invited) to a team, please check out [TeamAddEvent][team-add-event]. - -### Preview period - -We're making the new Team Memberships API (and the breaking changes to the [add team member][add-team-member] API) available today for developers to preview. During this period, we may change aspects of these endpoints. If we do, we will announce the changes on the developer blog, but we will not provide any advance notice. - -While these new APIs are in their preview period, you'll need to provide the following custom media type in the `Accept` header: - - application/vnd.github.the-wasp-preview+json - -We expect the preview period to last 30-60 days. At the end of the preview period, the Team Memberships API will become an official component of GitHub API v3, as will the [add team member][add-team-member] API's breaking changes. - -If you have any questions or feedback, please [get in touch with us][contact]! - -[contact]: https://github.com/contact?form[subject]=Team+Memberships+API -[org-invitations]: https://help.github.com/articles/adding-or-inviting-members-to-a-team-in-an-organization -[add-team-member]: /v3/orgs/teams/#add-team-member -[add-team-membership]: /v3/orgs/teams/#add-team-membership -[get-team-member]: /v3/orgs/teams/#get-team-member -[get-team-membership]: /v3/orgs/teams/#get-team-membership -[remove-team-member]: /v3/orgs/teams/#remove-team-member -[remove-team-member]: /v3/orgs/teams/#remove-team-membership -[team-add-event]: /v3/activity/events/types/#teamaddevent -;T; -I"A -

    Today, we’re announcing a change to the way organization owners add new members to their organization.

    - -

    Previously, if you were an organization owner, you could use the add team member endpoint to add any GitHub user to any team on your organization without any sort of approval from them. Now, we’re increasing user security by sending invitations to users when they’re added to teams on organizations that they aren’t yet a part of.

    - -

    With this change, if you use the add team member endpoint to add a user to a team and that user isn’t already on another team in your organization, the request will fail.

    - -

    The new Team Memberships API

    - -

    You should change all your add team member requests to use the new add team membership endpoint. This new endpoint works exactly the same as the old one, with one important change: if the membership being added is for a user who is unaffiliated with the team’s organization, that user will be sent an invitation via email.

    - -

    Unlike the add team member endpoint, a successful request to the add team membership endpoint does not guarantee that the user is now a member of the team. If you’re trying to migrate to the new endpoint and need to know when a user has been successfully added (not just invited) to a team, please check out TeamAddEvent.

    - -

    Preview period

    - -

    We’re making the new Team Memberships API (and the breaking changes to the add team member API) available today for developers to preview. During this period, we may change aspects of these endpoints. If we do, we will announce the changes on the developer blog, but we will not provide any advance notice.

    - -

    While these new APIs are in their preview period, you’ll need to provide the following custom media type in the Accept header:

    - -
    application/vnd.github.the-wasp-preview+json
    -
    - -

    We expect the preview period to last 30-60 days. At the end of the preview period, the Team Memberships API will become an official component of GitHub API v3, as will the add team member API’s breaking changes.

    - -

    If you have any questions or feedback, please get in touch with us!

    - -;T; @I"!/blog/2015-06-02-experiment/;T{;{ ;I"!, - - - - - - - Експеримент със зъб и Кока-Кола - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Експеримент със зъб и Кока-Кола -

    - -
    -
      -
    • - - June 2, 2015 -
    • -
    -
    - - -

    Сигурна съм, че всеки който се интересува от здравословно хранене знае, че подсладените газирани напитки нямат никаква полза за здравето. Те са само сладък вкус и празни калории.

    - -

    В Интернет можете да намерите хиляди статии за вредата от Кока-Колата и подобните й. Аз обаче ще ви изненадам като ви покажа ефекта й върху зъбите. По-точно върху един зъб. В снимки.

    - -

    Зъбът е молар (дъвкателен зъб) от долната челюст и както се вижда има голям кариес.

    - -

    Зъб1

    - -

    Поставям изваденият зъб в малко бурканче от детско пюре и наливам около 100мл Кока-Кола(pH 2.8). Прибирам затвореният съд на рафт в кухнята си, на стайна температура.

    - -

    Зъб2
    -Зъб3
    -Зъб4

    - -

    В газираната захарна напитка зъбът престоява 4 месеца. На повърхността се беше оформил слой плесен с дебелина 3-4мм. След изваждането му е силно оцветен в червеникаво-кафяво.

    - -

    Зъб5
    -Зъб6
    -Зъб7

    - -

    Подсуших и почистих зъба и ето резултата:

    - -

    Зъб8
    -Зъб9
    -Зъб10
    -Зъб11

    - -

    На снимките ясно си личи блясъкът на емайла; т.е. не е загубил твърдостта или здравината си.

    - -

    Зъб12
    -Зъб13
    -Зъб14
    -Зъб15
    -Зъб16
    -Зъб17

    - -

    Изводи, които си направих от този експеримент: -- Захарта сама по себе си НЕ ПРОМЕНЯ структурно зъбните тъкани
    -- Ниското pH на средата не е достатъчно, за да резорбира емайла или дентина на зъба
    -- За да се получи кариес са нужни всички фактори на куп: бактерии-причинители на кариес (streptococcus mutans), подходяща среда (киселинно pH) и храна за бактериите (захар)

    - -

    И все пак, припомнете си защо захарта не е храна за всеки ден и как да спрете газираните напитки.

    - -

    Надявам се, че тази статия ви е била интересна. Ако е така, споделете я в социалните мрежи.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"BСигурна съм, че всеки който се интересува от здравословно хранене знае, че подсладените газирани напитки нямат никаква полза за здравето. Те са само сладък вкус и празни калории.
    - -В Интернет можете да намерите хиляди статии за вредата от Кока-Колата и подобните й. Аз обаче ще ви изненадам като ви покажа ефекта й върху зъбите. По-точно върху един зъб. В снимки.
    - -Зъбът е молар (дъвкателен зъб) от долната челюст и както се вижда има голям кариес.
    - -![Зъб1](/images/posts/Tooth1.jpg){:width="350px"}
    - -Поставям изваденият зъб в малко бурканче от детско пюре и наливам около 100мл Кока-Кола(pH 2.8). Прибирам затвореният съд на рафт в кухнята си, на стайна температура.
    - -![Зъб2](/images/posts/Tooth2.jpg){:width="350px"}
    -![Зъб3](/images/posts/Tooth3.jpg){:width="350px"}
    -![Зъб4](/images/posts/Tooth4.jpg){:width="350px"}
    - -В газираната захарна напитка зъбът престоява 4 месеца. На повърхността се беше оформил слой плесен с дебелина 3-4мм. След изваждането му е силно оцветен в червеникаво-кафяво.
    - -![Зъб5](/images/posts/Tooth5.jpg){:width="350px"}
    -![Зъб6](/images/posts/Tooth6.jpg){:width="350px"}
    -![Зъб7](/images/posts/Tooth7.jpg){:width="350px"}
    - -Подсуших и почистих зъба и ето резултата:
    - -![Зъб8](/images/posts/Tooth8.jpg){:width="350px"}
    -![Зъб9](/images/posts/Tooth9.jpg){:width="350px"}
    -![Зъб10](/images/posts/Tooth10.jpg){:width="350px"}
    -![Зъб11](/images/posts/Tooth11.jpg){:width="350px"}
    - -На снимките ясно си личи блясъкът на емайла; т.е. не е загубил твърдостта или здравината си.
    - -![Зъб12](/images/posts/Tooth12.jpg){:width="350px"}
    -![Зъб13](/images/posts/Tooth13.jpg){:width="350px"}
    -![Зъб14](/images/posts/Tooth14.jpg){:width="350px"}
    -![Зъб15](/images/posts/Tooth15.jpg){:width="350px"}
    -![Зъб16](/images/posts/Tooth16.jpg){:width="350px"}
    -![Зъб17](/images/posts/Tooth17.jpg){:width="350px"}
    - -Изводи, които си направих от този експеримент: -- Захарта сама по себе си НЕ ПРОМЕНЯ структурно зъбните тъкани
    -- Ниското pH на средата не е достатъчно, за да резорбира емайла или дентина на зъба
    -- За да се получи кариес са нужни всички фактори на куп: бактерии-причинители на кариес (streptococcus mutans), подходяща среда (киселинно pH) и храна за бактериите (захар)
    - -И все пак, припомнете си [защо захарта не е храна за всеки ден](/blog/2014-05-05-наистина-ли-захарта-е-толкова-вредна/) и [как да спрете газираните напитки](/blog/2014-06-15-как-да-се-откажем-от-вредните-навици/).
    - -Надявам се, че тази статия ви е била интересна. Ако е така, споделете я в социалните мрежи. -;T; -I"I

    Сигурна съм, че всеки който се интересува от здравословно хранене знае, че подсладените газирани напитки нямат никаква полза за здравето. Те са само сладък вкус и празни калории.

    - -

    В Интернет можете да намерите хиляди статии за вредата от Кока-Колата и подобните й. Аз обаче ще ви изненадам като ви покажа ефекта й върху зъбите. По-точно върху един зъб. В снимки.

    - -

    Зъбът е молар (дъвкателен зъб) от долната челюст и както се вижда има голям кариес.

    - -

    Зъб1

    - -

    Поставям изваденият зъб в малко бурканче от детско пюре и наливам около 100мл Кока-Кола(pH 2.8). Прибирам затвореният съд на рафт в кухнята си, на стайна температура.

    - -

    Зъб2
    -Зъб3
    -Зъб4

    - -

    В газираната захарна напитка зъбът престоява 4 месеца. На повърхността се беше оформил слой плесен с дебелина 3-4мм. След изваждането му е силно оцветен в червеникаво-кафяво.

    - -

    Зъб5
    -Зъб6
    -Зъб7

    - -

    Подсуших и почистих зъба и ето резултата:

    - -

    Зъб8
    -Зъб9
    -Зъб10
    -Зъб11

    - -

    На снимките ясно си личи блясъкът на емайла; т.е. не е загубил твърдостта или здравината си.

    - -

    Зъб12
    -Зъб13
    -Зъб14
    -Зъб15
    -Зъб16
    -Зъб17

    - -

    Изводи, които си направих от този експеримент: -- Захарта сама по себе си НЕ ПРОМЕНЯ структурно зъбните тъкани
    -- Ниското pH на средата не е достатъчно, за да резорбира емайла или дентина на зъба
    -- За да се получи кариес са нужни всички фактори на куп: бактерии-причинители на кариес (streptococcus mutans), подходяща среда (киселинно pH) и храна за бактериите (захар)

    - -

    И все пак, припомнете си защо захарта не е храна за всеки ден и как да спрете газираните напитки.

    - -

    Надявам се, че тази статия ви е била интересна. Ако е така, споделете я в социалните мрежи.

    -;T; @I"//blog/2015-07-01-паста-за-зъби/;T{;{ ;I"rG - - - - - - - Полезна ли е пастата за зъби? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Полезна ли е пастата за зъби? -

    - -
    -
      -
    • - - July 1, 2015 -
    • -
    -
    - - -

    Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност!

    - -

    Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно:

    - -

    Как по естествен начин да лекуваме зъбите си от кариес

    -

    (без болезнени посещения при зъболекар)

    - -

    Тук и тук ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци.

    - -

    Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл.

    - -

    За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят.

    - -
      -
    • Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозирането е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива.
    • -
    • Сулфиди - веществата, които образуват пяната, увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост)
    • -
    • Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали
    • -
    • Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба
    • -
    • Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на сапун за уста, който набира популярност в САЩ и Великобритания.
    • -
    - -

    Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини.

    - -

    Тогава как да поддържаме добра и безопасна устна хигиена?

    - -

    Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми.

    - -

    Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н.

    - -

    Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето една, друга, още три

    - -

    С домашната паста, в комбинация с този лесен метод за избелване, при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца.

    - -

    Домашна паста за зъби

    - -
      -
    • 4 супени лъжици кокосово масло
    • -
    • 1 пълна супена лъжица сода за хляб
    • -
    • 1 чаена лъжичка листа от стевия на прах (опционално)
    • -
    • 2-3 зърна карамфил, смлени на прах
    • -
    • 7 капки ментово масло (или друго по избор)
    • -
    • 2-3 супени лъжици гореща вода
    • -
    - -

    съставки

    - -

    Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят се горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството.

    - -

    пастата

    - -

    Върши ли наистина работа?

    - -

    Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията (бактерии причиняващи кариес, хранителни остатъци и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки!

    - -

    Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.?

    - -

    Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й.

    - -

    Отново държа да подчертая, че трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"*Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност! - -Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно: - -###Как по естествен начин да лекуваме зъбите си от кариес -(без болезнени посещения при зъболекар) - -[Тук](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/) и [тук](/blog/2014-03-03-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-2/) ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци. - -Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл. - -За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят. - - * Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозирането е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива. - * Сулфиди - веществата, които образуват пяната, увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост) - * Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали - * Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба - * Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на [сапун за уста](http://www.amazon.com/Tooth-Soap-Peppermint-Liquid/dp/B0043L4JBI), който набира популярност в САЩ и Великобритания. - -Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини. - -###Тогава как да поддържаме добра и безопасна устна хигиена? - -Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми. - -Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н. - -Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето [една](http://desilifestyle.net/2012/09/%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B0-%D0%BA%D0%BE%D0%BA%D0%BE%D1%81%D0%BE%D0%B2%D0%B0-%D0%BF%D0%B0%D1%81%D1%82%D0%B0-%D0%B7%D0%B0-%D0%B7%D1%8A%D0%B1%D0%B8/), [друга](http://www.otnishtoneshto.com/2011/08/blog-post.html), [още три](http://www.mnn.com/lifestyle/natural-beauty-fashion/stories/3-simple-homemade-toothpaste-recipes)... - -С домашната паста, в комбинация с този лесен [метод за избелване](/blog/2014-03-07-%D0%B8%D0%B7%D0%B1%D0%B5%D0%BB%D0%B2%D0%B0%D0%BD%D0%B5/), при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца. - -**Домашна паста за зъби** - - * 4 супени лъжици кокосово масло - * 1 пълна супена лъжица сода за хляб - * 1 чаена лъжичка листа от стевия на прах (опционално) - * 2-3 зърна карамфил, смлени на прах - * 7 капки ментово масло (или друго по избор) - * 2-3 супени лъжици гореща вода - -![съставки](/images/posts/Ingredients.jpg) - -Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят се горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството. - -![пастата](/images/posts/Paste.jpg) - -###Върши ли наистина работа? - -Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията ([бактерии](http://www.ncbi.nlm.nih.gov/pubmed/18408265) причиняващи [кариес](http://www.walkbythewayjournal.com/wp-content/uploads/2013/10/Anand-et-al.pdf), [хранителни остатъци](http://www.ijdr.in/article.asp?issn=0970-9290;year=2009;volume=20;issue=1;spage=47;epage=51;aulast=Asokan) и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки! - -Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.? - -Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й. - -Отново държа да подчертая, че **трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.** -;T; -I"v,

    Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност!

    - -

    Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно:

    - -

    Как по естествен начин да лекуваме зъбите си от кариес

    -

    (без болезнени посещения при зъболекар)

    - -

    Тук и тук ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци.

    - -

    Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл.

    - -

    За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят.

    - -
      -
    • Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозирането е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива.
    • -
    • Сулфиди - веществата, които образуват пяната, увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост)
    • -
    • Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали
    • -
    • Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба
    • -
    • Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на сапун за уста, който набира популярност в САЩ и Великобритания.
    • -
    - -

    Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини.

    - -

    Тогава как да поддържаме добра и безопасна устна хигиена?

    - -

    Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми.

    - -

    Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н.

    - -

    Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето една, друга, още три

    - -

    С домашната паста, в комбинация с този лесен метод за избелване, при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца.

    - -

    Домашна паста за зъби

    - -
      -
    • 4 супени лъжици кокосово масло
    • -
    • 1 пълна супена лъжица сода за хляб
    • -
    • 1 чаена лъжичка листа от стевия на прах (опционално)
    • -
    • 2-3 зърна карамфил, смлени на прах
    • -
    • 7 капки ментово масло (или друго по избор)
    • -
    • 2-3 супени лъжици гореща вода
    • -
    - -

    съставки

    - -

    Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят се горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството.

    - -

    пастата

    - -

    Върши ли наистина работа?

    - -

    Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията (бактерии причиняващи кариес, хранителни остатъци и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки!

    - -

    Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.?

    - -

    Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й.

    - -

    Отново държа да подчертая, че трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.

    -;T; @I"!/blog/2015-07-29-успех/;T{;{ ;I"^ - - - - - - - Documentation added to Forknote - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Documentation added to Forknote -

    - -
    -
      -
    • - - October 11, 2015 -
    • -
    • - Avatar for pmitchev - pmitchev -
    • -
    -
    - - - -

    The documentation added for:

    - - - -

    Guides for the most common question were created.

    - -
      -
    • -
    - - - - - - -
    - - -
    -
    - - - -
    - - - - - - - -;T; I" -###The documentation added for: - -* [Daemon][documentation-daemon] -* [Simplewallet][documentation-simplewallet] -* [Payment gateway][documentation-payment-gateway] - -##Guides for the most common question were created. - -* - - -[documentation-daemon]: /documentation/daemon/ -[documentation-simplewallet]: /documentation/simplewallet/ -[documentation-payment-gateway]: /documentation/payment-gateway/ -[guide-get-started]: /guide/getting-started/ - - - - - -;T; -I" -

    The documentation added for:

    - - - -

    Guides for the most common question were created.

    - -
      -
    • -
    - -;T; @I"H/blog/2015-04-07-какво-не-казва-зъболекарят/;T{;{ ;I"5 - - - - - - - Това, което твоят зъболекар не ти казва - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Това, което твоят зъболекар не ти казва -

    - -
    -
      -
    • - - April 7, 2015 -
    • -
    -
    - - -

    Доверието в лекаря рядко се подлага под съмнение. В съвременната концепция за медицината е заложено, че лекарят ни знае всичко и ще приложи най-доброто лечение за нашият проблем. Истината обаче често е малко по-различна. Лекарят е човек като всички останали и прави грешки в работата си, колкото всички останали хора.

    - -

    Ето някои неща, които вашият зъболекар може би не ви казва, а е добре да знаете, за да получите най-доброто лечение.

    - -
      -
    1. -

      Зъболекарят ви може да не е достатъчно квалифициран. -Денталната медицина се развива с много бързи темпове. Има голяма вероятност вашият зъболекар да е пропуснал много от новостите, ако не се е информирал адекватно след като е напуснал университета. По тази причина млади зъболекари с малък стаж може да е по-подходящ за вашият проблем, от обръгналият и навлязал в рутината опитен и по-възрастен негов колега.

      -
    2. -
    3. -

      Зъболекарят ви може да не използва съвременни материали и апаратура. -Знаете, че в зъболекарският кабинет има стотици малки кутийки пълни с лекарства, пластични материали, миниатюрни инструменти. Освен това нещата като коронки, мостове, протези и импланти се изготвят в зъботехническа лаборатория извън денталният офис. Вие имате право да се информирате за материалите, с които работят зъболекарят ви и зъботехникът. -Апаратурата от друга страна може да не изглежда “лъскава”, но лесно можете да разпознаете някои нови технологии. Например при почистване на зъбен камък, ултразвуковите инструменти вибрират и отделят натрупаната храна и налепи по зъбите. -Diagnodent е лазер, който осветява зъбите и помага за по-лесното откриване на кариеси като ги оцветява в червен цвят. -Разбира се само наличието на добра апаратура не е достатъчно. Специален мотор за поставяне на импланти или за провеждане на коренови лечения може да има в много зъболекарски офиси, но добрите специалисти в тези области не се срещат често.

      -
    4. -
    5. -

      Зъболекарят ви може би още използва живачна амалгама. -Живакът е токсичен и спор за това няма. Амалгамените пломби често се наричат “сребърни”, но истината е, че амалгамата може да съдържа до 50% живак. Съвременните производители на стоматологични материали произвеждат амалгама без живак, така че се уверете, че вашият зъболекар използва именно такава. Причините за употребата на амалгамени пломби са различни за всеки пациент и за всеки зъб. Питайте и разберете защо е подходяща във вашият случай. Повече за живака скоро в блога.

      -
    6. -
    7. -

      Доброто лечение на зъбите не е само “запълване на кариеса”. Вашият зъболекар трябва да се запознае със цялостното ви здравословно състояние и заболявания като диабет или високо кръвно налягане; евентуални проблеми със долночелюстните стави; пародонтални оплаквания и кървене от венците; състояния, които засягат костите; сънна апнея или стискане на зъби в будно състояние или по време на сън. Всички тези данни ще създадат една цялостна представа за вашето здраве, която ще помогне за вземане на добри и адекватни решения по време на лечението.

      -
    8. -
    9. -

      Може би кореновото лечение не е най-подходящото лечение за вашият зъб. -Чували ли сте за “феруле ефекта”? С две думи: кореновото лечение на вашият зъб няма да е успешно, ако няма достатъчно здрави зъбни тъкани след почистването на кариозният емайл и дентин. Нужно е останалата здрава част от зъба да е достатъчно стабилна, за да издържи поставянето на коронка. Ако това условие не е спазено, то по-добрият вариант за лечение е изваждане на зъба и поставянето на имплант.

      -
    10. -
    - -

    С пожелание към всички колеги никога да не угасва искрицата, която ги е запалила да бъдат лечители на човешката болка и нещастие. Честит професионален празник!

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"^Доверието в лекаря рядко се подлага под съмнение. В съвременната концепция за медицината е заложено, че лекарят ни знае всичко и ще приложи най-доброто лечение за нашият проблем. Истината обаче често е малко по-различна. Лекарят е човек като всички останали и прави грешки в работата си, колкото всички останали хора. - -Ето някои неща, които вашият зъболекар може би не ви казва, а е добре да знаете, за да получите най-доброто лечение. - -1. Зъболекарят ви може да не е достатъчно квалифициран. -Денталната медицина се развива с много бързи темпове. Има голяма вероятност вашият зъболекар да е пропуснал много от новостите, ако не се е информирал адекватно след като е напуснал университета. По тази причина млади зъболекари с малък стаж може да е по-подходящ за вашият проблем, от обръгналият и навлязал в рутината опитен и по-възрастен негов колега. - -2. Зъболекарят ви може да не използва съвременни материали и апаратура. -Знаете, че в зъболекарският кабинет има стотици малки кутийки пълни с лекарства, пластични материали, миниатюрни инструменти. Освен това нещата като коронки, мостове, протези и импланти се изготвят в зъботехническа лаборатория извън денталният офис. Вие имате право да се информирате за материалите, с които работят зъболекарят ви и зъботехникът. -Апаратурата от друга страна може да не изглежда "лъскава", но лесно можете да разпознаете някои нови технологии. Например при почистване на зъбен камък, ултразвуковите инструменти вибрират и отделят натрупаната храна и налепи по зъбите. -Diagnodent е лазер, който осветява зъбите и помага за по-лесното откриване на кариеси като ги оцветява в червен цвят. -Разбира се само наличието на добра апаратура не е достатъчно. Специален мотор за поставяне на импланти или за провеждане на коренови лечения може да има в много зъболекарски офиси, но добрите специалисти в тези области не се срещат често. - -3. Зъболекарят ви може би още използва живачна амалгама. -Живакът е токсичен и спор за това няма. Амалгамените пломби често се наричат "сребърни", но истината е, че амалгамата може да съдържа до 50% живак. Съвременните производители на стоматологични материали произвеждат амалгама без живак, така че се уверете, че вашият зъболекар използва именно такава. Причините за употребата на амалгамени пломби са различни за всеки пациент и за всеки зъб. Питайте и разберете защо е подходяща във вашият случай. Повече за живака скоро в блога. - -4. Доброто лечение на зъбите не е само "запълване на кариеса". Вашият зъболекар трябва да се запознае със цялостното ви здравословно състояние и заболявания като диабет или високо кръвно налягане; евентуални проблеми със долночелюстните стави; пародонтални оплаквания и кървене от венците; състояния, които засягат костите; сънна апнея или стискане на зъби в будно състояние или по време на сън. Всички тези данни ще създадат една цялостна представа за вашето здраве, която ще помогне за вземане на добри и адекватни решения по време на лечението. - -5. Може би кореновото лечение не е най-подходящото лечение за вашият зъб. -Чували ли сте за "феруле ефекта"? С две думи: кореновото лечение на вашият зъб няма да е успешно, ако няма достатъчно здрави зъбни тъкани след почистването на кариозният емайл и дентин. Нужно е останалата здрава част от зъба да е достатъчно стабилна, за да издържи поставянето на коронка. Ако това условие не е спазено, то по-добрият вариант за лечение е изваждане на зъба и поставянето на имплант. - -С пожелание към всички колеги никога да не угасва искрицата, която ги е запалила да бъдат лечители на човешката болка и нещастие. Честит професионален празник! ;T; -I"

    Доверието в лекаря рядко се подлага под съмнение. В съвременната концепция за медицината е заложено, че лекарят ни знае всичко и ще приложи най-доброто лечение за нашият проблем. Истината обаче често е малко по-различна. Лекарят е човек като всички останали и прави грешки в работата си, колкото всички останали хора.

    - -

    Ето някои неща, които вашият зъболекар може би не ви казва, а е добре да знаете, за да получите най-доброто лечение.

    - -
      -
    1. -

      Зъболекарят ви може да не е достатъчно квалифициран. -Денталната медицина се развива с много бързи темпове. Има голяма вероятност вашият зъболекар да е пропуснал много от новостите, ако не се е информирал адекватно след като е напуснал университета. По тази причина млади зъболекари с малък стаж може да е по-подходящ за вашият проблем, от обръгналият и навлязал в рутината опитен и по-възрастен негов колега.

      -
    2. -
    3. -

      Зъболекарят ви може да не използва съвременни материали и апаратура. -Знаете, че в зъболекарският кабинет има стотици малки кутийки пълни с лекарства, пластични материали, миниатюрни инструменти. Освен това нещата като коронки, мостове, протези и импланти се изготвят в зъботехническа лаборатория извън денталният офис. Вие имате право да се информирате за материалите, с които работят зъболекарят ви и зъботехникът. -Апаратурата от друга страна може да не изглежда “лъскава”, но лесно можете да разпознаете някои нови технологии. Например при почистване на зъбен камък, ултразвуковите инструменти вибрират и отделят натрупаната храна и налепи по зъбите. -Diagnodent е лазер, който осветява зъбите и помага за по-лесното откриване на кариеси като ги оцветява в червен цвят. -Разбира се само наличието на добра апаратура не е достатъчно. Специален мотор за поставяне на импланти или за провеждане на коренови лечения може да има в много зъболекарски офиси, но добрите специалисти в тези области не се срещат често.

      -
    4. -
    5. -

      Зъболекарят ви може би още използва живачна амалгама. -Живакът е токсичен и спор за това няма. Амалгамените пломби често се наричат “сребърни”, но истината е, че амалгамата може да съдържа до 50% живак. Съвременните производители на стоматологични материали произвеждат амалгама без живак, така че се уверете, че вашият зъболекар използва именно такава. Причините за употребата на амалгамени пломби са различни за всеки пациент и за всеки зъб. Питайте и разберете защо е подходяща във вашият случай. Повече за живака скоро в блога.

      -
    6. -
    7. -

      Доброто лечение на зъбите не е само “запълване на кариеса”. Вашият зъболекар трябва да се запознае със цялостното ви здравословно състояние и заболявания като диабет или високо кръвно налягане; евентуални проблеми със долночелюстните стави; пародонтални оплаквания и кървене от венците; състояния, които засягат костите; сънна апнея или стискане на зъби в будно състояние или по време на сън. Всички тези данни ще създадат една цялостна представа за вашето здраве, която ще помогне за вземане на добри и адекватни решения по време на лечението.

      -
    8. -
    9. -

      Може би кореновото лечение не е най-подходящото лечение за вашият зъб. -Чували ли сте за “феруле ефекта”? С две думи: кореновото лечение на вашият зъб няма да е успешно, ако няма достатъчно здрави зъбни тъкани след почистването на кариозният емайл и дентин. Нужно е останалата здрава част от зъба да е достатъчно стабилна, за да издържи поставянето на коронка. Ако това условие не е спазено, то по-добрият вариант за лечение е изваждане на зъба и поставянето на имплант.

      -
    10. -
    - -

    С пожелание към всички колеги никога да не угасва искрицата, която ги е запалила да бъдат лечители на човешката болка и нещастие. Честит професионален празник!

    -;T; @I"H/blog/2015-05-05-хранене-за-бъдещи-родители/;T{;{ ;I"H - - - - - - - Хранене за бъдещи майки и татковци - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Хранене за бъдещи майки и татковци -

    - -
    -
      -
    • - - May 5, 2015 -
    • -
    -
    - - -

    Да вземе решение да има дете е сериозна и отговорна стъпка за всяка двойка. Промяната, която носи това е голяма, но тя започва много преди детето да се появи. За да създадем и отгледаме здраво човешко същество е нужно и двамата родители да положат немалко усилия. -Да, бременността касае основно жената, но при зачеването участват наравно двете клетки: яйцеклетка и сперматозоид. Поради тази причина доброто здраве и на мъжа, и на жената е важна основа за създаване на здраво дете.

    - -

    Времето за узряване на яйцеклетката до състояние, в което може да бъде оплодена е 120 дни, а за сперматозоида - 30 дни. Т.е. минималното време за подготовка на бременността е 4 месеца за жената и 1 месец за мъжа.

    - -

    Първата стъпка е да се направят някои медицински изследвания, за да се избегнат евентуални рискове, които носят заболяванията хепатит, СПИН и някои венерически болести. Токсоплазмоза и хламидия са често срещани инфекции и лечението им е препоръчително да се проведе при отсъствие на бременност, тъй като медикаментите, които се използват са силни клетъчни отрови.

    - -

    Бъдещата майка трябва да посети гинеколог, за пълен профилактичен преглед, с оглед предстоящата бременност. Балансът на хормоните на щитовидната жлеза е изключително важен за цялостното здраве и най-вече за бъдещите хормонални промени, които предстоят.

    - -

    Посещението при зъболекарят също е от първостепенна важност преди бременността. Всички болестни процеси по зъбите и венците трябва да бъдат елиминирани, а стари и счупени пломби да се сменят с нови. Кървенето на венците и появата на кариеси са едни от най-честите проблеми през деветте месеца. Вашият стоматолог трябва да ви даде съвети как да се грижите за здравето, хигиената и евентуални проблеми, които могат да възникнат. Причината за кървенето от венците са хормоналните промени в тялото на бъдещата майка. Появата на кариеси, пък е свързана с високите нужди на Калций от развиващата се костна система на бебето.

    - -

    Три до шест месеца преди бременността е подходящо време за изчистване на токсините от организма на бъдещите родители: цигари, алкохол, упойващи вещества, различни медикаменти трябва да бъдат елиминирани или поне сведени до минимум. Не е необходимо да се правят т.нар. “прочиствания” със сокове, билки и какви ли не магически отвари. Тялото на един млад и здрав индивид има достатъчно компенсаторни възможности, за да възстанови баланса в клетките така, че те да дадат най-добрият генетичен материал. Важното е да не се натоварва излишно имунната система, бъбреците и черният дроб с вредни вещества.

    - -

    Зачеването и раждането на здраво бебе не е въпрос на късмет. Храненето на бременната жена е най-важният аспект в това отношение. Всички сме чували, че бременните трябва да ядат за двама… и това е така, НО качеството, а не количеството на храната трябва да се удвои! Кръвта на майката, която изгражда растящият плод трябва да е много богата на минерали и структурни вещества. За тази цел храненето трябва да е много разнообразно и пълноценно. -Бременност

    - -

    Какво трябва да яде една бременна жена? -Протеини и мазнини. Достатъчно количество протеини и мазнини ще обезпечат нуждите на бързо развиващият се организъм на бебето. Мазнините и холестеролът изграждат клетъчната стена на всяка клетка от човешкото тяло, както и са основна структурна единица за половите хормони. При дефицит на холестерол в самото начало на бременността има риск от недобро имплантиране на ембриона в матката и в последствие риск от спонтанен аборт или преждевремнно раждане. -Дълговерижните мастни киселини като Омега-3 са нужни за изграждането на мозъчната кора и цялата нервна система на плода. Приемането им като хранителна добавка преди, по време и след бременността (периода на кърмене) допринася за по-добре структурирана нервна система и в последствие по-умни деца. -Протеините са източник на есенциални аминокиселини, които изпълняват редица функции в нашето тяло и включват ензими, антитела, хормони и транспортни молекули. Известни са 20 аминокиселини, които съставят повечето протеини, като 8 от тях се наричат незаменими. По време на вътреутробното развитие детето има нужда от всички тях, за да създаде необходимите протеини. Това означава, че животинските храни са с голяма важност по време на бременността. Въглехидратите са предпочитан енергиен източник за тялото. Но високо въглехидратното хранене не обезпечава нуждите на майка и бебе, като дори може да доведе до някои заболявания и вродени дефекти при детето. Гестационен диабет могат да развиват жените, които се хранят основно с въглехидрати. Дори без да бъде нарушен калорийният баланс, нивата на инсулина на бебето са нестабилни и се повишава риска от ранно затлъстяване, инсулинова резистентност и диабет. Нуждите от Фолиева киселина са силно завишени в този период и приемането й като хранителна добавка е жизненоважно за малкото бебе. Бъдещата майка може да добави естествен източник като яде разнообразни зеленолистни зеленчуци като спанак и лапад. Нивата на Желязото, което често е дефицитно при бременните могат да се повишат с прием на черен дроб, червено цвекло, червени портокали, касис, боровинки, спанак, коприва.

    - -

    И нещо за храненето на бъдещите татковци: -Висококачествените сперматозоиди са необходими, за да заченат здраво, силно и умно бебе. Нуждата от животински мазнини за мъжете също е ключова за репродуктивните им възможности. Американско изследване твърди, че мъже на изцяло растителна диета имат по-висок процент некачествени сперматозоиди. Друг фактор, който може да окаже негативно влияние са фитоестрогените и ксеноестрогените. Фитоестрогените са еднакво вредни и в диетата на жената и трябва стриктно да се избягват от двата пола. Те се съдържат в голямо количество в соята и соевите продукти. Соята увеличава естрогена при мъжете и нарушава нормалния мъжки хормонен баланс. Ксеноестрогените се откриват във всички храни и напитки, които са в полиетиленова опаковка, козметични средства и други. -Диетата, която се препоръчва на мъжете е същата, както при жените: с високо съдържание на протеини и мазнини и с ниско съдържание на въглехидрати и хидрогенирани растителни масла.

    - -

    Надявам се, че днешната статия е била интересна и полезна за всички, които се интересуват от здравословен начин на живот.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I",Да вземе решение да има дете е сериозна и отговорна стъпка за всяка двойка. Промяната, която носи това е голяма, но тя започва много преди детето да се появи. **За да създадем и отгледаме здраво човешко същество е нужно и двамата родители да положат немалко усилия**. -Да, бременността касае основно жената, но при зачеването участват наравно двете клетки: яйцеклетка и сперматозоид. Поради тази причина доброто здраве и на мъжа, и на жената е важна основа за създаване на здраво дете. - -Времето за узряване на яйцеклетката до състояние, в което може да бъде оплодена е 120 дни, а за сперматозоида - 30 дни. Т.е. минималното време за подготовка на бременността е 4 месеца за жената и 1 месец за мъжа. - -Първата стъпка е да се направят някои **медицински изследвания**, за да се избегнат евентуални рискове, които носят заболяванията хепатит, СПИН и някои венерически болести. Токсоплазмоза и хламидия са често срещани инфекции и лечението им е препоръчително да се проведе при отсъствие на бременност, тъй като медикаментите, които се използват са силни клетъчни отрови. - -Бъдещата майка трябва да посети гинеколог, за пълен профилактичен преглед, с оглед предстоящата бременност. Балансът на хормоните на щитовидната жлеза е изключително важен за цялостното здраве и най-вече за бъдещите хормонални промени, които предстоят. - -**Посещението при зъболекарят също е от първостепенна важност преди бременността**. Всички болестни процеси по зъбите и венците трябва да бъдат елиминирани, а стари и счупени пломби да се сменят с нови. Кървенето на венците и появата на кариеси са едни от най-честите проблеми през деветте месеца. Вашият стоматолог трябва да ви даде съвети как да се грижите за здравето, хигиената и евентуални проблеми, които могат да възникнат. Причината за кървенето от венците са хормоналните промени в тялото на бъдещата майка. Появата на кариеси, пък е свързана с високите нужди на Калций от развиващата се костна система на бебето. - -Три до шест месеца преди бременността е подходящо време за **изчистване на токсините** от организма на бъдещите родители: цигари, алкохол, упойващи вещества, различни медикаменти трябва да бъдат елиминирани или поне сведени до минимум. Не е необходимо да се правят т.нар. "прочиствания" със сокове, билки и какви ли не магически отвари. Тялото на един млад и здрав индивид има достатъчно компенсаторни възможности, за да възстанови баланса в клетките така, че те да дадат **най-добрият генетичен материал**. Важното е да не се натоварва излишно имунната система, бъбреците и черният дроб с вредни вещества. - -Зачеването и раждането на здраво бебе не е въпрос на късмет. Храненето на бременната жена е най-важният аспект в това отношение. Всички сме чували, че бременните трябва да ядат за двама... и това е така, НО **качеството, а не количеството на храната трябва да се удвои**! Кръвта на майката, която изгражда растящият плод трябва да е много богата на минерали и структурни вещества. За тази цел храненето трябва да е много разнообразно и пълноценно. -![Бременност](/images/posts/Preg.jpg){:width="350px"}
    - -**Какво трябва да яде една бременна жена?** -Протеини и мазнини. Достатъчно количество протеини и мазнини ще обезпечат нуждите на бързо развиващият се организъм на бебето. Мазнините и холестеролът изграждат клетъчната стена на всяка клетка от човешкото тяло, както и са основна структурна единица за половите хормони. При дефицит на холестерол в самото начало на бременността има риск от недобро имплантиране на ембриона в матката и в последствие риск от спонтанен аборт или преждевремнно раждане. -Дълговерижните мастни киселини като Омега-3 са нужни за изграждането на мозъчната кора и цялата нервна система на плода. Приемането им като хранителна добавка преди, по време и след бременността (периода на кърмене) допринася за по-добре структурирана нервна система и в последствие по-умни деца. -Протеините са източник на есенциални аминокиселини, които изпълняват редица функции в нашето тяло и включват ензими, антитела, хормони и транспортни молекули. Известни са 20 аминокиселини, които съставят повечето протеини, като 8 от тях се наричат незаменими. По време на вътреутробното развитие детето има нужда от всички тях, за да създаде необходимите протеини. Това означава, че **животинските храни са с голяма важност по време на бременността**. Въглехидратите са предпочитан енергиен източник за тялото. Но високо въглехидратното хранене не обезпечава нуждите на майка и бебе, като дори може да доведе до някои заболявания и вродени дефекти при детето. Гестационен диабет могат да развиват жените, които се хранят основно с въглехидрати. Дори без да бъде нарушен калорийният баланс, нивата на инсулина на бебето са нестабилни и се повишава риска от ранно затлъстяване, инсулинова резистентност и диабет. Нуждите от Фолиева киселина са силно завишени в този период и приемането й като хранителна добавка е жизненоважно за малкото бебе. Бъдещата майка може да добави естествен източник като яде разнообразни зеленолистни зеленчуци като спанак и лапад. Нивата на Желязото, което често е дефицитно при бременните могат да се повишат с прием на черен дроб, червено цвекло, червени портокали, касис, боровинки, спанак, коприва. - -И нещо за храненето на **бъдещите татковци**: -Висококачествените сперматозоиди са необходими, за да заченат **здраво, силно и умно бебе**. Нуждата от животински мазнини за мъжете също е ключова за репродуктивните им възможности. Американско изследване твърди, че мъже на изцяло растителна диета имат по-висок процент некачествени сперматозоиди. Друг фактор, който може да окаже негативно влияние са фитоестрогените и ксеноестрогените. Фитоестрогените са еднакво вредни и в диетата на жената и трябва стриктно да се избягват от двата пола. Те се съдържат в голямо количество в соята и соевите продукти. Соята увеличава естрогена при мъжете и нарушава нормалния мъжки хормонен баланс. Ксеноестрогените се откриват във всички храни и напитки, които са в полиетиленова опаковка, козметични средства и други. -Диетата, която се препоръчва на мъжете е същата, както при жените: с високо съдържание на протеини и мазнини и с ниско съдържание на въглехидрати и хидрогенирани растителни масла. - -Надявам се, че днешната статия е била интересна и полезна за всички, които се интересуват от здравословен начин на живот. - - - - - - - - - - - - -;T; -I"_-

    Да вземе решение да има дете е сериозна и отговорна стъпка за всяка двойка. Промяната, която носи това е голяма, но тя започва много преди детето да се появи. За да създадем и отгледаме здраво човешко същество е нужно и двамата родители да положат немалко усилия. -Да, бременността касае основно жената, но при зачеването участват наравно двете клетки: яйцеклетка и сперматозоид. Поради тази причина доброто здраве и на мъжа, и на жената е важна основа за създаване на здраво дете.

    - -

    Времето за узряване на яйцеклетката до състояние, в което може да бъде оплодена е 120 дни, а за сперматозоида - 30 дни. Т.е. минималното време за подготовка на бременността е 4 месеца за жената и 1 месец за мъжа.

    - -

    Първата стъпка е да се направят някои медицински изследвания, за да се избегнат евентуални рискове, които носят заболяванията хепатит, СПИН и някои венерически болести. Токсоплазмоза и хламидия са често срещани инфекции и лечението им е препоръчително да се проведе при отсъствие на бременност, тъй като медикаментите, които се използват са силни клетъчни отрови.

    - -

    Бъдещата майка трябва да посети гинеколог, за пълен профилактичен преглед, с оглед предстоящата бременност. Балансът на хормоните на щитовидната жлеза е изключително важен за цялостното здраве и най-вече за бъдещите хормонални промени, които предстоят.

    - -

    Посещението при зъболекарят също е от първостепенна важност преди бременността. Всички болестни процеси по зъбите и венците трябва да бъдат елиминирани, а стари и счупени пломби да се сменят с нови. Кървенето на венците и появата на кариеси са едни от най-честите проблеми през деветте месеца. Вашият стоматолог трябва да ви даде съвети как да се грижите за здравето, хигиената и евентуални проблеми, които могат да възникнат. Причината за кървенето от венците са хормоналните промени в тялото на бъдещата майка. Появата на кариеси, пък е свързана с високите нужди на Калций от развиващата се костна система на бебето.

    - -

    Три до шест месеца преди бременността е подходящо време за изчистване на токсините от организма на бъдещите родители: цигари, алкохол, упойващи вещества, различни медикаменти трябва да бъдат елиминирани или поне сведени до минимум. Не е необходимо да се правят т.нар. “прочиствания” със сокове, билки и какви ли не магически отвари. Тялото на един млад и здрав индивид има достатъчно компенсаторни възможности, за да възстанови баланса в клетките така, че те да дадат най-добрият генетичен материал. Важното е да не се натоварва излишно имунната система, бъбреците и черният дроб с вредни вещества.

    - -

    Зачеването и раждането на здраво бебе не е въпрос на късмет. Храненето на бременната жена е най-важният аспект в това отношение. Всички сме чували, че бременните трябва да ядат за двама… и това е така, НО качеството, а не количеството на храната трябва да се удвои! Кръвта на майката, която изгражда растящият плод трябва да е много богата на минерали и структурни вещества. За тази цел храненето трябва да е много разнообразно и пълноценно. -Бременност

    - -

    Какво трябва да яде една бременна жена? -Протеини и мазнини. Достатъчно количество протеини и мазнини ще обезпечат нуждите на бързо развиващият се организъм на бебето. Мазнините и холестеролът изграждат клетъчната стена на всяка клетка от човешкото тяло, както и са основна структурна единица за половите хормони. При дефицит на холестерол в самото начало на бременността има риск от недобро имплантиране на ембриона в матката и в последствие риск от спонтанен аборт или преждевремнно раждане. -Дълговерижните мастни киселини като Омега-3 са нужни за изграждането на мозъчната кора и цялата нервна система на плода. Приемането им като хранителна добавка преди, по време и след бременността (периода на кърмене) допринася за по-добре структурирана нервна система и в последствие по-умни деца. -Протеините са източник на есенциални аминокиселини, които изпълняват редица функции в нашето тяло и включват ензими, антитела, хормони и транспортни молекули. Известни са 20 аминокиселини, които съставят повечето протеини, като 8 от тях се наричат незаменими. По време на вътреутробното развитие детето има нужда от всички тях, за да създаде необходимите протеини. Това означава, че животинските храни са с голяма важност по време на бременността. Въглехидратите са предпочитан енергиен източник за тялото. Но високо въглехидратното хранене не обезпечава нуждите на майка и бебе, като дори може да доведе до някои заболявания и вродени дефекти при детето. Гестационен диабет могат да развиват жените, които се хранят основно с въглехидрати. Дори без да бъде нарушен калорийният баланс, нивата на инсулина на бебето са нестабилни и се повишава риска от ранно затлъстяване, инсулинова резистентност и диабет. Нуждите от Фолиева киселина са силно завишени в този период и приемането й като хранителна добавка е жизненоважно за малкото бебе. Бъдещата майка може да добави естествен източник като яде разнообразни зеленолистни зеленчуци като спанак и лапад. Нивата на Желязото, което често е дефицитно при бременните могат да се повишат с прием на черен дроб, червено цвекло, червени портокали, касис, боровинки, спанак, коприва.

    - -

    И нещо за храненето на бъдещите татковци: -Висококачествените сперматозоиди са необходими, за да заченат здраво, силно и умно бебе. Нуждата от животински мазнини за мъжете също е ключова за репродуктивните им възможности. Американско изследване твърди, че мъже на изцяло растителна диета имат по-висок процент некачествени сперматозоиди. Друг фактор, който може да окаже негативно влияние са фитоестрогените и ксеноестрогените. Фитоестрогените са еднакво вредни и в диетата на жената и трябва стриктно да се избягват от двата пола. Те се съдържат в голямо количество в соята и соевите продукти. Соята увеличава естрогена при мъжете и нарушава нормалния мъжки хормонен баланс. Ксеноестрогените се откриват във всички храни и напитки, които са в полиетиленова опаковка, козметични средства и други. -Диетата, която се препоръчва на мъжете е същата, както при жените: с високо съдържание на протеини и мазнини и с ниско съдържание на въглехидрати и хидрогенирани растителни масла.

    - -

    Надявам се, че днешната статия е била интересна и полезна за всички, които се интересуват от здравословен начин на живот.

    - -;T; @I"/blog/2015-05-12-apple/;T{;{ ;I"t/ - - - - - - - An apple(watch) a day keeps the doctor away - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - An apple(watch) a day keeps the doctor away -

    - -
    -
      -
    • - - May 12, 2015 -
    • -
    -
    - - -

    Предполагам, че повечето хора които се интересуват от здравословен начин на живот използват своите смартфони за да проследяват движението през деня, тренировките или храната си. Приложенията, които следят качеството и количеството на съня също вече са много популярни.

    - -

    А какво знаете за iPhone Research kit?

    - -

    Представете си всички хора, които имат смартфони. Всички, които имат диабет от тях да вписват 5, дори 10 години храната си и стойностите на кръвната си захар, когато я измерят. Сигурна съм, че подобно проучване се е правило, но с ограничен брой хора. А сега могат да се включат милиони, милиарди хора. Глобално. И резултатите ще са реални. Е, разбира се до постигането на еднакви условия за всички в изследването ще отнеме време (т.е. в началото отклонението ще е голямо). Може дори да отнеме толкова време, че да не съм жива да го видя. Но ще се случи: медицина от хората за хората.

    - -

    И за да не кажете, че съм фен на Apple (какъвто всъщност съм): Google подготвят гривна срещу рак. След приема на таблетка с наночастици, ще се диагностицира тялото за рак. Как ви звучи? Както и да ви звучи, няма значение. Защото това е бъдещето. И то е съвсем, съвсем близко (5 години).

    - -

    От гледна точка на моята специалност, ето за какво си мисля аз: -Идея за рисърч кит приложение: да се отхвърли или потвърди теорията на Стейн-Леонора за паротидните хормони като причинител на кариеса. За тази теория бях споменала бегло тук, но всъщност остана незабелязано. Аз също някога мислех, че е меко казано абстрактна.

    - -

    Как би могло да стане това? Ако се проследи храненето на всички хора за период от 3 години и хората, които ядат захар всъщност не страдат повече от кариес от хората, които не ядат захар. -Още една идея: колко захар е нужно да изядеш, за да получиш кариес.

    - -

    А това е моята теория за кариеса: -Захарта сама по себе си не е причинител на кариес. Метаболизирането й се нуждае от толкова много минерали, че се налага тялото да даде част от себе си, да се разгради или по-точно разтвори, за да я изхвърли. А за него, от своя страна най-щадящо е да “даде” първо зъбите, защото те са много. А ръцете и краката например са много по-важни за оцеляването му. Чиста химия, ни повече, ни по-малко.

    - -

    Дори заради преработена храна, бройката на зъбите намалява: тялото не държи нищо излишно. Излишното се “изхвърля”. Няма нужда от толкова много зъби за сдъвкване на храната, а и по-малко проблеми(болки, възпаления и т.н.). Тогава за какво са му на тялото толкова масивни жлезисти тъкани, за да правят слюнка. Слюнчените жлези са малки и безброй по цялата уста. И две големи жлези с прилежащото им кръвоснабдяване и инервация. Навярно има нещо повече в тях. Дали наистина контролират деминерализацията и реминерализацията на зъбите?

    - -

    И всъщност… ако разберем как работят телата ни, това ще ни донесе ли вечен живот?

    - -

    #

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Предполагам, че повечето хора които се интересуват от здравословен начин на живот използват своите смартфони за да проследяват движението през деня, тренировките или храната си. Приложенията, които следят качеството и количеството на съня също вече са много популярни. - -А какво знаете за iPhone Research kit? - -Представете си всички хора, които имат смартфони. Всички, които имат диабет от тях да вписват 5, дори 10 години храната си и стойностите на кръвната си захар, когато я измерят. Сигурна съм, че подобно проучване се е правило, но с ограничен брой хора. А сега могат да се включат милиони, милиарди хора. Глобално. И резултатите ще са реални. Е, разбира се до постигането на еднакви условия за всички в изследването ще отнеме време (т.е. в началото отклонението ще е голямо). Може дори да отнеме толкова време, че да не съм жива да го видя. Но ще се случи: медицина от хората за хората. - -И за да не кажете, че съм фен на Apple (какъвто всъщност съм): Google подготвят гривна срещу рак. След приема на таблетка с наночастици, ще се диагностицира тялото за рак. Как ви звучи? Както и да ви звучи, няма значение. Защото това е бъдещето. И то е съвсем, съвсем близко (5 години). - -От гледна точка на моята специалност, ето за какво си мисля аз: -Идея за рисърч кит приложение: да се отхвърли или потвърди теорията на Стейн-Леонора за паротидните хормони като причинител на кариеса. За тази теория бях споменала бегло [тук](/blog/2014-04-23-%D0%BA%D0%BE%D0%B8%CC%86-%D0%B5-%D0%BD%D0%B0%D0%B8%CC%86-%D0%B3%D0%BE%D0%BB%D0%B5%D0%BC%D0%B8%D1%8F%D1%82-%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D0%B8%D1%82%D0%B5%D0%BB-%D0%BD%D0%B0-%D0%BA%D0%B0%D1%80%D0%B8%D0%B5%D1%81%D0%B0/), но всъщност остана незабелязано. Аз също някога мислех, че е меко казано абстрактна. - -Как би могло да стане това? Ако се проследи храненето на всички хора за период от 3 години и хората, които ядат захар всъщност не страдат повече от кариес от хората, които не ядат захар. -Още една идея: колко захар е нужно да изядеш, за да получиш кариес. - -А това е моята теория за кариеса: -Захарта сама по себе си не е причинител на кариес. Метаболизирането й се нуждае от толкова много минерали, че се налага тялото да даде част от себе си, да се разгради или по-точно разтвори, за да я изхвърли. А за него, от своя страна най-щадящо е да "даде" първо зъбите, защото те са много. А ръцете и краката например са много по-важни за оцеляването му. Чиста химия, ни повече, ни по-малко. - -Дори заради преработена храна, бройката на зъбите намалява: тялото не държи нищо излишно. Излишното се "изхвърля". Няма нужда от толкова много зъби за сдъвкване на храната, а и по-малко проблеми(болки, възпаления и т.н.). Тогава за какво са му на тялото толкова масивни жлезисти тъкани, за да правят слюнка. Слюнчените жлези са малки и безброй по цялата уста. И две големи жлези с прилежащото им кръвоснабдяване и инервация. Навярно има нещо повече в тях. Дали наистина контролират деминерализацията и реминерализацията на зъбите? - -И всъщност... ако разберем как работят телата ни, това ще ни донесе ли вечен живот? - -## - -;T; -I"

    Предполагам, че повечето хора които се интересуват от здравословен начин на живот използват своите смартфони за да проследяват движението през деня, тренировките или храната си. Приложенията, които следят качеството и количеството на съня също вече са много популярни.

    - -

    А какво знаете за iPhone Research kit?

    - -

    Представете си всички хора, които имат смартфони. Всички, които имат диабет от тях да вписват 5, дори 10 години храната си и стойностите на кръвната си захар, когато я измерят. Сигурна съм, че подобно проучване се е правило, но с ограничен брой хора. А сега могат да се включат милиони, милиарди хора. Глобално. И резултатите ще са реални. Е, разбира се до постигането на еднакви условия за всички в изследването ще отнеме време (т.е. в началото отклонението ще е голямо). Може дори да отнеме толкова време, че да не съм жива да го видя. Но ще се случи: медицина от хората за хората.

    - -

    И за да не кажете, че съм фен на Apple (какъвто всъщност съм): Google подготвят гривна срещу рак. След приема на таблетка с наночастици, ще се диагностицира тялото за рак. Как ви звучи? Както и да ви звучи, няма значение. Защото това е бъдещето. И то е съвсем, съвсем близко (5 години).

    - -

    От гледна точка на моята специалност, ето за какво си мисля аз: -Идея за рисърч кит приложение: да се отхвърли или потвърди теорията на Стейн-Леонора за паротидните хормони като причинител на кариеса. За тази теория бях споменала бегло тук, но всъщност остана незабелязано. Аз също някога мислех, че е меко казано абстрактна.

    - -

    Как би могло да стане това? Ако се проследи храненето на всички хора за период от 3 години и хората, които ядат захар всъщност не страдат повече от кариес от хората, които не ядат захар. -Още една идея: колко захар е нужно да изядеш, за да получиш кариес.

    - -

    А това е моята теория за кариеса: -Захарта сама по себе си не е причинител на кариес. Метаболизирането й се нуждае от толкова много минерали, че се налага тялото да даде част от себе си, да се разгради или по-точно разтвори, за да я изхвърли. А за него, от своя страна най-щадящо е да “даде” първо зъбите, защото те са много. А ръцете и краката например са много по-важни за оцеляването му. Чиста химия, ни повече, ни по-малко.

    - -

    Дори заради преработена храна, бройката на зъбите намалява: тялото не държи нищо излишно. Излишното се “изхвърля”. Няма нужда от толкова много зъби за сдъвкване на храната, а и по-малко проблеми(болки, възпаления и т.н.). Тогава за какво са му на тялото толкова масивни жлезисти тъкани, за да правят слюнка. Слюнчените жлези са малки и безброй по цялата уста. И две големи жлези с прилежащото им кръвоснабдяване и инервация. Навярно има нещо повече в тях. Дали наистина контролират деминерализацията и реминерализацията на зъбите?

    - -

    И всъщност… ако разберем как работят телата ни, това ще ни донесе ли вечен живот?

    - -

    #

    - -;T; @I":/blog/2015-01-05-ново-аз-нова-година/;T{;{ ;I"E? - - - - - - - Новото Аз през Новата година - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Новото Аз през Новата година -

    - -
    -
      -
    • - - January 5, 2015 -
    • -
    -
    - - -

    Нова Година

    - -

    Новата година носи толкова много възможности, идеи, планове и време за да изпълним всичките. Всеки е пълен с надежда, сила и вяра в себе си и запретва ръкави да постигне целите си. Истината обаче често е, че част от Новогодишните решения се стопвяват със снега и не достигат даже до Свети Валентин.

    - -

    Новогодишното обещание е точно това - обещание; Намерение да правиш нещо от този ден нататък и да създадеш или премахнеш навик. Лесно е да обещаеш, трудното идва после.

    - -

    Защо се получава така? Повечето хора си поставят нереалистични и много високи цели и бързо губят мотивация, тъй като промените са големи и резки. За да постигнете истинска промяна в което и да е направление на живота си трябва да правите малки, но уверени стъпки. Изберете три до пет неща за цялата година, които да промените и се придържайте към плана.

    - -
      -
    • Да започнете да спортувате редовно
    • -
    • Да отделяте повече време за себе си
    • -
    • Да започнете да четете повече
    • -
    • Да откажете цигарите
    • -
    • Да заслужите повишение
    • -
    • Да отделяте повече време на децата си
    • -
    • Да започнете да живеете по-здравословно -И така нататък…
    • -
    - -

    В контекста на последното ви предлагам следните малки стъпки, които ще ви донесат по-добро здраве и сила, за да се справите с другите обещания:

    - -
      -
    1. -

      Без електронни устройства в спалнята: телефон, лаптоп, телевизор, таблет, музикален плейър - вън! Това вероятно ще е най-голямата промяна и най-трудният навик за премахване! Но си заслужава! Циклите на сън се влияят пряко от светлината, а изкуствената синя светлина има сериозно негативно влияние. Проблеми като раздразнение, невъзможност за концентриране и изтощение още от сутринта могат да се преустановят, ако спрете да облъчвате мозъка си със синя светлина до момента на заспиването. За да получите почивката, която заслужавате и ще ви даде сили за предизвикателствата на новият ден, опитайте сън без технологични устройства в близост до леглото.

      -
    2. -
    3. -

      Започнете да консумирате животинско органно месо веднъж седмично. Не веднъж съм казвала колко по-ценни са органите на животните, в сравнение с мускулното месо. Те съдържат високи количества ценни мазнини и лесно усвоими витамини. Рибеното масло е един от най-важните продукти, които трябва да приемате ежедневно. То подпомага мозъчната дейност и обмяната на веществата в клетките. Повече по темата - скоро в блога.

      -
    4. -
    5. -

      Пазарувайте и приготвяйте зеленчуците за цяла седмица. За да не си намирате извинение за липсата на зеленчуци в храната има едно лесно решение: пазарувайте количеството за седмицата в почивният си ден. Преди да приберете всичко в хладилника, измийте, нарежете и подгответе в удобни кутии. Така през следващите седем дни ще имате нужда само от няколко минути за да овкусите салатата или да задушите малко броколи за гарнитура например. Ще видите колко по-удобно, бързо и лесно става готвенето всеки ден.

      -
    6. -
    7. -

      Спрете консумацията на подсладени напитки. Да, знам че и това съм казвала преди1,2,3, но наистина е време да спрете да тровите тялото си с тези течни-химични-захарни смеси, които ви се продават като безалкохолни напитки. Газирани, сокове, фрешове, плодови шейкове и какво ли не - всички те нямат място в ежедневието ви. Най-голяма вреда оказват върху развиващият се детски организъм, така че ако купувате за семейството си подобни напитки трябва да преустановите този навик още сега. Освен всичко, те са висококалорични и повишават риска от затлъстяване и диабет и при деца, и при възрастни.

      -
    8. -
    9. -

      Включете кокосови продукти в менюто си. Кокоса и кокосовата мазнина имат уникален състав от мастни киселини - 90% от тях са наситени. Това прави кокосовото олио изключително устойчиво на окисление и загряване и е най-подходящата мазнина за готвене на високи температури. Освен това кокосовите продукти имат почти пълен набор от средноверижни триглицериди, които биват директно превръщани в кетони и използвани за енергия, без да се складират в тялото. Кетоните могат да се използват и за енергия за мозъка. Лауриловата киселина, която се намира в кокоса пък е много ефективна в борбата с патогени. Кокосовото масло може да помогне и в редуцирането на теглото, защото дава бърза енергия и засилва чувството на ситост. По-подробно за ползите от кокосовото масло ще можете да прочетете скоро.

      -
    10. -
    - -

    Сега искам да ви пожелая една усмихната, здрава и успешна година, в която да постигнете перфектен баланс между ума, духа и тялото си. Защото само тогава човек се чувства наистина щастлив и удовлетворен.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I""![Нова Година](/images/posts/Newyear.jpg){:width="450px"} - -Новата година носи толкова много възможности, идеи, планове и време за да изпълним всичките. Всеки е пълен с надежда, сила и вяра в себе си и запретва ръкави да постигне целите си. Истината обаче често е, че част от Новогодишните решения се стопвяват със снега и не достигат даже до Свети Валентин. - -Новогодишното обещание е точно това - обещание; Намерение да правиш нещо от този ден нататък и да създадеш или премахнеш навик. Лесно е да обещаеш, трудното идва после. - -Защо се получава така? Повечето хора си поставят нереалистични и много високи цели и бързо губят мотивация, тъй като промените са големи и резки. За да постигнете истинска промяна в което и да е направление на живота си трябва да правите малки, но уверени стъпки. Изберете три до пет неща за цялата година, които да промените и се придържайте към плана. - -- Да започнете да спортувате редовно -- Да отделяте повече време за себе си -- Да започнете да четете повече -- Да откажете цигарите -- Да заслужите повишение -- Да отделяте повече време на децата си -- Да започнете да живеете по-здравословно -И така нататък... - -В контекста на последното ви предлагам следните малки стъпки, които ще ви донесат по-добро здраве и сила, за да се справите с другите обещания: - -1. **Без електронни устройства в спалнята**: телефон, лаптоп, телевизор, таблет, музикален плейър - вън! Това вероятно ще е най-голямата промяна и най-трудният навик за премахване! Но си заслужава! Циклите на сън се влияят пряко от светлината, а изкуствената синя светлина има сериозно негативно влияние. Проблеми като раздразнение, невъзможност за концентриране и изтощение още от сутринта могат да се преустановят, ако спрете да облъчвате мозъка си със синя светлина до момента на заспиването. За да получите почивката, която заслужавате и ще ви даде сили за предизвикателствата на новият ден, опитайте сън без технологични устройства в близост до леглото. - -2. **Започнете да консумирате животинско органно месо веднъж седмично**. Не веднъж съм [казвала](/blog/2014-07-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%B0%D1%82%D0%BE-%D0%BB%D0%B5%D0%BA%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%BE-%D1%87%D0%B5%D1%80%D0%B5%D0%BD-%D0%B4%D1%80%D0%BE%D0%B1/) колко по-ценни са органите на животните, в сравнение с мускулното месо. Те съдържат високи количества ценни мазнини и лесно усвоими витамини. Рибеното масло е един от най-важните продукти, които трябва да приемате ежедневно. То подпомага мозъчната дейност и обмяната на веществата в клетките. Повече по темата - скоро в блога. - -3. **Пазарувайте и приготвяйте зеленчуците за цяла седмица**. За да не си намирате извинение за липсата на зеленчуци в храната има едно лесно решение: пазарувайте количеството за седмицата в почивният си ден. Преди да приберете всичко в хладилника, измийте, нарежете и подгответе в удобни кутии. Така през следващите седем дни ще имате нужда само от няколко минути за да овкусите салатата или да задушите малко броколи за гарнитура например. Ще видите колко по-удобно, бързо и лесно става готвенето всеки ден. - -4. **Спрете консумацията на подсладени напитки**. Да, знам че и това съм казвала преди[1](/blog/2014-05-05-%D0%BD%D0%B0%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0-%D0%BB%D0%B8-%D0%B7%D0%B0%D1%85%D0%B0%D1%80%D1%82%D0%B0-%D0%B5-%D1%82%D0%BE%D0%BB%D0%BA%D0%BE%D0%B2%D0%B0-%D0%B2%D1%80%D0%B5%D0%B4%D0%BD%D0%B0/),[2](/blog/2014-06-15-%D0%BA%D0%B0%D0%BA-%D0%B4%D0%B0-%D1%81%D0%B5-%D0%BE%D1%82%D0%BA%D0%B0%D0%B6%D0%B5%D0%BC-%D0%BE%D1%82-%D0%B2%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%82%D0%B5-%D0%BD%D0%B0%D0%B2%D0%B8%D1%86%D0%B8/),[3](/blog/2014-08-02-%D0%BF%D0%B5%D1%82-%D1%81%D1%82%D1%8A%D0%BF%D0%BA%D0%B8-%D0%BA%D1%8A%D0%BC-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%BE%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%BE-%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B5/), но наистина е време да спрете да тровите тялото си с тези течни-химични-захарни смеси, които ви се продават като безалкохолни напитки. Газирани, сокове, фрешове, плодови шейкове и какво ли не - всички те нямат място в ежедневието ви. Най-голяма вреда оказват върху развиващият се детски организъм, така че ако купувате за семейството си подобни напитки трябва да преустановите този навик още сега. Освен всичко, те са висококалорични и повишават риска от затлъстяване и диабет и при деца, и при възрастни. - -5. **Включете кокосови продукти в менюто си**. Кокоса и кокосовата мазнина имат уникален състав от мастни киселини - 90% от тях са наситени. Това прави кокосовото олио изключително устойчиво на окисление и загряване и е най-подходящата мазнина за готвене на високи температури. Освен това кокосовите продукти имат почти пълен набор от средноверижни триглицериди, които биват директно превръщани в кетони и използвани за енергия, без да се складират в тялото. Кетоните могат да се използват и за енергия за мозъка. Лауриловата киселина, която се намира в кокоса пък е много ефективна в борбата с патогени. Кокосовото масло може да помогне и в редуцирането на теглото, защото дава бърза енергия и засилва чувството на ситост. По-подробно за ползите от кокосовото масло ще можете да прочетете скоро. - -Сега искам да ви пожелая една усмихната, здрава и успешна година, в която да постигнете перфектен баланс между ума, духа и тялото си. Защото само тогава човек се чувства наистина щастлив и удовлетворен.;T; -I"$

    Нова Година

    - -

    Новата година носи толкова много възможности, идеи, планове и време за да изпълним всичките. Всеки е пълен с надежда, сила и вяра в себе си и запретва ръкави да постигне целите си. Истината обаче често е, че част от Новогодишните решения се стопвяват със снега и не достигат даже до Свети Валентин.

    - -

    Новогодишното обещание е точно това - обещание; Намерение да правиш нещо от този ден нататък и да създадеш или премахнеш навик. Лесно е да обещаеш, трудното идва после.

    - -

    Защо се получава така? Повечето хора си поставят нереалистични и много високи цели и бързо губят мотивация, тъй като промените са големи и резки. За да постигнете истинска промяна в което и да е направление на живота си трябва да правите малки, но уверени стъпки. Изберете три до пет неща за цялата година, които да промените и се придържайте към плана.

    - -
      -
    • Да започнете да спортувате редовно
    • -
    • Да отделяте повече време за себе си
    • -
    • Да започнете да четете повече
    • -
    • Да откажете цигарите
    • -
    • Да заслужите повишение
    • -
    • Да отделяте повече време на децата си
    • -
    • Да започнете да живеете по-здравословно -И така нататък…
    • -
    - -

    В контекста на последното ви предлагам следните малки стъпки, които ще ви донесат по-добро здраве и сила, за да се справите с другите обещания:

    - -
      -
    1. -

      Без електронни устройства в спалнята: телефон, лаптоп, телевизор, таблет, музикален плейър - вън! Това вероятно ще е най-голямата промяна и най-трудният навик за премахване! Но си заслужава! Циклите на сън се влияят пряко от светлината, а изкуствената синя светлина има сериозно негативно влияние. Проблеми като раздразнение, невъзможност за концентриране и изтощение още от сутринта могат да се преустановят, ако спрете да облъчвате мозъка си със синя светлина до момента на заспиването. За да получите почивката, която заслужавате и ще ви даде сили за предизвикателствата на новият ден, опитайте сън без технологични устройства в близост до леглото.

      -
    2. -
    3. -

      Започнете да консумирате животинско органно месо веднъж седмично. Не веднъж съм казвала колко по-ценни са органите на животните, в сравнение с мускулното месо. Те съдържат високи количества ценни мазнини и лесно усвоими витамини. Рибеното масло е един от най-важните продукти, които трябва да приемате ежедневно. То подпомага мозъчната дейност и обмяната на веществата в клетките. Повече по темата - скоро в блога.

      -
    4. -
    5. -

      Пазарувайте и приготвяйте зеленчуците за цяла седмица. За да не си намирате извинение за липсата на зеленчуци в храната има едно лесно решение: пазарувайте количеството за седмицата в почивният си ден. Преди да приберете всичко в хладилника, измийте, нарежете и подгответе в удобни кутии. Така през следващите седем дни ще имате нужда само от няколко минути за да овкусите салатата или да задушите малко броколи за гарнитура например. Ще видите колко по-удобно, бързо и лесно става готвенето всеки ден.

      -
    6. -
    7. -

      Спрете консумацията на подсладени напитки. Да, знам че и това съм казвала преди1,2,3, но наистина е време да спрете да тровите тялото си с тези течни-химични-захарни смеси, които ви се продават като безалкохолни напитки. Газирани, сокове, фрешове, плодови шейкове и какво ли не - всички те нямат място в ежедневието ви. Най-голяма вреда оказват върху развиващият се детски организъм, така че ако купувате за семейството си подобни напитки трябва да преустановите този навик още сега. Освен всичко, те са висококалорични и повишават риска от затлъстяване и диабет и при деца, и при възрастни.

      -
    8. -
    9. -

      Включете кокосови продукти в менюто си. Кокоса и кокосовата мазнина имат уникален състав от мастни киселини - 90% от тях са наситени. Това прави кокосовото олио изключително устойчиво на окисление и загряване и е най-подходящата мазнина за готвене на високи температури. Освен това кокосовите продукти имат почти пълен набор от средноверижни триглицериди, които биват директно превръщани в кетони и използвани за енергия, без да се складират в тялото. Кетоните могат да се използват и за енергия за мозъка. Лауриловата киселина, която се намира в кокоса пък е много ефективна в борбата с патогени. Кокосовото масло може да помогне и в редуцирането на теглото, защото дава бърза енергия и засилва чувството на ситост. По-подробно за ползите от кокосовото масло ще можете да прочетете скоро.

      -
    10. -
    - -

    Сега искам да ви пожелая една усмихната, здрава и успешна година, в която да постигнете перфектен баланс между ума, духа и тялото си. Защото само тогава човек се чувства наистина щастлив и удовлетворен.

    -;T; @I"*/blog/2015-01-12-обяд-навън/;T{;{ ;I"= - - - - - - - Дюнер? Не, благодаря! - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Дюнер? Не, благодаря! -

    - -
    -
      -
    • - - January 12, 2015 -
    • -
    -
    - - -

    Едно от големите “неудобства” да се храниш здравословно е, че губиш удобството на леснодостъпна та храна около теб. Вече знаеш, че всички вафли, бисквити, дюнери, пици и т.н. нямат хранителните качества, които да задоволят нуждите на тялото ти и трябва или да направиш изключение и да ядеш нещо, което знаеш че няма стойност като храна или да останеш гладен… Аз предпочитам втората опция, но рядко ми се налага да я използвам, защото свикнах да си предвиждам необходимата храна за деня навън и да си я нося с мен. Закуската и вечерята обикновенно са вкъщи, а обяда и следобедната закуска - в кутийки в раницата. След като получих няколко молби от читатели на блога да им дам идеи за хранене извън дома, реших да обобщя всичко, което аз прилагам в този пост. -Ето няколко идеи какво да носиш за обяд навън или в офиса и да приготвяш за децата си, докато са на училище.

    - -

    Плодове, измити и нарязани на хапки: ябълки, круши, киви, портокали, ананас, ягоди, други дребни горски плодове, цял необелен банан. Нерядко ще видиш добра възможност в това да си купиш кофичка кисело мляко и да го смесиш с плодовете, които си носиш. Това за съжаление не е добра идея, защото плодовете и млечната захар са трудна за храносмилане комбинация. Плодовете яж винаги самостоятелно като следобедна закуска например или поне 30 минути преди или след друго хранене. Единствената сполучлива комбинация е плодово-зеленчукови шейкове и смутита.

    - -

    Зеленчуци: тук можеш да се развихриш! Всички любими зеленчуци сурови или сготвени се прибират в малка кутия и могат да се хапват по всяко време. Ако си подготвил зеленчуците си за цялата седмица в почивният си ден, както те посъветвах тук, то салатата или гарнитурата ти е готова за няколко секунди. Подправките и зехтина за пресните зеленчуци носи отделно в малко бурканче. Добра идея е за мазнина да използвате намачкано авокадо - то овкусява чудесно всяка салата.

    - -

    Плодово-зеленчуковите напитки са отличен заместител на хранене, но е най-добре да се консумират веднага след приготвянето им. Това ги прави идеалната сутрешна закуска за хора които бързат или не обичат да се хранят сутрин. Банан, авокадо, шепа спанак и малко канела например ще те събуди с вкус и аромат, и ще ти даде много енергия за добър старт на деня, сила за предстоящата тренировка или пък за възстановяване след нея. Ето още една идея.

    - -

    Месо, яйца: Остатъците от снощната вечеря са идеалният обяд за следващият ден. Опаковаш го в кутия, заедно с порция зеленчуци и храната за деня ти е подсигурена. Варените необелени яйца могат да издържат цял ден извън хладилник, дори и през лятото. Консерва риба е компромис, но със сигурност е добро разнообразяване на менюто и много бърза и лесна опция. Избирай по-висококачествени консерви риба в зехтин или собствен сос.
    -Обяд

    - -

    Ядки и семена: чисто, практично и удобно. Шепа от любимите ти ядки или дори микс от няколко вида. Избягвайте да купувате от готовите миксове по магазините, които макар да са със сурови ядки и сушени плодове са третирани с различни препарати, а плодовете са със захар. Една любима моя вариация на темата е ядкова паста (тахан), в който добавям различни овкусители. Например в малко бурканче смесвам няколко лъжици пълнозърнест сусамов тахан с малко мед, натрошени какаови зърна, канела, няколко капки лимонов сок. Може вместо мед да използваш сушени плодове или пресни фурми, нарязани на дребно, различни подправки и семена, парченца пресен кокос… решението е твое. Този “коктейл” от суперхрани е изключително засищащ, а в същото време и малко като обем и тегло: перфектен за носене дори в малка дамска чанта. Ядковоте тахани набраха голяма популярност в последната година и вече можеш да намериш всякакви варианти: лешников, бадемов, слънчогледов, от тиквени семки, фъстъчен. Тъй като е пакетирана храна те съветвам винаги да четеш етикета и да се увериш, че купуваш паста от 100% ядки или семена, без сол, захар и други. Нека добавките да са от теб по твой вкус!

    - -

    И на последно място, но не и по значение поставям замествамето на хранене с доза протеин на прах. Това е спорен продукт и аз нямам намерение сега да разисквам колко вреден или полезен в той. Истината е, че въпреки че е силно преработена и концентрирана храна, протеинът на прах се усвоява добре от тялото и има определени ползи. Вече на пазара могат да се намерят десетки видове - млечен, животински, растителен, с различни вкусове и подсладители. Колкото по-висококачествен избереш, толкова повече ползи ще имаш от него. Разбира се аз съветвам винаги да предпочетеш цяла, необработена храна, но в изключителни случаи, когато обстоятелствата налагат бързо и питателно хранене една доза протеин може да спаси положението.

    - -

    Това бяха моите идеи за хранене извън дома. Надявам се да са ти били полезни и да успееш да ги приложиш в ежедневието си.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I""Едно от големите "неудобства" да се храниш здравословно е, че губиш удобството на леснодостъпна та храна около теб. Вече знаеш, че всички вафли, бисквити, дюнери, пици и т.н. нямат хранителните качества, които да задоволят нуждите на тялото ти и трябва или да направиш изключение и да ядеш нещо, което знаеш че няма стойност като храна или да останеш гладен... Аз предпочитам втората опция, но рядко ми се налага да я използвам, защото свикнах да си предвиждам необходимата храна за деня навън и да си я нося с мен. Закуската и вечерята обикновенно са вкъщи, а обяда и следобедната закуска - в кутийки в раницата. След като получих няколко молби от читатели на блога да им дам идеи за хранене извън дома, реших да обобщя всичко, което аз прилагам в този пост. -Ето няколко идеи какво да носиш за обяд навън или в офиса и да приготвяш за децата си, докато са на училище. - -Плодове, измити и нарязани на хапки: ябълки, круши, киви, портокали, ананас, ягоди, други дребни горски плодове, цял необелен банан. Нерядко ще видиш добра възможност в това да си купиш кофичка кисело мляко и да го смесиш с плодовете, които си носиш. Това за съжаление не е добра идея, защото плодовете и млечната захар са трудна за храносмилане комбинация. Плодовете яж винаги самостоятелно като следобедна закуска например или поне 30 минути преди или след друго хранене. Единствената сполучлива комбинация е плодово-зеленчукови шейкове и смутита. - -Зеленчуци: тук можеш да се развихриш! Всички любими зеленчуци сурови или сготвени се прибират в малка кутия и могат да се хапват по всяко време. Ако си подготвил зеленчуците си за цялата седмица в почивният си ден, както те посъветвах [тук](/blog/2015-01-05-%D0%BD%D0%BE%D0%B2%D0%BE-%D0%B0%D0%B7-%D0%BD%D0%BE%D0%B2%D0%B0-%D0%B3%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0/), то салатата или гарнитурата ти е готова за няколко секунди. Подправките и зехтина за пресните зеленчуци носи отделно в малко бурканче. Добра идея е за мазнина да използвате намачкано авокадо - то овкусява чудесно всяка салата. - -Плодово-зеленчуковите напитки са отличен заместител на хранене, но е най-добре да се консумират веднага след приготвянето им. Това ги прави идеалната сутрешна закуска за хора които бързат или не обичат да се хранят сутрин. Банан, авокадо, шепа спанак и малко канела например ще те събуди с вкус и аромат, и ще ти даде много енергия за добър старт на деня, сила за предстоящата тренировка или пък за възстановяване след нея. Ето още една [идея](/blog/2014-08-17-%D0%B2%D0%BA%D1%83%D1%81%D0%BD%D0%BE-%D0%BB%D1%8F%D1%82%D0%BE/). - -Месо, яйца: Остатъците от снощната вечеря са идеалният обяд за следващият ден. Опаковаш го в кутия, заедно с порция зеленчуци и храната за деня ти е подсигурена. Варените необелени яйца могат да издържат цял ден извън хладилник, дори и през лятото. Консерва риба е компромис, но със сигурност е добро разнообразяване на менюто и много бърза и лесна опция. Избирай по-висококачествени консерви риба в зехтин или собствен сос.
    -![Обяд](/images/posts/Lunchbox.jpg){:width="450px"}
    - -Ядки и семена: чисто, практично и удобно. Шепа от любимите ти ядки или дори микс от няколко вида. Избягвайте да купувате от готовите миксове по магазините, които макар да са със сурови ядки и сушени плодове са третирани с различни препарати, а плодовете са със захар. Една любима моя вариация на темата е ядкова паста (тахан), в който добавям различни овкусители. Например в малко бурканче смесвам няколко лъжици пълнозърнест сусамов тахан с малко мед, натрошени какаови зърна, канела, няколко капки лимонов сок. Може вместо мед да използваш сушени плодове или пресни фурми, нарязани на дребно, различни подправки и семена, парченца пресен кокос... решението е твое. Този "коктейл" от суперхрани е изключително засищащ, а в същото време и малко като обем и тегло: перфектен за носене дори в малка дамска чанта. Ядковоте тахани набраха голяма популярност в последната година и вече можеш да намериш всякакви варианти: лешников, бадемов, слънчогледов, от тиквени семки, фъстъчен. Тъй като е пакетирана храна те съветвам винаги да четеш етикета и да се увериш, че купуваш паста от 100% ядки или семена, без сол, захар и други. Нека добавките да са от теб по твой вкус! - -И на последно място, но не и по значение поставям замествамето на хранене с доза протеин на прах. Това е спорен продукт и аз нямам намерение сега да разисквам колко вреден или полезен в той. Истината е, че въпреки че е силно преработена и концентрирана храна, протеинът на прах се усвоява добре от тялото и има определени ползи. Вече на пазара могат да се намерят десетки видове - млечен, животински, растителен, с различни вкусове и подсладители. Колкото по-висококачествен избереш, толкова повече ползи ще имаш от него. Разбира се аз съветвам винаги да предпочетеш цяла, необработена храна, но в изключителни случаи, когато обстоятелствата налагат бързо и питателно хранене една доза протеин може да спаси положението. - -Това бяха моите идеи за хранене извън дома. Надявам се да са ти били полезни и да успееш да ги приложиш в ежедневието си. -;T; -I"#

    Едно от големите “неудобства” да се храниш здравословно е, че губиш удобството на леснодостъпна та храна около теб. Вече знаеш, че всички вафли, бисквити, дюнери, пици и т.н. нямат хранителните качества, които да задоволят нуждите на тялото ти и трябва или да направиш изключение и да ядеш нещо, което знаеш че няма стойност като храна или да останеш гладен… Аз предпочитам втората опция, но рядко ми се налага да я използвам, защото свикнах да си предвиждам необходимата храна за деня навън и да си я нося с мен. Закуската и вечерята обикновенно са вкъщи, а обяда и следобедната закуска - в кутийки в раницата. След като получих няколко молби от читатели на блога да им дам идеи за хранене извън дома, реших да обобщя всичко, което аз прилагам в този пост. -Ето няколко идеи какво да носиш за обяд навън или в офиса и да приготвяш за децата си, докато са на училище.

    - -

    Плодове, измити и нарязани на хапки: ябълки, круши, киви, портокали, ананас, ягоди, други дребни горски плодове, цял необелен банан. Нерядко ще видиш добра възможност в това да си купиш кофичка кисело мляко и да го смесиш с плодовете, които си носиш. Това за съжаление не е добра идея, защото плодовете и млечната захар са трудна за храносмилане комбинация. Плодовете яж винаги самостоятелно като следобедна закуска например или поне 30 минути преди или след друго хранене. Единствената сполучлива комбинация е плодово-зеленчукови шейкове и смутита.

    - -

    Зеленчуци: тук можеш да се развихриш! Всички любими зеленчуци сурови или сготвени се прибират в малка кутия и могат да се хапват по всяко време. Ако си подготвил зеленчуците си за цялата седмица в почивният си ден, както те посъветвах тук, то салатата или гарнитурата ти е готова за няколко секунди. Подправките и зехтина за пресните зеленчуци носи отделно в малко бурканче. Добра идея е за мазнина да използвате намачкано авокадо - то овкусява чудесно всяка салата.

    - -

    Плодово-зеленчуковите напитки са отличен заместител на хранене, но е най-добре да се консумират веднага след приготвянето им. Това ги прави идеалната сутрешна закуска за хора които бързат или не обичат да се хранят сутрин. Банан, авокадо, шепа спанак и малко канела например ще те събуди с вкус и аромат, и ще ти даде много енергия за добър старт на деня, сила за предстоящата тренировка или пък за възстановяване след нея. Ето още една идея.

    - -

    Месо, яйца: Остатъците от снощната вечеря са идеалният обяд за следващият ден. Опаковаш го в кутия, заедно с порция зеленчуци и храната за деня ти е подсигурена. Варените необелени яйца могат да издържат цял ден извън хладилник, дори и през лятото. Консерва риба е компромис, но със сигурност е добро разнообразяване на менюто и много бърза и лесна опция. Избирай по-висококачествени консерви риба в зехтин или собствен сос.
    -Обяд

    - -

    Ядки и семена: чисто, практично и удобно. Шепа от любимите ти ядки или дори микс от няколко вида. Избягвайте да купувате от готовите миксове по магазините, които макар да са със сурови ядки и сушени плодове са третирани с различни препарати, а плодовете са със захар. Една любима моя вариация на темата е ядкова паста (тахан), в който добавям различни овкусители. Например в малко бурканче смесвам няколко лъжици пълнозърнест сусамов тахан с малко мед, натрошени какаови зърна, канела, няколко капки лимонов сок. Може вместо мед да използваш сушени плодове или пресни фурми, нарязани на дребно, различни подправки и семена, парченца пресен кокос… решението е твое. Този “коктейл” от суперхрани е изключително засищащ, а в същото време и малко като обем и тегло: перфектен за носене дори в малка дамска чанта. Ядковоте тахани набраха голяма популярност в последната година и вече можеш да намериш всякакви варианти: лешников, бадемов, слънчогледов, от тиквени семки, фъстъчен. Тъй като е пакетирана храна те съветвам винаги да четеш етикета и да се увериш, че купуваш паста от 100% ядки или семена, без сол, захар и други. Нека добавките да са от теб по твой вкус!

    - -

    И на последно място, но не и по значение поставям замествамето на хранене с доза протеин на прах. Това е спорен продукт и аз нямам намерение сега да разисквам колко вреден или полезен в той. Истината е, че въпреки че е силно преработена и концентрирана храна, протеинът на прах се усвоява добре от тялото и има определени ползи. Вече на пазара могат да се намерят десетки видове - млечен, животински, растителен, с различни вкусове и подсладители. Колкото по-висококачествен избереш, толкова повече ползи ще имаш от него. Разбира се аз съветвам винаги да предпочетеш цяла, необработена храна, но в изключителни случаи, когато обстоятелствата налагат бързо и питателно хранене една доза протеин може да спаси положението.

    - -

    Това бяха моите идеи за хранене извън дома. Надявам се да са ти били полезни и да успееш да ги приложиш в ежедневието си.

    -;T; @I"1/blog/2015-01-21-съвети-лош-дъх/;T{;{ ;I": - - - - - - - Как да се преборите с лошият дъх или неприятна телесна миризма? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как да се преборите с лошият дъх или неприятна телесна миризма? -

    - -
    -
      -
    • - - January 21, 2015 -
    • -
    -
    - - -

    Нищо не може да убие разговор, среща или парти по-бързо от това събеседникът да има лош дъх или неприятна телесна миризма. Ами ако това се случва на теб? Неприятно, но има решение.

    - -

    Как да разбереш, че имаш лош дъх? Ако долавяш това постоянно, значи и другите го усещат. Ако се съмняваш - наслюнчи/оближи част от дланта си. След като изсъхне за около 20-30 секунди помириши мястото. Вече знаеш.

    - -

    Как да разбереш, че имаш неприятна телесна миризма? След бягане, тежка тренировка или друго физическо усилие е ясно. Лесно е - помиришете дрехите си, но направете пауза след като ги съблечете: изкъпете се, облечете чисти дрехи и се върнете към тези, които са вече носени.

    - -

    Какво да направиш, за да премахнеш отблъскващите миризми? Ето пет лесни и полезни съвета. Те разбира са допълнителни мерки, след като се поддържа едно добро ниво на лична хигиена: ежедневно измиване на тялото, както и почистване на устната кухина и зъбите с четка, паста и зъбен конец.
    -Лош дъх

    - -
      -
    1. -

      Яж ферментирали храни - проучвания доказват, че лошият дъх често се дължи на дисбаланс в чревната флора. Т.е. лошите бактерии преобладават над добрите. За да възстановиш благоприятните условия за живот на полезните чревни бактерии увеличи приема на ферментирали храни. -Яж естествено ферментирала храна в малко количество ежедневно: кисело мляко, кисело зеле, айран, кефир, комбуча. Зеленият чай е богат на полифеноли, които също имат добро влияние върху микроорганизмите в червата.

      -
    2. -
    3. -

      Увеличи храната със съдържание на хлорофил - Въпреки, че животинските храни са изключително богати на лесно усвоими протеини, минерали, витамини и полезни мазнини не бива да забравяш за зеленчуците. Особено зелените зеленчуци! Те трябва да са част от всяко твое хранене. -Хлорофилът е зелен пигмент, който се съдържа във водораслите и зелените растения. Неговата роля е да абсорбира слънчевата светлина и да я трансформира в енергия. Зеленолистните зеленчуци са заредени с голямо количество хлорофил, който е естествен антиоксидант и помага в борбата с лошият дъх и неприятна телесна миризма. -Спанакът и магданозът са на първите места по съдържание на хлорофил (24mg и 19mg за половин порция. Китайско зеле, зелен боб, броколи, аспержи и тиквички също са чудесен избор.

      -
    4. -
    5. -

      Консумирай “охлаждащи” храни. Според Древната Китайска Медицина, излишната топлина води до лош дъх, гнилостна миризма от стомаха и акумулация на мукус в цялата храносмилателна система. “Затоплящите” храни са протеиновите храни и зърнените култури. “Охлаждащите” са зелени зеленчуци и подове като круши, ябълки, пъпеш, диня. Както знаеш от тук зърнените храни и пшеницата не са най-полезната храна, така че ето още една причина да редуцираш употребата им.

      -
    6. -
    7. -

      Използвай естествени антибактериални средства. За лошият дъх полезни са гаргари с вода, обогатена с етерично масло от чаено дърво и мента. Маслото от чаено дърво има противовъзпалително и антибактериално действие, а ментовото масло ароматизира и освежава. В малко вода се капват по 1-2 капки от маслата и се жабури за 30 секунди. За тялото пробвай етерично масло от чаено дърво и лавандула. Те се смесват в базово масло (кокосово, бадемово) и се нанасят на кожата. Те са естествени антимикробни средства и убиват бактериите, като в същото време ароматизират кожата приятно.

      -
    8. -
    9. -

      Редуцирай стреса. За да елиминираш ефективно неприятните миризми, трябва да намериш причината за тях. Нерядко това може да е високото ниво на стрес. Апокринните потни жлези освобождават съдържанието си в моменти на стрес, психически и физически. Безмирисната, мазна субстанция, която се отделя реагира с бактериите по кожата и причинява неприятната миризма. -Ако често имаш дълги и тежки работни дни, много крайни срокове и други ангажименти, опитай се да повлияеш на нервната система като за две седмици изключиш (или поне редуцираш до минимум) кафето, елиминираш енергийните напитки от менюто си, увеличиш времето за сън и дори да включиш дихателни упражнения и йога. Ето още съвети за контролиране на стреса.

      -
    10. -
    - -

    Ако днешната статия ти е харесала, може да я споделиш с приятелите си с бутоните отдолу.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Нищо не може да убие разговор, среща или парти по-бързо от това събеседникът да има лош дъх или неприятна телесна миризма. Ами ако това се случва на теб? Неприятно, но има решение. - -Как да разбереш, че имаш лош дъх? Ако долавяш това постоянно, значи и другите го усещат. Ако се съмняваш - наслюнчи/оближи част от дланта си. След като изсъхне за около 20-30 секунди помириши мястото. Вече знаеш. - -Как да разбереш, че имаш неприятна телесна миризма? След бягане, тежка тренировка или друго физическо усилие е ясно. Лесно е - помиришете дрехите си, но направете пауза след като ги съблечете: изкъпете се, облечете чисти дрехи и се върнете към тези, които са вече носени. - -Какво да направиш, за да премахнеш отблъскващите миризми? Ето пет лесни и полезни съвета. Те разбира са допълнителни мерки, след като се поддържа едно добро ниво на лична хигиена: ежедневно измиване на тялото, както и почистване на устната кухина и зъбите с четка, паста и зъбен конец.
    -![Лош дъх](/images/posts/Smell.jpg){:width="350px"}
    - - -1. Яж ферментирали храни - проучвания доказват, че лошият дъх често се дължи на дисбаланс в чревната флора. Т.е. лошите бактерии преобладават над добрите. За да възстановиш благоприятните условия за живот на полезните чревни бактерии увеличи приема на ферментирали храни. -Яж [естествено ферментирала храна](/blog/2014-10-14-%D1%84%D0%B5%D1%80%D0%BC%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%B0%D0%BB%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8/) в малко количество ежедневно: кисело мляко, кисело зеле, айран, кефир, комбуча. Зеленият чай е богат на полифеноли, които също имат добро влияние върху микроорганизмите в червата. - -2. Увеличи храната със съдържание на хлорофил - Въпреки, че животинските храни са изключително богати на лесно усвоими протеини, минерали, витамини и полезни мазнини не бива да забравяш за зеленчуците. Особено зелените зеленчуци! Те трябва да са част от всяко твое хранене. -Хлорофилът е зелен пигмент, който се съдържа във водораслите и зелените растения. Неговата роля е да абсорбира слънчевата светлина и да я трансформира в енергия. Зеленолистните зеленчуци са заредени с голямо количество хлорофил, който е естествен антиоксидант и помага в борбата с лошият дъх и неприятна телесна миризма. -Спанакът и магданозът са на първите места по съдържание на хлорофил (24mg и 19mg за половин порция. Китайско зеле, зелен боб, броколи, аспержи и тиквички също са чудесен избор. - -3. Консумирай "охлаждащи" храни. Според Древната Китайска Медицина, излишната топлина води до лош дъх, гнилостна миризма от стомаха и акумулация на мукус в цялата храносмилателна система. "Затоплящите" храни са протеиновите храни и зърнените култури. "Охлаждащите" са зелени зеленчуци и подове като круши, ябълки, пъпеш, диня. Както знаеш от [тук](/blog/2014-08-24-%D0%BF%D1%8A%D0%BB%D0%BD%D0%BE%D0%B7%D1%8A%D1%80%D0%BD%D0%B5%D1%81%D1%82-%D1%85%D0%BB%D1%8F%D0%B1/) зърнените храни и пшеницата не са най-полезната храна, така че ето още една причина да редуцираш употребата им. - -4. Използвай естествени антибактериални средства. За лошият дъх полезни са гаргари с вода, обогатена с етерично масло от чаено дърво и мента. Маслото от чаено дърво има противовъзпалително и антибактериално действие, а ментовото масло ароматизира и освежава. В малко вода се капват по 1-2 капки от маслата и се жабури за 30 секунди. За тялото пробвай етерично масло от чаено дърво и лавандула. Те се смесват в базово масло (кокосово, бадемово) и се нанасят на кожата. Те са естествени антимикробни средства и убиват бактериите, като в същото време ароматизират кожата приятно. - -5. Редуцирай стреса. За да елиминираш ефективно неприятните миризми, трябва да намериш причината за тях. Нерядко това може да е високото ниво на стрес. Апокринните потни жлези освобождават съдържанието си в моменти на стрес, психически и физически. Безмирисната, мазна субстанция, която се отделя реагира с бактериите по кожата и причинява неприятната миризма. -Ако често имаш дълги и тежки работни дни, много крайни срокове и други ангажименти, опитай се да повлияеш на нервната система като за две седмици изключиш (или поне редуцираш до минимум) кафето, елиминираш енергийните напитки от менюто си, увеличиш времето за сън и дори да включиш дихателни упражнения и йога. [Ето](/blog/2014-06-29-%D1%81%D1%82%D1%80%D0%B5%D1%81%D1%8A%D1%82/) още съвети за контролиране на стреса. - -Ако днешната статия ти е харесала, може да я споделиш с приятелите си с бутоните отдолу. - -;T; -I"

    Нищо не може да убие разговор, среща или парти по-бързо от това събеседникът да има лош дъх или неприятна телесна миризма. Ами ако това се случва на теб? Неприятно, но има решение.

    - -

    Как да разбереш, че имаш лош дъх? Ако долавяш това постоянно, значи и другите го усещат. Ако се съмняваш - наслюнчи/оближи част от дланта си. След като изсъхне за около 20-30 секунди помириши мястото. Вече знаеш.

    - -

    Как да разбереш, че имаш неприятна телесна миризма? След бягане, тежка тренировка или друго физическо усилие е ясно. Лесно е - помиришете дрехите си, но направете пауза след като ги съблечете: изкъпете се, облечете чисти дрехи и се върнете към тези, които са вече носени.

    - -

    Какво да направиш, за да премахнеш отблъскващите миризми? Ето пет лесни и полезни съвета. Те разбира са допълнителни мерки, след като се поддържа едно добро ниво на лична хигиена: ежедневно измиване на тялото, както и почистване на устната кухина и зъбите с четка, паста и зъбен конец.
    -Лош дъх

    - -
      -
    1. -

      Яж ферментирали храни - проучвания доказват, че лошият дъх често се дължи на дисбаланс в чревната флора. Т.е. лошите бактерии преобладават над добрите. За да възстановиш благоприятните условия за живот на полезните чревни бактерии увеличи приема на ферментирали храни. -Яж естествено ферментирала храна в малко количество ежедневно: кисело мляко, кисело зеле, айран, кефир, комбуча. Зеленият чай е богат на полифеноли, които също имат добро влияние върху микроорганизмите в червата.

      -
    2. -
    3. -

      Увеличи храната със съдържание на хлорофил - Въпреки, че животинските храни са изключително богати на лесно усвоими протеини, минерали, витамини и полезни мазнини не бива да забравяш за зеленчуците. Особено зелените зеленчуци! Те трябва да са част от всяко твое хранене. -Хлорофилът е зелен пигмент, който се съдържа във водораслите и зелените растения. Неговата роля е да абсорбира слънчевата светлина и да я трансформира в енергия. Зеленолистните зеленчуци са заредени с голямо количество хлорофил, който е естествен антиоксидант и помага в борбата с лошият дъх и неприятна телесна миризма. -Спанакът и магданозът са на първите места по съдържание на хлорофил (24mg и 19mg за половин порция. Китайско зеле, зелен боб, броколи, аспержи и тиквички също са чудесен избор.

      -
    4. -
    5. -

      Консумирай “охлаждащи” храни. Според Древната Китайска Медицина, излишната топлина води до лош дъх, гнилостна миризма от стомаха и акумулация на мукус в цялата храносмилателна система. “Затоплящите” храни са протеиновите храни и зърнените култури. “Охлаждащите” са зелени зеленчуци и подове като круши, ябълки, пъпеш, диня. Както знаеш от тук зърнените храни и пшеницата не са най-полезната храна, така че ето още една причина да редуцираш употребата им.

      -
    6. -
    7. -

      Използвай естествени антибактериални средства. За лошият дъх полезни са гаргари с вода, обогатена с етерично масло от чаено дърво и мента. Маслото от чаено дърво има противовъзпалително и антибактериално действие, а ментовото масло ароматизира и освежава. В малко вода се капват по 1-2 капки от маслата и се жабури за 30 секунди. За тялото пробвай етерично масло от чаено дърво и лавандула. Те се смесват в базово масло (кокосово, бадемово) и се нанасят на кожата. Те са естествени антимикробни средства и убиват бактериите, като в същото време ароматизират кожата приятно.

      -
    8. -
    9. -

      Редуцирай стреса. За да елиминираш ефективно неприятните миризми, трябва да намериш причината за тях. Нерядко това може да е високото ниво на стрес. Апокринните потни жлези освобождават съдържанието си в моменти на стрес, психически и физически. Безмирисната, мазна субстанция, която се отделя реагира с бактериите по кожата и причинява неприятната миризма. -Ако често имаш дълги и тежки работни дни, много крайни срокове и други ангажименти, опитай се да повлияеш на нервната система като за две седмици изключиш (или поне редуцираш до минимум) кафето, елиминираш енергийните напитки от менюто си, увеличиш времето за сън и дори да включиш дихателни упражнения и йога. Ето още съвети за контролиране на стреса.

      -
    10. -
    - -

    Ако днешната статия ти е харесала, може да я споделиш с приятелите си с бутоните отдолу.

    - -;T; @I"%/blog/2015-01-27-шоколад/;T{;{ ;I"B - - - - - - - Полезният течен шоколад и още 13 тайни съставки за вкусни и здравословни ястия - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Полезният течен шоколад и още 13 тайни съставки за вкусни и здравословни ястия -

    - -
    -
      -
    • - - January 27, 2015 -
    • -
    -
    - - -

    От доста време не просто внимаваш с какво се храниш, но вече имаш желание да експериментираш в кухнята и да превърнеш рецептите на любимите си ястия в подходящи за настоящият ти начин на живот? Днес ще ти дам идеи с какво да заместиш “лошите” съставки и да облагородиш всяка рецепта.

    - -
      -
    1. -

      Захар - вече всеки знае, че бялата рафинирана захар не е полезна. Вместо нея избери натурален източник на сладост - суров мед, фурми или зрели банани. Ако рецептата изисква подсладителя да е суха съставка, то приемлив избор е кокосовата захар, която съдържа много минерали и баластни вещества, които възпрепядстват рязкото покачване на кръвната захар. А и е много вкусна и ароматна.

      -
    2. -
    3. -

      Кафява рафинирана захар, захарин, глюкозо-фруктозен сироп. Изкуствените заместители на захарта не са по-малкото зло. Те често са нискокачествени химични продукти или силно рафинирани вещества. Стевия е приемлив вариант тук, но единствено ако се приема под формата на изсушени листа или чай/запарка от растението. Екстрактите от стевия съдържат съставки като глицерин, ксилитол, декстроза, натурални аромати (би могло да бъде всичко) които не са особено полезни.

      -
    4. -
    5. -

      Трапезна сол. Дълги години солта беше заклеймена като вредна и опасна за здравето. Това не важи за истинската морска сол, която освен че овкусява храната, я обогатява с редица минерали и микроелементи. Повече за солта.

      -
    6. -
    7. -

      Оцет. Когато рецептата изисква оцет, изберете суров ябълков оцет или домашен винен оцет. Оцета, който се продава масово е съставен (ако имате късмет) само от химически синтезирана лимонена киселина и вода. Понякога има добавена захар, консерванти, стабилизатори, оцветители и т.н.

      -
    8. -
    9. -

      Маргарин. Няма никакво съмнение, че най-добрият избор е кравето масло или пречистеното краве масло (гхи). Кокосовото масло и животинската мас също са чудесни за готвене. За вредата от маргарина има много, много информация, а ето какво аз мисля по въпроса.

      -
    10. -
    11. -

      Олио. Растителните хидрогенирани и рафинирани мазнини са лош избор за храна. За сурови рецепти използвай студенопресован зехтин, а за термична обработка - разтопено кокосово масло.

      -
    12. -
    13. -

      Кубче бульон. Натриевият глутамат в него (подобрител на вкуса) дори не е най-лошата съставка. В кубчетата бульон има високо количество трансмазнини и палмова мазнина, инстантни брашна и пренебрежимо количество зеленчуци. Най-добрият вариант е да си сварите концентриран домашен бульон, който да замразите във форми за лед и да ползвате, когато имате нужда. А в някои от големите супермаркети се намират сушени зеленчуци без никакви добавки и от тях става чудесен ароматен микс за всяко ястие.

      -
    14. -
    15. -

      Какао. Какаото е една от суперхраните, консумирани от древните народи в Южна Америка и Африка. То е балансиран източник на минерали, витамини, мастни киселини, антиоксиданти. Разбира се, това се отнася за суровото, пълномаслено висококачествено какао. Масовите какаови смеси на прах са обезмаслени и обогатени с нишесте и различни консерванти, което унищожава полезните свойства, вкуса и аромата. Престрашете се да опитате и сурови какаови зърна.

      -
    16. -
    17. -

      Кафяв ориз. Наистина ли? Кафявият ориз е лош избор? Кафявият ориз съдържа голямо количество фитинова киселина, лектини (повече за тях тук и тук) и несмилаеми фибри, които не са добри за храносмилателната ти система. По-добре замени ориза с бял жасминов или киноа.

      -
    18. -
    19. -

      Нискомаслени млечни продукти, заместители на мляко. Нискомаслените млека и растителни сметани са кодовите наименования на химически-обогатени сироватъчни смеси. Заменете ги с пълномаслено животинско или кокосово мляко и сметана.

      -
    20. -
    21. -

      Мариновани зеленчуци, туршии. Краставички, моркови, карфиол, зеле можете да си приготвите бързо и лесно (дори и зимата) по описаният тук начин. Естествената ферментация е процесът, който ще донесе ползи за тялото ти. Консервирането с оцет и изваряването на зеленчуците убива всички полезни вещества и окислява организма.

      -
    22. -
    23. -

      Бяло пшенично брашно. В десерти то се заменя изключително успешно с коксово брашно. За хляб и печива може да избереш брашно от лимец, елда и други по-полезни зърнени култури, според вкуса и възможностите си.

      -
    24. -
    25. -

      Шоколад, течен шоколад - в рецептите шоколада успешно може да се замени със смес от сурово какао и лешников тахан. Със същата комбинация с малко мед ще получиш най-вкусният течен шоколад.

      -
    26. -
    27. -

      Оцветители за храна. Кой има нужда от това?! Все пак можете да използваш сок от червено зеле, за да оцветиш нещо в синьо или сок от цвекло за наситен розово-червен цвят.
      -Шоколад

      -
    28. -
    - -

    Надявам се тази статия да ти е харесала и да ти е полезна в приготвянето на любимите ти ястия.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I",$От доста време не просто внимаваш с какво се храниш, но вече имаш желание да експериментираш в кухнята и да превърнеш рецептите на любимите си ястия в подходящи за настоящият ти начин на живот? Днес ще ти дам идеи с какво да заместиш "лошите" съставки и да облагородиш всяка рецепта. - -1. Захар - вече всеки знае, че бялата рафинирана захар не е полезна. Вместо нея избери натурален източник на сладост - суров мед, фурми или зрели банани. Ако рецептата изисква подсладителя да е суха съставка, то приемлив избор е кокосовата захар, която съдържа много минерали и баластни вещества, които възпрепядстват рязкото покачване на кръвната захар. А и е много вкусна и ароматна. - -2. Кафява рафинирана захар, захарин, глюкозо-фруктозен сироп. Изкуствените заместители на захарта не са по-малкото зло. Те често са нискокачествени химични продукти или силно рафинирани вещества. Стевия е приемлив вариант тук, но единствено ако се приема под формата на изсушени листа или чай/запарка от растението. Екстрактите от стевия съдържат съставки като глицерин, ксилитол, декстроза, натурални аромати (би могло да бъде всичко) които не са особено полезни. - -3. Трапезна сол. Дълги години солта беше заклеймена като вредна и опасна за здравето. Това не важи за истинската морска сол, която освен че овкусява храната, я обогатява с редица минерали и микроелементи. [Повече за солта](/blog/2014-05-09-%D1%81%D0%BE%D0%BB%D1%82%D0%B0/). - -4. Оцет. Когато рецептата изисква оцет, изберете суров ябълков оцет или домашен винен оцет. Оцета, който се продава масово е съставен (ако имате късмет) само от химически синтезирана лимонена киселина и вода. Понякога има добавена захар, консерванти, стабилизатори, оцветители и т.н. - -5. Маргарин. Няма никакво съмнение, че най-добрият избор е кравето масло или пречистеното краве [масло](/blog/2014-06-07-%D0%A5%D1%80%D0%B0%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%B0%D1%82%D0%BE-%D0%BB%D0%B5%D0%BA%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%BE-%D0%9C%D0%B0%D1%81%D0%BB%D0%BE%D1%82%D0%BE/) (гхи). Кокосовото масло и животинската мас също са чудесни за готвене. За вредата от маргарина има много, много информация, а [ето](/blog/2014-04-08-%D0%B7%D0%B0%D1%89%D0%BE-%D0%BD%D0%B8%D0%BA%D0%BE%D0%B3%D0%B0-%D0%BD%D0%B5-%D1%82%D1%80%D1%8F%D0%B1%D0%B2%D0%B0-%D0%B4%D0%B0-%D1%8F%D0%B4%D0%B5%D1%82%D0%B5-%D0%BC%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D0%BD/) какво аз мисля по въпроса. - -6. Олио. Растителните хидрогенирани и рафинирани мазнини са лош избор за храна. За сурови рецепти използвай студенопресован зехтин, а за термична обработка - разтопено кокосово масло. - -7. Кубче бульон. Натриевият глутамат в него (подобрител на вкуса) дори не е най-лошата съставка. В кубчетата бульон има високо количество трансмазнини и палмова мазнина, инстантни брашна и пренебрежимо количество зеленчуци. Най-добрият вариант е да си сварите концентриран домашен бульон, който да замразите във форми за лед и да ползвате, когато имате нужда. А в някои от големите супермаркети се намират сушени зеленчуци без никакви добавки и от тях става чудесен ароматен микс за всяко ястие. - -8. Какао. Какаото е една от суперхраните, консумирани от древните народи в Южна Америка и Африка. То е балансиран източник на минерали, витамини, мастни киселини, антиоксиданти. Разбира се, това се отнася за суровото, пълномаслено висококачествено какао. Масовите какаови смеси на прах са обезмаслени и обогатени с нишесте и различни консерванти, което унищожава полезните свойства, вкуса и аромата. Престрашете се да опитате и сурови какаови зърна. - -9. Кафяв ориз. Наистина ли? Кафявият ориз е лош избор? Кафявият ориз съдържа голямо количество фитинова киселина, лектини (повече за тях [тук](/blog/2014-04-02-%D1%82%D1%80%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%BA%D0%BE%D0%B8%D1%82%D0%BE-%D1%81%D0%B5-%D0%B7%D0%B0%D0%B1%D0%BB%D1%83%D0%B6%D0%B4%D0%B0%D0%B2%D0%B0%D1%82%D0%B5-%D1%87%D0%B5-%D1%81%D0%B0-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%B8/) и [тук](/blog/2014-08-29-%D0%BF%D1%88%D0%B5%D0%BD%D0%B8%D1%86%D0%B0%D1%82%D0%B0/)) и несмилаеми фибри, които не са добри за храносмилателната ти система. По-добре замени ориза с бял жасминов или киноа. - -10. Нискомаслени млечни продукти, заместители на мляко. Нискомаслените млека и растителни сметани са кодовите наименования на химически-обогатени сироватъчни смеси. Заменете ги с пълномаслено животинско или кокосово мляко и сметана. - -11. Мариновани зеленчуци, туршии. Краставички, моркови, карфиол, зеле можете да си приготвите бързо и лесно (дори и зимата) по описаният [тук](/blog/2014-06-07-%D0%A5%D1%80%D0%B0%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%B0%D1%82%D0%BE-%D0%BB%D0%B5%D0%BA%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%BE-%D0%9C%D0%B0%D1%81%D0%BB%D0%BE%D1%82%D0%BE/) начин. Естествената ферментация е процесът, който ще донесе ползи за тялото ти. Консервирането с оцет и изваряването на зеленчуците убива всички полезни вещества и окислява организма. - -12. Бяло пшенично брашно. В десерти то се заменя изключително успешно с коксово брашно. За хляб и печива може да избереш брашно от лимец, елда и други по-полезни зърнени култури, според вкуса и възможностите си. - -13. Шоколад, течен шоколад - в рецептите шоколада успешно може да се замени със смес от сурово какао и лешников тахан. Със същата комбинация с малко мед ще получиш най-вкусният течен шоколад. - -14. Оцветители за храна. Кой има нужда от това?! Все пак можете да използваш сок от червено зеле, за да оцветиш нещо в синьо или сок от цвекло за наситен розово-червен цвят.
    -![Шоколад](/images/posts/Choco.jpg){:width="350px"}
    - -Надявам се тази статия да ти е харесала и да ти е полезна в приготвянето на любимите ти ястия.;T; -I"%

    От доста време не просто внимаваш с какво се храниш, но вече имаш желание да експериментираш в кухнята и да превърнеш рецептите на любимите си ястия в подходящи за настоящият ти начин на живот? Днес ще ти дам идеи с какво да заместиш “лошите” съставки и да облагородиш всяка рецепта.

    - -
      -
    1. -

      Захар - вече всеки знае, че бялата рафинирана захар не е полезна. Вместо нея избери натурален източник на сладост - суров мед, фурми или зрели банани. Ако рецептата изисква подсладителя да е суха съставка, то приемлив избор е кокосовата захар, която съдържа много минерали и баластни вещества, които възпрепядстват рязкото покачване на кръвната захар. А и е много вкусна и ароматна.

      -
    2. -
    3. -

      Кафява рафинирана захар, захарин, глюкозо-фруктозен сироп. Изкуствените заместители на захарта не са по-малкото зло. Те често са нискокачествени химични продукти или силно рафинирани вещества. Стевия е приемлив вариант тук, но единствено ако се приема под формата на изсушени листа или чай/запарка от растението. Екстрактите от стевия съдържат съставки като глицерин, ксилитол, декстроза, натурални аромати (би могло да бъде всичко) които не са особено полезни.

      -
    4. -
    5. -

      Трапезна сол. Дълги години солта беше заклеймена като вредна и опасна за здравето. Това не важи за истинската морска сол, която освен че овкусява храната, я обогатява с редица минерали и микроелементи. Повече за солта.

      -
    6. -
    7. -

      Оцет. Когато рецептата изисква оцет, изберете суров ябълков оцет или домашен винен оцет. Оцета, който се продава масово е съставен (ако имате късмет) само от химически синтезирана лимонена киселина и вода. Понякога има добавена захар, консерванти, стабилизатори, оцветители и т.н.

      -
    8. -
    9. -

      Маргарин. Няма никакво съмнение, че най-добрият избор е кравето масло или пречистеното краве масло (гхи). Кокосовото масло и животинската мас също са чудесни за готвене. За вредата от маргарина има много, много информация, а ето какво аз мисля по въпроса.

      -
    10. -
    11. -

      Олио. Растителните хидрогенирани и рафинирани мазнини са лош избор за храна. За сурови рецепти използвай студенопресован зехтин, а за термична обработка - разтопено кокосово масло.

      -
    12. -
    13. -

      Кубче бульон. Натриевият глутамат в него (подобрител на вкуса) дори не е най-лошата съставка. В кубчетата бульон има високо количество трансмазнини и палмова мазнина, инстантни брашна и пренебрежимо количество зеленчуци. Най-добрият вариант е да си сварите концентриран домашен бульон, който да замразите във форми за лед и да ползвате, когато имате нужда. А в някои от големите супермаркети се намират сушени зеленчуци без никакви добавки и от тях става чудесен ароматен микс за всяко ястие.

      -
    14. -
    15. -

      Какао. Какаото е една от суперхраните, консумирани от древните народи в Южна Америка и Африка. То е балансиран източник на минерали, витамини, мастни киселини, антиоксиданти. Разбира се, това се отнася за суровото, пълномаслено висококачествено какао. Масовите какаови смеси на прах са обезмаслени и обогатени с нишесте и различни консерванти, което унищожава полезните свойства, вкуса и аромата. Престрашете се да опитате и сурови какаови зърна.

      -
    16. -
    17. -

      Кафяв ориз. Наистина ли? Кафявият ориз е лош избор? Кафявият ориз съдържа голямо количество фитинова киселина, лектини (повече за тях тук и тук) и несмилаеми фибри, които не са добри за храносмилателната ти система. По-добре замени ориза с бял жасминов или киноа.

      -
    18. -
    19. -

      Нискомаслени млечни продукти, заместители на мляко. Нискомаслените млека и растителни сметани са кодовите наименования на химически-обогатени сироватъчни смеси. Заменете ги с пълномаслено животинско или кокосово мляко и сметана.

      -
    20. -
    21. -

      Мариновани зеленчуци, туршии. Краставички, моркови, карфиол, зеле можете да си приготвите бързо и лесно (дори и зимата) по описаният тук начин. Естествената ферментация е процесът, който ще донесе ползи за тялото ти. Консервирането с оцет и изваряването на зеленчуците убива всички полезни вещества и окислява организма.

      -
    22. -
    23. -

      Бяло пшенично брашно. В десерти то се заменя изключително успешно с коксово брашно. За хляб и печива може да избереш брашно от лимец, елда и други по-полезни зърнени култури, според вкуса и възможностите си.

      -
    24. -
    25. -

      Шоколад, течен шоколад - в рецептите шоколада успешно може да се замени със смес от сурово какао и лешников тахан. Със същата комбинация с малко мед ще получиш най-вкусният течен шоколад.

      -
    26. -
    27. -

      Оцветители за храна. Кой има нужда от това?! Все пак можете да използваш сок от червено зеле, за да оцветиш нещо в синьо или сок от цвекло за наситен розово-червен цвят.
      -Шоколад

      -
    28. -
    - -

    Надявам се тази статия да ти е харесала и да ти е полезна в приготвянето на любимите ти ястия.

    -;T; @ -I"(/blog/2015-02-03-аутопсия1/;T{;{ ;I"B - - - - - - - Аутопсия на болестите - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Аутопсия на болестите -

    - -
    -
      -
    • - - February 3, 2015 -
    • -
    -
    - - -

    Защо има болести? Защо се разболяват хората? Защо някои хора заболяват от много тежки, нелечими болести? Защо такива нелечими заболявания засягат дори малки бебета? Защо някои хора живеят нездравословно и въпреки това нямат сериозни проблеми със здравето? Защо съвременните хора стават все по-болни и все по-дебели, макар да се обръща много по-голямо внимание на храната и здравето, от когато и да било? Защо човечеството прогресивно затлъстява и как можем да променим това?

    - -

    В настоящата статия ще ви представя моята гледна точка по тези въпроси. С годините тя се е променяла и се надявам да се променя и развива и в бъдеще. Нямам самочувствието да знам всичко, но се надявам, че ще бъде интересно и полезно четиво.

    - -

    Старата, но популярна и до момента парадигма за заболяванията включва 3 причини:

    - -
      -
    1. -

      Генетична предразположеност. Любимата ми причина: Никой не е виновен за състоянието на болния (особено той!) - всичко е наследствено! Ако в семейството има рак, сърдечни заболявания, диабет, затлъстяване, пародонтални заболявания всичко, което може да се направи е да се провери с редица изследвания има или няма заболяване и/или някакви отклонения. Ако има проблем се започва лечение; ако няма проблем - продължаваме си по старому.

      -
    2. -
    3. -

      Втората причина да се разболяват хората е защото са дебели. Затлъстяването води със себе си високо кръвно налягане, повишен холестерол, сърдечно-съдови заболявания, диабет, рак, деменция и др. Ако обаче ядем по-малко и се движим повече ще отслабнем/няма да напълнеем и ще сме здрави. Защото слабите хора са здрави!

      -
    4. -
    5. -

      Микробите са навсякъде около нас и те са лоши. Ако имаме твърде много микроби в себе си се разболяваме. Затова е най-добре да използваме всякакви антибактериални средства и по този начин да създадем една безопасна среда около себе си. По-малко микроорганизми означава по-добро здраве.

      -
    6. -
    - -

    Във всичко по-горе има известна доза истина, но науката вече знае, че:

    - -
      -
    1. -

      Не гените които сме наследили от родителите си са тези, които ни разболяват. Болестите са резултат от това как гените се изявяват във външният свят. Това се проследява от новата наука, наречена Епигенетика. Тя установява, че гените се изявяват или не в зависимост от условията, в които са поставени. Гените не ни контролират; ние сме тези които контролират гените си, защото ние избираме околната среда в която живеем и външните влияния, които въздействат върху нашите гени.

      -
    2. -
    3. -

      Наднорменото тегло не е причина, а по-скоро следствие от метаболитни нарушения. Хиперинсулинемията (повишено количество на инсулин в кръвта) е една от главните причини за метаболитният синдром, който се свързва с редица заболявания на сърдечно-съдовата система, неврологични, кожни и др. Прекомерната консумация на преработени и рафинирани храни, които съдържат захар и изкуствени добавки създава предпоставки за развитието на тези състояния. Ако премахнем от менюто си всички преработени храни и започнем да се храним само с истинска, цяла храна, шансът да се разболеем намалява значително. Истината е, че това въобще не е ново откритие: хората са се хранели с непреработена храна милиони години. -Освен инсулина, в регулацията на обмяната на веществата участват още редица хормони. Постоянно високите нива на инсулин обаче са първата стъпка към метаболитните проблеми. Много хора имат лоша инсулинова чувствителност за която не подозират. Например: След високо-въглехидратно хранене чувствате ли се заситени или по-скоро подути и оточни? Ако е първото, значи имате добра инсулиновата чувствителност; ако въглехидратите ви създават дискомфорт в стомаха може да се съмнявате за инсулинова резистентност. -Още един тест: при прием на повече въглехидрати усещате ли прилив на енергия, която е стабилна във времето до следващото хранене или ви се доспива и изпитвате глад най-много до час след въглехидратното хранене? Ако наблюдавате първите признаци, то тялото ви има добри отношения с инсулина. Ако е втората реакция: вероятно имате инсулинова резистентност. -Това, разбира се не са диагнози, но може да ви даде насоки за размисъл какво да промените в храненето си. Ако се храните с 90% цели, непреработени храни вероятността да подобрите инсулиновата си чувствителност е 100%.

      -
    4. -
    5. -

      Не всички микроби са лоши. Всъщност в телата ни има изключително много полезни бактерии, които е добре да съхраним и да се грижим за тях правилно. Храносмилателната система съставлява 80% от имунната система на човека и се бори с повечето токсини и паразити и вируси. През червата също така, постъпват хранителните вещества в кръвообращанието. Ако храносмилателната ни система е в добро здраве, означава цялостно здраве за организма. Ако поддържаме балансирано ниво на полезните бактерии с прием на ферментирали храни, пробиотици, минимален прием на медикаменти и антибиотици можем да редуцираме рисковете за болести до минимум.

      -
    6. -
    7. -

      Колкото важно е какво внасяме в тялото си чрез храната, толкова значение има и как третираме кожата си. Много продукти за хигиена (лична и домашна) съдържат токсини, които навлизат в кръвотока и създават опасност за здравето. За да създадем здравословна среда е разумно да потърсим по-натурални козметика и средства за хигиена.

      -
    8. -
    - -

    Съвременната наука и медицина се развиват много бързо и успешно, но за мен най-важна си остава профилактиката на заболяванията. Затова моят съвет е да се грижите за здравето си всеки ден.

    - -

    Ако тази статия ви е харесала, можете да я споделите с приятелите си чрез бутоните отдолу.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"&Защо има болести? Защо се разболяват хората? Защо някои хора заболяват от много тежки, нелечими болести? Защо такива нелечими заболявания засягат дори малки бебета? Защо някои хора живеят нездравословно и въпреки това нямат сериозни проблеми със здравето? Защо съвременните хора стават все по-болни и все по-дебели, макар да се обръща много по-голямо внимание на храната и здравето, от когато и да било? Защо човечеството прогресивно затлъстява и как можем да променим това? - -В настоящата статия ще ви представя **моята гледна точка** по тези въпроси. С годините тя се е променяла и се надявам да се променя и развива и в бъдеще. Нямам самочувствието да знам всичко, но се надявам, че ще бъде интересно и полезно четиво. - -Старата, но популярна и до момента парадигма за заболяванията включва 3 причини: - -1. Генетична предразположеност. Любимата ми причина: Никой не е виновен за състоянието на болния (особено той!) - **всичко е наследствено!** Ако в семейството има рак, сърдечни заболявания, диабет, затлъстяване, пародонтални заболявания всичко, което може да се направи е да се провери с редица изследвания има или няма заболяване и/или някакви отклонения. Ако има проблем се започва лечение; ако няма проблем - продължаваме си по старому. - -2. Втората причина да се разболяват хората е защото са дебели. **Затлъстяването** води със себе си високо кръвно налягане, повишен холестерол, сърдечно-съдови заболявания, диабет, рак, деменция и др. Ако обаче ядем по-малко и се движим повече ще отслабнем/няма да напълнеем и ще сме здрави. Защото слабите хора са здрави! - -3. **Микробите** са навсякъде около нас и те са лоши. Ако имаме твърде много микроби в себе си се разболяваме. Затова е най-добре да използваме всякакви антибактериални средства и по този начин да създадем една безопасна среда около себе си. По-малко микроорганизми означава по-добро здраве. - -Във всичко по-горе има известна доза истина, но науката вече знае, че: - -1. Не гените които сме наследили от родителите си са тези, които ни разболяват. Болестите са резултат от това как гените се изявяват във външният свят. Това се проследява от новата наука, наречена **Епигенетика**. Тя установява, че **гените се изявяват или не в зависимост от условията, в които са поставени**. Гените не ни контролират; ние сме тези които контролират гените си, защото ние избираме околната среда в която живеем и външните влияния, които въздействат върху нашите гени. - -2. Наднорменото тегло не е причина, а по-скоро следствие от **метаболитни нарушения**. Хиперинсулинемията (повишено количество на инсулин в кръвта) е една от главните причини за метаболитният синдром, който се свързва с редица заболявания на сърдечно-съдовата система, неврологични, кожни и др. Прекомерната консумация на преработени и рафинирани храни, които съдържат захар и изкуствени добавки създава предпоставки за развитието на тези състояния. Ако премахнем от менюто си всички преработени храни и започнем да се храним само с **истинска, цяла храна**, шансът да се разболеем намалява значително. Истината е, че това въобще не е ново откритие: хората са се хранели с непреработена храна милиони години. -Освен инсулина, в регулацията на обмяната на веществата участват още редица хормони. Постоянно високите нива на инсулин обаче са първата стъпка към метаболитните проблеми. Много хора имат лоша инсулинова чувствителност за която не подозират. Например: След високо-въглехидратно хранене чувствате ли се заситени или по-скоро подути и оточни? Ако е първото, значи имате добра инсулиновата чувствителност; ако въглехидратите ви създават дискомфорт в стомаха може да се съмнявате за инсулинова резистентност. -Още един тест: при прием на повече въглехидрати усещате ли прилив на енергия, която е стабилна във времето до следващото хранене или ви се доспива и изпитвате глад най-много до час след въглехидратното хранене? Ако наблюдавате първите признаци, то тялото ви има добри отношения с инсулина. Ако е втората реакция: вероятно имате **инсулинова резистентност**. -Това, разбира се не са диагнози, но може да ви даде насоки за размисъл какво да промените в храненето си. **Ако се храните с 90% цели, непреработени храни вероятността да подобрите инсулиновата си чувствителност е 100%**. - -3. Не всички микроби са лоши. Всъщност в телата ни има изключително много полезни бактерии, които е добре да съхраним и да се грижим за тях правилно. Храносмилателната система съставлява 80% от имунната система на човека и се бори с повечето токсини и паразити и вируси. През червата също така, постъпват хранителните вещества в кръвообращанието. Ако **храносмилателната ни система е в добро здраве, означава цялостно здраве за организма**. Ако поддържаме балансирано ниво на полезните бактерии с прием на ферментирали храни, пробиотици, минимален прием на медикаменти и антибиотици можем да редуцираме рисковете за болести до минимум. - -4. Колкото важно е какво внасяме в тялото си чрез храната, толкова значение има и **как третираме кожата** си. Много продукти за хигиена (лична и домашна) съдържат токсини, които навлизат в кръвотока и създават опасност за здравето. За да създадем здравословна среда е разумно да потърсим по-натурални козметика и средства за хигиена. - -Съвременната наука и медицина се развиват много бързо и успешно, но за мен най-важна си остава профилактиката на заболяванията. Затова **моят съвет е да се грижите за здравето си всеки ден**. - -Ако тази статия ви е харесала, можете да я споделите с приятелите си чрез бутоните отдолу. - - -;T; -I"%(

    Защо има болести? Защо се разболяват хората? Защо някои хора заболяват от много тежки, нелечими болести? Защо такива нелечими заболявания засягат дори малки бебета? Защо някои хора живеят нездравословно и въпреки това нямат сериозни проблеми със здравето? Защо съвременните хора стават все по-болни и все по-дебели, макар да се обръща много по-голямо внимание на храната и здравето, от когато и да било? Защо човечеството прогресивно затлъстява и как можем да променим това?

    - -

    В настоящата статия ще ви представя моята гледна точка по тези въпроси. С годините тя се е променяла и се надявам да се променя и развива и в бъдеще. Нямам самочувствието да знам всичко, но се надявам, че ще бъде интересно и полезно четиво.

    - -

    Старата, но популярна и до момента парадигма за заболяванията включва 3 причини:

    - -
      -
    1. -

      Генетична предразположеност. Любимата ми причина: Никой не е виновен за състоянието на болния (особено той!) - всичко е наследствено! Ако в семейството има рак, сърдечни заболявания, диабет, затлъстяване, пародонтални заболявания всичко, което може да се направи е да се провери с редица изследвания има или няма заболяване и/или някакви отклонения. Ако има проблем се започва лечение; ако няма проблем - продължаваме си по старому.

      -
    2. -
    3. -

      Втората причина да се разболяват хората е защото са дебели. Затлъстяването води със себе си високо кръвно налягане, повишен холестерол, сърдечно-съдови заболявания, диабет, рак, деменция и др. Ако обаче ядем по-малко и се движим повече ще отслабнем/няма да напълнеем и ще сме здрави. Защото слабите хора са здрави!

      -
    4. -
    5. -

      Микробите са навсякъде около нас и те са лоши. Ако имаме твърде много микроби в себе си се разболяваме. Затова е най-добре да използваме всякакви антибактериални средства и по този начин да създадем една безопасна среда около себе си. По-малко микроорганизми означава по-добро здраве.

      -
    6. -
    - -

    Във всичко по-горе има известна доза истина, но науката вече знае, че:

    - -
      -
    1. -

      Не гените които сме наследили от родителите си са тези, които ни разболяват. Болестите са резултат от това как гените се изявяват във външният свят. Това се проследява от новата наука, наречена Епигенетика. Тя установява, че гените се изявяват или не в зависимост от условията, в които са поставени. Гените не ни контролират; ние сме тези които контролират гените си, защото ние избираме околната среда в която живеем и външните влияния, които въздействат върху нашите гени.

      -
    2. -
    3. -

      Наднорменото тегло не е причина, а по-скоро следствие от метаболитни нарушения. Хиперинсулинемията (повишено количество на инсулин в кръвта) е една от главните причини за метаболитният синдром, който се свързва с редица заболявания на сърдечно-съдовата система, неврологични, кожни и др. Прекомерната консумация на преработени и рафинирани храни, които съдържат захар и изкуствени добавки създава предпоставки за развитието на тези състояния. Ако премахнем от менюто си всички преработени храни и започнем да се храним само с истинска, цяла храна, шансът да се разболеем намалява значително. Истината е, че това въобще не е ново откритие: хората са се хранели с непреработена храна милиони години. -Освен инсулина, в регулацията на обмяната на веществата участват още редица хормони. Постоянно високите нива на инсулин обаче са първата стъпка към метаболитните проблеми. Много хора имат лоша инсулинова чувствителност за която не подозират. Например: След високо-въглехидратно хранене чувствате ли се заситени или по-скоро подути и оточни? Ако е първото, значи имате добра инсулиновата чувствителност; ако въглехидратите ви създават дискомфорт в стомаха може да се съмнявате за инсулинова резистентност. -Още един тест: при прием на повече въглехидрати усещате ли прилив на енергия, която е стабилна във времето до следващото хранене или ви се доспива и изпитвате глад най-много до час след въглехидратното хранене? Ако наблюдавате първите признаци, то тялото ви има добри отношения с инсулина. Ако е втората реакция: вероятно имате инсулинова резистентност. -Това, разбира се не са диагнози, но може да ви даде насоки за размисъл какво да промените в храненето си. Ако се храните с 90% цели, непреработени храни вероятността да подобрите инсулиновата си чувствителност е 100%.

      -
    4. -
    5. -

      Не всички микроби са лоши. Всъщност в телата ни има изключително много полезни бактерии, които е добре да съхраним и да се грижим за тях правилно. Храносмилателната система съставлява 80% от имунната система на човека и се бори с повечето токсини и паразити и вируси. През червата също така, постъпват хранителните вещества в кръвообращанието. Ако храносмилателната ни система е в добро здраве, означава цялостно здраве за организма. Ако поддържаме балансирано ниво на полезните бактерии с прием на ферментирали храни, пробиотици, минимален прием на медикаменти и антибиотици можем да редуцираме рисковете за болести до минимум.

      -
    6. -
    7. -

      Колкото важно е какво внасяме в тялото си чрез храната, толкова значение има и как третираме кожата си. Много продукти за хигиена (лична и домашна) съдържат токсини, които навлизат в кръвотока и създават опасност за здравето. За да създадем здравословна среда е разумно да потърсим по-натурални козметика и средства за хигиена.

      -
    8. -
    - -

    Съвременната наука и медицина се развиват много бързо и успешно, но за мен най-важна си остава профилактиката на заболяванията. Затова моят съвет е да се грижите за здравето си всеки ден.

    - -

    Ако тази статия ви е харесала, можете да я споделите с приятелите си чрез бутоните отдолу.

    - -;T; @I"%/blog/2015-02-08-ваксини/;T{;{ ;I"-. - - - - - - - За ваксините - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - За ваксините -

    - -
    -
      -
    • - - February 8, 2015 -
    • -
    -
    - - -

    Напоследък масово се заговори за ваксините. И не само в България, а в световен мащаб. -Открояват се два лагера: този на антиваксърите (хората, които отричат ваксините) и другият, на хората които са про-ваксините. -Темата е много дълбока и гледните точки, според мен, не са само две. -Отвсякъде се четат мнения на лекари и специалисти, които вместо да се позовават на научни факти, буквално плюят върху “необразованите и некомпетентни родители, които не ваксинират децата си”. -Въпросните родители често са с много задълбочени познания по темата, особено тези които са свидетели на страничните реакции от ваксинирането.

    - -

    Защото странични реакции има! Абсурдно е да се твърди, че даден медикамент е безвреден за 100% от хората. Абсурдно е да се твърди, че всички ваксини са задължителни за 100% от децата ни.

    - -

    Според мен най-големият проблем е задължителният характер на ваксините. В Българиският имунизационен календар те са девет и има санкции при отказ за поставянето им. В повечето европейски страни задължителните ваксини са по-малко от пет, а в страни като Великобритания, Германия, Дания, Финландия няма такива.(виж табл.) Ваксините не трябва да са задължителни, а препоръчатителни. И лекарите трябва да имат компетенциите да обяснят ползите и рисковете и да мотивират родителя да ваксинира детето при нужда. Защото нерядко след ваксинацията напътствията са: “Довечера не къпеш и даваш Панадол”. И толкова.

    - -

    Разгорелите спорове в Интернет пространството са изключително неефективни и само вдигат пушилка. А реално и в двата лагера има достатъчно компетентни хора, които да вземат разумно решение. Но е много по-интересно (и генерира повече трафик) битката да се води между крайните хипари-естестволюбители и великите, безгрешни медицински експерти. И кой печели от това? Със сигурност не децата. Най-облагодетелствани си остават фармацевтичните фирми, които произвеждат ваксините, защото няма успешен бизнес (а фармацевтичният е най-успешният в света) който да не приоритезира печалбите си.

    - -

    Защо смятам, че ваксините не трябва да са задължителни? Защото 24 часа след като се роди моето дете, в болницата по закон трябва да му поставят ваксина срещу хепатит Б, при ре-ваксинацията на която аз получих сериозна алергична реакция. Без тестове, без церемонии - по закон. И ако откажа ще ме санкционират. А ако не откажа и има негативни последствия за здравето на новороденото ми бебе - те са си за мен и моето семейство.

    - -

    Темата защо току-що родено бебе се ваксинира срещу заболяване предавано само по полов и кръвен път не желая да засягам. Защо се поставя комбинирана ваксина, която включва тетанус, който осигурява имунитет за максимум шест месеца след ваксинацията също.

    - -

    Благодаря.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"}Напоследък масово се заговори за ваксините. И не само в България, а в световен мащаб. -Открояват се два лагера: този на антиваксърите (хората, които отричат ваксините) и другият, на хората които са про-ваксините. -Темата е много дълбока и гледните точки, според мен, не са само две. -Отвсякъде се четат мнения на лекари и специалисти, които вместо да се позовават на научни факти, буквално плюят върху "необразованите и некомпетентни родители, които не ваксинират децата си". -Въпросните родители често са с много задълбочени познания по темата, особено тези които са свидетели на страничните реакции от ваксинирането. - -Защото странични реакции има! Абсурдно е да се твърди, че даден медикамент е безвреден за 100% от хората. Абсурдно е да се твърди, че всички ваксини са задължителни за 100% от децата ни. - -Според мен най-големият проблем е задължителният характер на ваксините. В [Българиският имунизационен календар](http://www.riokoz-vt.com/imkalendar.htm) те са девет и има санкции при отказ за поставянето им. В повечето европейски страни задължителните ваксини са по-малко от пет, а в страни като Великобритания, Германия, Дания, Финландия няма такива.([виж табл.](http://www.eurosurveillance.org/images/dynamic/EE/V17N22/DAncona_tab1.jpg)) Ваксините не трябва да са задължителни, а препоръчатителни. И лекарите трябва да имат компетенциите да обяснят ползите и рисковете и да мотивират родителя да ваксинира детето при нужда. Защото нерядко след ваксинацията напътствията са: "Довечера не къпеш и даваш Панадол". И толкова. - -Разгорелите спорове в Интернет пространството са изключително неефективни и само вдигат пушилка. А реално и в двата лагера има достатъчно компетентни хора, които да вземат разумно решение. Но е много по-интересно (и генерира повече трафик) битката да се води между крайните хипари-естестволюбители и великите, безгрешни медицински експерти. И кой печели от това? Със сигурност не децата. Най-облагодетелствани си остават фармацевтичните фирми, които произвеждат ваксините, защото няма успешен бизнес (а фармацевтичният е най-успешният в света) който да не приоритезира печалбите си. - -Защо смятам, че ваксините не трябва да са задължителни? Защото 24 часа след като се роди моето дете, в болницата по закон трябва да му поставят ваксина срещу хепатит Б, при ре-ваксинацията на която аз получих сериозна алергична реакция. Без тестове, без церемонии - по закон. И ако откажа ще ме санкционират. А ако не откажа и има негативни последствия за здравето на новороденото ми бебе - те са си за мен и моето семейство. - -Темата защо току-що родено бебе се ваксинира срещу заболяване предавано само по полов и кръвен път не желая да засягам. Защо се поставя комбинирана ваксина, която включва тетанус, който осигурява имунитет за максимум шест месеца след ваксинацията също. - -Благодаря. - - - -;T; -I"

    Напоследък масово се заговори за ваксините. И не само в България, а в световен мащаб. -Открояват се два лагера: този на антиваксърите (хората, които отричат ваксините) и другият, на хората които са про-ваксините. -Темата е много дълбока и гледните точки, според мен, не са само две. -Отвсякъде се четат мнения на лекари и специалисти, които вместо да се позовават на научни факти, буквално плюят върху “необразованите и некомпетентни родители, които не ваксинират децата си”. -Въпросните родители често са с много задълбочени познания по темата, особено тези които са свидетели на страничните реакции от ваксинирането.

    - -

    Защото странични реакции има! Абсурдно е да се твърди, че даден медикамент е безвреден за 100% от хората. Абсурдно е да се твърди, че всички ваксини са задължителни за 100% от децата ни.

    - -

    Според мен най-големият проблем е задължителният характер на ваксините. В Българиският имунизационен календар те са девет и има санкции при отказ за поставянето им. В повечето европейски страни задължителните ваксини са по-малко от пет, а в страни като Великобритания, Германия, Дания, Финландия няма такива.(виж табл.) Ваксините не трябва да са задължителни, а препоръчатителни. И лекарите трябва да имат компетенциите да обяснят ползите и рисковете и да мотивират родителя да ваксинира детето при нужда. Защото нерядко след ваксинацията напътствията са: “Довечера не къпеш и даваш Панадол”. И толкова.

    - -

    Разгорелите спорове в Интернет пространството са изключително неефективни и само вдигат пушилка. А реално и в двата лагера има достатъчно компетентни хора, които да вземат разумно решение. Но е много по-интересно (и генерира повече трафик) битката да се води между крайните хипари-естестволюбители и великите, безгрешни медицински експерти. И кой печели от това? Със сигурност не децата. Най-облагодетелствани си остават фармацевтичните фирми, които произвеждат ваксините, защото няма успешен бизнес (а фармацевтичният е най-успешният в света) който да не приоритезира печалбите си.

    - -

    Защо смятам, че ваксините не трябва да са задължителни? Защото 24 часа след като се роди моето дете, в болницата по закон трябва да му поставят ваксина срещу хепатит Б, при ре-ваксинацията на която аз получих сериозна алергична реакция. Без тестове, без церемонии - по закон. И ако откажа ще ме санкционират. А ако не откажа и има негативни последствия за здравето на новороденото ми бебе - те са си за мен и моето семейство.

    - -

    Темата защо току-що родено бебе се ваксинира срещу заболяване предавано само по полов и кръвен път не желая да засягам. Защо се поставя комбинирана ваксина, която включва тетанус, който осигурява имунитет за максимум шест месеца след ваксинацията също.

    - -

    Благодаря.

    - -;T; @I"(/blog/2015-03-25-без-болка/;T{;{ ;I"S$ - - - - - - - Кариес без болка - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Кариес без болка -

    - -
    -
      -
    • - - March 25, 2015 -
    • -
    -
    - - -

    Безболезнено посещение при зъболекаря? Неосъществима мечта или илюзия? Всъщност съвсем скоро това ще бъде реалност!

    - -

    Професор Найджъл Питс от Кралския Лондондки колеж и екипът му създават нов метод за лечение на кариес.

    - -

    Кариесът е едно от най-разпространените заболявания в света. Годишно страдащите от него са 2.5 милиарда хора. Зъбният кариес се развива на няколко етапа - започва като микроскопичен дефект, където количеството на минералите в зъба намалява. Движението им отвътре-навън и обратно в зъба е естествен процес. Но когато има голяма загуба на Калций и Фосфор, емайлът става пропусклив и се развива т.нар. кариозна лезия, която по-късно може да се превърне в кариес. Зъболекарите обикновено лекуват кариеса като пробиват емайла и почистват кариозният дентин, а след това запълват дупката с амалгама или дентална смола(пломба).

    - -

    Методът на проф. Питс използва естественият процес на реминерализация като чрез електрически импулси връща калция и фосфора в зъба. По този начин не се използват машини, борери и игли, а процесът е напълно безболезнен.

    - -

    Тази нова и несъмнено най-щадяща здравето на пациента техника се очаква да се появи на пазара съвсем скоро - през 2017 година от компанията Reminova. До тогава посещавайте редовно вашият зъболекар за профилактични прегледи, за да не се налага да се подлагате на болезненото (все още) лечение на кариес.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I" Безболезнено посещение при зъболекаря? Неосъществима мечта или илюзия? Всъщност съвсем скоро това ще бъде реалност! - -Професор Найджъл Питс от Кралския Лондондки колеж и екипът му създават нов метод за лечение на кариес. - -Кариесът е едно от най-разпространените заболявания в света. Годишно страдащите от него са 2.5 милиарда хора. Зъбният кариес се развива на няколко етапа - започва като микроскопичен дефект, където количеството на минералите в зъба намалява. Движението им отвътре-навън и обратно в зъба е естествен процес. Но когато има голяма загуба на Калций и Фосфор, емайлът става пропусклив и се развива т.нар. кариозна лезия, която по-късно може да се превърне в кариес. Зъболекарите обикновено лекуват кариеса като пробиват емайла и почистват кариозният дентин, а след това запълват дупката с амалгама или дентална смола(пломба). - -Методът на проф. Питс използва естественият процес на реминерализация като чрез електрически импулси връща калция и фосфора в зъба. По този начин не се използват машини, борери и игли, а процесът е напълно безболезнен. - -Тази нова и несъмнено най-щадяща здравето на пациента техника се очаква да се появи на пазара съвсем скоро - през 2017 година от компанията Reminova. До тогава посещавайте редовно вашият зъболекар за профилактични прегледи, за да не се налага да се подлагате на болезненото (все още) лечение на кариес.;T; -I"

    Безболезнено посещение при зъболекаря? Неосъществима мечта или илюзия? Всъщност съвсем скоро това ще бъде реалност!

    - -

    Професор Найджъл Питс от Кралския Лондондки колеж и екипът му създават нов метод за лечение на кариес.

    - -

    Кариесът е едно от най-разпространените заболявания в света. Годишно страдащите от него са 2.5 милиарда хора. Зъбният кариес се развива на няколко етапа - започва като микроскопичен дефект, където количеството на минералите в зъба намалява. Движението им отвътре-навън и обратно в зъба е естествен процес. Но когато има голяма загуба на Калций и Фосфор, емайлът става пропусклив и се развива т.нар. кариозна лезия, която по-късно може да се превърне в кариес. Зъболекарите обикновено лекуват кариеса като пробиват емайла и почистват кариозният дентин, а след това запълват дупката с амалгама или дентална смола(пломба).

    - -

    Методът на проф. Питс използва естественият процес на реминерализация като чрез електрически импулси връща калция и фосфора в зъба. По този начин не се използват машини, борери и игли, а процесът е напълно безболезнен.

    - -

    Тази нова и несъмнено най-щадяща здравето на пациента техника се очаква да се появи на пазара съвсем скоро - през 2017 година от компанията Reminova. До тогава посещавайте редовно вашият зъболекар за профилактични прегледи, за да не се налага да се подлагате на болезненото (все още) лечение на кариес.

    -;T; @I"(/static/images/posts/Antiaging.jpg/;T{;{I"&/static/images/posts/Banana1.jpg/;T{;{I"&/static/images/posts/Banana2.jpg/;T{;{I"$/static/images/posts/Beets.jpg/;T{;{I"&/static/images/posts/Berries.jpg/;T{;{I"$/static/images/posts/Bread.jpg/;T{;{I"%/static/images/posts/carbo3.jpg/;T{;{I"%/static/images/posts/carbo4.jpg/;T{;{I"$/static/images/posts/Choco.jpg/;T{;{I"$/static/images/posts/Clock.jpg/;T{;{I"%/static/images/posts/Coffee.jpg/;T{;{I"#/static/images/posts/Cold.jpg/;T{;{I"'/static/images/posts/Cravings.jpg/;T{;{I"#/static/images/posts/Diet.jpg/;T{;{I""/static/images/posts/Dog.jpg/;T{;{I"#/static/images/posts/eggs.jpg/;T{;{I"#/static/images/posts/Fats.jpg/;T{;{I"(/static/images/posts/Fivesteps.jpg/;T{;{I"%/static/images/posts/Garlic.jpg/;T{;{I"$/static/images/posts/Gifts.jpg/;T{;{I"$/static/images/posts/Honey.jpg/;T{;{I"*/static/images/posts/Ingredients.jpg/;T{;{I"'/static/images/posts/Lunchbox.jpg/;T{;{I"&/static/images/posts/Newyear.jpg/;T{;{I"$/static/images/posts/Paste.jpg/;T{;{I""/static/images/posts/Pig.jpg/;T{;{I"#/static/images/posts/Preg.jpg/;T{;{I"&/static/images/posts/Pyramid.jpg/;T{;{I"'/static/images/posts/Raya-blw.jpg/;T{;{I"$/static/images/posts/Smell.jpg/;T{;{I"#/static/images/posts/Snow.jpg/;T{;{I"%/static/images/posts/Stress.jpg/;T{;{I"&/static/images/posts/Tooth10.jpg/;T{;{I"&/static/images/posts/Tooth11.jpg/;T{;{I"&/static/images/posts/Tooth12.jpg/;T{;{I"&/static/images/posts/Tooth13.jpg/;T{;{I"&/static/images/posts/Tooth14.jpg/;T{;{I"&/static/images/posts/Tooth15.jpg/;T{;{I"&/static/images/posts/Tooth16.jpg/;T{;{I"&/static/images/posts/Tooth17.jpg/;T{;{I"%/static/images/posts/Tooth5.jpg/;T{;{I"%/static/images/posts/Tooth6.jpg/;T{;{I"%/static/images/posts/Tooth7.jpg/;T{;{I"%/static/images/posts/Tooth8.jpg/;T{;{I"%/static/images/posts/Tooth9.jpg/;T{;{I"&/static/images/posts/Veggies.jpg/;T{;{I"#/static/images/posts/Zele.jpg/;T{;{I"Y/blog/2014-08-02-пет-стъпки-към-здравословно-хранене/;T{;{ ;I"; - - - - - - - Пет лесни стъпки към здравословното хранене - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Пет лесни стъпки към здравословното хранене -

    - -
    -
      -
    • - - August 2, 2014 -
    • -
    -
    - - -

    Искате да се храните правилно, но не знаете откъде да започнете? -Наистина всяко начало е трудно. Но и най-дългият път започва с една малка първа стъпка. Вижте няколко лесни начина да започнете да се храните по-здравословно, без това да утежнява ежедневието или бюджета ви.

    - -
      -
    1. -

      Започнете да се оглеждате за скрита захар. Както добре знаете, в съвременната хранителна индустрия захарта е изключително разпространена. Можете да я срещнете в съдържанието не само на сладки стоки и напитки, но и в продукти като хляб, млечни продукти, всякакви консервирани храни, сосове, кетчуп, колбаси, месни деликатеси, бекон, зърнени закуски, солети, чипс и др. Разбира се, не е добра идея да започнете да купувате подобни стоки със заместители на захарта като фруктоза, аспартам и захарин. Най-доброто, което можете да направите е да избягвате пакетираните стоки и да приготвяте десертите и закуските си сами. Така контролът върху количеството и качеството на влаганите продукти ще е много по-добър. Още по темата.

      -
    2. -
    3. -

      Започнете да се оглеждате за вредните мазнини. Вече повечето хора са на ясно с вредата от маргарина върху здравето им. Но също така много хора вярват, че олиото например е добра мазнина. А то е същата мазнина, но не е втвърдена. Избягвайте продукти съдържащи растителни мазнини, произведени от семена или зърнени култури. Те са продукт, който не носи нищо полезно на тялото ви. Вместо това започнете да добавяте към храната си и да готвите с полезни мазнини под формата на масло, зехтин, мас, кокосово масло, авокадо. Още по темата.

      -
    4. -
    5. -Започнете да пазарувате от пазара, а не от хипермаркетите. Големите вериги са удобни, защото пестят време на клиентите си, но реално ви карат да купувате неща от които нямате нужда. Ако започнете да пазарувате от малките магазинчета на пазара ще подпомогнете икономиката, ще имате по-добър контрол над това което купувате и ще успеете да се придържате по-лесно към списъка със здравословни храни, тъй като няма да ви изкушават “промоционални” стоки. Да пазарувате от кварталната месарница или хлебарница има голямо предимство, че можете да се уверите, че продуктите са пресни и с изяснен произход. Плод-зеленчукът също ще ви предложи най-свежите плодове и зеленчуци, а не такива залежали по складове със седмици. За да се справите с товави трябва малко организация на времето и няколко опита, докато намерите “вашият” магазин.

      -Пазаруване -
    6. -
    7. -

      Започнете да готвите. Още по-добре: започнете вие да приготвяте всичката си храна. Това е една стъпка по-далеч, но рано или късно всеки, който има желание за здравословен начин на живот за себе си и семейството си достига до тук. -На първо време ще ви е трудно не само с организацията на времето, защото това се постига с малко повече желание. От опит знам, че когато човек реши да остави всички вредни храни, изглежда сякаш не остава много-много за ядене. Омлета за закуска и пържолата със салата за обяд и вечеря, колкото и да са вкусни в един момент омръзват. Пък и разнообразното хранене е в основата на здравето. Тук на помощ идва Интернет с хилядите готварски блогове за здравословно хранене, от където можете да черпите идеи за лесни, екзотични или дори гурме рецепти. Ето например този или този.

      -
    8. -
    9. -Мотивирайте всички членове на семейството да допринесат за здравословното хранене. Информирайте половинката си, децата и родителите си за ползите от здравословното хранене и дайте нагледен пример със себе си. Не е добра идея да се впускате в ужасяващи истории за сърдечно-съдови заболявания и диабет, които засягат хора, които се хранят безразборно. По-добре създайте позитивна нагласа и намерете роля за всеки. Разпределете задълженията като съставяне на списък с покупки, пазаруване, определяне на седмичното меню и др. Между всички членове на семейството. Така ще се получи нещо като забавно занимание за всички, със големи ползи за здравето.
    10. -
    - -

    Това бяха моите стъпки в началото, когато започнах да обръщам внимание на храненето и да облагородявам начина си на живот. Дано прочетеното да ви е било полезно и да успеете да го приложите и във вашето ежедневие.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Искате да се храните правилно, но не знаете откъде да започнете? -Наистина всяко начало е трудно. Но и най-дългият път започва с една малка първа стъпка. Вижте няколко лесни начина да започнете да се храните по-здравословно, без това да утежнява ежедневието или бюджета ви. - -1. **Започнете да се оглеждате за скрита захар.** Както добре знаете, в съвременната хранителна индустрия захарта е изключително разпространена. Можете да я срещнете в съдържанието не само на сладки стоки и напитки, но и в продукти като хляб, млечни продукти, всякакви консервирани храни, сосове, кетчуп, колбаси, месни деликатеси, бекон, зърнени закуски, солети, чипс и др. Разбира се, не е добра идея да започнете да купувате подобни стоки със заместители на захарта като фруктоза, аспартам и захарин. Най-доброто, което можете да направите е да избягвате пакетираните стоки и да приготвяте десертите и закуските си сами. Така контролът върху количеството и качеството на влаганите продукти ще е много по-добър. [Още](/blog/2014-05-05-%D0%BD%D0%B0%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0-%D0%BB%D0%B8-%D0%B7%D0%B0%D1%85%D0%B0%D1%80%D1%82%D0%B0-%D0%B5-%D1%82%D0%BE%D0%BB%D0%BA%D0%BE%D0%B2%D0%B0-%D0%B2%D1%80%D0%B5%D0%B4%D0%BD%D0%B0/) по темата. - -2. **Започнете да се оглеждате за вредните мазнини.** Вече повечето хора са на ясно с вредата от маргарина върху здравето им. Но също така много хора вярват, че олиото например е добра мазнина. А то е същата мазнина, но не е втвърдена. Избягвайте продукти съдържащи растителни мазнини, произведени от семена или зърнени култури. Те са продукт, който не носи нищо полезно на тялото ви. Вместо това започнете да добавяте към храната си и да готвите с полезни мазнини под формата на масло, зехтин, мас, кокосово масло, авокадо. [Още](/blog/2014-04-08-%D0%B7%D0%B0%D1%89%D0%BE-%D0%BD%D0%B8%D0%BA%D0%BE%D0%B3%D0%B0-%D0%BD%D0%B5-%D1%82%D1%80%D1%8F%D0%B1%D0%B2%D0%B0-%D0%B4%D0%B0-%D1%8F%D0%B4%D0%B5%D1%82%D0%B5-%D0%BC%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D0%BD/) по темата. - -3. **Започнете да пазарувате от пазара**, а не от хипермаркетите. Големите вериги са удобни, защото пестят време на клиентите си, но реално ви карат да купувате неща от които нямате нужда. Ако започнете да пазарувате от малките магазинчета на пазара ще подпомогнете икономиката, ще имате по-добър контрол над това което купувате и ще успеете да се придържате по-лесно към списъка със здравословни храни, тъй като няма да ви изкушават "промоционални" стоки. Да пазарувате от кварталната месарница или хлебарница има голямо предимство, че можете да се уверите, че продуктите са пресни и с изяснен произход. Плод-зеленчукът също ще ви предложи най-свежите плодове и зеленчуци, а не такива залежали по складове със седмици. За да се справите с товави трябва малко организация на времето и няколко опита, докато намерите "вашият" магазин.

    -![Пазаруване](/images/posts/Fivesteps.jpg) -4. **Започнете да готвите**. Още по-добре: започнете вие да приготвяте всичката си храна. Това е една стъпка по-далеч, но рано или късно всеки, който има желание за здравословен начин на живот за себе си и семейството си достига до тук. -На първо време ще ви е трудно не само с организацията на времето, защото това се постига с малко повече желание. От опит знам, че когато човек реши да остави всички вредни храни, изглежда сякаш не остава много-много за ядене. Омлета за закуска и пържолата със салата за обяд и вечеря, колкото и да са вкусни в един момент омръзват. Пък и разнообразното хранене е в основата на здравето. Тук на помощ идва Интернет с хилядите готварски блогове за здравословно хранене, от където можете да черпите идеи за лесни, екзотични или дори гурме рецепти. Ето например [този](https://illusion123.wordpress.com/author/illusion123/) или [този](http://nomnompaleo.com/). - -5. **Мотивирайте всички членове на семейството** да допринесат за здравословното хранене. Информирайте половинката си, децата и родителите си за ползите от здравословното хранене и дайте нагледен пример със себе си. Не е добра идея да се впускате в ужасяващи истории за сърдечно-съдови заболявания и диабет, които засягат хора, които се хранят безразборно. По-добре създайте позитивна нагласа и намерете роля за всеки. Разпределете задълженията като съставяне на списък с покупки, пазаруване, определяне на седмичното меню и др. Между всички членове на семейството. Така ще се получи нещо като забавно занимание за всички, със големи ползи за здравето. - -Това бяха моите стъпки в началото, когато започнах да обръщам внимание на храненето и да облагородявам начина си на живот. Дано прочетеното да ви е било полезно и да успеете да го приложите и във вашето ежедневие.;T; -I"

    Искате да се храните правилно, но не знаете откъде да започнете? -Наистина всяко начало е трудно. Но и най-дългият път започва с една малка първа стъпка. Вижте няколко лесни начина да започнете да се храните по-здравословно, без това да утежнява ежедневието или бюджета ви.

    - -
      -
    1. -

      Започнете да се оглеждате за скрита захар. Както добре знаете, в съвременната хранителна индустрия захарта е изключително разпространена. Можете да я срещнете в съдържанието не само на сладки стоки и напитки, но и в продукти като хляб, млечни продукти, всякакви консервирани храни, сосове, кетчуп, колбаси, месни деликатеси, бекон, зърнени закуски, солети, чипс и др. Разбира се, не е добра идея да започнете да купувате подобни стоки със заместители на захарта като фруктоза, аспартам и захарин. Най-доброто, което можете да направите е да избягвате пакетираните стоки и да приготвяте десертите и закуските си сами. Така контролът върху количеството и качеството на влаганите продукти ще е много по-добър. Още по темата.

      -
    2. -
    3. -

      Започнете да се оглеждате за вредните мазнини. Вече повечето хора са на ясно с вредата от маргарина върху здравето им. Но също така много хора вярват, че олиото например е добра мазнина. А то е същата мазнина, но не е втвърдена. Избягвайте продукти съдържащи растителни мазнини, произведени от семена или зърнени култури. Те са продукт, който не носи нищо полезно на тялото ви. Вместо това започнете да добавяте към храната си и да готвите с полезни мазнини под формата на масло, зехтин, мас, кокосово масло, авокадо. Още по темата.

      -
    4. -
    5. -Започнете да пазарувате от пазара, а не от хипермаркетите. Големите вериги са удобни, защото пестят време на клиентите си, но реално ви карат да купувате неща от които нямате нужда. Ако започнете да пазарувате от малките магазинчета на пазара ще подпомогнете икономиката, ще имате по-добър контрол над това което купувате и ще успеете да се придържате по-лесно към списъка със здравословни храни, тъй като няма да ви изкушават “промоционални” стоки. Да пазарувате от кварталната месарница или хлебарница има голямо предимство, че можете да се уверите, че продуктите са пресни и с изяснен произход. Плод-зеленчукът също ще ви предложи най-свежите плодове и зеленчуци, а не такива залежали по складове със седмици. За да се справите с товави трябва малко организация на времето и няколко опита, докато намерите “вашият” магазин.

      -Пазаруване -
    6. -
    7. -

      Започнете да готвите. Още по-добре: започнете вие да приготвяте всичката си храна. Това е една стъпка по-далеч, но рано или късно всеки, който има желание за здравословен начин на живот за себе си и семейството си достига до тук. -На първо време ще ви е трудно не само с организацията на времето, защото това се постига с малко повече желание. От опит знам, че когато човек реши да остави всички вредни храни, изглежда сякаш не остава много-много за ядене. Омлета за закуска и пържолата със салата за обяд и вечеря, колкото и да са вкусни в един момент омръзват. Пък и разнообразното хранене е в основата на здравето. Тук на помощ идва Интернет с хилядите готварски блогове за здравословно хранене, от където можете да черпите идеи за лесни, екзотични или дори гурме рецепти. Ето например този или този.

      -
    8. -
    9. -Мотивирайте всички членове на семейството да допринесат за здравословното хранене. Информирайте половинката си, децата и родителите си за ползите от здравословното хранене и дайте нагледен пример със себе си. Не е добра идея да се впускате в ужасяващи истории за сърдечно-съдови заболявания и диабет, които засягат хора, които се хранят безразборно. По-добре създайте позитивна нагласа и намерете роля за всеки. Разпределете задълженията като съставяне на списък с покупки, пазаруване, определяне на седмичното меню и др. Между всички членове на семейството. Така ще се получи нещо като забавно занимание за всички, със големи ползи за здравето.
    10. -
    - -

    Това бяха моите стъпки в началото, когато започнах да обръщам внимание на храненето и да облагородявам начина си на живот. Дано прочетеното да ви е било полезно и да успеете да го приложите и във вашето ежедневие.

    -;T; @I")/blog/2014-08-10-зеленчуци/;T{;{ ;I"H - - - - - - - Зеленчуци, който не яде... - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Зеленчуци, който не яде... -

    - -
    -
      -
    • - - August 10, 2014 -
    • -
    -
    - - -

    Всеки знае колко е важно и полезно да се ядат плодове и зеленчуци. Но знаете ли защо? И как?

    - -

    Всъщност истината е, че плодовете не са чак толкова ценна храна за човешкото тяло. Истинските ползи от растителната храна идват от зеленчуците. Витамин С, който много хора смятат, че могат да си набавят от лимони и портокали всъщност е в най-голямо количество в… червените чушки.

    - -

    Ето още факти за полезният състав на зеленчуците:

    - -

    Каротеноиди (витамин А, ликопен и Бета-каротен): това са мощни антиоксиданти, важни за имунната система. Те се намират в оранжевите и червените зеленчуци, както и в зеленолистните.

    - -

    Витамини от групата В: важни витамини за клетъчният метаболизъм, имунната система и нервната система. Можете да си ги набавите от оранжевите и червени зеленчуци, зелените зеленчуци от рода на броколи, брюкселско зеле, карфиол, аспержи, зеленолистни и гъби. В авокадото също има витамини от групата В.

    - -

    Витамин С: мощен антиоксидант, необходим за правилното функциониране на целият организъм, имунната система, както и влиза в състава на някои ензими: например ензимът, който подпомага производството на колаген и затова липсата на витамин С може да причини скорбут. Витамин С се среща в зеленчуци като червени и зелени чушки, броколи, авокадо, карфиол, моркови, аспержи, спанак, тиква, лук, сладък картоф.

    - -

    Витамин К е важен за процесите на кръвосъсирването и метаболизма на калция в тялото. Той се открива в броколи, зеле, зеленолистните и др.

    - -

    Калций: освен като структурен елемент на костите и зъбите, Калцият е важен за много процеси в клетката; например провежда сигнали за мускулни контракции, включително и за сърдечният мускул. Зеленчуци, богати на Калций са тъмно-зелените зеленчуци, пащърнак, тиква.

    - -

    Храм: той е важен за метаболизма на въглехидратите и мазнините. Намира се в лук, чесън, зеле, моркови, гъби и зеленолистни зеленчуци.

    - -

    Мед: медта е важна за абсорбцията, метаболизма и съхранението на желязото в червените кръвни телца. Можете да си го набавите с тиква, пащърнак и зеленолистни.

    - -

    Желязо: ключовият компонент на хемоглобина - това е протеинът, който се свързва и пренася кислорода към всяка клетка в тялото ви. Тъмно-зелените зеленчуци са богати на желязо.

    - -

    Магнезий: жизненоважен за всяка клетка. Над 300 ензима се нуждаят от Магнезий, за да работят, включително всички ензими, които синтезират АТФ (горивото на клетките) и ензимите, които синтезират ДНК и РНК. Зеленчуци, богати на Магнезий са всички зелени зеленчуци, моркови, тиква, сладки картофи и особено тъмно-зелените зеленчуци като спанак и кейл.

    - -

    Манган: манганът е необходим за ензимите, които подпомагат възстановяването на увредените от свободните радикали клетки. Богати на Манган зеленчуци са сладките картофи, патладжан, цвекло, кръстоцветни(карфиол, броколи и др.) и тъмно-зелени зеленчуци.

    - -

    Калий: важен за нервната функция, сърдечната функция и мускулатурата. Среща се най-много в кръстоцветните зеленчуци, оранжеви зеленчуци, патладжан и тъмно-зелени от рода на спанака и руколата.

    - -

    Сяра: Сярата е широкоизползвана в биохимичните процеси, включително в състава на всички аминокиселини, много ензими и антиоксиданти. Кръстоцветните зеленчуци и зеленчуците от семейството на лука са най-добри източници на сяра.

    - -

    Цинк: важен за почти всяка функция в клетката: от метаболизъм на протеините до имунната система. Повечето зелени зеленчуци са добър източник на Цинк.

    -Зеленчуци

    - -

    Очевидно зеленчуците, заедно с плодовете, ядките и семената са богата на хранителни вещества, витамини и минерали храна. Но има още една много важна причина да консумираме зеленчуци на всяко хранене. Това е алкално-киселинният баланс на организма. За да не ви отегчавам с научна информация ще ви обясня на кратко какво представлява той и какво е отношението на зеленчуците към него.

    - -

    Като си помислите за киселина вероятно първо се сещате за неща като оцет, лимони и може би сярна киселина. А алкални вещества/основи са сода за хляб, белина и сапун. Е, в телата ни нещата са малко по-различни. Важното е не първоначалният вид и вкус на храната, а компонентите на които се разпада в стомаха и червата и от там веществата които попадат в кръвта.

    - -

    Човешкото тяло е една перфектно балансирана система и не позволява големи колебания що се отнася до алкално-киселинното равновесие. Нормално кръвта има pH 7.4 (алкална стойност). Т.е. тялото може да срещне два проблема: Ако в кръвта има повече киселинни съставки, то това значи, че има излишни водородни йони, които се освобождават чрез бъбреците. Ако има недостиг на алкални съставки, бъбреците използват Калций, извлечен от костите, за да се свържат с излишните водородни йони ида се изхвърлят навън. Това съответно може да доведе до проблеми с костната система, зъбите, бъбреците и т.н.

    - -

    Тогава следва да се запитаме: кои са алкални и кои киселинни храни и как ги комбинираме, за да не губим така ценният Калций? -Алкалните храни са всички зеленчуци и плодове (да, и лимоните). -Червеното и птичето месо, рибата са киселинни храни. -Зърнените култури са силно киселинни храни. -Млечните продукти и млякото са кисели храни. -Яйцата са слабо алкални, по-скоро неутрални. -Храните, които вероятно вече сте изключили (или сте на път да изключите) от менюто си като захар, брашно, пакетирани храни са силно кисели и затрудняващи тялото храни. -Равносметката е, че зеленчуците трябва да присъстват на всяко хранене в еквивалентни пропорции с киселинно-образуващите храни, за да помогнем на тялото си да балансира състава на кръвта. Колкото повече алкални храни ядете, толкова по-добре.

    - -

    И последно: сурови или сготвени зеленчуци? Мит е, че зеленчуците са полезни единствено и само в суров вид. Истината е, че те имат много съставки, които се усвояват само след термична обработка. Например каротеноидите в морковите и другите оранжеви и червени зеленчуци; ликопенът (мощен антиоксидант) в доматите; индолът (смята се, че е противораков фактор) в броколи, карфиол. Топлината разрушава твърдите стени на клетките на растенията и това освобождава нутриентите, които се намират в тях и ги прави лесно смилаеми. Други съставки като витамин С и полифенолите (важни антиоксиданти) можем да си набавим само от растения в суров вид или от естествено ферментирали зеленчуци. Алицинът-естественият антибиотик в чесъна също се губи при готвене. Моят съвет е: смесвайте готвени и сурови зеленчуци, както ви е вкусно и приятно, но винаги добавяйте по една порция от тях на всяко хранене.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"^-Всеки знае колко е важно и полезно да се ядат плодове и зеленчуци. Но знаете ли защо? И как? - -Всъщност истината е, че плодовете не са чак толкова ценна храна за човешкото тяло. Истинските ползи от растителната храна идват от зеленчуците. Витамин С, който много хора смятат, че могат да си набавят от лимони и портокали всъщност е в най-голямо количество в... червените чушки. - -Ето още факти за **полезният състав на зеленчуците**: - -Каротеноиди (витамин А, ликопен и Бета-каротен): това са мощни антиоксиданти, важни за имунната система. Те се намират в оранжевите и червените зеленчуци, както и в зеленолистните. - -Витамини от групата В: важни витамини за клетъчният метаболизъм, имунната система и нервната система. Можете да си ги набавите от оранжевите и червени зеленчуци, зелените зеленчуци от рода на броколи, брюкселско зеле, карфиол, аспержи, зеленолистни и гъби. В авокадото също има витамини от групата В. - -Витамин С: мощен антиоксидант, необходим за правилното функциониране на целият организъм, имунната система, както и влиза в състава на някои ензими: например ензимът, който подпомага производството на колаген и затова липсата на витамин С може да причини скорбут. Витамин С се среща в зеленчуци като червени и зелени чушки, броколи, авокадо, карфиол, моркови, аспержи, спанак, тиква, лук, сладък картоф. - -Витамин К е важен за процесите на кръвосъсирването и метаболизма на калция в тялото. Той се открива в броколи, зеле, зеленолистните и др. - -Калций: освен като структурен елемент на костите и зъбите, Калцият е важен за много процеси в клетката; например провежда сигнали за мускулни контракции, включително и за сърдечният мускул. Зеленчуци, богати на Калций са тъмно-зелените зеленчуци, пащърнак, тиква. - -Храм: той е важен за метаболизма на въглехидратите и мазнините. Намира се в лук, чесън, зеле, моркови, гъби и зеленолистни зеленчуци. - -Мед: медта е важна за абсорбцията, метаболизма и съхранението на желязото в червените кръвни телца. Можете да си го набавите с тиква, пащърнак и зеленолистни. - -Желязо: ключовият компонент на хемоглобина - това е протеинът, който се свързва и пренася кислорода към всяка клетка в тялото ви. Тъмно-зелените зеленчуци са богати на желязо. - -Магнезий: жизненоважен за всяка клетка. Над 300 ензима се нуждаят от Магнезий, за да работят, включително всички ензими, които синтезират АТФ (горивото на клетките) и ензимите, които синтезират ДНК и РНК. Зеленчуци, богати на Магнезий са всички зелени зеленчуци, моркови, тиква, сладки картофи и особено тъмно-зелените зеленчуци като спанак и кейл. - -Манган: манганът е необходим за ензимите, които подпомагат възстановяването на увредените от свободните радикали клетки. Богати на Манган зеленчуци са сладките картофи, патладжан, цвекло, кръстоцветни(карфиол, броколи и др.) и тъмно-зелени зеленчуци. - -Калий: важен за нервната функция, сърдечната функция и мускулатурата. Среща се най-много в кръстоцветните зеленчуци, оранжеви зеленчуци, патладжан и тъмно-зелени от рода на спанака и руколата. - -Сяра: Сярата е широкоизползвана в биохимичните процеси, включително в състава на всички аминокиселини, много ензими и антиоксиданти. Кръстоцветните зеленчуци и зеленчуците от семейството на лука са най-добри източници на сяра. - -Цинк: важен за почти всяка функция в клетката: от метаболизъм на протеините до имунната система. Повечето зелени зеленчуци са добър източник на Цинк.

    -![Зеленчуци](/images/posts/Veggies.jpg) - -Очевидно зеленчуците, заедно с плодовете, ядките и семената са богата на хранителни вещества, витамини и минерали храна. Но има още една много важна причина да консумираме зеленчуци на всяко хранене. Това е **алкално-киселинният баланс на организма**. За да не ви отегчавам с научна информация ще ви обясня на кратко какво представлява той и какво е отношението на зеленчуците към него. - -Като си помислите за киселина вероятно първо се сещате за неща като оцет, лимони и може би сярна киселина. А алкални вещества/основи са сода за хляб, белина и сапун. Е, в телата ни нещата са малко по-различни. Важното е не първоначалният вид и вкус на храната, а компонентите на които се разпада в стомаха и червата и от там веществата които попадат в кръвта. - -Човешкото тяло е една перфектно балансирана система и не позволява големи колебания що се отнася до алкално-киселинното равновесие. Нормално кръвта има pH 7.4 (алкална стойност). Т.е. тялото може да срещне два проблема: Ако в кръвта има повече киселинни съставки, то това значи, че има излишни водородни йони, които се освобождават чрез бъбреците. Ако има недостиг на алкални съставки, бъбреците използват Калций, извлечен от костите, за да се свържат с излишните водородни йони ида се изхвърлят навън. Това съответно може да доведе до проблеми с костната система, зъбите, бъбреците и т.н. - -Тогава следва да се запитаме: кои са алкални и кои киселинни храни и как ги комбинираме, за да не губим така ценният Калций? -Алкалните храни са всички зеленчуци и плодове (да, и лимоните). -Червеното и птичето месо, рибата са киселинни храни. -Зърнените култури са силно киселинни храни. -Млечните продукти и млякото са кисели храни. -Яйцата са слабо алкални, по-скоро неутрални. -Храните, които вероятно вече сте изключили (или сте на път да изключите) от менюто си като захар, брашно, пакетирани храни са силно кисели и затрудняващи тялото храни. -Равносметката е, че зеленчуците трябва да присъстват на всяко хранене в еквивалентни пропорции с киселинно-образуващите храни, за да помогнем на тялото си да балансира състава на кръвта. Колкото повече алкални храни ядете, толкова по-добре. - -И последно: **сурови или сготвени зеленчуци?** Мит е, че зеленчуците са полезни единствено и само в суров вид. Истината е, че те имат много съставки, които се усвояват само след термична обработка. Например каротеноидите в морковите и другите оранжеви и червени зеленчуци; ликопенът (мощен антиоксидант) в доматите; индолът (смята се, че е противораков фактор) в броколи, карфиол. Топлината разрушава твърдите стени на клетките на растенията и това освобождава нутриентите, които се намират в тях и ги прави лесно смилаеми. Други съставки като витамин С и полифенолите (важни антиоксиданти) можем да си набавим само от растения в суров вид или от естествено ферментирали зеленчуци. Алицинът-естественият антибиотик в чесъна също се губи при готвене. Моят съвет е: смесвайте готвени и сурови зеленчуци, както ви е вкусно и приятно, но винаги добавяйте по една порция от тях на всяко хранене.;T; -I"!.

    Всеки знае колко е важно и полезно да се ядат плодове и зеленчуци. Но знаете ли защо? И как?

    - -

    Всъщност истината е, че плодовете не са чак толкова ценна храна за човешкото тяло. Истинските ползи от растителната храна идват от зеленчуците. Витамин С, който много хора смятат, че могат да си набавят от лимони и портокали всъщност е в най-голямо количество в… червените чушки.

    - -

    Ето още факти за полезният състав на зеленчуците:

    - -

    Каротеноиди (витамин А, ликопен и Бета-каротен): това са мощни антиоксиданти, важни за имунната система. Те се намират в оранжевите и червените зеленчуци, както и в зеленолистните.

    - -

    Витамини от групата В: важни витамини за клетъчният метаболизъм, имунната система и нервната система. Можете да си ги набавите от оранжевите и червени зеленчуци, зелените зеленчуци от рода на броколи, брюкселско зеле, карфиол, аспержи, зеленолистни и гъби. В авокадото също има витамини от групата В.

    - -

    Витамин С: мощен антиоксидант, необходим за правилното функциониране на целият организъм, имунната система, както и влиза в състава на някои ензими: например ензимът, който подпомага производството на колаген и затова липсата на витамин С може да причини скорбут. Витамин С се среща в зеленчуци като червени и зелени чушки, броколи, авокадо, карфиол, моркови, аспержи, спанак, тиква, лук, сладък картоф.

    - -

    Витамин К е важен за процесите на кръвосъсирването и метаболизма на калция в тялото. Той се открива в броколи, зеле, зеленолистните и др.

    - -

    Калций: освен като структурен елемент на костите и зъбите, Калцият е важен за много процеси в клетката; например провежда сигнали за мускулни контракции, включително и за сърдечният мускул. Зеленчуци, богати на Калций са тъмно-зелените зеленчуци, пащърнак, тиква.

    - -

    Храм: той е важен за метаболизма на въглехидратите и мазнините. Намира се в лук, чесън, зеле, моркови, гъби и зеленолистни зеленчуци.

    - -

    Мед: медта е важна за абсорбцията, метаболизма и съхранението на желязото в червените кръвни телца. Можете да си го набавите с тиква, пащърнак и зеленолистни.

    - -

    Желязо: ключовият компонент на хемоглобина - това е протеинът, който се свързва и пренася кислорода към всяка клетка в тялото ви. Тъмно-зелените зеленчуци са богати на желязо.

    - -

    Магнезий: жизненоважен за всяка клетка. Над 300 ензима се нуждаят от Магнезий, за да работят, включително всички ензими, които синтезират АТФ (горивото на клетките) и ензимите, които синтезират ДНК и РНК. Зеленчуци, богати на Магнезий са всички зелени зеленчуци, моркови, тиква, сладки картофи и особено тъмно-зелените зеленчуци като спанак и кейл.

    - -

    Манган: манганът е необходим за ензимите, които подпомагат възстановяването на увредените от свободните радикали клетки. Богати на Манган зеленчуци са сладките картофи, патладжан, цвекло, кръстоцветни(карфиол, броколи и др.) и тъмно-зелени зеленчуци.

    - -

    Калий: важен за нервната функция, сърдечната функция и мускулатурата. Среща се най-много в кръстоцветните зеленчуци, оранжеви зеленчуци, патладжан и тъмно-зелени от рода на спанака и руколата.

    - -

    Сяра: Сярата е широкоизползвана в биохимичните процеси, включително в състава на всички аминокиселини, много ензими и антиоксиданти. Кръстоцветните зеленчуци и зеленчуците от семейството на лука са най-добри източници на сяра.

    - -

    Цинк: важен за почти всяка функция в клетката: от метаболизъм на протеините до имунната система. Повечето зелени зеленчуци са добър източник на Цинк.

    -Зеленчуци

    - -

    Очевидно зеленчуците, заедно с плодовете, ядките и семената са богата на хранителни вещества, витамини и минерали храна. Но има още една много важна причина да консумираме зеленчуци на всяко хранене. Това е алкално-киселинният баланс на организма. За да не ви отегчавам с научна информация ще ви обясня на кратко какво представлява той и какво е отношението на зеленчуците към него.

    - -

    Като си помислите за киселина вероятно първо се сещате за неща като оцет, лимони и може би сярна киселина. А алкални вещества/основи са сода за хляб, белина и сапун. Е, в телата ни нещата са малко по-различни. Важното е не първоначалният вид и вкус на храната, а компонентите на които се разпада в стомаха и червата и от там веществата които попадат в кръвта.

    - -

    Човешкото тяло е една перфектно балансирана система и не позволява големи колебания що се отнася до алкално-киселинното равновесие. Нормално кръвта има pH 7.4 (алкална стойност). Т.е. тялото може да срещне два проблема: Ако в кръвта има повече киселинни съставки, то това значи, че има излишни водородни йони, които се освобождават чрез бъбреците. Ако има недостиг на алкални съставки, бъбреците използват Калций, извлечен от костите, за да се свържат с излишните водородни йони ида се изхвърлят навън. Това съответно може да доведе до проблеми с костната система, зъбите, бъбреците и т.н.

    - -

    Тогава следва да се запитаме: кои са алкални и кои киселинни храни и как ги комбинираме, за да не губим така ценният Калций? -Алкалните храни са всички зеленчуци и плодове (да, и лимоните). -Червеното и птичето месо, рибата са киселинни храни. -Зърнените култури са силно киселинни храни. -Млечните продукти и млякото са кисели храни. -Яйцата са слабо алкални, по-скоро неутрални. -Храните, които вероятно вече сте изключили (или сте на път да изключите) от менюто си като захар, брашно, пакетирани храни са силно кисели и затрудняващи тялото храни. -Равносметката е, че зеленчуците трябва да присъстват на всяко хранене в еквивалентни пропорции с киселинно-образуващите храни, за да помогнем на тялото си да балансира състава на кръвта. Колкото повече алкални храни ядете, толкова по-добре.

    - -

    И последно: сурови или сготвени зеленчуци? Мит е, че зеленчуците са полезни единствено и само в суров вид. Истината е, че те имат много съставки, които се усвояват само след термична обработка. Например каротеноидите в морковите и другите оранжеви и червени зеленчуци; ликопенът (мощен антиоксидант) в доматите; индолът (смята се, че е противораков фактор) в броколи, карфиол. Топлината разрушава твърдите стени на клетките на растенията и това освобождава нутриентите, които се намират в тях и ги прави лесно смилаеми. Други съставки като витамин С и полифенолите (важни антиоксиданти) можем да си набавим само от растения в суров вид или от естествено ферментирали зеленчуци. Алицинът-естественият антибиотик в чесъна също се губи при готвене. Моят съвет е: смесвайте готвени и сурови зеленчуци, както ви е вкусно и приятно, но винаги добавяйте по една порция от тях на всяко хранене.

    -;T; @I",/blog/2014-08-17-вкусно-лято/;T{;{ ;I"' - - - - - - - Вкусно лято - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Вкусно лято -

    - -
    -
      -
    • - - August 17, 2014 -
    • -
    -
    - - -

    От всички плодове, които дават вкуса и аромата на лятото, най-ценните са дребните горски плодове: боровинки, къпини, малини, касис, ягоди, годжи бери и др.

    - -

    Ето в какво се изразява тяхната полза за здравето: За разлика от повечето плодове, горските плодчета не са богати на захар и дори помагат за регулирането на кръвната захар и инсулина. Богати са на антиоксиданти и минерали: силиций за здрави нокти и коса; витамини от групата В, желязо и магнезий. Всъщност всеки плод си има специфичен витаминен и минерален профил и това го прави полезен за определени здравословни състояния. -Например къпините са полезни за имунната система, боровинките подпомагат здравето на отделителната система и уро-гениталният тракт, годжи бери се свързват с дълголетие и общо здраве. Това означава, че трябва да ядем от всички видове, за да си набавим пълният спектър от полезности. А сега, през лятото дори можем да ги хапваме директно от храста, растящ близо до някоя планинска пътека. -Ползите от горските плодове не са по-малко, ако ги купуваме през другите сезони замразени. Половин чаша с дребни плодчета дневно, зарежда тялото ви с пълноценни витамини и минерали. Нещо като мултивитамини, но вкусни и ароматни, а не таблетка от шишенце на рафта в аптеката.

    - -

    Ето и една рецепта за вкусна закуска или напитка с горски плодове (за 2 порции):

    -Плодова напитка -“Лято в чаша”

    -1 чаша с дребни плодове: малини, къпини, боровинки и др.
    -1/2 чаша годжи бери, накиснати във вода
    -1 авокадо
    -1 чаша вода
    -щипка канела

    - -

    Всички продукти се смесват в блендер или купа за пастор и се пасират до гладкост. Ако искате да е по-течно може да добавите още вода. Ако ви харесва кремообразно, оставете го така. Не заменяйте водата с прясно мляко, тъй като не е добра комбинация с плодовете. Евентуално може да използвате кисело мляко или кефир. Използвайте охладени продукти и консумирайте веднага.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"l От всички плодове, които дават вкуса и аромата на лятото, най-ценните са дребните горски плодове: боровинки, къпини, малини, касис, ягоди, годжи бери и др. - -Ето в какво се изразява тяхната полза за здравето: За разлика от повечето плодове, горските плодчета не са богати на захар и дори помагат за регулирането на кръвната захар и инсулина. Богати са на антиоксиданти и минерали: силиций за здрави нокти и коса; витамини от групата В, желязо и магнезий. Всъщност всеки плод си има специфичен витаминен и минерален профил и това го прави полезен за определени здравословни състояния. -Например къпините са полезни за имунната система, боровинките подпомагат здравето на отделителната система и уро-гениталният тракт, годжи бери се свързват с дълголетие и общо здраве. Това означава, че трябва да ядем от всички видове, за да си набавим пълният спектър от полезности. А сега, през лятото дори можем да ги хапваме директно от храста, растящ близо до някоя планинска пътека. -Ползите от горските плодове не са по-малко, ако ги купуваме през другите сезони замразени. Половин чаша с дребни плодчета дневно, зарежда тялото ви с пълноценни витамини и минерали. Нещо като мултивитамини, но вкусни и ароматни, а не таблетка от шишенце на рафта в аптеката. - -Ето и една рецепта за вкусна закуска или напитка с горски плодове (за 2 порции):

    -![Плодова напитка](/images/posts/Berries.jpg) -"Лято в чаша"

    -1 чаша с дребни плодове: малини, къпини, боровинки и др.
    -1/2 чаша годжи бери, накиснати във вода
    -1 авокадо
    -1 чаша вода
    -щипка канела
    - -Всички продукти се смесват в блендер или купа за пастор и се пасират до гладкост. Ако искате да е по-течно може да добавите още вода. Ако ви харесва кремообразно, оставете го така. Не заменяйте водата с прясно мляко, тъй като не е добра комбинация с плодовете. Евентуално може да използвате кисело мляко или кефир. Използвайте охладени продукти и консумирайте веднага.;T; -I"

    От всички плодове, които дават вкуса и аромата на лятото, най-ценните са дребните горски плодове: боровинки, къпини, малини, касис, ягоди, годжи бери и др.

    - -

    Ето в какво се изразява тяхната полза за здравето: За разлика от повечето плодове, горските плодчета не са богати на захар и дори помагат за регулирането на кръвната захар и инсулина. Богати са на антиоксиданти и минерали: силиций за здрави нокти и коса; витамини от групата В, желязо и магнезий. Всъщност всеки плод си има специфичен витаминен и минерален профил и това го прави полезен за определени здравословни състояния. -Например къпините са полезни за имунната система, боровинките подпомагат здравето на отделителната система и уро-гениталният тракт, годжи бери се свързват с дълголетие и общо здраве. Това означава, че трябва да ядем от всички видове, за да си набавим пълният спектър от полезности. А сега, през лятото дори можем да ги хапваме директно от храста, растящ близо до някоя планинска пътека. -Ползите от горските плодове не са по-малко, ако ги купуваме през другите сезони замразени. Половин чаша с дребни плодчета дневно, зарежда тялото ви с пълноценни витамини и минерали. Нещо като мултивитамини, но вкусни и ароматни, а не таблетка от шишенце на рафта в аптеката.

    - -

    Ето и една рецепта за вкусна закуска или напитка с горски плодове (за 2 порции):

    -Плодова напитка -“Лято в чаша”

    -1 чаша с дребни плодове: малини, къпини, боровинки и др.
    -1/2 чаша годжи бери, накиснати във вода
    -1 авокадо
    -1 чаша вода
    -щипка канела

    - -

    Всички продукти се смесват в блендер или купа за пастор и се пасират до гладкост. Ако искате да е по-течно може да добавите още вода. Ако ви харесва кремообразно, оставете го така. Не заменяйте водата с прясно мляко, тъй като не е добра комбинация с плодовете. Евентуално може да използвате кисело мляко или кефир. Използвайте охладени продукти и консумирайте веднага.

    -;T; @I"8/blog/2014-08-24-пълнозърнест-хляб/;T{;{ ;I"0 - - - - - - - Истината за пълнозърнестият хляб - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Истината за пълнозърнестият хляб -

    - -
    -
      -
    • - - August 24, 2014 -
    • -
    -
    - - -

    Пълнозърнест или бял хляб/бисквити/спагети? Кое е по-здравословно и полезно за вас? Сигурна съм, че 99% от хората, загрижени за здравето си и внимаващи какво слагат в чинията си ще предпочетат пълнозърнестите продукти. А имат ли те реално полза за здравето ви?

    - -

    Защо е популярен митът, че пълнозърнестите пшенични тестени произведения са по-добрият избор?

    - -
      -
    1. -

      Защото имат повече фибри, които подпомагат перисталтиката. -Ще ви разочаровам, но не: фибрите не са полезни. Те всъщност са доста едри и дразнещи нежната лигавица на стомаха и червата, частици. Дори често стават причина за микроскопични рани и язви по повърхността на храносмилателната лигавица, които в последствие могат да се възпалят и да донесат по-сериозни проблеми като улцерозен колит или язва. -Всъщност истинските “помощници” на лесното храносмилане са мазнините, които постъпват с храната. Освен, че имат много други ползи за тялото, те “смазват” лигавицата на стомаха и червата, помагат за по-лесното транспортиране на храната и заздравяват наранените места. -А фибрите, които получаваме от плодовете и зеленчуците са много по-меки и фини и са напълно достатъчни, за да си набавим нужното количество от тях.

      -
    2. -
    3. -

      Пълнозърнестите произведения стоят в основата на хранителната пирамида. -Да, хранителната пирамида, която се изучава и е дала основа на съвременното хранене е съставена от агенцията по храните и съгласувана от правителствата на държави, които са водещи в производството на пшеница. Не, че казвам, че има заговор срещу човечеството, но със сигурност политиката и бизнеса нямат за основна цел да се грижат за здравето ви. По-скоро целта им е да продадат селскостопанските стоки, които са толкова разпространени в световен мащаб. Не без значение е корелацията между повишената консумация на пшеница и повишаването броя заболели от затлъстяване, диабет и сърдечно-съдови заболявания през последните 60-70 години. Естествено, ако нямаше пшеница и царевица едва ли биха могли да се изхранят 7 милиарда души, но това е съвсем друга тема. -Важното е да разберете, че пшеницата и зърнените култури не са непременно най-добрият избор за основа на храненето ви.

      -
    4. -
    5. -

      В пълнозърнестите продукти има витамини от групата В. Е да, факт! Има витамин В1, В2, желязо, цинк, мед. Но можете ли да си ги набавите от други източници? И още как! Направете си салата от зеленолистни, броколи, орехи, червени и зелени чушки, домати, авокадо, зехтин и морска сол и ще получите много по-засищащ и полезен източник на въпросните полезни вещества.
      -Хляб

      -
    6. -
    - -

    След всичко прочетено до тук сигурно си мислите, че ще ви посъветвам да зарежете тъмничкият, сух пълнозърнест хляб и да се отдадете на онзи, мекият и пухкав, снежно бял, подобен на дунапрен. -Сигурно ще ви разочаровам, но пък едва ли ще ви изненадам като ви кажа, че най-добрият избор, който може да направите е да изключите пшеницата от менюто си. Защо смятам така, ще можете да прочетете следващата седмица.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Пълнозърнест или бял хляб/бисквити/спагети? Кое е по-здравословно и полезно за вас? Сигурна съм, че 99% от хората, загрижени за здравето си и внимаващи какво слагат в чинията си ще предпочетат пълнозърнестите продукти. А имат ли те реално полза за здравето ви? - -Защо е популярен митът, че пълнозърнестите пшенични тестени произведения са по-добрият избор? - -1. Защото имат повече фибри, които подпомагат перисталтиката. -Ще ви разочаровам, но не: фибрите не са полезни. Те всъщност са доста едри и дразнещи нежната лигавица на стомаха и червата, частици. Дори често стават причина за микроскопични рани и язви по повърхността на храносмилателната лигавица, които в последствие могат да се възпалят и да донесат по-сериозни проблеми като улцерозен колит или язва. -Всъщност истинските "помощници" на лесното храносмилане са мазнините, които постъпват с храната. Освен, че имат много други ползи за тялото, те "смазват" лигавицата на стомаха и червата, помагат за по-лесното транспортиране на храната и заздравяват наранените места. -А фибрите, които получаваме от плодовете и зеленчуците са много по-меки и фини и са напълно достатъчни, за да си набавим нужното количество от тях. - -2. Пълнозърнестите произведения стоят в основата на хранителната пирамида. -Да, хранителната пирамида, която се изучава и е дала основа на съвременното хранене е съставена от агенцията по храните и съгласувана от правителствата на държави, които са водещи в производството на пшеница. Не, че казвам, че има заговор срещу човечеството, но със сигурност политиката и бизнеса нямат за основна цел да се грижат за здравето ви. По-скоро целта им е да продадат селскостопанските стоки, които са толкова разпространени в световен мащаб. Не без значение е корелацията между повишената консумация на пшеница и повишаването броя заболели от затлъстяване, диабет и сърдечно-съдови заболявания през последните 60-70 години. Естествено, ако нямаше пшеница и царевица едва ли биха могли да се изхранят 7 милиарда души, но това е съвсем друга тема. -Важното е да разберете, че пшеницата и зърнените култури не са непременно най-добрият избор за основа на храненето ви. - -3. В пълнозърнестите продукти има витамини от групата В. Е да, факт! Има витамин В1, В2, желязо, цинк, мед. Но можете ли да си ги набавите от други източници? И още как! Направете си салата от зеленолистни, броколи, орехи, червени и зелени чушки, домати, авокадо, зехтин и морска сол и ще получите много по-засищащ и полезен източник на въпросните полезни вещества.
    -![Хляб](/images/posts/Bread.jpg) - -След всичко прочетено до тук сигурно си мислите, че ще ви посъветвам да зарежете тъмничкият, сух пълнозърнест хляб и да се отдадете на онзи, мекият и пухкав, снежно бял, подобен на дунапрен. -Сигурно ще ви разочаровам, но пък едва ли ще ви изненадам като ви кажа, че **най-добрият избор, който може да направите е да изключите пшеницата от менюто си**. Защо смятам така, ще можете да прочетете [следващата седмица](/blog/2014-08-29-%D0%BF%D1%88%D0%B5%D0%BD%D0%B8%D1%86%D0%B0%D1%82%D0%B0/).;T; -I"

    Пълнозърнест или бял хляб/бисквити/спагети? Кое е по-здравословно и полезно за вас? Сигурна съм, че 99% от хората, загрижени за здравето си и внимаващи какво слагат в чинията си ще предпочетат пълнозърнестите продукти. А имат ли те реално полза за здравето ви?

    - -

    Защо е популярен митът, че пълнозърнестите пшенични тестени произведения са по-добрият избор?

    - -
      -
    1. -

      Защото имат повече фибри, които подпомагат перисталтиката. -Ще ви разочаровам, но не: фибрите не са полезни. Те всъщност са доста едри и дразнещи нежната лигавица на стомаха и червата, частици. Дори често стават причина за микроскопични рани и язви по повърхността на храносмилателната лигавица, които в последствие могат да се възпалят и да донесат по-сериозни проблеми като улцерозен колит или язва. -Всъщност истинските “помощници” на лесното храносмилане са мазнините, които постъпват с храната. Освен, че имат много други ползи за тялото, те “смазват” лигавицата на стомаха и червата, помагат за по-лесното транспортиране на храната и заздравяват наранените места. -А фибрите, които получаваме от плодовете и зеленчуците са много по-меки и фини и са напълно достатъчни, за да си набавим нужното количество от тях.

      -
    2. -
    3. -

      Пълнозърнестите произведения стоят в основата на хранителната пирамида. -Да, хранителната пирамида, която се изучава и е дала основа на съвременното хранене е съставена от агенцията по храните и съгласувана от правителствата на държави, които са водещи в производството на пшеница. Не, че казвам, че има заговор срещу човечеството, но със сигурност политиката и бизнеса нямат за основна цел да се грижат за здравето ви. По-скоро целта им е да продадат селскостопанските стоки, които са толкова разпространени в световен мащаб. Не без значение е корелацията между повишената консумация на пшеница и повишаването броя заболели от затлъстяване, диабет и сърдечно-съдови заболявания през последните 60-70 години. Естествено, ако нямаше пшеница и царевица едва ли биха могли да се изхранят 7 милиарда души, но това е съвсем друга тема. -Важното е да разберете, че пшеницата и зърнените култури не са непременно най-добрият избор за основа на храненето ви.

      -
    4. -
    5. -

      В пълнозърнестите продукти има витамини от групата В. Е да, факт! Има витамин В1, В2, желязо, цинк, мед. Но можете ли да си ги набавите от други източници? И още как! Направете си салата от зеленолистни, броколи, орехи, червени и зелени чушки, домати, авокадо, зехтин и морска сол и ще получите много по-засищащ и полезен източник на въпросните полезни вещества.
      -Хляб

      -
    6. -
    - -

    След всичко прочетено до тук сигурно си мислите, че ще ви посъветвам да зарежете тъмничкият, сух пълнозърнест хляб и да се отдадете на онзи, мекият и пухкав, снежно бял, подобен на дунапрен. -Сигурно ще ви разочаровам, но пък едва ли ще ви изненадам като ви кажа, че най-добрият избор, който може да направите е да изключите пшеницата от менюто си. Защо смятам така, ще можете да прочетете следващата седмица.

    -;T; @I")/blog/2014-08-29-пшеницата/;T{;{ ;I"> - - - - - - - Истината за пълнозърнестият хляб - 2 част - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Истината за пълнозърнестият хляб - 2 част -

    - -
    -
      -
    • - - August 29, 2014 -
    • -
    -
    - - -

    В статията от миналата седмица ви споменах, че пшеницата (било тя и пълнозърнеста) не е полезен продукт. Нещо повече: съвременната генно-модифицирана пшеница е храна, която дори може да ви разболее.

    - -
      -
    1. -

      Консумирането на пшенични продукти като хляб, макарони и др. повишава кръвната захар, почти колкото приема на чиста захар. Причината е, че пшеничното зърно е смляно на фино брашно, което се метаболизира бързо и предизвиква отделянето на голямо количество инсулин, което да нормализира кръвната захар. Този бърз спад води до усещане за глад и желание за още въглехидрати - хляб, пица, нещо сладко. Така се получава един омагьосан кръг, който може да доведе до болести като метаболитните синдром, диабет, затлъстяване, сърдечно-съдови заболявания и дори някои видове рак. -Пълнозърнестото пшенично брашно не се различава от бялото брашно по “захарност”, а дори в него има запазени антинутриенти, които се нуждаят от минерали като Калций, Цинк, Желязо и Магнезий, за да се метаболизират. Тези антинутриенти са фитиновата киселина и лектините. Те се намират в състава на зърното, за да го предпазват от унищожаване, както например розите имат бодли. Фитиновата киселина е инхибитор и пречи на покълването в неблагоприятни условия. Открива се и при всички ядки и сечена. Тя се премахва след накисване и измиване. В индустриално произведените брашна обаче, със сигурност има доста голямо количество от нея. Лектините са вид протеини, които пазят зърното и семената на растенията от това да бъдат разрушени и изядени. Следва логичният въпрос: а семената на ябълките, кивито и ягодите нямат ли тези защити? Нали целта на растенията е да бъдат изядени от животните или хората и чрез храносмилателната им система да се разпространят? Съвсем вярно. Някои растения искат да бъдат изядени, а други - не! Можете да направите разликата така: ако може да се изяде сурово веднага, значи няма вредни за вас антинутриенти. Ако трябва да се потрудите, за да стигнете до същността му (ядки) или да го сготвите (зърно) значи може да ви нанесе вреда.

      -
    2. -
    3. -

      Специално място ще отделя на още един антинутриент в пшеничното зърно - глутенът. Сигурно сте го срещали, защото напоследък доста се изговори/изписа по темата. Аз ще обобщя най-важното: Глутенът е протеин, който има ролята на лепило, сгъстител в кулинарията. Има го в много зърнени култури най-вече пшеница, ечемик, ръж. Използва се не само при печива като хляб и други тестени произведения, а също в колбаси, сосове, различни медикаменти и дори в козметични продукти. Тази леплива структура освен, че не дава нищо на организма; извлича ценни вещества от костите и един от най-често срещаните алергени в хранителните продукти. Алергичните реакции могат да се проявят остро (при заболяването глутенова ентеропатия/цьолиякия) или хронично с главоболие, тежест в стомаха, умора, обриви, болки в ставите и др. Защо за това се заговори чак сега? Защото съвременната ГМО пшеница има 35% глутен, за разлика от пшеницата! отглеждана преди 50 години, която има 5% глутен. Да, от нея са яли нашите баби и дядовци ежедневно и са били в добро здраве до дълбока старост.

      -
    4. -
    5. -

      Консумацията на пшеница се свързва с появата на редица болести на обмяната, сърдечно-съдовата система и мозъка. -Метаболитният синдром и диабета са пряко свързани с консумацията на въглехидрати, които предизвикват резки пикове и спадове на кръвната захар и инсулина. -След дългогодишни изследвания вече е доказано, че “лошият” холестерол също се дължи на високовъглехидратното хранене, а не на приема на животински наситени мазнини. Специално пшеницата, сравнена с други зърнени култури, в медицински експерименти е доказала ролята си в превръщането на добрия холестерол в лош, т.е. от големи и пухкави холестеролови частици, минаващи лесно с кръвотока се превръщат в малки и плътни, които се “залепват” по стените на артериите и образуват плаки. -Глутенът участва в патогенезата на някои заболявания на мозъка като малкомозъчна атаксия, шизофрения, аутизъм и епилепсия. -Високовъглехидратното хранене и консумацията на голямо количество пшенични продукти се свързва и с някои видове рак като рак на гърдата, рак на дебелото черво и рак на панкреаса.
      -Пирамида

      -
    6. -
    - -

    И за да завърша малко по-позитивно, ви предлагам да направите един експеримент: изключете за 30дни пшеницата и глутена от менюто си. Всички пици, сладкиши, хляб, солети, макарони, мекици, питки, кетчуп, горчица, кренвирши, шунка и колбаси със спорен произход, и дори любимата баничка с боза. Само за 30 дни… Какво може да загубите? -Ето какво: няколко килограма, главоболието, постоянният глад за сладко, необяснимият кожен обрив, болки и скованост в ставите, подутият и нередовен стомах. Или пък ако нищо не се промени ще знаете, че спокойно може да си похапвате пица.

    - -

    Ако темата ви е интересна и искате да се задълбочите още повече ви съветвам да прочетете книгата “Пшеницата - маскираният убиец” на Уилям Дейвис.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"#В [статията](/blog/2014-08-24-%D0%BF%D1%8A%D0%BB%D0%BD%D0%BE%D0%B7%D1%8A%D1%80%D0%BD%D0%B5%D1%81%D1%82-%D1%85%D0%BB%D1%8F%D0%B1/) от миналата седмица ви споменах, че пшеницата (било тя и пълнозърнеста) не е полезен продукт. Нещо повече: съвременната генно-модифицирана пшеница е храна, която дори може да ви разболее. - -1. Консумирането на пшенични продукти като хляб, макарони и др. повишава кръвната захар, почти колкото приема на чиста захар. Причината е, че пшеничното зърно е смляно на фино брашно, което се метаболизира бързо и предизвиква отделянето на голямо количество инсулин, което да нормализира кръвната захар. Този бърз спад води до усещане за глад и желание за още въглехидрати - хляб, пица, нещо сладко. Така се получава един омагьосан кръг, който може да доведе до болести като метаболитните синдром, диабет, затлъстяване, сърдечно-съдови заболявания и дори някои видове рак. -Пълнозърнестото пшенично брашно не се различава от бялото брашно по "захарност", а дори в него има запазени антинутриенти, които се нуждаят от минерали като Калций, Цинк, Желязо и Магнезий, за да се метаболизират. Тези антинутриенти са фитиновата киселина и лектините. Те се намират в състава на зърното, за да го предпазват от унищожаване, както например розите имат бодли. Фитиновата киселина е инхибитор и пречи на покълването в неблагоприятни условия. Открива се и при всички ядки и сечена. Тя се премахва след накисване и измиване. В индустриално произведените брашна обаче, със сигурност има доста голямо количество от нея. Лектините са вид протеини, които пазят зърното и семената на растенията от това да бъдат разрушени и изядени. Следва логичният въпрос: а семената на ябълките, кивито и ягодите нямат ли тези защити? Нали целта на растенията е да бъдат изядени от животните или хората и чрез храносмилателната им система да се разпространят? Съвсем вярно. Някои растения искат да бъдат изядени, а други - не! Можете да направите разликата така: ако може да се изяде сурово веднага, значи няма вредни за вас антинутриенти. Ако трябва да се потрудите, за да стигнете до същността му (ядки) или да го сготвите (зърно) значи може да ви нанесе вреда. - -2. Специално място ще отделя на още един антинутриент в пшеничното зърно - глутенът. Сигурно сте го срещали, защото напоследък доста се изговори/изписа по темата. Аз ще обобщя най-важното: Глутенът е протеин, който има ролята на лепило, сгъстител в кулинарията. Има го в много зърнени култури най-вече пшеница, ечемик, ръж. Използва се не само при печива като хляб и други тестени произведения, а също в колбаси, сосове, различни медикаменти и дори в козметични продукти. Тази леплива структура освен, че не дава нищо на организма; извлича ценни вещества от костите и един от най-често срещаните алергени в хранителните продукти. Алергичните реакции могат да се проявят остро (при заболяването глутенова ентеропатия/цьолиякия) или хронично с главоболие, тежест в стомаха, умора, обриви, болки в ставите и др. Защо за това се заговори чак сега? Защото съвременната ГМО пшеница има 35% глутен, за разлика от пшеницата! отглеждана преди 50 години, която има 5% глутен. Да, от нея са яли нашите баби и дядовци ежедневно и са били в добро здраве до дълбока старост. - -3. Консумацията на пшеница се свързва с появата на редица болести на обмяната, сърдечно-съдовата система и мозъка. -Метаболитният синдром и диабета са пряко свързани с консумацията на въглехидрати, които предизвикват резки пикове и спадове на кръвната захар и инсулина. -След дългогодишни изследвания вече е доказано, че "лошият" холестерол също се дължи на високовъглехидратното хранене, а не на приема на животински наситени мазнини. Специално пшеницата, сравнена с други зърнени култури, в медицински експерименти е доказала ролята си в превръщането на добрия холестерол в лош, т.е. от големи и пухкави холестеролови частици, минаващи лесно с кръвотока се превръщат в малки и плътни, които се "залепват" по стените на артериите и образуват плаки. -Глутенът участва в патогенезата на някои заболявания на мозъка като малкомозъчна атаксия, шизофрения, аутизъм и епилепсия. -Високовъглехидратното хранене и консумацията на голямо количество пшенични продукти се свързва и с някои видове рак като рак на гърдата, рак на дебелото черво и рак на панкреаса.
    -![Пирамида](/images/posts/Pyramid.jpg) - -И за да завърша малко по-позитивно, ви предлагам да направите един експеримент: изключете за 30дни пшеницата и глутена от менюто си. Всички пици, сладкиши, хляб, солети, макарони, мекици, питки, кетчуп, горчица, кренвирши, шунка и колбаси със спорен произход, и дори любимата баничка с боза. Само за 30 дни... Какво може да загубите? -Ето какво: няколко килограма, главоболието, постоянният глад за сладко, необяснимият кожен обрив, болки и скованост в ставите, подутият и нередовен стомах. Или пък ако нищо не се промени ще знаете, че спокойно може да си похапвате пица. - -Ако темата ви е интересна и искате да се задълбочите още повече ви съветвам да прочетете книгата "Пшеницата - маскираният убиец" на Уилям Дейвис.;T; -I"#

    В статията от миналата седмица ви споменах, че пшеницата (било тя и пълнозърнеста) не е полезен продукт. Нещо повече: съвременната генно-модифицирана пшеница е храна, която дори може да ви разболее.

    - -
      -
    1. -

      Консумирането на пшенични продукти като хляб, макарони и др. повишава кръвната захар, почти колкото приема на чиста захар. Причината е, че пшеничното зърно е смляно на фино брашно, което се метаболизира бързо и предизвиква отделянето на голямо количество инсулин, което да нормализира кръвната захар. Този бърз спад води до усещане за глад и желание за още въглехидрати - хляб, пица, нещо сладко. Така се получава един омагьосан кръг, който може да доведе до болести като метаболитните синдром, диабет, затлъстяване, сърдечно-съдови заболявания и дори някои видове рак. -Пълнозърнестото пшенично брашно не се различава от бялото брашно по “захарност”, а дори в него има запазени антинутриенти, които се нуждаят от минерали като Калций, Цинк, Желязо и Магнезий, за да се метаболизират. Тези антинутриенти са фитиновата киселина и лектините. Те се намират в състава на зърното, за да го предпазват от унищожаване, както например розите имат бодли. Фитиновата киселина е инхибитор и пречи на покълването в неблагоприятни условия. Открива се и при всички ядки и сечена. Тя се премахва след накисване и измиване. В индустриално произведените брашна обаче, със сигурност има доста голямо количество от нея. Лектините са вид протеини, които пазят зърното и семената на растенията от това да бъдат разрушени и изядени. Следва логичният въпрос: а семената на ябълките, кивито и ягодите нямат ли тези защити? Нали целта на растенията е да бъдат изядени от животните или хората и чрез храносмилателната им система да се разпространят? Съвсем вярно. Някои растения искат да бъдат изядени, а други - не! Можете да направите разликата така: ако може да се изяде сурово веднага, значи няма вредни за вас антинутриенти. Ако трябва да се потрудите, за да стигнете до същността му (ядки) или да го сготвите (зърно) значи може да ви нанесе вреда.

      -
    2. -
    3. -

      Специално място ще отделя на още един антинутриент в пшеничното зърно - глутенът. Сигурно сте го срещали, защото напоследък доста се изговори/изписа по темата. Аз ще обобщя най-важното: Глутенът е протеин, който има ролята на лепило, сгъстител в кулинарията. Има го в много зърнени култури най-вече пшеница, ечемик, ръж. Използва се не само при печива като хляб и други тестени произведения, а също в колбаси, сосове, различни медикаменти и дори в козметични продукти. Тази леплива структура освен, че не дава нищо на организма; извлича ценни вещества от костите и един от най-често срещаните алергени в хранителните продукти. Алергичните реакции могат да се проявят остро (при заболяването глутенова ентеропатия/цьолиякия) или хронично с главоболие, тежест в стомаха, умора, обриви, болки в ставите и др. Защо за това се заговори чак сега? Защото съвременната ГМО пшеница има 35% глутен, за разлика от пшеницата! отглеждана преди 50 години, която има 5% глутен. Да, от нея са яли нашите баби и дядовци ежедневно и са били в добро здраве до дълбока старост.

      -
    4. -
    5. -

      Консумацията на пшеница се свързва с появата на редица болести на обмяната, сърдечно-съдовата система и мозъка. -Метаболитният синдром и диабета са пряко свързани с консумацията на въглехидрати, които предизвикват резки пикове и спадове на кръвната захар и инсулина. -След дългогодишни изследвания вече е доказано, че “лошият” холестерол също се дължи на високовъглехидратното хранене, а не на приема на животински наситени мазнини. Специално пшеницата, сравнена с други зърнени култури, в медицински експерименти е доказала ролята си в превръщането на добрия холестерол в лош, т.е. от големи и пухкави холестеролови частици, минаващи лесно с кръвотока се превръщат в малки и плътни, които се “залепват” по стените на артериите и образуват плаки. -Глутенът участва в патогенезата на някои заболявания на мозъка като малкомозъчна атаксия, шизофрения, аутизъм и епилепсия. -Високовъглехидратното хранене и консумацията на голямо количество пшенични продукти се свързва и с някои видове рак като рак на гърдата, рак на дебелото черво и рак на панкреаса.
      -Пирамида

      -
    6. -
    - -

    И за да завърша малко по-позитивно, ви предлагам да направите един експеримент: изключете за 30дни пшеницата и глутена от менюто си. Всички пици, сладкиши, хляб, солети, макарони, мекици, питки, кетчуп, горчица, кренвирши, шунка и колбаси със спорен произход, и дори любимата баничка с боза. Само за 30 дни… Какво може да загубите? -Ето какво: няколко килограма, главоболието, постоянният глад за сладко, необяснимият кожен обрив, болки и скованост в ставите, подутият и нередовен стомах. Или пък ако нищо не се промени ще знаете, че спокойно може да си похапвате пица.

    - -

    Ако темата ви е интересна и искате да се задълбочите още повече ви съветвам да прочетете книгата “Пшеницата - маскираният убиец” на Уилям Дейвис.

    -;T; @I"!/blog/2014-09-14-чесън/;T{;{ ;I"- - - - - - - - Храната като лекарство: Чесън - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Храната като лекарство: Чесън -

    - -
    -
      -
    • - - September 14, 2014 -
    • -
    -
    - - -

    От древни времена чесънът е използван от хората като лекарство. Дори Хипократ, бащата на медицината го е използвал за лечение на много болести; а днес дори съвременната медицина потвърждава полезните му ефекти.

    - -

    Започва сезонът на грипът и настинските, затова е важно да знаем как да се предпазим от тях. На помощ естествено идват добрата храна, умерено движение и пълноценна почивка.

    - -

    Защо този не-толкова-деликатен зеленчук е толкова полезен? -Най-важната му съставка е Алицинът - вещество, богато на Сяра, от където идва и силният му, специфичен мирис. Той има доказано антимикробно, антивирусно и антимикотично действие. Тези характеристики го правят изключително ефикасно средство при различни инфекции в тялото: от простуда и грип, през зъбобол или болки в корема, та до унищожаване на гъбички по ноктите на краката. -В изследване е доказано, че ефективността на Алицинът е също толкова добра, колкото противогрипните лекарства от рода на Тамифлу, но без бонуса от възможни странични ефекти, алергични реакции и коктейла от придружаващи химични вещества в състава на медикамента.

    - -

    Освен това в няколко скилидки чесън има количество Витамин С, колкото в един и половина лимона, Манган, Витамин В6, Селен, известно количество Калций, Мед, Фосфор, Желязо и Витамин В1, както и полезни фибри.

    - -

    Науката е открила още редица ползи от приема на тази ценна билка (да, чесънът е билка!), които съвсем на кратко ще изброя-съдови заболявания, включително сърдечен удар и инфаркт
    -* подпомага нормализирането на холестерола и кръвното налягане
    -* предпазва от развитието на рак , включително най-тежките форми (рак на белите дробове, простата и мозъка)
    -* подсилва здравето на костната система и намалява риска от артрит
    -* помага за редукция на излишното телесно тегло
    -* смята се за една от силните анти-ейджинг храни (храни, които забавят стареенето)
    -Чесън

    - -

    Всички полезни вещества можете да си набавите от суров или ферментирал (за разликата между ферментация и консервиране ще ви разкажа скоро) чесън. Въпреки, че чесънът е изключително подходяща подправка за почти всякакви ястия, ценният Алицин се унищожава при нагряване. В случай, че вкусът и ароматът на чесънът са прекалено силни за вашият вкус, можете да си го набавите като хранителна добавка. В този случай ефективността му е също толкова добра. Ако често страдате от настинки и грип в есенно-зимният сезон, не пропускайте да засилите имунитета си с тази толкова лесна и вкусна терапия. А ако вече имате симптоми, включването на чесъна към ежедневното меню ще облекчи заболяването и ще скъси оздравителният период.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"От древни времена чесънът е използван от хората като лекарство. Дори Хипократ, бащата на медицината го е използвал за лечение на много болести; а днес дори съвременната медицина потвърждава полезните му ефекти. - -Започва сезонът на грипът и настинските, затова е важно да знаем как да се предпазим от тях. На помощ естествено идват добрата храна, умерено движение и пълноценна почивка. - -Защо този не-толкова-деликатен зеленчук е толкова полезен? -Най-важната му съставка е Алицинът - вещество, богато на Сяра, от където идва и силният му, специфичен мирис. Той има доказано антимикробно, антивирусно и антимикотично действие. Тези характеристики го правят изключително ефикасно средство при различни инфекции в тялото: от простуда и грип, през зъбобол или болки в корема, та до унищожаване на гъбички по ноктите на краката. -В [изследване](http://summaries.cochrane.org/CD006206/ARI_garlic-for-the-common-cold) е доказано, че ефективността на Алицинът е също толкова добра, колкото противогрипните лекарства от рода на Тамифлу, но без бонуса от възможни странични ефекти, алергични реакции и коктейла от придружаващи химични вещества в състава на медикамента. - -Освен това в няколко скилидки чесън има количество Витамин С, колкото в един и половина лимона, Манган, Витамин В6, Селен, известно количество Калций, Мед, Фосфор, Желязо и Витамин В1, както и полезни фибри. - -Науката е открила още редица ползи от приема на тази ценна билка (да, чесънът е билка!), които съвсем на кратко ще изброя-съдови заболявания, включително сърдечен удар и инфаркт
    -* подпомага нормализирането на холестерола и кръвното налягане
    -* предпазва от развитието на рак , включително най-тежките форми (рак на белите дробове, простата и мозъка)
    -* подсилва здравето на костната система и намалява риска от артрит
    -* помага за редукция на излишното телесно тегло
    -* смята се за една от силните анти-ейджинг храни (храни, които забавят стареенето)
    -![Чесън](/images/posts/Garlic.jpg) - -Всички полезни вещества можете да си набавите от суров или ферментирал (за разликата между ферментация и консервиране ще ви разкажа скоро) чесън. Въпреки, че чесънът е изключително подходяща подправка за почти всякакви ястия, ценният Алицин се унищожава при нагряване. В случай, че вкусът и ароматът на чесънът са прекалено силни за вашият вкус, можете да си го набавите като хранителна добавка. В този случай ефективността му е също толкова добра. Ако често страдате от настинки и грип в есенно-зимният сезон, не пропускайте да засилите имунитета си с тази толкова лесна и вкусна терапия. А ако вече имате симптоми, включването на чесъна към ежедневното меню ще облекчи заболяването и ще скъси оздравителният период.;T; -I"

    От древни времена чесънът е използван от хората като лекарство. Дори Хипократ, бащата на медицината го е използвал за лечение на много болести; а днес дори съвременната медицина потвърждава полезните му ефекти.

    - -

    Започва сезонът на грипът и настинските, затова е важно да знаем как да се предпазим от тях. На помощ естествено идват добрата храна, умерено движение и пълноценна почивка.

    - -

    Защо този не-толкова-деликатен зеленчук е толкова полезен? -Най-важната му съставка е Алицинът - вещество, богато на Сяра, от където идва и силният му, специфичен мирис. Той има доказано антимикробно, антивирусно и антимикотично действие. Тези характеристики го правят изключително ефикасно средство при различни инфекции в тялото: от простуда и грип, през зъбобол или болки в корема, та до унищожаване на гъбички по ноктите на краката. -В изследване е доказано, че ефективността на Алицинът е също толкова добра, колкото противогрипните лекарства от рода на Тамифлу, но без бонуса от възможни странични ефекти, алергични реакции и коктейла от придружаващи химични вещества в състава на медикамента.

    - -

    Освен това в няколко скилидки чесън има количество Витамин С, колкото в един и половина лимона, Манган, Витамин В6, Селен, известно количество Калций, Мед, Фосфор, Желязо и Витамин В1, както и полезни фибри.

    - -

    Науката е открила още редица ползи от приема на тази ценна билка (да, чесънът е билка!), които съвсем на кратко ще изброя-съдови заболявания, включително сърдечен удар и инфаркт
    -* подпомага нормализирането на холестерола и кръвното налягане
    -* предпазва от развитието на рак , включително най-тежките форми (рак на белите дробове, простата и мозъка)
    -* подсилва здравето на костната система и намалява риска от артрит
    -* помага за редукция на излишното телесно тегло
    -* смята се за една от силните анти-ейджинг храни (храни, които забавят стареенето)
    -Чесън

    - -

    Всички полезни вещества можете да си набавите от суров или ферментирал (за разликата между ферментация и консервиране ще ви разкажа скоро) чесън. Въпреки, че чесънът е изключително подходяща подправка за почти всякакви ястия, ценният Алицин се унищожава при нагряване. В случай, че вкусът и ароматът на чесънът са прекалено силни за вашият вкус, можете да си го набавите като хранителна добавка. В този случай ефективността му е също толкова добра. Ако често страдате от настинки и грип в есенно-зимният сезон, не пропускайте да засилите имунитета си с тази толкова лесна и вкусна терапия. А ако вече имате симптоми, включването на чесъна към ежедневното меню ще облекчи заболяването и ще скъси оздравителният период.

    -;T; @I"3/blog/2014-09-22-настинка-и-грип/;T{;{ ;I"> - - - - - - - Как бързо и лесно да се справим с настинката и грипа? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как бързо и лесно да се справим с настинката и грипа? -

    - -
    -
      -
    • - - September 22, 2014 -
    • -
    -
    - - -

    Навън застудява. Започваме да стоим все повече на закрито и в близост с други хора, като в същото време прекарваме все по-малко време на чист въздух и слънце. Това води до две неща: обменяме повече микроби с другите хора и количеството на витамин Д в тялото ни намалява. От тук следват много по-слабият имунитет и по-високата честота на зарази като настинка и грип.

    - -

    Първо е важно да уточним, че настинките и грипът не са бактериални инфекции и антибиотични лечение не може да помогне да се излекувате. Причинителите са вируси, които имат съвсем различна структура от бактериите и действат по различен начин. Да, има случаи на вторична бактериална инфекция след прекарано вирусно заболяване като бронхит, пневмония и др., но това са случаи, в които се нуждаете от лекарска помощ и не касаят днешната тема.

    - -

    Следващото важно условие, за да станем жертва на вирусна инфекция е намалените защитни сили на организма. Както и преди съм писала, витамин Д е изключително важен за цялостното здраве. Освен всичко останало, той има високи антимикробни свойства като произвежда между 200 и 300 антимикробни пептиди, които унищожават патогенни бактерии, вируси и гъби в тялото. За витамин Д обаче знаем, че се произвежда в тялото под действието на слънчевите лъчи върху кожа, която не е покрита с дрехи или слънцезащитни продукти и за територията на България това се случва само в месеците от май до септември. Следователно, когато слънцето през есента и зимата е все по-далеч, все по-трудно си набавяме от този ценен елемент. За да не позволим тялото да губи защитните си сили е задължително през студените месеци да си набавяме витамин Д под формата на хранителна добавка.

    - -

    Други причини, които правят човека уязвим са прекалено много захар и преработени продукти в храната; консумация на много пшенични и зърнени храни, които имат голямо съдържание на антинутриенти; недостатъчно и непълноценен сън; ежедневен стрес; липса на здравословна доза движение и упражнения; комбинация от част или всички по-горе изброени причини.

    - -

    Какво да направим, когато сме болни?

    -1. Подобрете храненето си. Най-популярната храна за болни хора са сухари, препечен хляб и бисквити. Обаче това е и най-безмислената храна, когато организмът е с намалени сили. Защо? Високо виглехидратните храни дават само бърза енергия на тялото и никакви градивни елементи. Освен това глюкозата се конкурира в усвояването си с важни нутриенти като витамин С например. А точно в този период, човек се нуждае от много течности, витамини, минерали и лесно усвоими протеини. Така че най-добрата храна при настинка се оказва добрата стара пилешка супа. Тя ще възстанови водно-солевият баланс и ще помогне да се почувствате по-добре. Разбира се, ако нямате апетит не трябва да се храните на сила: слушайте тялото си и пийте много течности. Не посягайте веднага към лекарствата, а позволете на организма ви сам да се пребори със симптомите, като вие му помагате с добра хидратация и качествена храна.

    -2. Време за почивка. Обърнете внимание на качеството и количеството на съня си. Непълноценната почивка може да е причина за удължаване на периода на болестта. В същото време обаче не изоставяйте напълно движението - едночасова лека разходка на свеж въздух, в топлите часове на деня ще ви донесе много повече ползи от това просто да стоите три дни под завивките: ще подишате свеж въздух, ще съберете слънце и естествен витамин Д. Отново е важно да слушате тялото си и да му давате най-добрата грижа.

    -Настинка
    -3. Време е за добавки. За да подпомогнете самоизлекуването отвътре-навън, т.е. без лекарства, има няколко добавки, които е подходящо да вземате в период на болест. Освен приема на витамин Д, за който споменах по-горе, много подходящо е да включите натурален витамин С. Той се намира в зеленчуци като червени чушки, цвекло, плодове като касис, ацерола и др. С включването на чесън, ще скъсите оздравителният период. Много подходящ “оздравителен коктейл” е смес от настърган джинджифил, мед и лимон. Медът и прополисът също са незаменими помощници при простуда и грип. Естествено ферментиралите храни като кисело зеле и туршии имат голямо количество пробиотици и ще ви помогнат да възстановите нормалната стомашно-чревна флора след боледуване.

    -4. И нещо за зъбите: след прекарана вирусна инфекция задължително сменете четката си за зъби, дори да е била съвсем нова. Патогенните микроби се настаняват удобно в старата ви четка и може да попаднат в тялото ви отново и пак да ви заразят след известно време.

    - -

    Надявам се тази зима да се разминете с вирусите, но ако това не се случи следвайте тези съвети и съм сигурна, че ще се възстановите бързо и лесно. -Какви са вашите средства за профилактика през зимата? Напишете ми в коментар.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"t"Навън застудява. Започваме да стоим все повече на закрито и в близост с други хора, като в същото време прекарваме все по-малко време на чист въздух и слънце. Това води до две неща: обменяме повече микроби с другите хора и количеството на витамин Д в тялото ни намалява. От тук следват много по-слабият имунитет и по-високата честота на зарази като настинка и грип. - -Първо е важно да уточним, че настинките и грипът не са бактериални инфекции и антибиотични лечение не може да помогне да се излекувате. Причинителите са вируси, които имат съвсем различна структура от бактериите и действат по различен начин. Да, има случаи на вторична бактериална инфекция след прекарано вирусно заболяване като бронхит, пневмония и др., но това са случаи, в които се нуждаете от лекарска помощ и не касаят днешната тема. - -Следващото важно условие, за да станем жертва на вирусна инфекция е намалените защитни сили на организма. Както и преди съм [писала](), витамин Д е изключително важен за цялостното здраве. Освен всичко останало, той има високи антимикробни свойства като произвежда между 200 и 300 антимикробни пептиди, които унищожават патогенни бактерии, вируси и гъби в тялото. За витамин Д обаче знаем, че се произвежда в тялото под действието на слънчевите лъчи върху кожа, която не е покрита с дрехи или слънцезащитни продукти и за територията на България това се случва само в месеците от май до септември. Следователно, когато слънцето през есента и зимата е все по-далеч, все по-трудно си набавяме от този ценен елемент. За да не позволим тялото да губи защитните си сили е задължително през студените месеци да си набавяме витамин Д под формата на хранителна добавка. - -Други причини, които правят човека уязвим са прекалено много захар и преработени продукти в храната; консумация на много [пшенични и зърнени](/blog/2014-08-24-%D0%BF%D1%8A%D0%BB%D0%BD%D0%BE%D0%B7%D1%8A%D1%80%D0%BD%D0%B5%D1%81%D1%82-%D1%85%D0%BB%D1%8F%D0%B1/) храни, които имат голямо съдържание на антинутриенти; недостатъчно и непълноценен сън; ежедневен [стрес](/blog/2014-06-29-%D1%81%D1%82%D1%80%D0%B5%D1%81%D1%8A%D1%82/); липса на здравословна доза движение и упражнения; комбинация от част или всички по-горе изброени причини. - -Какво да направим, когато сме болни?

    -1. **Подобрете храненето си**. Най-популярната храна за болни хора са сухари, препечен хляб и бисквити. Обаче това е и най-безмислената храна, когато организмът е с намалени сили. Защо? Високо виглехидратните храни дават само бърза енергия на тялото и никакви градивни елементи. Освен това глюкозата се конкурира в усвояването си с важни нутриенти като витамин С например. А точно в този период, човек се нуждае от много течности, витамини, минерали и лесно усвоими протеини. Така че най-добрата храна при настинка се оказва добрата стара пилешка супа. Тя ще възстанови водно-солевият баланс и ще помогне да се почувствате по-добре. Разбира се, ако нямате апетит не трябва да се храните на сила: слушайте тялото си и пийте много течности. Не посягайте веднага към лекарствата, а позволете на организма ви сам да се пребори със симптомите, като вие му помагате с добра хидратация и качествена храна.

    -2. **Време за почивка**. Обърнете внимание на качеството и количеството на съня си. Непълноценната почивка може да е причина за удължаване на периода на болестта. В същото време обаче не изоставяйте напълно движението - едночасова лека разходка на свеж въздух, в топлите часове на деня ще ви донесе много повече ползи от това просто да стоите три дни под завивките: ще подишате свеж въздух, ще съберете слънце и естествен витамин Д. Отново е важно да слушате тялото си и да му давате най-добрата грижа.

    -![Настинка](/images/posts/Cold.jpg)
    -3. **Време е за добавки**. За да подпомогнете самоизлекуването отвътре-навън, т.е. без лекарства, има няколко добавки, които е подходящо да вземате в период на болест. Освен приема на витамин Д, за който споменах по-горе, много подходящо е да включите натурален витамин С. Той се намира в зеленчуци като червени чушки, цвекло, плодове като касис, ацерола и др. С включването на [чесън](/blog/2014-09-14-%D1%87%D0%B5%D1%81%D1%8A%D0%BD/), ще скъсите оздравителният период. Много подходящ "оздравителен коктейл" е смес от настърган джинджифил, мед и лимон. Медът и прополисът също са незаменими помощници при простуда и грип. Естествено ферментиралите храни като кисело зеле и туршии имат голямо количество пробиотици и ще ви помогнат да възстановите нормалната стомашно-чревна флора след боледуване.

    -4. **И нещо за зъбите**: след прекарана вирусна инфекция задължително сменете четката си за зъби, дори да е била съвсем нова. Патогенните микроби се настаняват удобно в старата ви четка и може да попаднат в тялото ви отново и пак да ви заразят след известно време. - -Надявам се тази зима да се разминете с вирусите, но ако това не се случи следвайте тези съвети и съм сигурна, че ще се възстановите бързо и лесно. -Какви са вашите средства за профилактика през зимата? Напишете ми в коментар.;T; -I""

    Навън застудява. Започваме да стоим все повече на закрито и в близост с други хора, като в същото време прекарваме все по-малко време на чист въздух и слънце. Това води до две неща: обменяме повече микроби с другите хора и количеството на витамин Д в тялото ни намалява. От тук следват много по-слабият имунитет и по-високата честота на зарази като настинка и грип.

    - -

    Първо е важно да уточним, че настинките и грипът не са бактериални инфекции и антибиотични лечение не може да помогне да се излекувате. Причинителите са вируси, които имат съвсем различна структура от бактериите и действат по различен начин. Да, има случаи на вторична бактериална инфекция след прекарано вирусно заболяване като бронхит, пневмония и др., но това са случаи, в които се нуждаете от лекарска помощ и не касаят днешната тема.

    - -

    Следващото важно условие, за да станем жертва на вирусна инфекция е намалените защитни сили на организма. Както и преди съм писала, витамин Д е изключително важен за цялостното здраве. Освен всичко останало, той има високи антимикробни свойства като произвежда между 200 и 300 антимикробни пептиди, които унищожават патогенни бактерии, вируси и гъби в тялото. За витамин Д обаче знаем, че се произвежда в тялото под действието на слънчевите лъчи върху кожа, която не е покрита с дрехи или слънцезащитни продукти и за територията на България това се случва само в месеците от май до септември. Следователно, когато слънцето през есента и зимата е все по-далеч, все по-трудно си набавяме от този ценен елемент. За да не позволим тялото да губи защитните си сили е задължително през студените месеци да си набавяме витамин Д под формата на хранителна добавка.

    - -

    Други причини, които правят човека уязвим са прекалено много захар и преработени продукти в храната; консумация на много пшенични и зърнени храни, които имат голямо съдържание на антинутриенти; недостатъчно и непълноценен сън; ежедневен стрес; липса на здравословна доза движение и упражнения; комбинация от част или всички по-горе изброени причини.

    - -

    Какво да направим, когато сме болни?

    -1. Подобрете храненето си. Най-популярната храна за болни хора са сухари, препечен хляб и бисквити. Обаче това е и най-безмислената храна, когато организмът е с намалени сили. Защо? Високо виглехидратните храни дават само бърза енергия на тялото и никакви градивни елементи. Освен това глюкозата се конкурира в усвояването си с важни нутриенти като витамин С например. А точно в този период, човек се нуждае от много течности, витамини, минерали и лесно усвоими протеини. Така че най-добрата храна при настинка се оказва добрата стара пилешка супа. Тя ще възстанови водно-солевият баланс и ще помогне да се почувствате по-добре. Разбира се, ако нямате апетит не трябва да се храните на сила: слушайте тялото си и пийте много течности. Не посягайте веднага към лекарствата, а позволете на организма ви сам да се пребори със симптомите, като вие му помагате с добра хидратация и качествена храна.

    -2. Време за почивка. Обърнете внимание на качеството и количеството на съня си. Непълноценната почивка може да е причина за удължаване на периода на болестта. В същото време обаче не изоставяйте напълно движението - едночасова лека разходка на свеж въздух, в топлите часове на деня ще ви донесе много повече ползи от това просто да стоите три дни под завивките: ще подишате свеж въздух, ще съберете слънце и естествен витамин Д. Отново е важно да слушате тялото си и да му давате най-добрата грижа.

    -Настинка
    -3. Време е за добавки. За да подпомогнете самоизлекуването отвътре-навън, т.е. без лекарства, има няколко добавки, които е подходящо да вземате в период на болест. Освен приема на витамин Д, за който споменах по-горе, много подходящо е да включите натурален витамин С. Той се намира в зеленчуци като червени чушки, цвекло, плодове като касис, ацерола и др. С включването на чесън, ще скъсите оздравителният период. Много подходящ “оздравителен коктейл” е смес от настърган джинджифил, мед и лимон. Медът и прополисът също са незаменими помощници при простуда и грип. Естествено ферментиралите храни като кисело зеле и туршии имат голямо количество пробиотици и ще ви помогнат да възстановите нормалната стомашно-чревна флора след боледуване.

    -4. И нещо за зъбите: след прекарана вирусна инфекция задължително сменете четката си за зъби, дори да е била съвсем нова. Патогенните микроби се настаняват удобно в старата ви четка и може да попаднат в тялото ви отново и пак да ви заразят след известно време.

    - -

    Надявам се тази зима да се разминете с вирусите, но ако това не се случи следвайте тези съвети и съм сигурна, че ще се възстановите бързо и лесно. -Какви са вашите средства за профилактика през зимата? Напишете ми в коментар.

    -;T; @I"+/blog/2014-09-30-отслабване/;T{;{ ;I"A - - - - - - - Време ли е за диета? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Време ли е за диета? -

    - -
    -
      -
    • - - September 30, 2014 -
    • -
    -
    - - -

    Лятото отмина и дойде времето за по-топлите дрешки, които прикриват няколкото излишни килца, мазнинките около талията и заоблените бедра. Докато не дойде другото лято и момента на истината. -Затова не отлагайте, а започнете да мислите за здравето и добрата си форма още сега.

    - -

    Нямам време да готвя/пазарувам/ям здравословно
    -Това е оправданието, което чувам най-често. И то е най-безмисленото. Ето защо: ако започнете да пазарувате само качествени и непреработени хранителни продукти, няма да губите време в лутане из супермаркета. Повечето диети се състоят основно от няколко хранителни продукта, така че това, което ви трябва се намира в покрайнините: месо и риба, яйца, мляко, масло, зеленчуци и плодове. Всички закуски, кексове, шоколади, кроасани и т.н. са в лабиринта от щандове в центъра на магазина. А влезете ли там се загубвате в морето от лъскави опаковки, пълни с вредни неща. След като се приберете вкъщи подготвяте/мариновате месото или рибата за 5 до 10 мин и го оставяте да се пече във фурната. Измивате и нарязване салатата и ето ви вечеря за 15 мин. Остава само да я сервирате и изядете.

    - -

    Нямам воля да спазвам хранителен режим
    -Волята подлежи на трениране и ако си създадете навик за нещо, вече няма да чувствате тежест. А за да създадете един навик са ви нужни 30 дни. Ако си наложите за 30 дни да не пиете газирани подсладени напитки, то на 31вият ден въобще няма да се сещате за колата и дори е вероятно да не ви изкуши изобщо, ако има бутилка от нея наблизо. -Не трябва да мислите как НЕ трябва да пиете кола или да ядете вафли. Най-добре е просто да спрете да купувате или да ходите на местата, където най-често ви се случва да я консумирате. Ако ви кажа “Не мислете за голям, кръгъл, оранжев портокал!” всичко за което ще можете да мислите е… портокал! Затова не мислете за ограничението, което имате, а насочете вниманието си към други приятни за вас неща. Когато вече не се сещате за вредната храна ще дойде етапа да тренирате волята си да не се изкушавате дори ако има такава наблизо. Аз винаги си казвам: “Какво ще даде това на тялото ми? Ще имам ли полза или вреда, ако изям това?” Отговорът е ясен и решението е лесно!

    - -

    Зимно време е трудно да се спазват диети
    -Дните стават по-къси, застояваме се повече вкъщи, има десетки празници свързани с големи, богати трапези с всякакви кулинарни изкушения, алкохол и десерти. Как да се спазва диета в такъв момент? “Тялото ми го иска!” Всъщност съвсем не е вярно. Истината е, че през зимните месеци хормоналните промени в телата ни водят до намален енергоразход и енергоприем, и естественото състояние на организма е през зимата да използва натрупаната през лятото енергия, т.е. през зимата отслабваме по-лесно. -Проблемът е, че съвременният човек е направил денонощието си независимо от сезоните и естествените циркадни ритми. Това провокира промяна и на хормонално ниво, което пък рефлектира върху апетита. Затова ако се храните с качествена, пълноценна, цяла храна ще се засищате по-бързо и ще давате по-добро гориво на тялото си. Така то няма да гладува и да ви изкушават калорийни бомби и неусетно да посягате към вредности като бисквити, чипс и шоколад.
    -Отслабване

    - -

    Ям малко, но напълнявам/не отслабвам
    -В човешкото тяло 2+2 не е равно на 4! Но все пак когато приемате повече енергия, отколкото тялото ви изразходва тя се складира някъде (не задължително като мазнини), но със сигурност не се губи. И обратното: ако приемате по-малко енергия отколкото изразходвате, тялото ви започва да гори от енергийните си запаси (не задължително мазнини). Т.е. ако ядете прекомерни количества от най-полезните храни ще напълнеете и ако ядете само по две вафли на ден ще отслабнете. Но къде е баланса? Как да не се чувствате вечно гладни и в същото време да отслабнете? Избирайте храната си в чинията правилно: винаги трябва да имате качествен източник на протеин (месо, яйца, риба), добавете източник на полезни мазнини (шепа маслини, масло, високомаслено сирене, авокадо, зехтин) и порция сурови или готвени зеленчуци. Ако след това изпитвате още глад може да добавите половин до една порция въглехидрати (картофи, ориз, ред шоколад - не по дължина! или една бира). Т.е. 80% от храната да е питателна и да дава енергия и градивни елементи на тялото ви, а останалите 20% са за да си доставите удоволствие. Ако сте на диета ще трябва да се задоволите само с 80те процента.

    - -

    Примирил/а съм се и се харесвам пълен/а
    -Стремежът на човек към самоусъвършенстване е естествен и постоянен. Не се примирявате с това да сте посредствен в работата си или в любимите си занимания и хобита, защо се примирявате с това да не сте в най-добрата си форма? Излишното тегло е не само естестически, но и здравословен проблем. Да изглеждате и да се чувствате добре са две неразривно свързани неща и не трябва да се отказвате от желанието си за тях. Примиренческото поведение няма да ви донесе нищо повече от неудовлетвореност и омраза към себе си. Съберете силите и волята си и се преборете за това, което искате. Не с магически прахчета, хапчета, чайчета, а по най-естествения и достъпен начин: като обърщате внимание на това, с което храните тялото си. Когато му давате качествена храна, то ще ви се отблагодари като постигате по-лесно желаните цели, не само по отношение на външният вид, но и в работата, личният живот, тренировките, социалните контакти.

    - -

    Надявам се днешната статия да ви е харесала. Вие как поддържате добрата си форма? Напишете ми в коментар?

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"p&Лятото отмина и дойде времето за по-топлите дрешки, които прикриват няколкото излишни килца, мазнинките около талията и заоблените бедра. Докато не дойде другото лято и момента на истината. -Затова не отлагайте, а започнете да мислите за здравето и добрата си форма още сега. - -**Нямам време да готвя/пазарувам/ям здравословно**
    -Това е оправданието, което чувам най-често. И то е най-безмисленото. Ето защо: ако започнете да пазарувате само качествени и непреработени хранителни продукти, няма да губите време в лутане из супермаркета. Повечето диети се състоят основно от няколко хранителни продукта, така че това, което ви трябва се намира в покрайнините: месо и риба, яйца, мляко, масло, зеленчуци и плодове. **Всички закуски, кексове, шоколади, кроасани и т.н. са в лабиринта от щандове в центъра на магазина.** А влезете ли там се загубвате в морето от лъскави опаковки, пълни с вредни неща. След като се приберете вкъщи подготвяте/мариновате месото или рибата за 5 до 10 мин и го оставяте да се пече във фурната. Измивате и нарязване салатата и ето ви вечеря за 15 мин. Остава само да я сервирате и изядете. - -**Нямам воля да спазвам хранителен режим**
    -Волята подлежи на трениране и ако си създадете навик за нещо, вече няма да чувствате тежест. А за да създадете един навик са ви нужни 30 дни. Ако си наложите за 30 дни да не пиете газирани подсладени напитки, то на 31вият ден въобще няма да се сещате за колата и дори е вероятно да не ви изкуши изобщо, ако има бутилка от нея наблизо. -Не трябва да мислите как НЕ трябва да пиете кола или да ядете вафли. Най-добре е просто да спрете да купувате или да ходите на местата, където най-често ви се случва да я консумирате. Ако ви кажа **"Не мислете за голям, кръгъл, оранжев портокал!"** всичко за което ще можете да мислите е... портокал! Затова не мислете за ограничението, което имате, а насочете вниманието си към други приятни за вас неща. Когато вече не се сещате за вредната храна ще дойде етапа да тренирате волята си да не се изкушавате дори ако има такава наблизо. Аз винаги си казвам: "Какво ще даде това на тялото ми? Ще имам ли полза или вреда, ако изям това?" Отговорът е ясен и решението е лесно! - -**Зимно време е трудно да се спазват диети**
    -Дните стават по-къси, застояваме се повече вкъщи, има десетки празници свързани с големи, богати трапези с всякакви кулинарни изкушения, алкохол и десерти. Как да се спазва диета в такъв момент? "Тялото ми го иска!" Всъщност съвсем не е вярно. Истината е, че през зимните месеци хормоналните промени в телата ни водят до намален енергоразход и енергоприем, и естественото състояние на организма е през зимата да използва натрупаната през лятото енергия, т.е. през зимата отслабваме по-лесно. -Проблемът е, че съвременният човек е направил денонощието си независимо от сезоните и естествените циркадни ритми. Това провокира промяна и на хормонално ниво, което пък рефлектира върху апетита. Затова ако се храните с качествена, пълноценна, цяла храна ще се засищате по-бързо и ще давате по-добро гориво на тялото си. Така то няма да гладува и да ви изкушават калорийни бомби и неусетно да посягате към вредности като бисквити, чипс и шоколад.
    -![Отслабване](/images/posts/Diet.jpg){:width="300px"}
    - -**Ям малко, но напълнявам/не отслабвам**
    -В човешкото тяло 2+2 не е равно на 4! Но все пак когато приемате повече енергия, отколкото тялото ви изразходва тя се складира някъде (не задължително като мазнини), но със сигурност не се губи. И обратното: ако приемате по-малко енергия отколкото изразходвате, тялото ви започва да гори от енергийните си запаси (не задължително мазнини). Т.е. ако ядете прекомерни количества от най-полезните храни ще напълнеете и ако ядете само по две вафли на ден ще отслабнете. Но къде е баланса? Как да не се чувствате вечно гладни и в същото време да отслабнете? Избирайте храната си в чинията правилно: винаги трябва да имате качествен източник на протеин (месо, яйца, риба), добавете източник на полезни мазнини (шепа маслини, масло, високомаслено сирене, авокадо, зехтин) и порция сурови или готвени зеленчуци. Ако след това изпитвате още глад може да добавите половин до една порция въглехидрати (картофи, ориз, ред шоколад - не по дължина! или една бира). Т.е. **80% от храната да е питателна и да дава енергия и градивни елементи на тялото ви, а останалите 20% са за да си доставите удоволствие**. Ако сте на диета ще трябва да се задоволите само с 80те процента. - - -**Примирил/а съм се и се харесвам пълен/а**
    -Стремежът на човек към самоусъвършенстване е естествен и постоянен. Не се примирявате с това да сте посредствен в работата си или в любимите си занимания и хобита, защо се примирявате с това да не сте в най-добрата си форма? Излишното тегло е не само естестически, но и здравословен проблем. **Да изглеждате и да се чувствате добре са две неразривно свързани неща и не трябва да се отказвате от желанието си за тях.** Примиренческото поведение няма да ви донесе нищо повече от неудовлетвореност и омраза към себе си. Съберете силите и волята си и се преборете за това, което искате. Не с магически прахчета, хапчета, чайчета, а по най-естествения и достъпен начин: като обърщате внимание на това, с което храните тялото си. Когато му давате качествена храна, то ще ви се отблагодари като постигате по-лесно желаните цели, не само по отношение на външният вид, но и в работата, личният живот, тренировките, социалните контакти.
    - -Надявам се днешната статия да ви е харесала. Вие как поддържате добрата си форма? Напишете ми в коментар?;T; -I"'

    Лятото отмина и дойде времето за по-топлите дрешки, които прикриват няколкото излишни килца, мазнинките около талията и заоблените бедра. Докато не дойде другото лято и момента на истината. -Затова не отлагайте, а започнете да мислите за здравето и добрата си форма още сега.

    - -

    Нямам време да готвя/пазарувам/ям здравословно
    -Това е оправданието, което чувам най-често. И то е най-безмисленото. Ето защо: ако започнете да пазарувате само качествени и непреработени хранителни продукти, няма да губите време в лутане из супермаркета. Повечето диети се състоят основно от няколко хранителни продукта, така че това, което ви трябва се намира в покрайнините: месо и риба, яйца, мляко, масло, зеленчуци и плодове. Всички закуски, кексове, шоколади, кроасани и т.н. са в лабиринта от щандове в центъра на магазина. А влезете ли там се загубвате в морето от лъскави опаковки, пълни с вредни неща. След като се приберете вкъщи подготвяте/мариновате месото или рибата за 5 до 10 мин и го оставяте да се пече във фурната. Измивате и нарязване салатата и ето ви вечеря за 15 мин. Остава само да я сервирате и изядете.

    - -

    Нямам воля да спазвам хранителен режим
    -Волята подлежи на трениране и ако си създадете навик за нещо, вече няма да чувствате тежест. А за да създадете един навик са ви нужни 30 дни. Ако си наложите за 30 дни да не пиете газирани подсладени напитки, то на 31вият ден въобще няма да се сещате за колата и дори е вероятно да не ви изкуши изобщо, ако има бутилка от нея наблизо. -Не трябва да мислите как НЕ трябва да пиете кола или да ядете вафли. Най-добре е просто да спрете да купувате или да ходите на местата, където най-често ви се случва да я консумирате. Ако ви кажа “Не мислете за голям, кръгъл, оранжев портокал!” всичко за което ще можете да мислите е… портокал! Затова не мислете за ограничението, което имате, а насочете вниманието си към други приятни за вас неща. Когато вече не се сещате за вредната храна ще дойде етапа да тренирате волята си да не се изкушавате дори ако има такава наблизо. Аз винаги си казвам: “Какво ще даде това на тялото ми? Ще имам ли полза или вреда, ако изям това?” Отговорът е ясен и решението е лесно!

    - -

    Зимно време е трудно да се спазват диети
    -Дните стават по-къси, застояваме се повече вкъщи, има десетки празници свързани с големи, богати трапези с всякакви кулинарни изкушения, алкохол и десерти. Как да се спазва диета в такъв момент? “Тялото ми го иска!” Всъщност съвсем не е вярно. Истината е, че през зимните месеци хормоналните промени в телата ни водят до намален енергоразход и енергоприем, и естественото състояние на организма е през зимата да използва натрупаната през лятото енергия, т.е. през зимата отслабваме по-лесно. -Проблемът е, че съвременният човек е направил денонощието си независимо от сезоните и естествените циркадни ритми. Това провокира промяна и на хормонално ниво, което пък рефлектира върху апетита. Затова ако се храните с качествена, пълноценна, цяла храна ще се засищате по-бързо и ще давате по-добро гориво на тялото си. Така то няма да гладува и да ви изкушават калорийни бомби и неусетно да посягате към вредности като бисквити, чипс и шоколад.
    -Отслабване

    - -

    Ям малко, но напълнявам/не отслабвам
    -В човешкото тяло 2+2 не е равно на 4! Но все пак когато приемате повече енергия, отколкото тялото ви изразходва тя се складира някъде (не задължително като мазнини), но със сигурност не се губи. И обратното: ако приемате по-малко енергия отколкото изразходвате, тялото ви започва да гори от енергийните си запаси (не задължително мазнини). Т.е. ако ядете прекомерни количества от най-полезните храни ще напълнеете и ако ядете само по две вафли на ден ще отслабнете. Но къде е баланса? Как да не се чувствате вечно гладни и в същото време да отслабнете? Избирайте храната си в чинията правилно: винаги трябва да имате качествен източник на протеин (месо, яйца, риба), добавете източник на полезни мазнини (шепа маслини, масло, високомаслено сирене, авокадо, зехтин) и порция сурови или готвени зеленчуци. Ако след това изпитвате още глад може да добавите половин до една порция въглехидрати (картофи, ориз, ред шоколад - не по дължина! или една бира). Т.е. 80% от храната да е питателна и да дава енергия и градивни елементи на тялото ви, а останалите 20% са за да си доставите удоволствие. Ако сте на диета ще трябва да се задоволите само с 80те процента.

    - -

    Примирил/а съм се и се харесвам пълен/а
    -Стремежът на човек към самоусъвършенстване е естествен и постоянен. Не се примирявате с това да сте посредствен в работата си или в любимите си занимания и хобита, защо се примирявате с това да не сте в най-добрата си форма? Излишното тегло е не само естестически, но и здравословен проблем. Да изглеждате и да се чувствате добре са две неразривно свързани неща и не трябва да се отказвате от желанието си за тях. Примиренческото поведение няма да ви донесе нищо повече от неудовлетвореност и омраза към себе си. Съберете силите и волята си и се преборете за това, което искате. Не с магически прахчета, хапчета, чайчета, а по най-естествения и достъпен начин: като обърщате внимание на това, с което храните тялото си. Когато му давате качествена храна, то ще ви се отблагодари като постигате по-лесно желаните цели, не само по отношение на външният вид, но и в работата, личният живот, тренировките, социалните контакти.

    - -

    Надявам се днешната статия да ви е харесала. Вие как поддържате добрата си форма? Напишете ми в коментар?

    -;T; @I"2/blog/2014-10-07-червено-цвекло/;T{;{ ;I", - - - - - - - Храната като лекарство: червено цвекло - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Храната като лекарство: червено цвекло -

    - -
    -
      -
    • - - October 7, 2014 -
    • -
    -
    - - -

    Есента предлага голямо разнообразие от храни, събрали всичко полезно от лятното слънце, почви и води. Една от ценните храни, които може би пропускате да включите в менюто си е червеното цвекло, при това заедно с дръжките и листата.

    - -

    Както всички червени плодове и зеленчуци, цвеклото има добро действие върху състава на кръвта. То е богато на витамин С, манган и желязо. Повишава по естествен път хемоглобина и регулира кръвното налягане. Именно поради тези свойства е много подходящо за преходните сезони, когато имунитета на хората намалява. Също така е чудесна храна за деца, бременни и кърмещи жени.

    - -

    Цвеклото е източник на изключително ценното вещество бетаин. Той защитава клетъчните протеини и ензими от пагубното действие на стреса. Също така се бори с възпалението в клетките, подобрява работата на вътрешните органи и по този начин предпазва от множество хронични заболявания. Бетаинът се включва дори при лечението на някои видове рак, а наличието на фолати предпазва от дефекти в развиващият се в утробата плод при бременност.

    - -

    Голямата детоксикираща функция на червеното цвекло не идва само от неговите фибри. Пигментите, които са богати на различни минерали като мед, манган, калций, желязо, фосфор, цинк участват във Фаза-2 на пречистването на кръвта, т.е. когато токсините са разрушени до съставните си части, те се свързват с други частици от тялото и така се извеждат от организма. По този начин цвеклото действа пречистващо за кръвта и черният дроб.

    - -

    Не забравяйте да сложите и зелените части на растението в салатата. Всъщност първоначално са се използвали само те, а по време на Римската епоха, хората са открили сладкият, землист вкус на неговият корен. Стъблата и листата съдържат дори повече от гореизброените минерали, така че със сигурност ще имате полза от тях. А освен това са и много вкусни.
    -Цвекло

    - -

    Сурово или сготвено трябва да се яде червеното цвекло? Хората със здрави стомаси могат да го ядат сурово в салата, овкусено със зехтин, тъй като мазнината ще помогне за по-лесното усвояване на пресните съставки. За хората, които по-трудно понасят фибрести зеленчуци много полезен и вкусен вариант е печено червено цвекло, овкусено по предпочитан начин или небезизвестната традиционна руска супа Борш. Когато е сготвено, червното цвекло губи част от полезните си вещества, но все още остава една от най-силните есенни храни. Не пропускайте ползите от него!

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"3Есента предлага голямо разнообразие от храни, събрали всичко полезно от лятното слънце, почви и води. Една от ценните храни, които може би пропускате да включите в менюто си е червеното цвекло, при това заедно с дръжките и листата.
    - -Както всички червени плодове и зеленчуци, цвеклото има добро действие върху състава на кръвта. То е богато на витамин С, манган и желязо. Повишава по естествен път хемоглобина и регулира кръвното налягане. Именно поради тези свойства е много подходящо за преходните сезони, когато имунитета на хората намалява. Също така е чудесна храна за деца, бременни и кърмещи жени.
    - -Цвеклото е източник на изключително ценното вещество бетаин. Той защитава клетъчните протеини и ензими от пагубното действие на стреса. Също така се бори с възпалението в клетките, подобрява работата на вътрешните органи и по този начин предпазва от множество хронични заболявания. Бетаинът се включва дори при лечението на някои видове рак, а наличието на фолати предпазва от дефекти в развиващият се в утробата плод при бременност.
    - -Голямата детоксикираща функция на червеното цвекло не идва само от неговите фибри. Пигментите, които са богати на различни минерали като мед, манган, калций, желязо, фосфор, цинк участват във Фаза-2 на пречистването на кръвта, т.е. когато токсините са разрушени до съставните си части, те се свързват с други частици от тялото и така се извеждат от организма. По този начин цвеклото действа пречистващо за кръвта и черният дроб.
    - -Не забравяйте да сложите и зелените части на растението в салатата. Всъщност първоначално са се използвали само те, а по време на Римската епоха, хората са открили сладкият, землист вкус на неговият корен. Стъблата и листата съдържат дори повече от гореизброените минерали, така че със сигурност ще имате полза от тях. А освен това са и много вкусни.
    -![Цвекло](/images/posts/Beets.jpg)
    - -Сурово или сготвено трябва да се яде червеното цвекло? Хората със здрави стомаси могат да го ядат сурово в салата, овкусено със зехтин, тъй като мазнината ще помогне за по-лесното усвояване на пресните съставки. За хората, които по-трудно понасят фибрести зеленчуци много полезен и вкусен вариант е печено червено цвекло, овкусено по предпочитан начин или небезизвестната традиционна руска супа Борш. Когато е сготвено, червното цвекло губи част от полезните си вещества, но все още остава една от най-силните есенни храни. Не пропускайте ползите от него! - - - - - -;T; -I"[

    Есента предлага голямо разнообразие от храни, събрали всичко полезно от лятното слънце, почви и води. Една от ценните храни, които може би пропускате да включите в менюто си е червеното цвекло, при това заедно с дръжките и листата.

    - -

    Както всички червени плодове и зеленчуци, цвеклото има добро действие върху състава на кръвта. То е богато на витамин С, манган и желязо. Повишава по естествен път хемоглобина и регулира кръвното налягане. Именно поради тези свойства е много подходящо за преходните сезони, когато имунитета на хората намалява. Също така е чудесна храна за деца, бременни и кърмещи жени.

    - -

    Цвеклото е източник на изключително ценното вещество бетаин. Той защитава клетъчните протеини и ензими от пагубното действие на стреса. Също така се бори с възпалението в клетките, подобрява работата на вътрешните органи и по този начин предпазва от множество хронични заболявания. Бетаинът се включва дори при лечението на някои видове рак, а наличието на фолати предпазва от дефекти в развиващият се в утробата плод при бременност.

    - -

    Голямата детоксикираща функция на червеното цвекло не идва само от неговите фибри. Пигментите, които са богати на различни минерали като мед, манган, калций, желязо, фосфор, цинк участват във Фаза-2 на пречистването на кръвта, т.е. когато токсините са разрушени до съставните си части, те се свързват с други частици от тялото и така се извеждат от организма. По този начин цвеклото действа пречистващо за кръвта и черният дроб.

    - -

    Не забравяйте да сложите и зелените части на растението в салатата. Всъщност първоначално са се използвали само те, а по време на Римската епоха, хората са открили сладкият, землист вкус на неговият корен. Стъблата и листата съдържат дори повече от гореизброените минерали, така че със сигурност ще имате полза от тях. А освен това са и много вкусни.
    -Цвекло

    - -

    Сурово или сготвено трябва да се яде червеното цвекло? Хората със здрави стомаси могат да го ядат сурово в салата, овкусено със зехтин, тъй като мазнината ще помогне за по-лесното усвояване на пресните съставки. За хората, които по-трудно понасят фибрести зеленчуци много полезен и вкусен вариант е печено червено цвекло, овкусено по предпочитан начин или небезизвестната традиционна руска супа Борш. Когато е сготвено, червното цвекло губи част от полезните си вещества, но все още остава една от най-силните есенни храни. Не пропускайте ползите от него!

    - -;T; @I":/blog/2014-10-14-ферментирали-храни/;T{;{ ;I"/ - - - - - - - Ферментиралите храни: кои са те и защо са полезни? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Ферментиралите храни: кои са те и защо са полезни? -

    - -
    -
      -
    • - - October 14, 2014 -
    • -
    -
    - - -

    За много хора, които се хранят с преработени храни, истинската храна има странен и твърде силен вкус. Така беше и за мен, преди да започна да обръщам внимание какво слагам в чинията (и тялото) си и да избирам цели, истински храни. Тогава неща като кисело зеле, истинско кисело мляко или зряло сирене въобще не влизаха вкъщи.

    - -

    След известно време обаче започнах да изпитвам желание за тях и открих много информация за ползите им. Ферментиралите храни са минали процеса на млечно-кисела ферментация, при който бактериите са преработили захарта и въглехидратите в млечна киселина. Това води до консервиране на храната и я обогатява с полезни ензими, витамини, Омега-3 мастни киселини и много и различни пробиотици. Всичко това прави храната по-лесно смилаема, а пробиотиците от своя страна подобряват храносмилането и облагородяват микроорганизмите, които живеят в червата.

    - -

    Много народи по света имат типични за тях ферментирали храни. За българите от векове това е било киселото мляко, ферментирало под действието на уникалната и всеизвестна бактерия Лактобацилус Булгарикус. Зрелите сирена и кашкавали от сурово мляко, киселото зеле, ферментирали туршии и др. са присъствали редовно на трапезата. Днес, тези храни са изключени от менюто или са заменени с консервирани зеленчуци с оцет или млечни продукти, сгъстени със сухо мляко и нишесте.

    - -

    Какво е общото и различното при ферментацията и консервирането? Чрез тези процеси се цели удължаване срока на годност на продуктите за сравнително дълъг период (няколко месеца). НО при ферментацията това става чрез повишаване на броя на полезните бактерии в храната, което я прави алкална и полезна за човека. За разлика от консервирането, където се намалява общият брой на бактериите (полезни и вредни) като се заливат зеленчуците с врял оцет и след това се варят, а това води до подкиселяване на продукта и на кръвта след консумацията му. При ферментацията ензимите и пробиотиците се увеличават стократно, докато консервираният продукт реално няма здравословни ползи. Ферментиралите храни са много лесни и евтини за приготвяне, а консервираните изискват много суровини за направата им.
    -Зеле

    - -

    Ето колко лесно, бързо и евтино можете да си направите висококачествена, полезна и здравословна салата за зимата: -В голям буркан нареждате плътно една накълцана на ситно и добре осолена с морска сол зелка и доливате чиста вода до горе. Затваряте плътно и оставяте на сенчесто място на терасата или на кухненския плот за 7-10дни. Веднъж дневно или когато се сетите, разтръсквате буркана няколко пъти. Държите в хладилник и цяла зима имате достъп до отлично “лекарство” срещу настинки, грип и храносмилателни проблеми. Ако искате, вможе да добавите карфиол, моркови, чушка, целина и да си направите истинска туршия.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"За много хора, които се хранят с преработени храни, истинската храна има странен и твърде силен вкус. Така беше и за мен, преди да започна да обръщам внимание какво слагам в чинията (и тялото) си и да избирам цели, истински храни. Тогава неща като кисело зеле, истинско кисело мляко или зряло сирене въобще не влизаха вкъщи. - -След известно време обаче започнах да изпитвам желание за тях и открих много информация за ползите им. Ферментиралите храни са минали процеса на млечно-кисела ферментация, при който бактериите са преработили захарта и въглехидратите в млечна киселина. Това води до консервиране на храната и я обогатява с полезни ензими, витамини, Омега-3 мастни киселини и много и различни пробиотици. Всичко това прави храната по-лесно смилаема, а пробиотиците от своя страна подобряват храносмилането и облагородяват микроорганизмите, които живеят в червата. - -Много народи по света имат типични за тях ферментирали храни. За българите от векове това е било киселото мляко, ферментирало под действието на уникалната и всеизвестна бактерия Лактобацилус Булгарикус. Зрелите сирена и кашкавали от сурово мляко, киселото зеле, ферментирали туршии и др. са присъствали редовно на трапезата. Днес, тези храни са изключени от менюто или са заменени с консервирани зеленчуци с оцет или млечни продукти, сгъстени със сухо мляко и нишесте. - -Какво е общото и различното при ферментацията и консервирането? Чрез тези процеси се цели удължаване срока на годност на продуктите за сравнително дълъг период (няколко месеца). НО при ферментацията това става чрез повишаване на броя на полезните бактерии в храната, което я прави алкална и полезна за човека. За разлика от консервирането, където се намалява общият брой на бактериите (полезни и вредни) като се заливат зеленчуците с врял оцет и след това се варят, а това води до подкиселяване на продукта и на кръвта след консумацията му. При ферментацията ензимите и пробиотиците се увеличават стократно, докато консервираният продукт реално няма здравословни ползи. Ферментиралите храни са много лесни и евтини за приготвяне, а консервираните изискват много суровини за направата им.
    -![Зеле](/images/posts/Zele.jpg)
    - -Ето колко лесно, бързо и евтино можете да си направите висококачествена, полезна и здравословна салата за зимата: -В голям буркан нареждате плътно една накълцана на ситно и добре осолена с морска сол зелка и доливате чиста вода до горе. Затваряте плътно и оставяте на сенчесто място на терасата или на кухненския плот за 7-10дни. Веднъж дневно или когато се сетите, разтръсквате буркана няколко пъти. Държите в хладилник и цяла зима имате достъп до отлично "лекарство" срещу настинки, грип и храносмилателни проблеми. Ако искате, вможе да добавите карфиол, моркови, чушка, целина и да си направите истинска туршия. -;T; -I"

    За много хора, които се хранят с преработени храни, истинската храна има странен и твърде силен вкус. Така беше и за мен, преди да започна да обръщам внимание какво слагам в чинията (и тялото) си и да избирам цели, истински храни. Тогава неща като кисело зеле, истинско кисело мляко или зряло сирене въобще не влизаха вкъщи.

    - -

    След известно време обаче започнах да изпитвам желание за тях и открих много информация за ползите им. Ферментиралите храни са минали процеса на млечно-кисела ферментация, при който бактериите са преработили захарта и въглехидратите в млечна киселина. Това води до консервиране на храната и я обогатява с полезни ензими, витамини, Омега-3 мастни киселини и много и различни пробиотици. Всичко това прави храната по-лесно смилаема, а пробиотиците от своя страна подобряват храносмилането и облагородяват микроорганизмите, които живеят в червата.

    - -

    Много народи по света имат типични за тях ферментирали храни. За българите от векове това е било киселото мляко, ферментирало под действието на уникалната и всеизвестна бактерия Лактобацилус Булгарикус. Зрелите сирена и кашкавали от сурово мляко, киселото зеле, ферментирали туршии и др. са присъствали редовно на трапезата. Днес, тези храни са изключени от менюто или са заменени с консервирани зеленчуци с оцет или млечни продукти, сгъстени със сухо мляко и нишесте.

    - -

    Какво е общото и различното при ферментацията и консервирането? Чрез тези процеси се цели удължаване срока на годност на продуктите за сравнително дълъг период (няколко месеца). НО при ферментацията това става чрез повишаване на броя на полезните бактерии в храната, което я прави алкална и полезна за човека. За разлика от консервирането, където се намалява общият брой на бактериите (полезни и вредни) като се заливат зеленчуците с врял оцет и след това се варят, а това води до подкиселяване на продукта и на кръвта след консумацията му. При ферментацията ензимите и пробиотиците се увеличават стократно, докато консервираният продукт реално няма здравословни ползи. Ферментиралите храни са много лесни и евтини за приготвяне, а консервираните изискват много суровини за направата им.
    -Зеле

    - -

    Ето колко лесно, бързо и евтино можете да си направите висококачествена, полезна и здравословна салата за зимата: -В голям буркан нареждате плътно една накълцана на ситно и добре осолена с морска сол зелка и доливате чиста вода до горе. Затваряте плътно и оставяте на сенчесто място на терасата или на кухненския плот за 7-10дни. Веднъж дневно или когато се сетите, разтръсквате буркана няколко пъти. Държите в хладилник и цяла зима имате достъп до отлично “лекарство” срещу настинки, грип и храносмилателни проблеми. Ако искате, вможе да добавите карфиол, моркови, чушка, целина и да си направите истинска туршия.

    -;T; @I"G/blog/2014-10-19-за-какво-гладува-тялото-ви/;T{;{ ;I"&B - - - - - - - За какво гладува тялото ви наистина? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - За какво гладува тялото ви наистина? -

    - -
    -
      -
    • - - October 19, 2014 -
    • -
    -
    - - -

    Замисляли ли сте се, че храненето е много повече от това, което слагате в чинията си. Често то има връзка с емоциите ни, с успехите или спадовете в кариерата, семейството и приятелите. Храната би трябвало да е гориво за тялото ни, но често я превръщаме в утехата, любовта или приятелят от който се нуждаем.

    - -

    Силното желание за дадена храна има два аспекта: физически и емоционален. Емоционалното хранене е проблем с по-дълбоки корени, отколкото аз мога да се задълбоча, но понякога си мислим, че “тялото ни има нужда” от сладкиш или чипс, а проблемът е съвсем повърхностен и е свързан с физическата нужда на организма от конкретен нутриент.

    - -

    Ако изпитвате желание за “успокояваща храна”; такава, която сте свикнали да хапвате след лош ден или храна, която майка ви, баба ви или някой друг кулинар в дома е приготвял, когато сте били дете, то вероятно става въпрос за емоционално хранене. Вие може би асоциирате чувството за комфорт, семейна топлина и уют с определена храна, която е станала като “хапче за подобряване на настроението”. Това е знак, че трябва да се замислите за връзката си с храната и да потърсите причините на истинският проблем, вместо ежедневно да го натъпквате по-дълбоко в себе си, с купичка сладолед.

    - -

    Имате ли неустоимо желание за бързи захари, например шоколад, бисквити, сладолед или други сладкиши? За това има две обяснения. Първото е, че тялото ви изпитва захарен глад, ако системно прекалявате с бързите въглехидрати и сега кръвната ви захар е ниска, а тялото се нуждае от нова доза “наркотик”; защото рафинираната захар (глюкозо-фруктозен царевичен сироп или захар от захарно цвекло) имат наркотичен ефект върху мозъка: действат пристрастяващо и имате нужда от все повече и по-често приемане на сладки храни. Другото обяснение, че тялото ви е подложено на глад и лишения за известен период (глад, диета, голямо физическо натоварване, дълго време хранене с непълноценна храна) и търси да си набави глюкоза, за да продължи да функционира нормално. И в двата случая подходете така: изяжте един цял пресен плод, а след 30мин направете едно пълноценно хранене, включващо достатъчно протеини, полезни мазнини и зеленчуци. Това ще регулира кръвната захар и ще набави на тялото ви това, от което има нужда.
    -Глад

    - -

    Не можете да спрете да мислите за супер-солени храни като пуканки, чипс, храна със соев сос? Въпреки, че нуждите на човешкото тяло от Натрий не са големи, количеството му е в пряка връзка с приема на Калий. Те са в съотношение 3:1 в полза на Калия. Ако изпитвате непреодолимо желание за много солени храни, то вероятно напоследък сте консумирали повече храни, богати на Калий, например много големи количества пресни плодове и зеленчуци, най-вече зрял боб, банани, тиква, картофи. Решението не е да се натъпчете с пакет чипс, пълен с изкуствени съставки, аромати и трапезна сол. По-добра идея е да слагате по малко морска сол в бутилката си с вода или да включите малка порция ферментирал продукт в менюто си. По този начин ще си набавите нужната сол, заедно с други полезни съставки.

    - -

    Прияжда ли ви се нещо плътно и тежко като масло, ядки, фъстъчено масло, ядкови тахани, бъргър или дюнер? Тялото ви отчаяно се нуждае от калории. Нуждата от мазна и тежка храна сочи само едно: системно недохранване на клетъчно ниво. Ако от седмица, месец или повече се изхранвате с баничка, пакет солети, три ябълки и два моркова, не се учудвайте, че започвате да сънувате мазните бъргъри от Макдоналдс. Имате нужда от истинска храна, която да нахрани клетките ви, а не само да запълни стомаха. Започнете да се храните пълноценно по три пъти на ден с протеини, мазнини, зеленчуци и плодове.

    - -

    Желанието ви за пиле, яйце или риба е всичко, за което може да мислите сега? Тук и дете ще ви каже къде е проблемът: нуждаете се от протеини. Набавете си го възможно най-скоро и не пропускайте да включвате протеин във всяко хранене.

    - -

    Мисълта за вкусна, сочна пържола от червено месо е свързана само с едно-единствено желание на тялото ви: то се нуждае от желязо. Добра идея е да комбинирате това хранене с източник на витамин С - салата от зеленолистни, пресни или сушени червени чушки, цитруси.

    - -

    Дояждат ви се кисело и прясно мляко или тестени изкушения като топъл хляб и кифли? Знаете ли, че глутен-съдържащите храни имат в състава си опиоидни пептиди, които представляват аминокиселини, въздействащи на мозъка като опиати. Те се свързват с рецепторите за ендорфините (хормона на щастието) и ядейки продукти, съдържащи смлени зърнени храни ви карат да се чувствате много добре. Същото важи за млякото, но при него ефекта е свързан с нуждата на бебетата от кърменето, което е не само доставяне на храна, но и създаване на усещането за сигурност и обич. За съжаление, пораствайки трудно се отказваме от това приятно усещане и малко по малко се оказваме пристрастени към млечните продукти и хляба. Най-доброто решение в случая е да започнем да отстраняваме тази зависимост или поне да търсим по-качествени и полезни източници.

    - -

    Вече знаете как да подходите при настъпил необясним глад. За да не се налага да го обуздавате, опитвайте се всеки ден да се храните достатъчно, да имате достатъчно протеини, полезни мазнини, зеленчуци и плодове в менюто си.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"%Замисляли ли сте се, че храненето е много повече от това, което слагате в чинията си. Често то има връзка с емоциите ни, с успехите или спадовете в кариерата, семейството и приятелите. Храната би трябвало да е гориво за тялото ни, но често я превръщаме в утехата, любовта или приятелят от който се нуждаем. - -Силното желание за дадена храна има два аспекта: физически и емоционален. Емоционалното хранене е проблем с по-дълбоки корени, отколкото аз мога да се задълбоча, но понякога си мислим, че "тялото ни има нужда" от сладкиш или чипс, а проблемът е съвсем повърхностен и е свързан с физическата нужда на организма от конкретен нутриент. - -Ако изпитвате желание за "**успокояваща храна**"; такава, която сте свикнали да хапвате след лош ден или храна, която майка ви, баба ви или някой друг кулинар в дома е приготвял, когато сте били дете, то вероятно става въпрос за емоционално хранене. Вие може би асоциирате чувството за комфорт, семейна топлина и уют с определена храна, която е станала като "хапче за подобряване на настроението". Това е знак, че трябва да се замислите за връзката си с храната и да потърсите причините на истинският проблем, вместо ежедневно да го натъпквате по-дълбоко в себе си, с купичка сладолед. - -Имате ли неустоимо желание за **бързи захари**, например шоколад, бисквити, сладолед или други сладкиши? За това има две обяснения. Първото е, че тялото ви изпитва захарен глад, ако системно прекалявате с бързите въглехидрати и сега кръвната ви захар е ниска, а тялото се нуждае от нова доза "наркотик"; защото рафинираната захар (глюкозо-фруктозен царевичен сироп или захар от захарно цвекло) имат наркотичен ефект върху мозъка: действат пристрастяващо и имате нужда от все повече и по-често приемане на сладки храни. Другото обяснение, че тялото ви е подложено на глад и лишения за известен период (глад, диета, голямо физическо натоварване, дълго време хранене с непълноценна храна) и търси да си набави глюкоза, за да продължи да функционира нормално. И в двата случая подходете така: изяжте един цял пресен плод, а след 30мин направете едно пълноценно хранене, включващо достатъчно протеини, полезни мазнини и зеленчуци. Това ще регулира кръвната захар и ще набави на тялото ви това, от което има нужда.
    -![Глад](/images/posts/Cravings.jpg){:width="450px"}
    - -Не можете да спрете да мислите за **супер-солени храни** като пуканки, чипс, храна със соев сос? Въпреки, че нуждите на човешкото тяло от Натрий не са големи, количеството му е в пряка връзка с приема на Калий. Те са в съотношение 3:1 в полза на Калия. Ако изпитвате непреодолимо желание за много солени храни, то вероятно напоследък сте консумирали повече храни, богати на Калий, например много големи количества пресни плодове и зеленчуци, най-вече зрял боб, банани, тиква, картофи. Решението не е да се натъпчете с пакет чипс, пълен с изкуствени съставки, аромати и трапезна сол. По-добра идея е да слагате по малко морска сол в бутилката си с вода или да включите малка порция [ферментирал продукт](/blog/2014-10-14-%D1%84%D0%B5%D1%80%D0%BC%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%B0%D0%BB%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8/) в менюто си. По този начин ще си набавите нужната сол, заедно с други полезни съставки. - -Прияжда ли ви се нещо плътно и тежко като **масло, ядки**, фъстъчено масло, ядкови тахани, бъргър или дюнер? Тялото ви отчаяно се нуждае от калории. Нуждата от мазна и тежка храна сочи само едно: системно недохранване на клетъчно ниво. Ако от седмица, месец или повече се изхранвате с баничка, пакет солети, три ябълки и два моркова, не се учудвайте, че започвате да сънувате мазните бъргъри от Макдоналдс. Имате нужда от истинска храна, която да нахрани клетките ви, а не само да запълни стомаха. Започнете да се храните пълноценно по три пъти на ден с протеини, мазнини, зеленчуци и плодове. - -Желанието ви за **пиле, яйце или риба** е всичко, за което може да мислите сега? Тук и дете ще ви каже къде е проблемът: нуждаете се от протеини. Набавете си го възможно най-скоро и не пропускайте да включвате протеин във всяко хранене. - -Мисълта за вкусна, сочна пържола от **червено месо** е свързана само с едно-единствено желание на тялото ви: то се нуждае от желязо. Добра идея е да комбинирате това хранене с източник на витамин С - салата от зеленолистни, пресни или сушени червени чушки, цитруси. - -Дояждат ви се кисело и прясно **мляко** или тестени изкушения като топъл **хляб** и кифли? Знаете ли, че глутен-съдържащите храни имат в състава си опиоидни пептиди, които представляват аминокиселини, въздействащи на мозъка като опиати. Те се свързват с рецепторите за ендорфините (хормона на щастието) и ядейки продукти, съдържащи смлени зърнени храни ви карат да се чувствате много добре. Същото важи за млякото, но при него ефекта е свързан с нуждата на бебетата от кърменето, което е не само доставяне на храна, но и създаване на усещането за сигурност и обич. За съжаление, пораствайки трудно се отказваме от това приятно усещане и малко по малко се оказваме пристрастени към млечните продукти и хляба. Най-доброто решение в случая е да започнем да отстраняваме тази зависимост или поне да търсим по-качествени и полезни [източници](/blog/2014-08-24-%D0%BF%D1%8A%D0%BB%D0%BD%D0%BE%D0%B7%D1%8A%D1%80%D0%BD%D0%B5%D1%81%D1%82-%D1%85%D0%BB%D1%8F%D0%B1/). - -Вече знаете как да подходите при настъпил необясним глад. За да не се налага да го обуздавате, опитвайте се всеки ден да се храните достатъчно, да имате достатъчно протеини, полезни мазнини, зеленчуци и плодове в менюто си. -;T; -I"&

    Замисляли ли сте се, че храненето е много повече от това, което слагате в чинията си. Често то има връзка с емоциите ни, с успехите или спадовете в кариерата, семейството и приятелите. Храната би трябвало да е гориво за тялото ни, но често я превръщаме в утехата, любовта или приятелят от който се нуждаем.

    - -

    Силното желание за дадена храна има два аспекта: физически и емоционален. Емоционалното хранене е проблем с по-дълбоки корени, отколкото аз мога да се задълбоча, но понякога си мислим, че “тялото ни има нужда” от сладкиш или чипс, а проблемът е съвсем повърхностен и е свързан с физическата нужда на организма от конкретен нутриент.

    - -

    Ако изпитвате желание за “успокояваща храна”; такава, която сте свикнали да хапвате след лош ден или храна, която майка ви, баба ви или някой друг кулинар в дома е приготвял, когато сте били дете, то вероятно става въпрос за емоционално хранене. Вие може би асоциирате чувството за комфорт, семейна топлина и уют с определена храна, която е станала като “хапче за подобряване на настроението”. Това е знак, че трябва да се замислите за връзката си с храната и да потърсите причините на истинският проблем, вместо ежедневно да го натъпквате по-дълбоко в себе си, с купичка сладолед.

    - -

    Имате ли неустоимо желание за бързи захари, например шоколад, бисквити, сладолед или други сладкиши? За това има две обяснения. Първото е, че тялото ви изпитва захарен глад, ако системно прекалявате с бързите въглехидрати и сега кръвната ви захар е ниска, а тялото се нуждае от нова доза “наркотик”; защото рафинираната захар (глюкозо-фруктозен царевичен сироп или захар от захарно цвекло) имат наркотичен ефект върху мозъка: действат пристрастяващо и имате нужда от все повече и по-често приемане на сладки храни. Другото обяснение, че тялото ви е подложено на глад и лишения за известен период (глад, диета, голямо физическо натоварване, дълго време хранене с непълноценна храна) и търси да си набави глюкоза, за да продължи да функционира нормално. И в двата случая подходете така: изяжте един цял пресен плод, а след 30мин направете едно пълноценно хранене, включващо достатъчно протеини, полезни мазнини и зеленчуци. Това ще регулира кръвната захар и ще набави на тялото ви това, от което има нужда.
    -Глад

    - -

    Не можете да спрете да мислите за супер-солени храни като пуканки, чипс, храна със соев сос? Въпреки, че нуждите на човешкото тяло от Натрий не са големи, количеството му е в пряка връзка с приема на Калий. Те са в съотношение 3:1 в полза на Калия. Ако изпитвате непреодолимо желание за много солени храни, то вероятно напоследък сте консумирали повече храни, богати на Калий, например много големи количества пресни плодове и зеленчуци, най-вече зрял боб, банани, тиква, картофи. Решението не е да се натъпчете с пакет чипс, пълен с изкуствени съставки, аромати и трапезна сол. По-добра идея е да слагате по малко морска сол в бутилката си с вода или да включите малка порция ферментирал продукт в менюто си. По този начин ще си набавите нужната сол, заедно с други полезни съставки.

    - -

    Прияжда ли ви се нещо плътно и тежко като масло, ядки, фъстъчено масло, ядкови тахани, бъргър или дюнер? Тялото ви отчаяно се нуждае от калории. Нуждата от мазна и тежка храна сочи само едно: системно недохранване на клетъчно ниво. Ако от седмица, месец или повече се изхранвате с баничка, пакет солети, три ябълки и два моркова, не се учудвайте, че започвате да сънувате мазните бъргъри от Макдоналдс. Имате нужда от истинска храна, която да нахрани клетките ви, а не само да запълни стомаха. Започнете да се храните пълноценно по три пъти на ден с протеини, мазнини, зеленчуци и плодове.

    - -

    Желанието ви за пиле, яйце или риба е всичко, за което може да мислите сега? Тук и дете ще ви каже къде е проблемът: нуждаете се от протеини. Набавете си го възможно най-скоро и не пропускайте да включвате протеин във всяко хранене.

    - -

    Мисълта за вкусна, сочна пържола от червено месо е свързана само с едно-единствено желание на тялото ви: то се нуждае от желязо. Добра идея е да комбинирате това хранене с източник на витамин С - салата от зеленолистни, пресни или сушени червени чушки, цитруси.

    - -

    Дояждат ви се кисело и прясно мляко или тестени изкушения като топъл хляб и кифли? Знаете ли, че глутен-съдържащите храни имат в състава си опиоидни пептиди, които представляват аминокиселини, въздействащи на мозъка като опиати. Те се свързват с рецепторите за ендорфините (хормона на щастието) и ядейки продукти, съдържащи смлени зърнени храни ви карат да се чувствате много добре. Същото важи за млякото, но при него ефекта е свързан с нуждата на бебетата от кърменето, което е не само доставяне на храна, но и създаване на усещането за сигурност и обич. За съжаление, пораствайки трудно се отказваме от това приятно усещане и малко по малко се оказваме пристрастени към млечните продукти и хляба. Най-доброто решение в случая е да започнем да отстраняваме тази зависимост или поне да търсим по-качествени и полезни източници.

    - -

    Вече знаете как да подходите при настъпил необясним глад. За да не се налага да го обуздавате, опитвайте се всеки ден да се храните достатъчно, да имате достатъчно протеини, полезни мазнини, зеленчуци и плодове в менюто си.

    -;T; @I"7/blog/2014-10-28-липса-на-движение/;T{;{ ;I"]0 - - - - - - - Движението: начин на употреба - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Движението: начин на употреба -

    - -
    -
      -
    • - - October 28, 2014 -
    • -
    -
    - - -

    Съвременният начин на живот води със себе си много вредни навици, но един от най-разпространените е заседяването. Милиони хора работят по 8-10-12 часа на бюро, почиват си на дивана пред телевизора, а в останалото време са в колата. -Проучване на Университета в Хонг Конг дава следните резултати: заседналият начин на живот взима повече жертви от тютюнопушенето при хората над 35години. Обездвижването увеличава риска от ракови заболявания1 с 45% при мъжете и 28% при жените; рискът от тежки и смъртоносни респираторни заболявания се увеличава с 92% за мъжете и с 75% за жените. Сърдечно-съдовите заболявания2 с фатален край са по-чести при 52% от мъжете и 28% при жените, които се лишават от ежедневно движение. С друго думи: обездвижването буквално може да ви убие.

    - -

    Ето какво прави седенето с човешкото тяло:
    - * гори 50калории по-малко на час, сравнено със стоенето прав
    - * седенето може да доведе до болки в мускулите и някои части на скелета, болки в гърба и врата
    - * нарушава се естественият хормонален баланс на Лептина и Инсулина и води до затлъстяване
    - * намалява костната плътност и води до остеопороза и други заболявания на костите

    - -

    Защо е важно да се движим? -Човешкото тяло е създадено, за да е в движение. Движейки мускулите, ставите и крайниците си в пространството всъщност ги заздравяваме и подобряваме цялостното здраве. Чрез движението се масажират тъканите и това задвижва потока на лимфата в тялото. Да, кръвта се изпомпва от сърцето, дори когато тялото е в покой, но физическата активност е “сърцето на лимфата”. Чрез движение на тялото се активизира всичко в него - обмена на кислород, хранителни вещества, ензими, нервни импулси и т.н. Ставите не се “износват” при движение, а точно обратното. Болките се появяват от обездвижване и вкостяване на хрущялите. -Потенето също носи ползи. Чрез потта се изхвърлят множество токсини извън тялото, а изгубените течности се възстановяват с пиенето на чиста вода. Физическата активност, която се извършва на открито пък допринася за набавянето на жизненоважния за всеки човек витамин Д, и то по най-добрият начин: чрез слънцето.
    -Глад

    - -

    Как да получим всички тези ползи и да се предпазим от рисковете, които носи обездвижването? -Умерената физическа активност в рамките на 30минути е достатъчна, ако е ежедневна практика. Няколкоминутно раздвижване на всеки 60минути работа на бюро също са препоръчителни. Избягвайте асансьори и ескалатори, използвайте стълбите във ваша полза. Водете домашният любимец на дълги разходки. Не пропускайте слънчев, дори и хладен ден за разходка с колелото или лек крос в парка. Колкото повече се движите, толкова по-здрави ще бъдете! Естествено не е добре да тренирате прекалено много и да увеличите риска от травми, но претренирането е доста рядко срещано при хора, които не са професионални спортисти. Затова намерете кое е най-приятното раздвижване за вас и започнете да го практикувате още днес.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Съвременният начин на живот води със себе си много вредни навици, но един от най-разпространените е заседяването. Милиони хора работят по 8-10-12 часа на бюро, почиват си на дивана пред телевизора, а в останалото време са в колата. -Проучване на Университета в Хонг Конг дава следните резултати: заседналият начин на живот взима повече жертви от тютюнопушенето при хората над 35години. Обездвижването увеличава риска от ракови заболявания[1](http://www.ncbi.nlm.nih.gov/pubmed/19346988) с 45% при мъжете и 28% при жените; рискът от тежки и смъртоносни респираторни заболявания се увеличава с 92% за мъжете и с 75% за жените. Сърдечно-съдовите заболявания[2](http://www.ncbi.nlm.nih.gov/pubmed/19996993) с фатален край са по-чести при 52% от мъжете и 28% при жените, които се лишават от ежедневно движение. С друго думи: обездвижването буквално може да ви убие. - -Ето какво прави седенето с човешкото тяло:
    - * гори 50калории по-малко на час, сравнено със стоенето прав
    - * седенето може да доведе до болки в мускулите и някои части на скелета, болки в гърба и врата
    - * нарушава се естественият хормонален баланс на Лептина и Инсулина и води до затлъстяване
    - * намалява костната плътност и води до остеопороза и други заболявания на костите - -Защо е важно да се движим? -Човешкото тяло е създадено, за да е в движение. Движейки мускулите, ставите и крайниците си в пространството всъщност ги заздравяваме и подобряваме цялостното здраве. Чрез движението се масажират тъканите и това задвижва потока на лимфата в тялото. Да, кръвта се изпомпва от сърцето, дори когато тялото е в покой, но физическата активност е "сърцето на лимфата". Чрез движение на тялото се активизира всичко в него - обмена на кислород, хранителни вещества, ензими, нервни импулси и т.н. Ставите не се "износват" при движение, а точно обратното. Болките се появяват от обездвижване и вкостяване на хрущялите. -Потенето също носи ползи. Чрез потта се изхвърлят множество токсини извън тялото, а изгубените течности се възстановяват с пиенето на чиста вода. Физическата активност, която се извършва на открито пък допринася за набавянето на жизненоважния за всеки човек витамин Д, и то по най-добрият начин: чрез слънцето.
    -![Глад](/images/posts/Dog.jpg)
    - -Как да получим всички тези ползи и да се предпазим от рисковете, които носи обездвижването? -Умерената физическа активност в рамките на 30минути е достатъчна, ако е ежедневна практика. Няколкоминутно раздвижване на всеки 60минути работа на бюро също са препоръчителни. Избягвайте асансьори и ескалатори, използвайте стълбите във ваша полза. Водете домашният любимец на дълги разходки. Не пропускайте слънчев, дори и хладен ден за разходка с колелото или лек крос в парка. Колкото повече се движите, толкова по-здрави ще бъдете! Естествено не е добре да тренирате прекалено много и да увеличите риска от травми, но претренирането е доста рядко срещано при хора, които не са професионални спортисти. Затова намерете кое е най-приятното раздвижване за вас и започнете да го практикувате още днес. - -;T; -I"5

    Съвременният начин на живот води със себе си много вредни навици, но един от най-разпространените е заседяването. Милиони хора работят по 8-10-12 часа на бюро, почиват си на дивана пред телевизора, а в останалото време са в колата. -Проучване на Университета в Хонг Конг дава следните резултати: заседналият начин на живот взима повече жертви от тютюнопушенето при хората над 35години. Обездвижването увеличава риска от ракови заболявания1 с 45% при мъжете и 28% при жените; рискът от тежки и смъртоносни респираторни заболявания се увеличава с 92% за мъжете и с 75% за жените. Сърдечно-съдовите заболявания2 с фатален край са по-чести при 52% от мъжете и 28% при жените, които се лишават от ежедневно движение. С друго думи: обездвижването буквално може да ви убие.

    - -

    Ето какво прави седенето с човешкото тяло:
    - * гори 50калории по-малко на час, сравнено със стоенето прав
    - * седенето може да доведе до болки в мускулите и някои части на скелета, болки в гърба и врата
    - * нарушава се естественият хормонален баланс на Лептина и Инсулина и води до затлъстяване
    - * намалява костната плътност и води до остеопороза и други заболявания на костите

    - -

    Защо е важно да се движим? -Човешкото тяло е създадено, за да е в движение. Движейки мускулите, ставите и крайниците си в пространството всъщност ги заздравяваме и подобряваме цялостното здраве. Чрез движението се масажират тъканите и това задвижва потока на лимфата в тялото. Да, кръвта се изпомпва от сърцето, дори когато тялото е в покой, но физическата активност е “сърцето на лимфата”. Чрез движение на тялото се активизира всичко в него - обмена на кислород, хранителни вещества, ензими, нервни импулси и т.н. Ставите не се “износват” при движение, а точно обратното. Болките се появяват от обездвижване и вкостяване на хрущялите. -Потенето също носи ползи. Чрез потта се изхвърлят множество токсини извън тялото, а изгубените течности се възстановяват с пиенето на чиста вода. Физическата активност, която се извършва на открито пък допринася за набавянето на жизненоважния за всеки човек витамин Д, и то по най-добрият начин: чрез слънцето.
    -Глад

    - -

    Как да получим всички тези ползи и да се предпазим от рисковете, които носи обездвижването? -Умерената физическа активност в рамките на 30минути е достатъчна, ако е ежедневна практика. Няколкоминутно раздвижване на всеки 60минути работа на бюро също са препоръчителни. Избягвайте асансьори и ескалатори, използвайте стълбите във ваша полза. Водете домашният любимец на дълги разходки. Не пропускайте слънчев, дори и хладен ден за разходка с колелото или лек крос в парка. Колкото повече се движите, толкова по-здрави ще бъдете! Естествено не е добре да тренирате прекалено много и да увеличите риска от травми, но претренирането е доста рядко срещано при хора, които не са професионални спортисти. Затова намерете кое е най-приятното раздвижване за вас и започнете да го практикувате още днес.

    - -;T; @I"-/blog/2014-11-04-антиейджинг/;T{;{ ;I"H; - - - - - - - Как да заличим следите на времето - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как да заличим следите на времето -

    - -
    -
      -
    • - - November 4, 2014 -
    • -
    -
    - - -

    Кой не иска да спре времето и да се наслаждава на младостта си цял живот?! Но има ли човешкото тяло наистина тази способност? Да не остарява поне външно. Истината е, че външният вид е отражение на случващото се вътре в тялото и ако не се грижим за здравето си, то няма как да запазим младостта и красотата.

    - -

    Признаците на остаряването са познати на всички - бръчки и петна, намалена еластичност на кожата; загуба на блясък в косата и промяна в цвета й; Накои хора започват да купуват скъпи кремове с екзотични и още по-скъпи съставки, подлагат се на болезнени процедури, но ефекта никога не е задоволителен. Защо? Защото красотата идва отвътре - навън и “замаскирането” на проблема не е решението.

    - -

    В тази статия съм обобщила три лесни за изпълнение съвета за подобряване и подмладяване на кожата. Разбира се, не трябва да очаквате светкавични резултати, но с времето ще видите по-сияен, красив и млад облик в огледалото.
    -Антиейджинг

    - -
      -
    1. -

      Обърнете внимание на това, което слагате върху кожата си. Човешката кожа има висока абсорбционна способност, което означава че всичко, което нанасяте върху нея ще попие и ще навлезе в подкожните слоеве. Най-лесно попиват всички мастни разтвори, а единственото вещество, което не се абсорбира е водата. Поради това трябва много внимателно да подбирате козметичните си продукти и процедури. Всякакви средства, които включват токсични химикали, консерванти, оцветители, парфюми могат да доведат до възпаление, обрив и преждевременно състаряване. Повече може да прочетете тук и тук Разбира се, изключително важно е да се поддържа кожата чиста, като същевременно се запазва естественото й кисело pH. Повече по темата очаквайте скоро.

      -
    2. -
    3. Храненето е изключително важно за външният вид на кожата ви. Както вече споменах, красотата и здравето идват отвътре. Затова отново голяма роля има храната, която даваме на тялото си. Ако е качествена, то ще успее да изгради добра и стабилна среда за процесите, които се случват в него. Кои са обаче храните, които оказват пряко влияние върху външният ни вид?
      -
        -
      • Пробиотици - те благоприятстват растежа на полезни микроорганизми в храносмилателната система, които предпазват от възпалителни процеси. Възпалението в различни области на тялото е най-голямата причина за стареене на клетките, включително тези на кожата. Пробиотици можете да си набавите с хранителни добавки или с естествено ферментирали храни.
      • -
      • Полезни мазнини - животинските мазнини са най-лесно усвоимият източник на мастно-разтворими витамини за човека. Ежедневният прием на рибено масло не само ще подмлади кожата ви, но ще допринесе за подобряване на цялостното ви здраве.
      • -
      • -Цвеклото и другите кореноплодни зеленчуци са богати на витамини от групата В; чесънът съдържа витамин С и естествени съставки, които намаляват възпалението и унищожават болестотворните микроорганизми; авокадото и ядките са източници на много витамини, минерали и растителни мазнини, които са полезни за кожата.
      • -
      • Избягвайте захарта и редуцирайте приема на фруктоза и зърнени храни. Крайни продукти при преработката им са токсичните за тялото AGЕ(advanced glycation end products). Те пречат на организма да се бори с външните токсини и се смятат за една от основните причини за стареене на клетките (т.нар. свободни радикали). Някои автори като Dr. Nicholas Perricone (автор на The Perricone Prescription и The Wrinkle Cure) споменават и за ролята на кафето като средство, което намалява хидратацията и еластичността на кожата и съветват за неговата умерена или минимална консумация.
        -
      • -
      -
    4. -
    5. Регулирайте хормоните. Стареенето има пряка връзка с нивата на кортизола в тялото(хормонът на стреса). Ако имате някой от следните симптоми: отпадналост, тревожност, усещане за загуба на контрол в ежедневни ситуации, проблеми със съня, натрупване на мазнини в областта около корема, задъхване без физическо натоварване, стомашно неразположение, постоянно усещане за напрегнатост, то има вероятност да имате повишен кортизол. Той може да се превърне в пряка или косвена причина за стареене на клетките и не трябва да подценявате проблема. Потърсете начини за справяне със стреса тук.
      -
    6. -
    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"fКой не иска да спре времето и да се наслаждава на младостта си цял живот?! Но има ли човешкото тяло наистина тази способност? Да не остарява поне външно. Истината е, че външният вид е отражение на случващото се вътре в тялото и ако не се грижим за здравето си, то няма как да запазим младостта и красотата. - -Признаците на остаряването са познати на всички - бръчки и петна, намалена еластичност на кожата; загуба на блясък в косата и промяна в цвета й; Накои хора започват да купуват скъпи кремове с екзотични и още по-скъпи съставки, подлагат се на болезнени процедури, но ефекта никога не е задоволителен. Защо? Защото красотата идва отвътре - навън и "замаскирането" на проблема не е решението. - -В тази статия съм обобщила три лесни за изпълнение съвета за подобряване и подмладяване на кожата. Разбира се, не трябва да очаквате светкавични резултати, но с времето ще видите по-сияен, красив и млад облик в огледалото.
    -![Антиейджинг](/images/posts/Antiaging.jpg){:width="350px"}
    - -1. Обърнете внимание на това, което слагате върху кожата си. Човешката кожа има висока абсорбционна способност, което означава че всичко, което нанасяте върху нея ще попие и ще навлезе в подкожните слоеве. Най-лесно попиват всички мастни разтвори, а единственото вещество, което не се абсорбира е водата. Поради това трябва много внимателно да подбирате козметичните си продукти и процедури. Всякакви средства, които включват токсични химикали, консерванти, оцветители, парфюми могат да доведат до възпаление, обрив и преждевременно състаряване. Повече може да прочетете [тук](/blog/2014-07-05-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0/) и [тук](/blog/2014-07-12-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0-2/) Разбира се, изключително важно е да се поддържа кожата чиста, като същевременно се запазва естественото й кисело pH. Повече по темата очаквайте скоро.
    - -2. Храненето е изключително важно за външният вид на кожата ви. Както вече споменах, красотата и здравето идват отвътре. Затова отново голяма роля има храната, която даваме на тялото си. Ако е качествена, то ще успее да изгради добра и стабилна среда за процесите, които се случват в него. Кои са обаче храните, които оказват пряко влияние върху външният ни вид?
    - * Пробиотици - те благоприятстват растежа на полезни микроорганизми в храносмилателната система, които предпазват от възпалителни процеси. Възпалението в различни области на тялото е най-голямата причина за стареене на клетките, включително тези на кожата. Пробиотици можете да си набавите с хранителни добавки или с естествено [ферментирали храни](/blog/2014-10-14-%D1%84%D0%B5%D1%80%D0%BC%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%B0%D0%BB%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8/). - * Полезни мазнини - животинските мазнини са най-лесно усвоимият източник на мастно-разтворими витамини за човека. Ежедневният прием на рибено масло не само ще подмлади кожата ви, но ще допринесе за подобряване на цялостното ви здраве. - * [Цвеклото](/blog/2014-10-07-%D1%87%D0%B5%D1%80%D0%B2%D0%B5%D0%BD%D0%BE-%D1%86%D0%B2%D0%B5%D0%BA%D0%BB%D0%BE/) и другите кореноплодни зеленчуци са богати на витамини от групата В; [чесънът](/blog/2014-09-14-%D1%87%D0%B5%D1%81%D1%8A%D0%BD/) съдържа витамин С и естествени съставки, които намаляват възпалението и унищожават болестотворните микроорганизми; авокадото и ядките са източници на много витамини, минерали и растителни мазнини, които са полезни за кожата. - * Избягвайте захарта и редуцирайте приема на фруктоза и зърнени храни. Крайни продукти при преработката им са токсичните за тялото AGЕ(advanced glycation end products). Те пречат на организма да се бори с външните токсини и се смятат за една от основните причини за стареене на клетките (т.нар. свободни радикали). Някои автори като Dr. Nicholas Perricone (автор на The Perricone Prescription и The Wrinkle Cure) споменават и за ролята на кафето като средство, което намалява хидратацията и еластичността на кожата и съветват за неговата умерена или минимална консумация.
    - -3. Регулирайте хормоните. Стареенето има пряка връзка с нивата на кортизола в тялото(хормонът на стреса). Ако имате някой от следните симптоми: отпадналост, тревожност, усещане за загуба на контрол в ежедневни ситуации, проблеми със съня, натрупване на мазнини в областта около корема, задъхване без физическо натоварване, стомашно неразположение, постоянно усещане за напрегнатост, то има вероятност да имате повишен кортизол. Той може да се превърне в пряка или косвена причина за стареене на клетките и не трябва да подценявате проблема. Потърсете начини за справяне със стреса [тук](/blog/2014-06-29-%D1%81%D1%82%D1%80%D0%B5%D1%81%D1%8A%D1%82/).
    - - -;T; -I",

    Кой не иска да спре времето и да се наслаждава на младостта си цял живот?! Но има ли човешкото тяло наистина тази способност? Да не остарява поне външно. Истината е, че външният вид е отражение на случващото се вътре в тялото и ако не се грижим за здравето си, то няма как да запазим младостта и красотата.

    - -

    Признаците на остаряването са познати на всички - бръчки и петна, намалена еластичност на кожата; загуба на блясък в косата и промяна в цвета й; Накои хора започват да купуват скъпи кремове с екзотични и още по-скъпи съставки, подлагат се на болезнени процедури, но ефекта никога не е задоволителен. Защо? Защото красотата идва отвътре - навън и “замаскирането” на проблема не е решението.

    - -

    В тази статия съм обобщила три лесни за изпълнение съвета за подобряване и подмладяване на кожата. Разбира се, не трябва да очаквате светкавични резултати, но с времето ще видите по-сияен, красив и млад облик в огледалото.
    -Антиейджинг

    - -
      -
    1. -

      Обърнете внимание на това, което слагате върху кожата си. Човешката кожа има висока абсорбционна способност, което означава че всичко, което нанасяте върху нея ще попие и ще навлезе в подкожните слоеве. Най-лесно попиват всички мастни разтвори, а единственото вещество, което не се абсорбира е водата. Поради това трябва много внимателно да подбирате козметичните си продукти и процедури. Всякакви средства, които включват токсични химикали, консерванти, оцветители, парфюми могат да доведат до възпаление, обрив и преждевременно състаряване. Повече може да прочетете тук и тук Разбира се, изключително важно е да се поддържа кожата чиста, като същевременно се запазва естественото й кисело pH. Повече по темата очаквайте скоро.

      -
    2. -
    3. Храненето е изключително важно за външният вид на кожата ви. Както вече споменах, красотата и здравето идват отвътре. Затова отново голяма роля има храната, която даваме на тялото си. Ако е качествена, то ще успее да изгради добра и стабилна среда за процесите, които се случват в него. Кои са обаче храните, които оказват пряко влияние върху външният ни вид?
      -
        -
      • Пробиотици - те благоприятстват растежа на полезни микроорганизми в храносмилателната система, които предпазват от възпалителни процеси. Възпалението в различни области на тялото е най-голямата причина за стареене на клетките, включително тези на кожата. Пробиотици можете да си набавите с хранителни добавки или с естествено ферментирали храни.
      • -
      • Полезни мазнини - животинските мазнини са най-лесно усвоимият източник на мастно-разтворими витамини за човека. Ежедневният прием на рибено масло не само ще подмлади кожата ви, но ще допринесе за подобряване на цялостното ви здраве.
      • -
      • -Цвеклото и другите кореноплодни зеленчуци са богати на витамини от групата В; чесънът съдържа витамин С и естествени съставки, които намаляват възпалението и унищожават болестотворните микроорганизми; авокадото и ядките са източници на много витамини, минерали и растителни мазнини, които са полезни за кожата.
      • -
      • Избягвайте захарта и редуцирайте приема на фруктоза и зърнени храни. Крайни продукти при преработката им са токсичните за тялото AGЕ(advanced glycation end products). Те пречат на организма да се бори с външните токсини и се смятат за една от основните причини за стареене на клетките (т.нар. свободни радикали). Някои автори като Dr. Nicholas Perricone (автор на The Perricone Prescription и The Wrinkle Cure) споменават и за ролята на кафето като средство, което намалява хидратацията и еластичността на кожата и съветват за неговата умерена или минимална консумация.
        -
      • -
      -
    4. -
    5. Регулирайте хормоните. Стареенето има пряка връзка с нивата на кортизола в тялото(хормонът на стреса). Ако имате някой от следните симптоми: отпадналост, тревожност, усещане за загуба на контрол в ежедневни ситуации, проблеми със съня, натрупване на мазнини в областта около корема, задъхване без физическо натоварване, стомашно неразположение, постоянно усещане за напрегнатост, то има вероятност да имате повишен кортизол. Той може да се превърне в пряка или косвена причина за стареене на клетките и не трябва да подценявате проблема. Потърсете начини за справяне със стреса тук.
      -
    6. -
    - -;T; @I"T/blog/2014-11-04-как-да-заличим-следите-на-времето/;T{;{ ;I"; - - - - - - - Как да заличим следите на времето - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как да заличим следите на времето -

    - -
    -
      -
    • - - November 4, 2014 -
    • -
    -
    - - -

    Кой не иска да спре времето и да се наслаждава на младостта си цял живот?! Но има ли човешкото тяло наистина тази способност? Да не остарява поне външно. Истината е, че външният вид е отражение на случващото се вътре в тялото и ако не се грижим за здравето си, то няма как да запазим младостта и красотата.

    - -

    Признаците на остаряването са познати на всички - бръчки и петна, намалена еластичност на кожата; загуба на блясък в косата и промяна в цвета й; Накои хора започват да купуват скъпи кремове с екзотични и още по-скъпи съставки, подлагат се на болезнени процедури, но ефекта никога не е задоволителен. Защо? Защото красотата идва отвътре - навън и “замаскирането” на проблема не е решението.

    - -

    В тази статия съм обобщила три лесни за изпълнение съвета за подобряване и подмладяване на кожата. Разбира се, не трябва да очаквате светкавични резултати, но с времето ще видите по-сияен, красив и млад облик в огледалото.
    -Антиейджинг

    - -
      -
    1. -

      Обърнете внимание на това, което слагате върху кожата си. Човешката кожа има висока абсорбционна способност, което означава че всичко, което нанасяте върху нея ще попие и ще навлезе в подкожните слоеве. Най-лесно попиват всички мастни разтвори, а единственото вещество, което не се абсорбира е водата. Поради това трябва много внимателно да подбирате козметичните си продукти и процедури. Всякакви средства, които включват токсични химикали, консерванти, оцветители, парфюми могат да доведат до възпаление, обрив и преждевременно състаряване. Повече може да прочетете тук и тук Разбира се, изключително важно е да се поддържа кожата чиста, като същевременно се запазва естественото й кисело pH. Повече по темата очаквайте скоро.

      -
    2. -
    3. Храненето е изключително важно за външният вид на кожата ви. Както вече споменах, красотата и здравето идват отвътре. Затова отново голяма роля има храната, която даваме на тялото си. Ако е качествена, то ще успее да изгради добра и стабилна среда за процесите, които се случват в него. Кои са обаче храните, които оказват пряко влияние върху външният ни вид?
      -
        -
      • Пробиотици - те благоприятстват растежа на полезни микроорганизми в храносмилателната система, които предпазват от възпалителни процеси. Възпалението в различни области на тялото е най-голямата причина за стареене на клетките, включително тези на кожата. Пробиотици можете да си набавите с хранителни добавки или с естествено ферментирали храни.
      • -
      • Полезни мазнини - животинските мазнини са най-лесно усвоимият източник на мастно-разтворими витамини за човека. Ежедневният прием на рибено масло не само ще подмлади кожата ви, но ще допринесе за подобряване на цялостното ви здраве.
      • -
      • -Цвеклото и другите кореноплодни зеленчуци са богати на витамини от групата В; чесънът съдържа витамин С и естествени съставки, които намаляват възпалението и унищожават болестотворните микроорганизми; авокадото и ядките са източници на много витамини, минерали и растителни мазнини, които са полезни за кожата.
      • -
      • Избягвайте захарта и редуцирайте приема на фруктоза и зърнени храни. Крайни продукти при преработката им са токсичните за тялото AGЕ(advanced glycation end products). Те пречат на организма да се бори с външните токсини и се смятат за една от основните причини за стареене на клетките (т.нар. свободни радикали). Някои автори като Dr. Nicholas Perricone (автор на The Perricone Prescription и The Wrinkle Cure) споменават и за ролята на кафето като средство, което намалява хидратацията и еластичността на кожата и съветват за неговата умерена или минимална консумация.
        -
      • -
      -
    4. -
    5. Регулирайте хормоните. Стареенето има пряка връзка с нивата на кортизола в тялото(хормонът на стреса). Ако имате някой от следните симптоми: отпадналост, тревожност, усещане за загуба на контрол в ежедневни ситуации, проблеми със съня, натрупване на мазнини в областта около корема, задъхване без физическо натоварване, стомашно неразположение, постоянно усещане за напрегнатост, то има вероятност да имате повишен кортизол. Той може да се превърне в пряка или косвена причина за стареене на клетките и не трябва да подценявате проблема. Потърсете начини за справяне със стреса тук.
      -
    6. -
    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"fКой не иска да спре времето и да се наслаждава на младостта си цял живот?! Но има ли човешкото тяло наистина тази способност? Да не остарява поне външно. Истината е, че външният вид е отражение на случващото се вътре в тялото и ако не се грижим за здравето си, то няма как да запазим младостта и красотата. - -Признаците на остаряването са познати на всички - бръчки и петна, намалена еластичност на кожата; загуба на блясък в косата и промяна в цвета й; Накои хора започват да купуват скъпи кремове с екзотични и още по-скъпи съставки, подлагат се на болезнени процедури, но ефекта никога не е задоволителен. Защо? Защото красотата идва отвътре - навън и "замаскирането" на проблема не е решението. - -В тази статия съм обобщила три лесни за изпълнение съвета за подобряване и подмладяване на кожата. Разбира се, не трябва да очаквате светкавични резултати, но с времето ще видите по-сияен, красив и млад облик в огледалото.
    -![Антиейджинг](/images/posts/Antiaging.jpg){:width="350px"}
    - -1. Обърнете внимание на това, което слагате върху кожата си. Човешката кожа има висока абсорбционна способност, което означава че всичко, което нанасяте върху нея ще попие и ще навлезе в подкожните слоеве. Най-лесно попиват всички мастни разтвори, а единственото вещество, което не се абсорбира е водата. Поради това трябва много внимателно да подбирате козметичните си продукти и процедури. Всякакви средства, които включват токсични химикали, консерванти, оцветители, парфюми могат да доведат до възпаление, обрив и преждевременно състаряване. Повече може да прочетете [тук](/blog/2014-07-05-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0/) и [тук](/blog/2014-07-12-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0-2/) Разбира се, изключително важно е да се поддържа кожата чиста, като същевременно се запазва естественото й кисело pH. Повече по темата очаквайте скоро.
    - -2. Храненето е изключително важно за външният вид на кожата ви. Както вече споменах, красотата и здравето идват отвътре. Затова отново голяма роля има храната, която даваме на тялото си. Ако е качествена, то ще успее да изгради добра и стабилна среда за процесите, които се случват в него. Кои са обаче храните, които оказват пряко влияние върху външният ни вид?
    - * Пробиотици - те благоприятстват растежа на полезни микроорганизми в храносмилателната система, които предпазват от възпалителни процеси. Възпалението в различни области на тялото е най-голямата причина за стареене на клетките, включително тези на кожата. Пробиотици можете да си набавите с хранителни добавки или с естествено [ферментирали храни](/blog/2014-10-14-%D1%84%D0%B5%D1%80%D0%BC%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%B0%D0%BB%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8/). - * Полезни мазнини - животинските мазнини са най-лесно усвоимият източник на мастно-разтворими витамини за човека. Ежедневният прием на рибено масло не само ще подмлади кожата ви, но ще допринесе за подобряване на цялостното ви здраве. - * [Цвеклото](/blog/2014-10-07-%D1%87%D0%B5%D1%80%D0%B2%D0%B5%D0%BD%D0%BE-%D1%86%D0%B2%D0%B5%D0%BA%D0%BB%D0%BE/) и другите кореноплодни зеленчуци са богати на витамини от групата В; [чесънът](/blog/2014-09-14-%D1%87%D0%B5%D1%81%D1%8A%D0%BD/) съдържа витамин С и естествени съставки, които намаляват възпалението и унищожават болестотворните микроорганизми; авокадото и ядките са източници на много витамини, минерали и растителни мазнини, които са полезни за кожата. - * Избягвайте захарта и редуцирайте приема на фруктоза и зърнени храни. Крайни продукти при преработката им са токсичните за тялото AGЕ(advanced glycation end products). Те пречат на организма да се бори с външните токсини и се смятат за една от основните причини за стареене на клетките (т.нар. свободни радикали). Някои автори като Dr. Nicholas Perricone (автор на The Perricone Prescription и The Wrinkle Cure) споменават и за ролята на кафето като средство, което намалява хидратацията и еластичността на кожата и съветват за неговата умерена или минимална консумация.
    - -3. Регулирайте хормоните. Стареенето има пряка връзка с нивата на кортизола в тялото(хормонът на стреса). Ако имате някой от следните симптоми: отпадналост, тревожност, усещане за загуба на контрол в ежедневни ситуации, проблеми със съня, натрупване на мазнини в областта около корема, задъхване без физическо натоварване, стомашно неразположение, постоянно усещане за напрегнатост, то има вероятност да имате повишен кортизол. Той може да се превърне в пряка или косвена причина за стареене на клетките и не трябва да подценявате проблема. Потърсете начини за справяне със стреса [тук](/blog/2014-06-29-%D1%81%D1%82%D1%80%D0%B5%D1%81%D1%8A%D1%82/).
    - - -;T; -I",

    Кой не иска да спре времето и да се наслаждава на младостта си цял живот?! Но има ли човешкото тяло наистина тази способност? Да не остарява поне външно. Истината е, че външният вид е отражение на случващото се вътре в тялото и ако не се грижим за здравето си, то няма как да запазим младостта и красотата.

    - -

    Признаците на остаряването са познати на всички - бръчки и петна, намалена еластичност на кожата; загуба на блясък в косата и промяна в цвета й; Накои хора започват да купуват скъпи кремове с екзотични и още по-скъпи съставки, подлагат се на болезнени процедури, но ефекта никога не е задоволителен. Защо? Защото красотата идва отвътре - навън и “замаскирането” на проблема не е решението.

    - -

    В тази статия съм обобщила три лесни за изпълнение съвета за подобряване и подмладяване на кожата. Разбира се, не трябва да очаквате светкавични резултати, но с времето ще видите по-сияен, красив и млад облик в огледалото.
    -Антиейджинг

    - -
      -
    1. -

      Обърнете внимание на това, което слагате върху кожата си. Човешката кожа има висока абсорбционна способност, което означава че всичко, което нанасяте върху нея ще попие и ще навлезе в подкожните слоеве. Най-лесно попиват всички мастни разтвори, а единственото вещество, което не се абсорбира е водата. Поради това трябва много внимателно да подбирате козметичните си продукти и процедури. Всякакви средства, които включват токсични химикали, консерванти, оцветители, парфюми могат да доведат до възпаление, обрив и преждевременно състаряване. Повече може да прочетете тук и тук Разбира се, изключително важно е да се поддържа кожата чиста, като същевременно се запазва естественото й кисело pH. Повече по темата очаквайте скоро.

      -
    2. -
    3. Храненето е изключително важно за външният вид на кожата ви. Както вече споменах, красотата и здравето идват отвътре. Затова отново голяма роля има храната, която даваме на тялото си. Ако е качествена, то ще успее да изгради добра и стабилна среда за процесите, които се случват в него. Кои са обаче храните, които оказват пряко влияние върху външният ни вид?
      -
        -
      • Пробиотици - те благоприятстват растежа на полезни микроорганизми в храносмилателната система, които предпазват от възпалителни процеси. Възпалението в различни области на тялото е най-голямата причина за стареене на клетките, включително тези на кожата. Пробиотици можете да си набавите с хранителни добавки или с естествено ферментирали храни.
      • -
      • Полезни мазнини - животинските мазнини са най-лесно усвоимият източник на мастно-разтворими витамини за човека. Ежедневният прием на рибено масло не само ще подмлади кожата ви, но ще допринесе за подобряване на цялостното ви здраве.
      • -
      • -Цвеклото и другите кореноплодни зеленчуци са богати на витамини от групата В; чесънът съдържа витамин С и естествени съставки, които намаляват възпалението и унищожават болестотворните микроорганизми; авокадото и ядките са източници на много витамини, минерали и растителни мазнини, които са полезни за кожата.
      • -
      • Избягвайте захарта и редуцирайте приема на фруктоза и зърнени храни. Крайни продукти при преработката им са токсичните за тялото AGЕ(advanced glycation end products). Те пречат на организма да се бори с външните токсини и се смятат за една от основните причини за стареене на клетките (т.нар. свободни радикали). Някои автори като Dr. Nicholas Perricone (автор на The Perricone Prescription и The Wrinkle Cure) споменават и за ролята на кафето като средство, което намалява хидратацията и еластичността на кожата и съветват за неговата умерена или минимална консумация.
        -
      • -
      -
    4. -
    5. Регулирайте хормоните. Стареенето има пряка връзка с нивата на кортизола в тялото(хормонът на стреса). Ако имате някой от следните симптоми: отпадналост, тревожност, усещане за загуба на контрол в ежедневни ситуации, проблеми със съня, натрупване на мазнини в областта около корема, задъхване без физическо натоварване, стомашно неразположение, постоянно усещане за напрегнатост, то има вероятност да имате повишен кортизол. Той може да се превърне в пряка или косвена причина за стареене на клетките и не трябва да подценявате проблема. Потърсете начини за справяне със стреса тук.
      -
    6. -
    - -;T; @I"%/blog/2014-11-11-закуска/;T{;{ ;I"; - - - - - - - Кое е най-важното хранене за деня? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Кое е най-важното хранене за деня? -

    - -
    -
      -
    • - - November 11, 2014 -
    • -
    -
    - - -

    “Закуската изяж сам,
    -Обяда раздели с приятел
    -Вечерята дай на врага си…“

    - -

    Тази японска мъдрост често се спряга като правилният начин на хранене, а всъщност много хора вечерят обилно и закусват кафе. Други държат на шест хранения дневно; трети се кълнат в периодичното гладуване. Къде е истината? Колко често трябва да се храним на ден, за да сме здрави и да имаме достатъчно енергия за работа, за спорт, за любимите си занимания и пълноценна почивка.

    - -

    Да закусваме или да не закусваме? -“Закуската е най-важното хранене” - няма начин да не сте чували това. Следва обяснението, че със закуската събуждаме метаболизма и това помага на тялото да има енергия през целият ден и да гори мазнини. Истината обаче е, че нощем тялото е в режим на горене на мазнини и елиминиране на токсини и първото хранене за деня прекъсва тези процеси и променя хормоналният състав на кръвта. Със закуската се повишава кръвната захар, отделя се инсулин (анаболен хормон, който предизвиква растеж на мазнини или мускули) и спира горенето на мазнини. Дали влиянието на инсулина ще се отрази на мазнините или мускулите зависи от вида на приетата храна, физическата активност (или липсата на такава), последвала закуската и общото здравословно състояние на организма. -Много хора започват деня си със сандвич, баничка, поничка или кифла, за да имат енергия, но след това сядат в офиса и нямат движение до обяд, когато вече са озверели от глад. Ето защо става така: Тестеният продукт е богат на въглехидрати. Консумацията набавя много калории (бърза енергия) и предизвиква отделянето на голямо количество инсулин. Ако тези калории не се изразходват чрез физическа дейност или тренировка, по-голямата част се натрупват като подкожни мазнини. Освен това след нормализирането на кръвната захар, човек усеща спад в енергията и желание за още храна - например солети или нещо сладко. Така се получава един омагьосан кръг на глад и ядене на въглехидрати. Т.е. “яденето на въглехидрати сутрин е по-здравословно” е поредният мит. По-разумно е ако човек е гладен и иска да закусва да избере източник на протеин, в комбинация с полезни мазнини и порция зеленчуци. Например омлет със сирене и домат; варени яйца с маслини и краставица; кисело мляко с половин плод и няколко ядки; няколко лъжици ядково масло или тахан; парче кашкавал или дори някакво месо. Всички тези закуски ще ви държат дълго време сити, без да изпитвате неистово желание за “нещо сладко” в часовете преди обяда. Най-добре е сладкото (малка порция) да изядете вечер, за да избегнете инсулиновият пик и да не мислите за вафли и шоколади цял ден или преди тренировка, когато ще използвате калориите по предназначение.

    - -

    По-честите хранения забързват ли метаболизма? Тази идея се обуславя на теорията за термичният ефект на храната: за обработването на храната, тялото гори известно количество енергия. Да, но разлика между 3 хранения по 600 калории и 6 хранения по 300 калории няма - тялото изразходва едно и също количество енергия, за да обработи храната. Разликата е, че с по-малко, но по-обилни хранения ще сте по-сити и няма да се налага да мислите за храна през няколко часа; кръвната ви захар ще има по-стабилни нива и няма да имате необясними желания за храна.
    -Часовник

    - -

    Удачно ли е да пропускаме хранене понякога? Т.нар. фастове (fast n. - пост) е актуална тема в здравословното хранене. Състои се в пропускане на закуската и обяда веднъж на няколко дни или по-дълги периоди 24-36 часа веднъж седмично. Според досегашните общоприети схващания, такива крайни рестрикции на храна биха довели организма до нетърпим глад и липса на енергия. Истината обаче е, че гладът стимулира метаболизма, подобрява хормоналната чувствителност и активизира тялото. Този начин на хранене е доста близък до начина на хранене в недалечното минало, напр. за хората в началото на миналият век. Контролираният глад активизира автофагията: процес в тялото, при който клетките “изяждат” непотребните и дефектните и по този начин се освобождава място за нови и здрави клетки, профилактират се злокачествени заболявания и има подмладяващ ефект за тъканите.

    - -

    Изводи? Има много митове и недоизяснени факти относно храненето. Истината е тази: яжте качествена храна, която да дава енергия и да служи за градивен материал на клетките в тялото ви.
    -Когато сте гладни - яжте.
    -Когато се заситите - спрете.
    -Повторете при нужда.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I""Закуската изяж сам,
    -Обяда раздели с приятел
    -Вечерята дай на врага си..."
    - -Тази японска мъдрост често се спряга като правилният начин на хранене, а всъщност много хора вечерят обилно и закусват кафе. Други държат на шест хранения дневно; трети се кълнат в периодичното гладуване. Къде е истината? Колко често трябва да се храним на ден, за да сме здрави и да имаме достатъчно енергия за работа, за спорт, за любимите си занимания и пълноценна почивка. - -**Да закусваме или да не закусваме?** -"Закуската е най-важното хранене" - няма начин да не сте чували това. Следва обяснението, че със закуската събуждаме метаболизма и това помага на тялото да има енергия през целият ден и да гори мазнини. Истината обаче е, че нощем тялото е в режим на горене на мазнини и елиминиране на токсини и първото хранене за деня прекъсва тези процеси и променя хормоналният състав на кръвта. Със закуската се повишава кръвната захар, отделя се инсулин (анаболен хормон, който предизвиква растеж на мазнини или мускули) и спира горенето на мазнини. Дали влиянието на инсулина ще се отрази на мазнините или мускулите зависи от вида на приетата храна, физическата активност (или липсата на такава), последвала закуската и общото здравословно състояние на организма. -Много хора започват деня си със сандвич, баничка, поничка или кифла, за да имат енергия, но след това сядат в офиса и нямат движение до обяд, когато вече са озверели от глад. Ето защо става така: Тестеният продукт е богат на въглехидрати. Консумацията набавя много калории (бърза енергия) и предизвиква отделянето на голямо количество инсулин. Ако тези калории не се изразходват чрез физическа дейност или тренировка, по-голямата част се натрупват като подкожни мазнини. Освен това след нормализирането на кръвната захар, човек усеща спад в енергията и желание за още храна - например солети или нещо сладко. Така се получава един омагьосан кръг на глад и ядене на въглехидрати. Т.е. "яденето на въглехидрати сутрин е по-здравословно" е поредният мит. По-разумно е ако човек е гладен и иска да закусва да избере източник на протеин, в комбинация с полезни мазнини и порция зеленчуци. Например омлет със сирене и домат; варени яйца с маслини и краставица; кисело мляко с половин плод и няколко ядки; няколко лъжици ядково масло или тахан; парче кашкавал или дори някакво месо. Всички тези закуски ще ви държат дълго време сити, без да изпитвате неистово желание за "нещо сладко" в часовете преди обяда. Най-добре е сладкото (малка порция) да изядете вечер, за да избегнете инсулиновият пик и да не мислите за вафли и шоколади цял ден или преди тренировка, когато ще използвате калориите по предназначение. - -**По-честите хранения забързват ли метаболизма?** Тази идея се обуславя на теорията за термичният ефект на храната: за обработването на храната, тялото гори известно количество енергия. Да, но разлика между 3 хранения по 600 калории и 6 хранения по 300 калории няма - тялото изразходва едно и също количество енергия, за да обработи храната. Разликата е, че с по-малко, но по-обилни хранения ще сте по-сити и няма да се налага да мислите за храна през няколко часа; кръвната ви захар ще има по-стабилни нива и няма да имате [необясними желания за храна](/blog/2014-10-19-%D0%B7%D0%B0-%D0%BA%D0%B0%D0%BA%D0%B2%D0%BE-%D0%B3%D0%BB%D0%B0%D0%B4%D1%83%D0%B2%D0%B0-%D1%82%D1%8F%D0%BB%D0%BE%D1%82%D0%BE-%D0%B2%D0%B8/).
    -![Часовник](/images/posts/Clock.jpg){:width="300px"}
    - -**Удачно ли е да пропускаме хранене понякога?** Т.нар. фастове (fast n. - пост) е актуална тема в здравословното хранене. Състои се в пропускане на закуската и обяда веднъж на няколко дни или по-дълги периоди 24-36 часа веднъж седмично. Според досегашните общоприети схващания, такива крайни рестрикции на храна биха довели организма до нетърпим глад и липса на енергия. Истината обаче е, че гладът стимулира метаболизма, подобрява хормоналната чувствителност и активизира тялото. Този начин на хранене е доста близък до начина на хранене в недалечното минало, напр. за хората в началото на миналият век. Контролираният глад активизира автофагията: процес в тялото, при който клетките "изяждат" непотребните и дефектните и по този начин се освобождава място за нови и здрави клетки, профилактират се злокачествени заболявания и има подмладяващ ефект за тъканите. - -**Изводи?** Има много митове и недоизяснени факти относно храненето. Истината е тази: яжте качествена храна, която да дава енергия и да служи за градивен материал на клетките в тялото ви.
    -Когато сте гладни - яжте.
    -Когато се заситите - спрете.
    -Повторете при нужда. - - - - - - - - -;T; -I"

    “Закуската изяж сам,
    -Обяда раздели с приятел
    -Вечерята дай на врага си…“

    - -

    Тази японска мъдрост често се спряга като правилният начин на хранене, а всъщност много хора вечерят обилно и закусват кафе. Други държат на шест хранения дневно; трети се кълнат в периодичното гладуване. Къде е истината? Колко често трябва да се храним на ден, за да сме здрави и да имаме достатъчно енергия за работа, за спорт, за любимите си занимания и пълноценна почивка.

    - -

    Да закусваме или да не закусваме? -“Закуската е най-важното хранене” - няма начин да не сте чували това. Следва обяснението, че със закуската събуждаме метаболизма и това помага на тялото да има енергия през целият ден и да гори мазнини. Истината обаче е, че нощем тялото е в режим на горене на мазнини и елиминиране на токсини и първото хранене за деня прекъсва тези процеси и променя хормоналният състав на кръвта. Със закуската се повишава кръвната захар, отделя се инсулин (анаболен хормон, който предизвиква растеж на мазнини или мускули) и спира горенето на мазнини. Дали влиянието на инсулина ще се отрази на мазнините или мускулите зависи от вида на приетата храна, физическата активност (или липсата на такава), последвала закуската и общото здравословно състояние на организма. -Много хора започват деня си със сандвич, баничка, поничка или кифла, за да имат енергия, но след това сядат в офиса и нямат движение до обяд, когато вече са озверели от глад. Ето защо става така: Тестеният продукт е богат на въглехидрати. Консумацията набавя много калории (бърза енергия) и предизвиква отделянето на голямо количество инсулин. Ако тези калории не се изразходват чрез физическа дейност или тренировка, по-голямата част се натрупват като подкожни мазнини. Освен това след нормализирането на кръвната захар, човек усеща спад в енергията и желание за още храна - например солети или нещо сладко. Така се получава един омагьосан кръг на глад и ядене на въглехидрати. Т.е. “яденето на въглехидрати сутрин е по-здравословно” е поредният мит. По-разумно е ако човек е гладен и иска да закусва да избере източник на протеин, в комбинация с полезни мазнини и порция зеленчуци. Например омлет със сирене и домат; варени яйца с маслини и краставица; кисело мляко с половин плод и няколко ядки; няколко лъжици ядково масло или тахан; парче кашкавал или дори някакво месо. Всички тези закуски ще ви държат дълго време сити, без да изпитвате неистово желание за “нещо сладко” в часовете преди обяда. Най-добре е сладкото (малка порция) да изядете вечер, за да избегнете инсулиновият пик и да не мислите за вафли и шоколади цял ден или преди тренировка, когато ще използвате калориите по предназначение.

    - -

    По-честите хранения забързват ли метаболизма? Тази идея се обуславя на теорията за термичният ефект на храната: за обработването на храната, тялото гори известно количество енергия. Да, но разлика между 3 хранения по 600 калории и 6 хранения по 300 калории няма - тялото изразходва едно и също количество енергия, за да обработи храната. Разликата е, че с по-малко, но по-обилни хранения ще сте по-сити и няма да се налага да мислите за храна през няколко часа; кръвната ви захар ще има по-стабилни нива и няма да имате необясними желания за храна.
    -Часовник

    - -

    Удачно ли е да пропускаме хранене понякога? Т.нар. фастове (fast n. - пост) е актуална тема в здравословното хранене. Състои се в пропускане на закуската и обяда веднъж на няколко дни или по-дълги периоди 24-36 часа веднъж седмично. Според досегашните общоприети схващания, такива крайни рестрикции на храна биха довели организма до нетърпим глад и липса на енергия. Истината обаче е, че гладът стимулира метаболизма, подобрява хормоналната чувствителност и активизира тялото. Този начин на хранене е доста близък до начина на хранене в недалечното минало, напр. за хората в началото на миналият век. Контролираният глад активизира автофагията: процес в тялото, при който клетките “изяждат” непотребните и дефектните и по този начин се освобождава място за нови и здрави клетки, профилактират се злокачествени заболявания и има подмладяващ ефект за тъканите.

    - -

    Изводи? Има много митове и недоизяснени факти относно храненето. Истината е тази: яжте качествена храна, която да дава енергия и да служи за градивен материал на клетките в тялото ви.
    -Когато сте гладни - яжте.
    -Когато се заситите - спрете.
    -Повторете при нужда.

    - -;T; @I"/blog/2014-11-17-мед/;T{;{ ;I"/ - - - - - - - Истината за меда - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Истината за меда -

    - -
    -
      -
    • - - November 17, 2014 -
    • -
    -
    - - -

    За хората, които се интересуват от здравословен начин на живот, отдавна е известно, че бялата захар е клетъчна отрова и една от най-големите причини за редица заболявания.

    - -

    Е да, обаче хранителната промишленост не спи и промотира нови и най-различни заместители на захарта. Темата е доста обширна и имам доста да кажа по нея, но днес ще ви кажа моето мнение за меда.

    - -

    Меда, като природен продукт се смята за много полезен и често можете да срещнете твърдения като: “Меда е лекарство”, “Най-полезната храна” “Златното чудо на Природата” “Храна на Боговете” и т.н. Тези лозунги могат, и реално заблуждават много хора, че меда може да се яде в неограничени количества, без никакви вредни последствия за тялото.
    -Мед

    - -

    Наистина, храната която идва директно от Природата е по-добрият избор, отколкото стоките в супермаркета. Но ето състава на меда:
    -- 82% захар (да, за захар става въпрос)
    -- половината от тази захар е фруктоза (40% от общото тегло на меда)
    -- следи от витамини
    -- 1% антиоксиданти
    -- минерали
    -- 17% вода

    - -

    С други думи: Меда повишава кръвната захар почти колкото бялата рафинирана захар и в това отношение няма голяма разлика в полезността. Т.е. ако имате здравословно състояние, което изисква контрол на инсулина (метаболитен синдром, диабет) или се опитвате да контролирате калориите и да отслабнете е по-добре да избягвате употребата на мед.

    - -

    Ако нямате по-горните съображения, ето какви ползи можете да извлечете от меда:
    -1. Меда е богат на антиоксиданти, които обогатяват кръвта и помагат на тялото да се справи с токсините и вредните ефекти от стреса.
    -2. Разнообразен набор от минерали, който помага за възстановяването при простудни заболявания и грип. Важно уточнение е, че меда трябва да е суров, т.е. да не се слага във горещ чай или да се обработва термично в храна.
    -3. Бърз и полезен източник на енергия за спортуващи и активни хора. Минералите в състава му също допринасят за активното възстановяване при физическо усилие.

    - -

    Какъв мед да изберем? Няма да ви давам указания как да познаете дали меда е истински и дали пчелите са хранени или не със захар - това е материя, която не ми е позната. Единственото което мога със сигурност да твърдя е, че медът с по-тъмен и наситен цвят е с по-високо съдържание на минерали и полезни вещества. Например тъмният Манов мед има до 20 пъти повече антиоксиданти, магнезий, желязо. Лечебните му ползи можете да извлечете, ако го консумирате в лечебни дози - не повече от 1-2 супени лъжици дневно. Именно като силно концентрирана натурална храна, Природата го е направила с толкова сладък и силен вкус, за да ядем по малко и да получим само добрите ефекти от него.

    - -

    Надявам се тази статия да ви е била интересна и полезна. Ако е така, споделете я с приятелите си чрез бутоните отдолу.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"DЗа хората, които се интересуват от здравословен начин на живот, отдавна е известно, че [бялата захар](/blog/2014-05-05-%D0%BD%D0%B0%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0-%D0%BB%D0%B8-%D0%B7%D0%B0%D1%85%D0%B0%D1%80%D1%82%D0%B0-%D0%B5-%D1%82%D0%BE%D0%BB%D0%BA%D0%BE%D0%B2%D0%B0-%D0%B2%D1%80%D0%B5%D0%B4%D0%BD%D0%B0/) е клетъчна отрова и една от най-големите причини за редица заболявания. - -Е да, обаче хранителната промишленост не спи и промотира нови и най-различни заместители на захарта. Темата е доста обширна и имам доста да кажа по нея, но днес ще ви кажа моето мнение за меда. - -Меда, като природен продукт се смята за много полезен и често можете да срещнете твърдения като: "Меда е лекарство", "Най-полезната храна" "Златното чудо на Природата" "Храна на Боговете" и т.н. Тези лозунги могат, и реално заблуждават много хора, че меда може да се яде в неограничени количества, без никакви вредни последствия за тялото.
    -![Мед](/images/posts/Honey.jpg){:width="300px"}
    - -Наистина, храната която идва директно от Природата е по-добрият избор, отколкото стоките в супермаркета. Но ето **състава на меда**:
    -- 82% захар (да, за захар става въпрос)
    -- половината от тази захар е фруктоза (40% от общото тегло на меда)
    -- следи от витамини
    -- 1% антиоксиданти
    -- минерали
    -- 17% вода
    - -С други думи: **Меда повишава кръвната захар почти колкото бялата рафинирана захар** и в това отношение няма голяма разлика в полезността. Т.е. ако имате здравословно състояние, което изисква контрол на инсулина (метаболитен синдром, диабет) или се опитвате да контролирате калориите и да отслабнете е по-добре да избягвате употребата на мед. - -Ако нямате по-горните съображения, ето какви ползи можете да извлечете от меда:
    -1. Меда е богат на **антиоксиданти**, които обогатяват кръвта и помагат на тялото да се справи с токсините и вредните ефекти от стреса.
    -2. Разнообразен набор от **минерали**, който помага за възстановяването при простудни заболявания и грип. Важно уточнение е, че меда трябва да е суров, т.е. да не се слага във горещ чай или да се обработва термично в храна.
    -3. Бърз и полезен **източник на енергия** за спортуващи и активни хора. Минералите в състава му също допринасят за активното възстановяване при физическо усилие.
    - -**Какъв мед да изберем?** Няма да ви давам указания как да познаете дали меда е истински и дали пчелите са хранени или не със захар - това е материя, която не ми е позната. Единственото което мога със сигурност да твърдя е, че медът с по-тъмен и наситен цвят е с по-високо съдържание на минерали и полезни вещества. Например тъмният Манов мед има до 20 пъти повече антиоксиданти, магнезий, желязо. Лечебните му ползи можете да извлечете, ако го консумирате в лечебни дози - не повече от 1-2 супени лъжици дневно. Именно като силно концентрирана натурална храна, Природата го е направила с толкова сладък и силен вкус, за да ядем по малко и да получим само добрите ефекти от него. - -Надявам се тази статия да ви е била интересна и полезна. Ако е така, споделете я с приятелите си чрез бутоните отдолу. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;T; -I"$

    За хората, които се интересуват от здравословен начин на живот, отдавна е известно, че бялата захар е клетъчна отрова и една от най-големите причини за редица заболявания.

    - -

    Е да, обаче хранителната промишленост не спи и промотира нови и най-различни заместители на захарта. Темата е доста обширна и имам доста да кажа по нея, но днес ще ви кажа моето мнение за меда.

    - -

    Меда, като природен продукт се смята за много полезен и често можете да срещнете твърдения като: “Меда е лекарство”, “Най-полезната храна” “Златното чудо на Природата” “Храна на Боговете” и т.н. Тези лозунги могат, и реално заблуждават много хора, че меда може да се яде в неограничени количества, без никакви вредни последствия за тялото.
    -Мед

    - -

    Наистина, храната която идва директно от Природата е по-добрият избор, отколкото стоките в супермаркета. Но ето състава на меда:
    -- 82% захар (да, за захар става въпрос)
    -- половината от тази захар е фруктоза (40% от общото тегло на меда)
    -- следи от витамини
    -- 1% антиоксиданти
    -- минерали
    -- 17% вода

    - -

    С други думи: Меда повишава кръвната захар почти колкото бялата рафинирана захар и в това отношение няма голяма разлика в полезността. Т.е. ако имате здравословно състояние, което изисква контрол на инсулина (метаболитен синдром, диабет) или се опитвате да контролирате калориите и да отслабнете е по-добре да избягвате употребата на мед.

    - -

    Ако нямате по-горните съображения, ето какви ползи можете да извлечете от меда:
    -1. Меда е богат на антиоксиданти, които обогатяват кръвта и помагат на тялото да се справи с токсините и вредните ефекти от стреса.
    -2. Разнообразен набор от минерали, който помага за възстановяването при простудни заболявания и грип. Важно уточнение е, че меда трябва да е суров, т.е. да не се слага във горещ чай или да се обработва термично в храна.
    -3. Бърз и полезен източник на енергия за спортуващи и активни хора. Минералите в състава му също допринасят за активното възстановяване при физическо усилие.

    - -

    Какъв мед да изберем? Няма да ви давам указания как да познаете дали меда е истински и дали пчелите са хранени или не със захар - това е материя, която не ми е позната. Единственото което мога със сигурност да твърдя е, че медът с по-тъмен и наситен цвят е с по-високо съдържание на минерали и полезни вещества. Например тъмният Манов мед има до 20 пъти повече антиоксиданти, магнезий, желязо. Лечебните му ползи можете да извлечете, ако го консумирате в лечебни дози - не повече от 1-2 супени лъжици дневно. Именно като силно концентрирана натурална храна, Природата го е направила с толкова сладък и силен вкус, за да ядем по малко и да получим само добрите ефекти от него.

    - -

    Надявам се тази статия да ви е била интересна и полезна. Ако е така, споделете я с приятелите си чрез бутоните отдолу.

    - -;T; @ I"(/blog/2014-11-25-на-бюджет/;T{;{ ;I"; - - - - - - - Здравословно хранене почти без пари - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Здравословно хранене почти без пари -

    - -
    -
      -
    • - - November 25, 2014 -
    • -
    -
    - - -

    В идеалният случай всички ще живеем в гора, където ще се изхранваме с дивечово месо, прясно уловена риба от реката, плодове от дърветата наоколо и свежи зеленчуци от малката ни градинка.

    - -

    Истината е, че такава прехрана могат да си позволят твърде малко домакинства. Повечето семейства имат ограничен месечен бюджет в който трябва да вместят стотици плащания и често се правят компромиси с качеството на храната, за сметка на количеството.

    - -

    Ето няколко съвета как да имате по-здравословна храна на трапезата си и едновременно с това да се поберете в бюджета за месеца.

    - -
      -
    1. -

      Първото и най-важно нещо е да планирате храненията за седмицата. По този начин ще се налага да пазарувате веднъж седмично и да се ограничите в излишните разходи, които неминуемо се случват при всяко влизане в магазина или дори ще спестите от гориво за автомобила си при неколкократно пътуване до хипермаркета. -Как реално се случва: направете списък с 12-15 ястия, които обичат всички вкъщи и смятате за полезни и добри за вашето семейство. Напишете седмично меню за вечерята и закуската. Обяда често е навън или в офиса и ще бъде част от снощната вечеря. -Направете списък с нужните продукти за достатъчно на брой порции (за вечеря и обяд) и купете всичко необходимо - месо, млечни продукти, зеленчуци, варива, плодове. Ако консумирате хляб може да купувате пресен на няколко дни по възможност от хлебарница, за да не се изкушавате от други излишни стоки в супермаркета.

      -
    2. -
    3. -

      Намерете фермерски пазар или хранителен кооператив във вашият град или в близките села. На тези места можете да намерите пресни и домашни месо, мляко и яйца с много по-добро качество и вкус от тези, които се продават в търговската мрежа. Добра идея е да си купите част от цяло прасе или теле, няколко пилета и т.н. По този начин ще ви излезе по-изгодно и ще имате продукти за по-дълго време. Нерядко производителите продават зеленчуци и плодове, които отглеждат в малки количества за своите семейства и те отново са по-добрият избор, а често и по-евтин такъв.
      -Мед

      -
    4. -
    5. -

      Най-добрият избор, който можете да направите при избора си на зеленчуци и плодове е да избирате сезонни и местни такива. Те са възможно най-пресни, най-малко обработвани с химикали и най-кратко престояли в складове и транспортни средства. Ако обаче ви се прииска да си хапнете ягоди през януари имате ли избор? И още как! Замразените зеленчуци и плодове са идеален вариант, тъй като производителите ги пакетират именно, когато им е сезонът. Освен това не са скъпи и са по-полезни от пресните им варианти извън сезона. Сушените плодове са силно компромисен вариант, тъй като те се обработват със захарни разтвори и всъщност няма останало почти нищо полезно в тях. Домашните сушени плодове разбира се са чудесно изключение. -Друг метод да си набавите полезна и дори безплатна храна е да си направите разходка в гората с някой познат гъбар и да съберете гъби. Разбира се, тук трябва много да се внимава и някой да познава наистина добре видовете гъби. През лятото пък си направете почивка в планината и съберете къпини, боровинки, шипки и други дребни горски плодове. Те са изключително полезни, дори в минимални количества и затова са толкова ценни и трудни за събиране.

      -
    6. -
    7. -

      Научете се как да пазарувате в Интернет. Световната мрежа предлага хиляди възможности за пазаруване, но вече е достъпно да си купувате дори хранителни продукти. Тъй като потреблението е в огромни мащаби често има големи намаления на всякакви стоки. Кокосовото масло, спирулина или рибено масло са част от нещата, които може да си набавите на много достъпна цена. Ако използвате хранителни добавки или екзотични и суперхрани, можете да ги намерите с до 100% по-евтино, отколкото в българските магазини. Например в сайта iHerb.com можете да използвате този код: SRW073 и да получите отстъпка от 10$ при първата си поръчка.

      -
    8. -
    9. -

      Не купувайте напитки. За да спестите още повече пари, а и вредни ефекти върху здравето си спрете да купувате напитки: газирани, сокове, разтворими напитки, здравословни млека от типа на соево или оризово мляко. Всички те съдържат знайни и незнайни химически производни, захар или (по-лошият вариант) подсладители, оцветители, консерванти и т.н. Спрете да внасяте в дома си тези ненужни стоки и ги заменете с полезни напитки като вода, чай, айран, кефир, газирана вода. Малко по малко всички членове на семейството ще променят вкуса си и ще забравят за тях.

      -
    10. -
    - -

    Надявам се днешната статия да ви е била интересна и полезна. Ако е така, споделете с приятелите си.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"В идеалният случай всички ще живеем в гора, където ще се изхранваме с дивечово месо, прясно уловена риба от реката, плодове от дърветата наоколо и свежи зеленчуци от малката ни градинка. - -Истината е, че такава прехрана могат да си позволят твърде малко домакинства. Повечето семейства имат ограничен месечен бюджет в който трябва да вместят стотици плащания и често се правят компромиси с качеството на храната, за сметка на количеството. - -Ето няколко съвета как да имате по-здравословна храна на трапезата си и едновременно с това да се поберете в бюджета за месеца. - -1. Първото и най-важно нещо е да **планирате храненията** за седмицата. По този начин ще се налага да пазарувате веднъж седмично и да се ограничите в излишните разходи, които неминуемо се случват при всяко влизане в магазина или дори ще спестите от гориво за автомобила си при неколкократно пътуване до хипермаркета. -Как реално се случва: направете списък с 12-15 ястия, които обичат всички вкъщи и смятате за полезни и добри за вашето семейство. Напишете седмично меню за вечерята и закуската. Обяда често е навън или в офиса и ще бъде част от снощната вечеря. -Направете списък с нужните продукти за достатъчно на брой порции (за вечеря и обяд) и купете всичко необходимо - месо, млечни продукти, зеленчуци, варива, плодове. Ако консумирате хляб може да купувате пресен на няколко дни по възможност от хлебарница, за да не се изкушавате от други излишни стоки в супермаркета. - -2. Намерете **фермерски пазар** или **хранителен кооператив** във вашият град или в близките села. На тези места можете да намерите пресни и домашни месо, мляко и яйца с много по-добро качество и вкус от тези, които се продават в търговската мрежа. Добра идея е да си купите част от цяло прасе или теле, няколко пилета и т.н. По този начин ще ви излезе по-изгодно и ще имате продукти за по-дълго време. Нерядко производителите продават зеленчуци и плодове, които отглеждат в малки количества за своите семейства и те отново са по-добрият избор, а често и по-евтин такъв.
    -![Мед](/images/posts/Pig.jpg){:width="300px"}
    - -3. Най-добрият избор, който можете да направите при избора си на **зеленчуци и плодове** е да избирате **сезонни и местни** такива. Те са възможно най-пресни, най-малко обработвани с химикали и най-кратко престояли в складове и транспортни средства. Ако обаче ви се прииска да си хапнете ягоди през януари имате ли избор? И още как! Замразените зеленчуци и плодове са идеален вариант, тъй като производителите ги пакетират именно, когато им е сезонът. Освен това не са скъпи и са по-полезни от пресните им варианти извън сезона. Сушените плодове са силно компромисен вариант, тъй като те се обработват със захарни разтвори и всъщност няма останало почти нищо полезно в тях. Домашните сушени плодове разбира се са чудесно изключение. -Друг метод да си набавите полезна и дори безплатна храна е да си направите разходка в гората с някой познат гъбар и да съберете гъби. Разбира се, тук трябва много да се внимава и някой да познава наистина добре видовете гъби. През лятото пък си направете почивка в планината и съберете къпини, боровинки, шипки и други дребни горски плодове. Те са изключително полезни, дори в минимални количества и затова са толкова ценни и трудни за събиране. - -4. Научете се как да **пазарувате в Интернет**. Световната мрежа предлага хиляди възможности за пазаруване, но вече е достъпно да си купувате дори хранителни продукти. Тъй като потреблението е в огромни мащаби често има големи намаления на всякакви стоки. Кокосовото масло, спирулина или рибено масло са част от нещата, които може да си набавите на много достъпна цена. Ако използвате хранителни добавки или екзотични и суперхрани, можете да ги намерите с до 100% по-евтино, отколкото в българските магазини. Например в сайта iHerb.com можете да използвате този код: SRW073 и да получите отстъпка от 10$ при първата си поръчка. - -5. **Не купувайте напитки**. За да спестите още повече пари, а и вредни ефекти върху здравето си спрете да купувате напитки: газирани, сокове, разтворими напитки, здравословни млека от типа на соево или оризово мляко. Всички те съдържат знайни и незнайни химически производни, захар или (по-лошият вариант) подсладители, оцветители, консерванти и т.н. Спрете да внасяте в дома си тези ненужни стоки и ги заменете с полезни напитки като вода, чай, айран, кефир, газирана вода. Малко по малко всички членове на семейството ще променят вкуса си и ще забравят за тях. - -Надявам се днешната статия да ви е била интересна и полезна. Ако е така, споделете с приятелите си. - - - - - - - - - - - - -;T; -I"

    В идеалният случай всички ще живеем в гора, където ще се изхранваме с дивечово месо, прясно уловена риба от реката, плодове от дърветата наоколо и свежи зеленчуци от малката ни градинка.

    - -

    Истината е, че такава прехрана могат да си позволят твърде малко домакинства. Повечето семейства имат ограничен месечен бюджет в който трябва да вместят стотици плащания и често се правят компромиси с качеството на храната, за сметка на количеството.

    - -

    Ето няколко съвета как да имате по-здравословна храна на трапезата си и едновременно с това да се поберете в бюджета за месеца.

    - -
      -
    1. -

      Първото и най-важно нещо е да планирате храненията за седмицата. По този начин ще се налага да пазарувате веднъж седмично и да се ограничите в излишните разходи, които неминуемо се случват при всяко влизане в магазина или дори ще спестите от гориво за автомобила си при неколкократно пътуване до хипермаркета. -Как реално се случва: направете списък с 12-15 ястия, които обичат всички вкъщи и смятате за полезни и добри за вашето семейство. Напишете седмично меню за вечерята и закуската. Обяда често е навън или в офиса и ще бъде част от снощната вечеря. -Направете списък с нужните продукти за достатъчно на брой порции (за вечеря и обяд) и купете всичко необходимо - месо, млечни продукти, зеленчуци, варива, плодове. Ако консумирате хляб може да купувате пресен на няколко дни по възможност от хлебарница, за да не се изкушавате от други излишни стоки в супермаркета.

      -
    2. -
    3. -

      Намерете фермерски пазар или хранителен кооператив във вашият град или в близките села. На тези места можете да намерите пресни и домашни месо, мляко и яйца с много по-добро качество и вкус от тези, които се продават в търговската мрежа. Добра идея е да си купите част от цяло прасе или теле, няколко пилета и т.н. По този начин ще ви излезе по-изгодно и ще имате продукти за по-дълго време. Нерядко производителите продават зеленчуци и плодове, които отглеждат в малки количества за своите семейства и те отново са по-добрият избор, а често и по-евтин такъв.
      -Мед

      -
    4. -
    5. -

      Най-добрият избор, който можете да направите при избора си на зеленчуци и плодове е да избирате сезонни и местни такива. Те са възможно най-пресни, най-малко обработвани с химикали и най-кратко престояли в складове и транспортни средства. Ако обаче ви се прииска да си хапнете ягоди през януари имате ли избор? И още как! Замразените зеленчуци и плодове са идеален вариант, тъй като производителите ги пакетират именно, когато им е сезонът. Освен това не са скъпи и са по-полезни от пресните им варианти извън сезона. Сушените плодове са силно компромисен вариант, тъй като те се обработват със захарни разтвори и всъщност няма останало почти нищо полезно в тях. Домашните сушени плодове разбира се са чудесно изключение. -Друг метод да си набавите полезна и дори безплатна храна е да си направите разходка в гората с някой познат гъбар и да съберете гъби. Разбира се, тук трябва много да се внимава и някой да познава наистина добре видовете гъби. През лятото пък си направете почивка в планината и съберете къпини, боровинки, шипки и други дребни горски плодове. Те са изключително полезни, дори в минимални количества и затова са толкова ценни и трудни за събиране.

      -
    6. -
    7. -

      Научете се как да пазарувате в Интернет. Световната мрежа предлага хиляди възможности за пазаруване, но вече е достъпно да си купувате дори хранителни продукти. Тъй като потреблението е в огромни мащаби често има големи намаления на всякакви стоки. Кокосовото масло, спирулина или рибено масло са част от нещата, които може да си набавите на много достъпна цена. Ако използвате хранителни добавки или екзотични и суперхрани, можете да ги намерите с до 100% по-евтино, отколкото в българските магазини. Например в сайта iHerb.com можете да използвате този код: SRW073 и да получите отстъпка от 10$ при първата си поръчка.

      -
    8. -
    9. -

      Не купувайте напитки. За да спестите още повече пари, а и вредни ефекти върху здравето си спрете да купувате напитки: газирани, сокове, разтворими напитки, здравословни млека от типа на соево или оризово мляко. Всички те съдържат знайни и незнайни химически производни, захар или (по-лошият вариант) подсладители, оцветители, консерванти и т.н. Спрете да внасяте в дома си тези ненужни стоки и ги заменете с полезни напитки като вода, чай, айран, кефир, газирана вода. Малко по малко всички членове на семейството ще променят вкуса си и ще забравят за тях.

      -
    10. -
    - -

    Надявам се днешната статия да ви е била интересна и полезна. Ако е така, споделете с приятелите си.

    - -;T; @I":/blog/2014-12-01-бананови-палачинки/;T{;{ ;I"$ - - - - - - - Бананови палачинки - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Бананови палачинки -

    - -
    -
      -
    • - - December 1, 2014 -
    • -
    -
    - - -

    Отдавна искам да ви представя тази изключително вкусна и лесна рецепта, но винаги всичко се изяжда преди снимките. Днес обаче ви представям банановите палачинки.

    - -

    Всичко от което се нуждаете са банани и яйца. Евентуално можете да използвате кокосово масло за тигана и сладко, канела, мед или тахан с които да намажете готовите палачинки. Но и само комбинацията банани с яйца е достатъчно вкусна, сладка и ароматна.

    - -

    Първа стъпка в приготвянето на палачинките е да изберете добре узрели банани, които да намачкайте до не идеално гладко пюре.

    - -

    Следващи по ред са яйцата, които разбивате много добре и към тях добавяте банановата каша.
    -Палачинки1

    - -

    Тиганът е загрят на средно-висока температура (5/9 при мен) и слагате съвсем малко кокосово масло. Неговата роля е повече за аромат, но ако тигана ви не е с незалепващо покритие може да се наложи да сложите повече - 1/2 чаена лъжичка например.

    - -

    С лъжица разсипвате сместа като една голяма или няколко малки палачинки и когато ръбчетата побелеят (това е коагулираният яйчен белтък) можете да ги обърнете да се изпекат и от другата страна. Ориентировъчно им трябва по 60-70 секунди на страна.
    -Палачинки2

    - -

    Вкусни са топли, студени, намазани с любимо сладко или мед, поръсени с кокосови стърготини или (лешников) тахан. Развихрете фантазията на вкусовете си.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I" Отдавна искам да ви представя тази изключително вкусна и лесна рецепта, но винаги всичко се изяжда преди снимките. Днес обаче ви представям **банановите палачинки**. - -Всичко от което се нуждаете са банани и яйца. Евентуално можете да използвате кокосово масло за тигана и сладко, канела, мед или тахан с които да намажете готовите палачинки. Но и само комбинацията банани с яйца е достатъчно вкусна, сладка и ароматна. - -Първа стъпка в приготвянето на палачинките е да изберете добре узрели банани, които да намачкайте до не идеално гладко пюре. - -Следващи по ред са яйцата, които разбивате много добре и към тях добавяте банановата каша.
    -![Палачинки1](/images/posts/Banana1.jpg){:width="500px"}
    - -Тиганът е загрят на средно-висока температура (5/9 при мен) и слагате съвсем малко кокосово масло. Неговата роля е повече за аромат, но ако тигана ви не е с незалепващо покритие може да се наложи да сложите повече - 1/2 чаена лъжичка например. - -С лъжица разсипвате сместа като една голяма или няколко малки палачинки и когато ръбчетата побелеят (това е коагулираният яйчен белтък) можете да ги обърнете да се изпекат и от другата страна. Ориентировъчно им трябва по 60-70 секунди на страна.
    -![Палачинки2](/images/posts/Banana2.jpg){:width="500px"}
    - -Вкусни са топли, студени, намазани с любимо сладко или мед, поръсени с кокосови стърготини или (лешников) тахан. Развихрете фантазията на вкусовете си. - - - - - - - - - - - - - - - - - - - - -;T; -I"

    Отдавна искам да ви представя тази изключително вкусна и лесна рецепта, но винаги всичко се изяжда преди снимките. Днес обаче ви представям банановите палачинки.

    - -

    Всичко от което се нуждаете са банани и яйца. Евентуално можете да използвате кокосово масло за тигана и сладко, канела, мед или тахан с които да намажете готовите палачинки. Но и само комбинацията банани с яйца е достатъчно вкусна, сладка и ароматна.

    - -

    Първа стъпка в приготвянето на палачинките е да изберете добре узрели банани, които да намачкайте до не идеално гладко пюре.

    - -

    Следващи по ред са яйцата, които разбивате много добре и към тях добавяте банановата каша.
    -Палачинки1

    - -

    Тиганът е загрят на средно-висока температура (5/9 при мен) и слагате съвсем малко кокосово масло. Неговата роля е повече за аромат, но ако тигана ви не е с незалепващо покритие може да се наложи да сложите повече - 1/2 чаена лъжичка например.

    - -

    С лъжица разсипвате сместа като една голяма или няколко малки палачинки и когато ръбчетата побелеят (това е коагулираният яйчен белтък) можете да ги обърнете да се изпекат и от другата страна. Ориентировъчно им трябва по 60-70 секунди на страна.
    -Палачинки2

    - -

    Вкусни са топли, студени, намазани с любимо сладко или мед, поръсени с кокосови стърготини или (лешников) тахан. Развихрете фантазията на вкусовете си.

    - -;T; @I"'/blog/2014-12-09-подаръци/;T{;{ ;I" & - - - - - - - Време за подаръци - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Време за подаръци -

    - -
    -
      -
    • - - December 9, 2014 -
    • -
    -
    - - -

    Студената зима носи със себе си и топлината и уюта на семейните празници. Един след друг се подреждат в календара поредица от именни дни, заедно с Бъдни вечер, Коледа, Нова Година.

    - -

    Днес можете да видите няколко идеи за подаръци, с които да зарадвате любимите си хора, които се интересуват от здравословен начин на живот. И не само тях.
    -Подаръци

    - -
      -
    1. -

      Кухненски робот/блендер

      -
    2. -
    3. -

      Абонамент за фитнес/йога център

      -
    4. -
    5. -

      Бутилка за вода или термос за топли напитки - стъклени, бамбукови или от пласмтмаса без съдържание на BPA (бисфенол А)

      -
    6. -
    7. -

      Книги на тема здравословно хранене - например Пшеницата - маскираният убиец

      -
    8. -
    9. -

      Спортни обувки или домашен уред - гирички, дъмбели, постелка

      -
    10. -
    11. -

      Комплект натурални сапуни

      -
    12. -
    13. -

      Керамичен кухненски нож

      -
    14. -
    15. -

      Колекция от качествен чай или екзотично кафе за ценители

      -
    16. -
    17. -

      Домашно приготвени сладки или бонбони

      -
    18. -
    19. -

      Висококачествен натурален шоколад - например българските шоколади Гайо

      -
    20. -
    21. -

      Дървени играчки за деца.

      -
    22. -
    23. -

      Чифт топли вълнени чорапи

      -
    24. -
    - -

    Това са моите предложения за красиви, полезни и здравословни подаръци. А какви са вашите желания? Напишете ги в коментар.
    -Публикацията не е спонсорирана или с цел реклама.

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"" -Студената зима носи със себе си и топлината и уюта на семейните празници. Един след друг се подреждат в календара поредица от именни дни, заедно с Бъдни вечер, Коледа, Нова Година. - -Днес можете да видите няколко идеи за подаръци, с които да зарадвате любимите си хора, които се интересуват от здравословен начин на живот. И не само тях.
    -![Подаръци](/images/posts/Gifts.jpg){:width="300px"}
    - -1. Кухненски робот/блендер - -2. Абонамент за фитнес/йога център - -3. [Бутилка](http://www.flashka.bg/) за вода или термос за топли напитки - стъклени, бамбукови или от пласмтмаса без съдържание на BPA (бисфенол А) - -4. Книги на тема здравословно хранене - например [Пшеницата - маскираният убиец](http://hermesbooks.com/pshenicata-maskiranijat-ubiec.html) - -5. Спортни обувки или домашен уред - гирички, [дъмбели](http://www.decathlon.bg/komplekt-v-kutiya-20-kg-id_8018574.html), постелка - -6. Комплект натурални [сапуни](http://www.iherb.com/search?kw=organic+soap) - -7. Керамичен кухненски нож - -8. Колекция от качествен чай или екзотично [кафе](http://www.amazon.co.uk/s/?ie=UTF8&keywords=kopi+luwak+coffee&tag=mh0a9-21&index=aps&hvadid=3170879876&ref=pd_sl_2u20wfmxru_e) за ценители - -9. Домашно приготвени сладки или бонбони - -10. Висококачествен натурален шоколад - например българските шоколади [Гайо](http://www.gaillotchocolate.com/) - -11. Дървени [играчки](http://laika.bg/index.php?route=product/category&path=76_104) за деца. - -12. Чифт топли вълнени чорапи - -Това са моите предложения за красиви, полезни и здравословни подаръци. А какви са вашите желания? Напишете ги в коментар.
    -Публикацията не е спонсорирана или с цел реклама. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;T; -I"}

    Студената зима носи със себе си и топлината и уюта на семейните празници. Един след друг се подреждат в календара поредица от именни дни, заедно с Бъдни вечер, Коледа, Нова Година.

    - -

    Днес можете да видите няколко идеи за подаръци, с които да зарадвате любимите си хора, които се интересуват от здравословен начин на живот. И не само тях.
    -Подаръци

    - -
      -
    1. -

      Кухненски робот/блендер

      -
    2. -
    3. -

      Абонамент за фитнес/йога център

      -
    4. -
    5. -

      Бутилка за вода или термос за топли напитки - стъклени, бамбукови или от пласмтмаса без съдържание на BPA (бисфенол А)

      -
    6. -
    7. -

      Книги на тема здравословно хранене - например Пшеницата - маскираният убиец

      -
    8. -
    9. -

      Спортни обувки или домашен уред - гирички, дъмбели, постелка

      -
    10. -
    11. -

      Комплект натурални сапуни

      -
    12. -
    13. -

      Керамичен кухненски нож

      -
    14. -
    15. -

      Колекция от качествен чай или екзотично кафе за ценители

      -
    16. -
    17. -

      Домашно приготвени сладки или бонбони

      -
    18. -
    19. -

      Висококачествен натурален шоколад - например българските шоколади Гайо

      -
    20. -
    21. -

      Дървени играчки за деца.

      -
    22. -
    23. -

      Чифт топли вълнени чорапи

      -
    24. -
    - -

    Това са моите предложения за красиви, полезни и здравословни подаръци. А какви са вашите желания? Напишете ги в коментар.
    -Публикацията не е спонсорирана или с цел реклама.

    - -;T; @I"6/blog/2014-12-16-празнични-съвети/;T{;{ ;I"I - - - - - - - Празнични съвети за здравословно хранене - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Празнични съвети за здравословно хранене -

    - -
    -
      -
    • - - December 16, 2014 -
    • -
    -
    - - -

    Зимните празници идват с пълна сила - именни дни, фирмени банкети, Бъдни вечер, Коледа, Нова Година. Кой от кой с по-обилни трапези, поляти с още по-обилни количества алкохол.

    - -

    Знаете, че трудно ще устоите и все пак ви се иска да има начин да не прекалите и да не се чувствате гузно след това, нали?

    - -

    Ето моите съвети как да се насладите на празниците и да се разминете с излишните калории.

    - -
      -
    1. -

      Най-важното на празника са хората, а не храната. От кога чакате празниците, за да си починете, повеселите и да се съберете със семейството и приятелите си, част от които са се върнали от чужбина или от другият край на България? Има толкова много неща, които трябва да си разкажете или просто да поседите заедно както когато бяхте деца. Е, използвайте тези безценни моменти и ги посветете на хората и на празничното настроение. Не съсредоточавайте празника си до една отрупана маса с храна и чинията пред вас. Общувайте с хората, сменяйте мястото си, така че да имате възможност да си кажете по нещо със всеки, танцувайте и се включете в игрите на децата. Празнувайте истински!

      -
    2. -
    3. -

      Избягвайте течните калории на празничната трапеза. Празниците са повод да си позволите алкохол и напитки, които не се консумират ежедневно. Но често под влияние на приповдигнатото настроение и веселата компания лесно се прекалява. Моят съвет е да избягвате подсладените напитки, бирата и екзотичните коктейли. По-добре изберете малко количество концентрат и чаша вино, отколкото да изгубите мярката с бира или подсладен вермут или ром. А за да избегнете страничните ефекти от алкохола редувайте всяка алкохолна напитка с чаша вода. По този начин ще изпиете по-малко, ще избегнете дехидратацията и главоболието на сутринта. За газираните напитки вече знаете - те са течна отрова за вашето тяло и нямат място на хубавите празнични събирания.

      -
    4. -
    5. -

      Хранете се нормално през целият ден. Много хора приемат стратегията да “се пазят” през деня, за да могат да ядат колкото искат на вечеря. Това не е разумно, защото до вечерта първо ще сте огладнели прекалено много и второ: стомахът ви ще се е свил и шансът да “се натъпчите” и да имате стомашни болки и неразположения е почти 100%. По-добрият избор е да хапнете два пъти през деня лека и не обемна храна, която да ви даде енергия и тонус. Изберете малко количество протеин (парче чисто месо, яйце, сирене), порция зеленчуци и малко полезни мазнини - няколко маслини, 10тина ядки, половин авокадо. Може да добавите и междинно хранене с плод, ако вечерята ще се забави. Така няма цял ден да мислите за храна и когато седнете на масата да изгубите контрол. Бъдете умерени в порциите и яжте бавно.

      -
    6. -
    7. -

      Не пропускайте редовната физическа активност. Празниците не са повод да мързелуване, а напротив: те са време, в които да се посветим на себе си и на хората и нещата които обичаме и ни правят щастливи. Ако имате тренировъчна програма няма никаква причина да я променяте или още повече прекъсвате, само защото не ходите на работа. Именно сега ще имате време и енергия да се раздадете още повече в тренировките. Може да поспите повече сутрин, но тренировките трябва да си вървят по план. Ако пък не тренирате нищо специално, свободните дни са идеално време за ободряваща разходка с децата или приятелите ви. Макар и зимно, времето предлага по-слънчеви часове, в които може да се раздвижите на чист въздух. Ако пък сте извън града вариантите за разходка стават още по-разнообразни. Поставете си за цел да се разхождате всеки един от почивните дни поне по един час и ще видите колко по-отпочинали и доволни ще сте, когато дойде време да се връщате на работа.

      -
    8. -
    9. -

      Пригответе здравословни варианти на популярните празнични ястия или десерти. Като хора, които се грижат за здравето си и внимават с какво гориво зареждат тялото си, вие трябва да обръщате внимание и на здравето на близките си. Ако хората, които обичате не са здрави, няма как вие да се чувствате добре. По тази причина можете да се погрижите за всички като се заемете с приготвянето на здравословна и вкусна празнична вечеря или поне да приготвите любимите си здравословни ястия. Направете вкусни десерти от ядки, сушени и пресни плодове и кокосово масло; заменете белият ориз в сърмите с по-полезна зърнена култура като киноа или просо; изберете по-качествено месо и пропуснете колбасите и луканките със съмнителен произход. Импровизирайте и съм сигурна, че всички ще останат очаровани от вашият ентусиазъм и грижа.

      -
    10. -
    11. -

      Опитайте от всичко, което ви се яде, но си сипете само веднъж. Колкото и да се стараем да заобикаляме висококалоричните и вредни изкушения, те просто по някакъв магически начин попадат пред погледа ни: топла питка от бяло брашно, сочна мазна баница и лепкава от сладост баклава - всички са изкушаващи и толкова близо. Има ли как да устоим? Лично аз отдавна не се изкушавам от такива храни, защото знам, че няма да донесат нищо ценно за тялото ми: те са просто моментно удоволствие за устата. Но дори и да се изкуша ето какво правя: сипвам си само по веднъж. Може да взема например 2 парчета баница или 5 дребни сладки или бонбона, но ги слагам в чинията пред мен и не посягам втори път. Колкото-толкова. Разбира се, не е добра идея да се презапасите с половината тава от баклавата. В крайна сметка опита показва, че човек не изяжда дори и половината от сервираното, тъй като често “очите са по-големи от стомаха”.

      -
    12. -
    13. -

      Ако прекалите не се самонаказвайте и не гладувайте на другият ден. И все пак ако след всички съвети не сте успели да се опазите и храната и алкохола са ви дошли в повече, какво да правите? Със сигурност най-лошият вариант е да се самобичувате с глад и лишения ден или два след празника. Ако не се чувствате добре и нямате апетит - не яжте. Но ако изпитвате глад, по-добре е да хапнете нещо леко - например купа пилешка супа или салата с протеин. По този начин ще хидратирате тялото си и няма да се измъчвате от глад. Лишаването от храна ще доведе до порочен кръг: глад, натъпкване, чувство за вина, отново глад и т.н. И както се казва в една популярна приказка: Човек не дебелее в дните от Коледа до Нова Година, а през дните от Нова Година до Коледа!
      -Снежко

      -
    14. -
    - -

    Весели празници!

    - - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"+Зимните празници идват с пълна сила - именни дни, фирмени банкети, Бъдни вечер, Коледа, Нова Година. Кой от кой с по-обилни трапези, поляти с още по-обилни количества алкохол. - - -Знаете, че трудно ще устоите и все пак ви се иска да има начин да не прекалите и да не се чувствате гузно след това, нали? - -Ето моите съвети **как да се насладите на празниците** и да се разминете с излишните калории. - -1. **Най-важното на празника са хората**, а не храната. От кога чакате празниците, за да си починете, повеселите и да се съберете със семейството и приятелите си, част от които са се върнали от чужбина или от другият край на България? Има толкова много неща, които трябва да си разкажете или просто да поседите заедно както когато бяхте деца. Е, използвайте тези безценни моменти и ги посветете на хората и на празничното настроение. Не съсредоточавайте празника си до една отрупана маса с храна и чинията пред вас. **Общувайте** с хората, сменяйте мястото си, така че да имате възможност да си кажете по нещо със всеки, **танцувайте** и се включете в игрите на децата. **Празнувайте истински!** - -2. Избягвайте **течните калории** на празничната трапеза. Празниците са повод да си позволите алкохол и напитки, които не се консумират ежедневно. Но често под влияние на приповдигнатото настроение и веселата компания лесно се прекалява. Моят съвет е да избягвате подсладените напитки, бирата и екзотичните коктейли. По-добре изберете **малко количество концентрат** и **чаша вино**, отколкото да изгубите мярката с бира или подсладен вермут или ром. А за да избегнете страничните ефекти от алкохола редувайте всяка алкохолна напитка с **чаша вода**. По този начин ще изпиете по-малко, ще избегнете дехидратацията и главоболието на сутринта. За газираните напитки вече знаете - те са течна отрова за вашето тяло и нямат място на хубавите празнични събирания. - -3. **Хранете се нормално** през целият ден. Много хора приемат стратегията да "се пазят" през деня, за да могат да ядат колкото искат на вечеря. Това не е разумно, защото до вечерта първо ще сте огладнели прекалено много и второ: стомахът ви ще се е свил и шансът да "се натъпчите" и да имате стомашни болки и неразположения е почти 100%. По-добрият избор е да хапнете два пъти през деня лека и не обемна храна, която да ви даде **енергия и тонус**. Изберете малко количество протеин (парче чисто месо, яйце, сирене), порция зеленчуци и малко полезни мазнини - няколко маслини, 10тина ядки, половин авокадо. Може да добавите и междинно хранене с плод, ако вечерята ще се забави. Така няма цял ден да мислите за храна и когато седнете на масата да изгубите контрол. Бъдете **умерени** в порциите и яжте **бавно**. - -4. Не пропускайте редовната **физическа активност**. Празниците не са повод да мързелуване, а напротив: те са **време, в които да се посветим на себе си и на хората и нещата които обичаме и ни правят щастливи**. Ако имате тренировъчна програма няма никаква причина да я променяте или още повече прекъсвате, само защото не ходите на работа. Именно сега ще имате време и енергия да се раздадете още повече в тренировките. Може да поспите повече сутрин, но тренировките трябва да си вървят по план. Ако пък не тренирате нищо специално, свободните дни са идеално време за **ободряваща разходка** с децата или приятелите ви. Макар и зимно, времето предлага по-слънчеви часове, в които може да се раздвижите на чист въздух. Ако пък сте извън града вариантите за разходка стават още по-разнообразни. Поставете си за цел да се разхождате всеки един от почивните дни поне по един час и ще видите колко **по-отпочинали и доволни** ще сте, когато дойде време да се връщате на работа. - -5. Пригответе **здравословни варианти на популярните празнични ястия или десерти**. Като хора, които се грижат за здравето си и внимават с какво гориво зареждат тялото си, вие трябва да обръщате внимание и на здравето на близките си. Ако **хората, които обичате** не са здрави, няма как вие да се чувствате добре. По тази причина можете да се погрижите за всички като се заемете с приготвянето на **здравословна и вкусна празнична вечеря** или поне да приготвите любимите си здравословни ястия. Направете вкусни десерти от ядки, сушени и пресни плодове и кокосово масло; заменете белият ориз в сърмите с по-полезна зърнена култура като киноа или просо; изберете по-качествено месо и пропуснете колбасите и луканките със съмнителен произход. Импровизирайте и съм сигурна, че всички ще останат очаровани от вашият **ентусиазъм и грижа**. - -6. **Опитайте от всичко**, което ви се яде, но си сипете само веднъж. Колкото и да се стараем да заобикаляме висококалоричните и вредни изкушения, те просто по някакъв магически начин попадат пред погледа ни: топла питка от бяло брашно, сочна мазна баница и лепкава от сладост баклава - всички са изкушаващи и толкова близо. Има ли как да устоим? Лично аз отдавна не се изкушавам от такива храни, защото знам, че няма да донесат нищо ценно за тялото ми: те са просто моментно удоволствие за устата. Но дори и да се изкуша ето какво правя: сипвам си само по веднъж. Може да взема например 2 парчета баница или 5 дребни сладки или бонбона, но ги слагам в чинията пред мен и не посягам втори път. Колкото-толкова. Разбира се, не е добра идея да се презапасите с половината тава от баклавата. В крайна сметка опита показва, че човек не изяжда дори и половината от сервираното, тъй като често "очите са по-големи от стомаха". - -7. Ако прекалите **не се самонаказвайте** и не гладувайте на другият ден. И все пак ако след всички съвети не сте успели да се опазите и храната и алкохола са ви дошли в повече, какво да правите? Със сигурност най-лошият вариант е да се самобичувате с глад и лишения ден или два след празника. Ако не се чувствате добре и нямате апетит - не яжте. Но ако изпитвате глад, по-добре е да хапнете нещо леко - например купа пилешка супа или салата с протеин. По този начин ще **хидратирате тялото** си и няма да се измъчвате от глад. Лишаването от храна ще доведе до порочен кръг: глад, натъпкване, чувство за вина, отново глад и т.н. И както се казва в една популярна приказка: Човек не дебелее в дните от Коледа до Нова Година, а през дните от Нова Година до Коледа!
    -![Снежко](/images/posts/Snow.jpg){:width="450px"}
    - -**Весели празници!** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;T; -I"-

    Зимните празници идват с пълна сила - именни дни, фирмени банкети, Бъдни вечер, Коледа, Нова Година. Кой от кой с по-обилни трапези, поляти с още по-обилни количества алкохол.

    - -

    Знаете, че трудно ще устоите и все пак ви се иска да има начин да не прекалите и да не се чувствате гузно след това, нали?

    - -

    Ето моите съвети как да се насладите на празниците и да се разминете с излишните калории.

    - -
      -
    1. -

      Най-важното на празника са хората, а не храната. От кога чакате празниците, за да си починете, повеселите и да се съберете със семейството и приятелите си, част от които са се върнали от чужбина или от другият край на България? Има толкова много неща, които трябва да си разкажете или просто да поседите заедно както когато бяхте деца. Е, използвайте тези безценни моменти и ги посветете на хората и на празничното настроение. Не съсредоточавайте празника си до една отрупана маса с храна и чинията пред вас. Общувайте с хората, сменяйте мястото си, така че да имате възможност да си кажете по нещо със всеки, танцувайте и се включете в игрите на децата. Празнувайте истински!

      -
    2. -
    3. -

      Избягвайте течните калории на празничната трапеза. Празниците са повод да си позволите алкохол и напитки, които не се консумират ежедневно. Но често под влияние на приповдигнатото настроение и веселата компания лесно се прекалява. Моят съвет е да избягвате подсладените напитки, бирата и екзотичните коктейли. По-добре изберете малко количество концентрат и чаша вино, отколкото да изгубите мярката с бира или подсладен вермут или ром. А за да избегнете страничните ефекти от алкохола редувайте всяка алкохолна напитка с чаша вода. По този начин ще изпиете по-малко, ще избегнете дехидратацията и главоболието на сутринта. За газираните напитки вече знаете - те са течна отрова за вашето тяло и нямат място на хубавите празнични събирания.

      -
    4. -
    5. -

      Хранете се нормално през целият ден. Много хора приемат стратегията да “се пазят” през деня, за да могат да ядат колкото искат на вечеря. Това не е разумно, защото до вечерта първо ще сте огладнели прекалено много и второ: стомахът ви ще се е свил и шансът да “се натъпчите” и да имате стомашни болки и неразположения е почти 100%. По-добрият избор е да хапнете два пъти през деня лека и не обемна храна, която да ви даде енергия и тонус. Изберете малко количество протеин (парче чисто месо, яйце, сирене), порция зеленчуци и малко полезни мазнини - няколко маслини, 10тина ядки, половин авокадо. Може да добавите и междинно хранене с плод, ако вечерята ще се забави. Така няма цял ден да мислите за храна и когато седнете на масата да изгубите контрол. Бъдете умерени в порциите и яжте бавно.

      -
    6. -
    7. -

      Не пропускайте редовната физическа активност. Празниците не са повод да мързелуване, а напротив: те са време, в които да се посветим на себе си и на хората и нещата които обичаме и ни правят щастливи. Ако имате тренировъчна програма няма никаква причина да я променяте или още повече прекъсвате, само защото не ходите на работа. Именно сега ще имате време и енергия да се раздадете още повече в тренировките. Може да поспите повече сутрин, но тренировките трябва да си вървят по план. Ако пък не тренирате нищо специално, свободните дни са идеално време за ободряваща разходка с децата или приятелите ви. Макар и зимно, времето предлага по-слънчеви часове, в които може да се раздвижите на чист въздух. Ако пък сте извън града вариантите за разходка стават още по-разнообразни. Поставете си за цел да се разхождате всеки един от почивните дни поне по един час и ще видите колко по-отпочинали и доволни ще сте, когато дойде време да се връщате на работа.

      -
    8. -
    9. -

      Пригответе здравословни варианти на популярните празнични ястия или десерти. Като хора, които се грижат за здравето си и внимават с какво гориво зареждат тялото си, вие трябва да обръщате внимание и на здравето на близките си. Ако хората, които обичате не са здрави, няма как вие да се чувствате добре. По тази причина можете да се погрижите за всички като се заемете с приготвянето на здравословна и вкусна празнична вечеря или поне да приготвите любимите си здравословни ястия. Направете вкусни десерти от ядки, сушени и пресни плодове и кокосово масло; заменете белият ориз в сърмите с по-полезна зърнена култура като киноа или просо; изберете по-качествено месо и пропуснете колбасите и луканките със съмнителен произход. Импровизирайте и съм сигурна, че всички ще останат очаровани от вашият ентусиазъм и грижа.

      -
    10. -
    11. -

      Опитайте от всичко, което ви се яде, но си сипете само веднъж. Колкото и да се стараем да заобикаляме висококалоричните и вредни изкушения, те просто по някакъв магически начин попадат пред погледа ни: топла питка от бяло брашно, сочна мазна баница и лепкава от сладост баклава - всички са изкушаващи и толкова близо. Има ли как да устоим? Лично аз отдавна не се изкушавам от такива храни, защото знам, че няма да донесат нищо ценно за тялото ми: те са просто моментно удоволствие за устата. Но дори и да се изкуша ето какво правя: сипвам си само по веднъж. Може да взема например 2 парчета баница или 5 дребни сладки или бонбона, но ги слагам в чинията пред мен и не посягам втори път. Колкото-толкова. Разбира се, не е добра идея да се презапасите с половината тава от баклавата. В крайна сметка опита показва, че човек не изяжда дори и половината от сервираното, тъй като често “очите са по-големи от стомаха”.

      -
    12. -
    13. -

      Ако прекалите не се самонаказвайте и не гладувайте на другият ден. И все пак ако след всички съвети не сте успели да се опазите и храната и алкохола са ви дошли в повече, какво да правите? Със сигурност най-лошият вариант е да се самобичувате с глад и лишения ден или два след празника. Ако не се чувствате добре и нямате апетит - не яжте. Но ако изпитвате глад, по-добре е да хапнете нещо леко - например купа пилешка супа или салата с протеин. По този начин ще хидратирате тялото си и няма да се измъчвате от глад. Лишаването от храна ще доведе до порочен кръг: глад, натъпкване, чувство за вина, отново глад и т.н. И както се казва в една популярна приказка: Човек не дебелее в дните от Коледа до Нова Година, а през дните от Нова Година до Коледа!
      -Снежко

      -
    14. -
    - -

    Весели празници!

    - -;T; @!I"_/blog/2014-02-19-кои-са-най-добрите-четка-и-паста-за-зъби/;T{;{ ;I"h6 - - - - - - - Кои са най-добрите четка и паста за зъби? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Кои са най-добрите четка и паста за зъби? -

    - -
    -
      -
    • - - February 19, 2014 -
    • -
    -
    - - -

    Да започнем да си задаваме въпроси за здравето за зъбите и венците в нашата уста и какво не ни казват зъболекарите?

    - -

    С тази полу-биографична публикация прерязвам лентата на моят блог. Надявам се да работим заедно по него, защото здравето трябва да е приоритет на цялото човечество.

    - -

    Съвсем скоро ходих на зимна разходка из Сливенският Балкан с група планинари-ентусиати и както винаги срещнах нови и интересни хора. А всички нови, стари и още по-стари мои познати са ме питали един и същ въпрос:’Коя е най-добрата паста за зъби?’ И никога няма да ми омръзне да отговарям на него.

    - -

    Първо, да уточним, че най-добра паста за зъби няма, а и да имаше не бих правила реклама на какъвто и да е продукт, част от асортимента на мултимилионен фармацевтичен концерн. О, ужас! А с какво да си мием зъбите? С четката!

    - -

    Преди всяка паста или помада за миене на зъби трябва да открием най-добрата четка за зъби. Тя освен че може да е най-модерната, с 18 различни цвята и дължини влакна и т.н. е желателно да е пригодена за вашата уста. Т.е. купувате си 5 четки с различна големина на работната част и избирате тази, с която достигате до всички зъби, от всичките им страни. Или отивате на зъболекар с тях и освен коя е четката, зъболекарят ще ви посъветва и за правилното й използване.

    - -

    Лично аз се научих как да си мия зъбите на 20годишна възраст. Познавам хора, които се научиха на 64, такива които се научиха още преди да имат зъби, деца в ясли и в гимназията, учители, счетоводители, строители, един гробар. Лоша техника за четкане може да направи безполезна най-добрата четка, която избрахме. И тъй като най-добре се помни, когато човек сам открие решението на проблема поставям това като задача за всеки от нас. В Интернет има наистина много информация, снимки, клипчета които показват как да мием правилно зъбите си. Аз само ще подскажа, че може да се наложи различна техника да се прилага за различни групи от зъби, или дори индивидуална техника за един зъб.

    - -

    Сега някои ще си помислят:’Ето, не ни казва правилната техника, а щеше да разкрива тайните на зъболекарите’. Ами това е тайната на зъболекарите: могат да видят вашата уста, толкова добре колкото вас и да синтезират информацията така, че да е приложима за вашите зъби. Ако ви мързи да търсите истината, плащате за това по един или друг начин. Често, със здравето на зъбите си и в следствие и цялата храносмилателна система и цялостното ви здраве.

    - -

    Тук идва реда и на конеца за зъби - наистина най-доброто въведение в зъбната хигиена, след брезовите пръчки, които са дъвчели нашите прабаби и прадядовци. Препоръчвам, пък и в планината или на поход може да се носи като основно средство за хигиена - почти не тежи, а с добра техника може да почистиш цялата си уста само с парче от него.

    - -

    Сега остана последното нещо, за да имаме целият арсенал за измиване и изчистване на зъбите: това е естествената защита на зъбите срещу кариес. Тя не се купува в аптеката или бакалията, дори не се поръчва по Интернет. Тя идва от вътрешната среда на тялото, от правилната обмяна на веществата в кръвта и баланса на хормоните.

    - -

    Човешките зъби имат естествена кариесна защита, която е подложена на пълно унищожение със съвременният начин на хранене. Всеизвестно е изследването на д-р Уестън Прайс, в което описва честота на кариеса под 1% при хора от изолирани общности : африкански племена, ескимоси, швейцарци, аборигени и индианци, които НЕ си мият зъбите, НЕ ядат сладко и преработени храни и НЕ дъвчат дъвка или НЕ приемат флуорид!

    - -

    Книгата му “Nutrition and Physical Degeneration” е лесно откриваема в Интернет.

    - -

    Добре тогава, къде е истината? Някой знае ли я? Аз знам ли я или ако да, ще я споделя ли?

    - -

    Да я потърсим заедно в следващите публикации.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"###Да започнем да си задаваме въпроси за здравето за зъбите и венците в нашата уста и какво не ни казват зъболекарите? - -С тази полу-биографична публикация прерязвам лентата на моят блог. Надявам се да работим заедно по него, защото здравето трябва да е приоритет на цялото човечество. - -Съвсем скоро ходих на зимна разходка из Сливенският Балкан с група планинари-ентусиати и както винаги срещнах нови и интересни хора. А всички нови, стари и още по-стари мои познати са ме питали един и същ въпрос:'Коя е най-добрата паста за зъби?' И никога няма да ми омръзне да отговарям на него. - -Първо, да уточним, че най-добра паста за зъби няма, а и да имаше не бих правила реклама на какъвто и да е продукт, част от асортимента на мултимилионен фармацевтичен концерн. О, ужас! А с какво да си мием зъбите? С четката! - -Преди всяка паста или помада за миене на зъби трябва да открием най-добрата четка за зъби. Тя освен че може да е най-модерната, с 18 различни цвята и дължини влакна и т.н. е желателно да е пригодена за вашата уста. Т.е. купувате си 5 четки с различна големина на работната част и избирате тази, с която достигате до всички зъби, от всичките им страни. Или отивате на зъболекар с тях и освен коя е четката, зъболекарят ще ви посъветва и за правилното й използване. - -Лично аз се научих как да си мия зъбите на 20годишна възраст. Познавам хора, които се научиха на 64, такива които се научиха още преди да имат зъби, деца в ясли и в гимназията, учители, счетоводители, строители, един гробар. Лоша техника за четкане може да направи безполезна най-добрата четка, която избрахме. И тъй като най-добре се помни, когато човек сам открие решението на проблема поставям това като задача за всеки от нас. В Интернет има наистина много информация, снимки, клипчета които показват **как да мием правилно зъбите си**. Аз само ще подскажа, че може да се наложи различна техника да се прилага за различни групи от зъби, или дори индивидуална техника за един зъб. - -Сега някои ще си помислят:'Ето, не ни казва правилната техника, а щеше да разкрива тайните на зъболекарите'. Ами това е тайната на зъболекарите: могат да видят вашата уста, толкова добре колкото вас и да синтезират информацията така, че да е приложима за вашите зъби. Ако ви мързи да търсите истината, плащате за това по един или друг начин. Често, със здравето на зъбите си и в следствие и цялата храносмилателна система и цялостното ви здраве. - -Тук идва реда и на конеца за зъби - наистина най-доброто въведение в зъбната хигиена, след брезовите пръчки, които са дъвчели нашите прабаби и прадядовци. Препоръчвам, пък и в планината или на поход може да се носи като основно средство за хигиена - почти не тежи, а с добра техника може да почистиш цялата си уста само с парче от него. - -Сега остана последното нещо, за да имаме целият арсенал за измиване и изчистване на зъбите: това е естествената защита на зъбите срещу кариес. Тя не се купува в аптеката или бакалията, дори не се поръчва по Интернет. Тя идва от вътрешната среда на тялото, от правилната обмяна на веществата в кръвта и баланса на хормоните. - -Човешките зъби имат естествена кариесна защита, която е подложена на пълно унищожение със съвременният начин на хранене. Всеизвестно е изследването на д-р Уестън Прайс, в което описва честота на **кариеса под 1% при хора от изолирани общности : африкански племена, ескимоси, швейцарци, аборигени и индианци, които НЕ си мият зъбите, НЕ ядат сладко и преработени храни и НЕ дъвчат дъвка или НЕ приемат флуорид!** - -Книгата му "Nutrition and Physical Degeneration" е лесно откриваема в Интернет. - -Добре тогава, къде е истината? Някой знае ли я? Аз знам ли я или ако да, ще я споделя ли? - -Да я потърсим заедно в следващите публикации.;T; -I"S

    Да започнем да си задаваме въпроси за здравето за зъбите и венците в нашата уста и какво не ни казват зъболекарите?

    - -

    С тази полу-биографична публикация прерязвам лентата на моят блог. Надявам се да работим заедно по него, защото здравето трябва да е приоритет на цялото човечество.

    - -

    Съвсем скоро ходих на зимна разходка из Сливенският Балкан с група планинари-ентусиати и както винаги срещнах нови и интересни хора. А всички нови, стари и още по-стари мои познати са ме питали един и същ въпрос:’Коя е най-добрата паста за зъби?’ И никога няма да ми омръзне да отговарям на него.

    - -

    Първо, да уточним, че най-добра паста за зъби няма, а и да имаше не бих правила реклама на какъвто и да е продукт, част от асортимента на мултимилионен фармацевтичен концерн. О, ужас! А с какво да си мием зъбите? С четката!

    - -

    Преди всяка паста или помада за миене на зъби трябва да открием най-добрата четка за зъби. Тя освен че може да е най-модерната, с 18 различни цвята и дължини влакна и т.н. е желателно да е пригодена за вашата уста. Т.е. купувате си 5 четки с различна големина на работната част и избирате тази, с която достигате до всички зъби, от всичките им страни. Или отивате на зъболекар с тях и освен коя е четката, зъболекарят ще ви посъветва и за правилното й използване.

    - -

    Лично аз се научих как да си мия зъбите на 20годишна възраст. Познавам хора, които се научиха на 64, такива които се научиха още преди да имат зъби, деца в ясли и в гимназията, учители, счетоводители, строители, един гробар. Лоша техника за четкане може да направи безполезна най-добрата четка, която избрахме. И тъй като най-добре се помни, когато човек сам открие решението на проблема поставям това като задача за всеки от нас. В Интернет има наистина много информация, снимки, клипчета които показват как да мием правилно зъбите си. Аз само ще подскажа, че може да се наложи различна техника да се прилага за различни групи от зъби, или дори индивидуална техника за един зъб.

    - -

    Сега някои ще си помислят:’Ето, не ни казва правилната техника, а щеше да разкрива тайните на зъболекарите’. Ами това е тайната на зъболекарите: могат да видят вашата уста, толкова добре колкото вас и да синтезират информацията така, че да е приложима за вашите зъби. Ако ви мързи да търсите истината, плащате за това по един или друг начин. Често, със здравето на зъбите си и в следствие и цялата храносмилателна система и цялостното ви здраве.

    - -

    Тук идва реда и на конеца за зъби - наистина най-доброто въведение в зъбната хигиена, след брезовите пръчки, които са дъвчели нашите прабаби и прадядовци. Препоръчвам, пък и в планината или на поход може да се носи като основно средство за хигиена - почти не тежи, а с добра техника може да почистиш цялата си уста само с парче от него.

    - -

    Сега остана последното нещо, за да имаме целият арсенал за измиване и изчистване на зъбите: това е естествената защита на зъбите срещу кариес. Тя не се купува в аптеката или бакалията, дори не се поръчва по Интернет. Тя идва от вътрешната среда на тялото, от правилната обмяна на веществата в кръвта и баланса на хормоните.

    - -

    Човешките зъби имат естествена кариесна защита, която е подложена на пълно унищожение със съвременният начин на хранене. Всеизвестно е изследването на д-р Уестън Прайс, в което описва честота на кариеса под 1% при хора от изолирани общности : африкански племена, ескимоси, швейцарци, аборигени и индианци, които НЕ си мият зъбите, НЕ ядат сладко и преработени храни и НЕ дъвчат дъвка или НЕ приемат флуорид!

    - -

    Книгата му “Nutrition and Physical Degeneration” е лесно откриваема в Интернет.

    - -

    Добре тогава, къде е истината? Някой знае ли я? Аз знам ли я или ако да, ще я споделя ли?

    - -

    Да я потърсим заедно в следващите публикации.

    -;T; @'I"Q/blog/2014-02-24-вижте-тайната-за-перфектни-зъби/;T{;{ ;I"F - - - - - - - Как по естествен начин да се преборим с кариеса - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как по естествен начин да се преборим с кариеса -

    - -
    -
      -
    • - - February 24, 2014 -
    • -
    -
    - - -

    Кое ни пречи да имаме здрави, добре наредени и бели зъби?

    - -

    В предишният пост направихме един кратък преглед на основните средства за почистване на зъбите, като умишлено пропуснах някои от тях като водата за уста, електрическите четки, клечките за зъби, ултразвуковите четки, междузъбните четки или душа за уста. Да, те имат своето място и често използването им е препоръчително, но това са неща за които всеки зъболекар или дентален асистент може да ви разкаже и покаже. Аз искам да насоча вниманието ви към друго.

    - -

    Не е ли жалко, че модерният човек е постигнал изключителен технологичен напредък, забравяйки напълно мъдростта събирана през вековете?! Искам да погледнем назад и да открием на ново натрупаният опит и знания от примитивните хора, от нашите прадеди и да ги съчетаем с днешните научни знания и методи за лечение.

    - -

    Колко добре познаваме телата си? Разчитаме ли техните знаци или сме потиснали сигналната им система със съвременният забързан начин на живот, а денят ни е дълъг по 18-20часа. И въпреки това времето все не достига да се погрижим за себе си и за здравето си. От кога приехме здравето си за даденост? От кога здравето ни може да съществува, без да полагаме грижи за него? Защо ни накараха да вярваме, че можем да сме здрави, само ако ежедневно гълтаме шепа разноцветни таблетки - дело на фармацевтичната индустрия?

    - -

    Често ще споменавам името на д-р Уестън Прайс, изследвал групи от хора, част от които непознаващи цивилизацията. Какво е наблюдавал той? -За почти 10 години, д-р Уестън Прайс и съпругата му пътували около света, търсейки истината за здравето. За целта многоуважаваният зъболекар и изследовател не се заел с четене на учебници за различни заболявания и преглеждане на болните хора, а вместо това насочил вниманието си към изключително здрави индивиди, поставяйки си за цел да разбере на какво се дължи удивителното им здраве и дълголетие. Обиколил стотици малки групи и общности в над 14 страни, където наблюдавал перфектни зъбни дъги (горната и долната редица зъби), минимални кариозни изменения, висок имунитет спрямо туберкулоза и отлично общо здравословно състояние, при хора които се хранели с изцяло непреработена храна. Точно обратният ефект установява при хора от същите племена или групи, но които имат достъп до модерните храни като бяло брашно, бяла захар, рафинирани растителни масла, пакетирани и консервирани стоки. Зъбният кариес, челюстни деформации, криви зъби и артрит свидетелствали за това. Защитните сили на организма срещу туберкулозата също били значително по-ниски. Д-р Прайс документира всичко това с много снимки в своята книга.

    - -

    Най-забележителни за мен бяха снимките на деца, чиито никога немити зъби имат жълто-зеленикав, подобен на плесен налеп върху тях, а отдолу емайлът беше изключително лъскав, бял и здрав.

    - -

    Преди да ви разкажа как тези, непознаващи цивилизацията хора постигат завидно здраве е важно да уточним от какво е изградено човешкото тяло. От осемнадесетте есенциални елемента, които формират всяка наша клетка, някои от тях са нужни в наистина много малки дози, а няколко други се срещат в свободни количества (излишъка се освобождава по естествен път през храносмилателната и отделителна системи и кожата). Един възрастен индивид се нуждае от половин до един грам калций на ден, фосфорът трябва да е почти двойно количество. Желязото, което трябва да си набавяме е една седма до една трета от грама дневно. Освен необходимите количества от всеки минерал, който се използва за поддържане на функциите на различните органи, се нуждаем от определени количества органични катализатори. Те активират процесите на изграждане и разграждане в клетките. Тези субстанции са познати под името витамини.

    - -

    Може би знаете, че повечето животни синтезират витамините си, а други имат подходяща чревна флора, която прави това за тях. Но не и хората. Ние трябва да си набавяме витамините чрез храната (тези витамини нямат нищо общо със синтетичните витамини, продавани в цветни шишенца и рекламирани по телевизията!)

    - -

    И ето още една забравена истина: при примитивните раси съществува животински инстинкт в селекцията на храната. Тъй като храната, която те консумират често е бедна на калории, това ги принуждава да приемат големи количества високо минерална и витаминозна храна, за да обезпечат енергийните си нужди.

    - -

    Държа още веднъж да подчертая разликата между естествените витамини и синтетичните им форми. Първите се отличават с отлична усвояемост от клетката, поради подходящия, разпознаваем (биологичен) състав. Те благоприятстват протичането на физиологичните процеси в нея. На другият бряг са синтетичните им “близнаци”, при чиято направа са използвани суровини като ацетон, амоняк, формалдехид и петролни производни. Не ви звучат като “жизненоважни” елементи, нали? Всъщност къде се крие истината за витамините е изключително актуална тема, по която скоро ще напиша повече. За сега трябва да знаем само, че единственото което правим приемайки синтетични мултивитамини е да повишаваме цената на телесните течности, които отделяме.

    - -

    На база книгата на д-р Прайс и семейството зъболекари д-р Мелънби, които са провели опити с пациенти, прилагайки различни начини на хранене, може да се направи следното заключение: -Качеството и здравината на зъбните структури се влияе от три главни фактора:

    - -
    1. Наличието на достатъчно минерали в храната
    -2. Наличието на достатъчно мастно-разтворими витамини А, Д, Е и К в храната
    -3. Усвояемостта на минералите и витамините от организма.
    -
    - -

    Надявам се, че началните уроци по биохимия и физиология са ви били интересни и ще прочетете и следващите материали, който съм подготвила за храненето на нецивилизованите племена, витамините и как всички те да заработят заедно в тялото ни, за да възстановим и най-вече да не губим красотата на усмивката си.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"*###Кое ни пречи да имаме здрави, добре наредени и бели зъби? - -В предишният [пост](/blog/2014-02-19-%D0%BA%D0%BE%D0%B8-%D1%81%D0%B0-%D0%BD%D0%B0%D0%B8%CC%86-%D0%B4%D0%BE%D0%B1%D0%B8%D1%82%D0%B5-%D1%87%D0%B5%D1%82%D0%BA%D0%B0-%D0%B8-%D0%BF%D0%B0%D1%81%D1%82%D0%B0-%D0%B7%D0%B0-%D0%B7%D1%8A%D0%B1%D0%B8/ "Кои са най-добрите четка и паста за зъби?") направихме един кратък преглед на основните средства за почистване на зъбите, като умишлено пропуснах някои от тях като водата за уста, електрическите четки, клечките за зъби, ултразвуковите четки, междузъбните четки или душа за уста. Да, те имат своето място и често използването им е препоръчително, но това са неща за които всеки зъболекар или дентален асистент може да ви разкаже и покаже. Аз искам да насоча вниманието ви към друго. - -Не е ли жалко, че модерният човек е постигнал изключителен технологичен напредък, забравяйки напълно мъдростта събирана през вековете?! Искам да погледнем назад и да открием на ново натрупаният опит и знания от примитивните хора, от нашите прадеди и да ги съчетаем с днешните научни знания и методи за лечение. - -Колко добре познаваме телата си? Разчитаме ли техните знаци или сме потиснали сигналната им система със съвременният забързан начин на живот, а денят ни е дълъг по 18-20часа. И въпреки това времето все не достига да се погрижим за себе си и за здравето си. От кога приехме здравето си за даденост? От кога здравето ни може да съществува, без да полагаме грижи за него? Защо ни накараха да вярваме, че можем да сме здрави, само ако ежедневно гълтаме шепа разноцветни таблетки - дело на фармацевтичната индустрия? - -Често ще споменавам името на д-р Уестън Прайс, изследвал групи от хора, част от които непознаващи цивилизацията. Какво е наблюдавал той? -За почти 10 години, д-р Уестън Прайс и съпругата му пътували около света, търсейки истината за здравето. За целта многоуважаваният зъболекар и изследовател не се заел с четене на учебници за различни заболявания и преглеждане на болните хора, а вместо това насочил вниманието си към изключително здрави индивиди, поставяйки си за цел да разбере на какво се дължи удивителното им здраве и дълголетие. Обиколил стотици малки групи и общности в над 14 страни, където наблюдавал перфектни зъбни дъги (горната и долната редица зъби), минимални кариозни изменения, висок имунитет спрямо туберкулоза и отлично общо здравословно състояние, при хора които се хранели с изцяло непреработена храна. Точно **обратният ефект установява при хора от същите племена или групи**, но които имат достъп до модерните храни като бяло брашно, бяла захар, рафинирани растителни масла, пакетирани и консервирани стоки. Зъбният кариес, челюстни деформации, криви зъби и артрит свидетелствали за това. Защитните сили на организма срещу туберкулозата също били значително по-ниски. Д-р Прайс документира всичко това с много снимки в своята книга. - -Най-забележителни за мен бяха снимките на **деца, чиито никога немити зъби имат жълто-зеленикав, подобен на плесен налеп върху тях, а отдолу емайлът беше изключително лъскав, бял и здрав.** - -Преди да ви разкажа как тези, непознаващи цивилизацията хора постигат завидно здраве е важно да уточним от какво е изградено човешкото тяло. От осемнадесетте есенциални елемента, които формират всяка наша клетка, някои от тях са нужни в наистина много малки дози, а няколко други се срещат в свободни количества (излишъка се освобождава по естествен път през храносмилателната и отделителна системи и кожата). Един възрастен индивид се нуждае от половин до един грам калций на ден, фосфорът трябва да е почти двойно количество. Желязото, което трябва да си набавяме е една седма до една трета от грама дневно. Освен необходимите количества от всеки минерал, който се използва за поддържане на функциите на различните органи, се нуждаем от определени количества органични катализатори. Те активират процесите на изграждане и разграждане в клетките. Тези субстанции са познати под името витамини. - -Може би знаете, че повечето животни синтезират витамините си, а други имат подходяща чревна флора, която прави това за тях. Но не и хората. Ние трябва да си набавяме витамините чрез храната (тези витамини нямат нищо общо със синтетичните витамини, продавани в цветни шишенца и рекламирани по телевизията!) - -И ето още една забравена истина: при примитивните раси съществува животински инстинкт в селекцията на храната. Тъй като храната, която те консумират често е бедна на калории, това ги принуждава да приемат големи количества високо минерална и витаминозна храна, за да обезпечат енергийните си нужди. - -Държа още веднъж да подчертая разликата между естествените витамини и синтетичните им форми. Първите се отличават с отлична усвояемост от клетката, поради подходящия, разпознаваем (биологичен) състав. Те благоприятстват протичането на физиологичните процеси в нея. На другият бряг са синтетичните им "близнаци", при чиято направа са използвани суровини като ацетон, амоняк, формалдехид и петролни производни. Не ви звучат като "жизненоважни" елементи, нали? Всъщност къде се крие истината за витамините е изключително актуална тема, по която скоро ще напиша повече. За сега трябва да знаем само, че единственото което правим приемайки синтетични мултивитамини е да повишаваме цената на телесните течности, които отделяме. - -На база книгата на д-р Прайс и семейството зъболекари д-р Мелънби, които са провели опити с пациенти, прилагайки различни начини на хранене, може да се направи следното заключение: -**Качеството и здравината на зъбните структури се влияе от три главни фактора:** - - 1. Наличието на достатъчно минерали в храната - 2. Наличието на достатъчно мастно-разтворими витамини А, Д, Е и К в храната - 3. Усвояемостта на минералите и витамините от организма. - -Надявам се, че началните уроци по биохимия и физиология са ви били интересни и ще прочетете и следващите материали, който съм подготвила за храненето на нецивилизованите племена, витамините и как всички те да заработят заедно в тялото ни, за да възстановим и най-вече да не губим красотата на усмивката си.;T; -I"*

    Кое ни пречи да имаме здрави, добре наредени и бели зъби?

    - -

    В предишният пост направихме един кратък преглед на основните средства за почистване на зъбите, като умишлено пропуснах някои от тях като водата за уста, електрическите четки, клечките за зъби, ултразвуковите четки, междузъбните четки или душа за уста. Да, те имат своето място и често използването им е препоръчително, но това са неща за които всеки зъболекар или дентален асистент може да ви разкаже и покаже. Аз искам да насоча вниманието ви към друго.

    - -

    Не е ли жалко, че модерният човек е постигнал изключителен технологичен напредък, забравяйки напълно мъдростта събирана през вековете?! Искам да погледнем назад и да открием на ново натрупаният опит и знания от примитивните хора, от нашите прадеди и да ги съчетаем с днешните научни знания и методи за лечение.

    - -

    Колко добре познаваме телата си? Разчитаме ли техните знаци или сме потиснали сигналната им система със съвременният забързан начин на живот, а денят ни е дълъг по 18-20часа. И въпреки това времето все не достига да се погрижим за себе си и за здравето си. От кога приехме здравето си за даденост? От кога здравето ни може да съществува, без да полагаме грижи за него? Защо ни накараха да вярваме, че можем да сме здрави, само ако ежедневно гълтаме шепа разноцветни таблетки - дело на фармацевтичната индустрия?

    - -

    Често ще споменавам името на д-р Уестън Прайс, изследвал групи от хора, част от които непознаващи цивилизацията. Какво е наблюдавал той? -За почти 10 години, д-р Уестън Прайс и съпругата му пътували около света, търсейки истината за здравето. За целта многоуважаваният зъболекар и изследовател не се заел с четене на учебници за различни заболявания и преглеждане на болните хора, а вместо това насочил вниманието си към изключително здрави индивиди, поставяйки си за цел да разбере на какво се дължи удивителното им здраве и дълголетие. Обиколил стотици малки групи и общности в над 14 страни, където наблюдавал перфектни зъбни дъги (горната и долната редица зъби), минимални кариозни изменения, висок имунитет спрямо туберкулоза и отлично общо здравословно състояние, при хора които се хранели с изцяло непреработена храна. Точно обратният ефект установява при хора от същите племена или групи, но които имат достъп до модерните храни като бяло брашно, бяла захар, рафинирани растителни масла, пакетирани и консервирани стоки. Зъбният кариес, челюстни деформации, криви зъби и артрит свидетелствали за това. Защитните сили на организма срещу туберкулозата също били значително по-ниски. Д-р Прайс документира всичко това с много снимки в своята книга.

    - -

    Най-забележителни за мен бяха снимките на деца, чиито никога немити зъби имат жълто-зеленикав, подобен на плесен налеп върху тях, а отдолу емайлът беше изключително лъскав, бял и здрав.

    - -

    Преди да ви разкажа как тези, непознаващи цивилизацията хора постигат завидно здраве е важно да уточним от какво е изградено човешкото тяло. От осемнадесетте есенциални елемента, които формират всяка наша клетка, някои от тях са нужни в наистина много малки дози, а няколко други се срещат в свободни количества (излишъка се освобождава по естествен път през храносмилателната и отделителна системи и кожата). Един възрастен индивид се нуждае от половин до един грам калций на ден, фосфорът трябва да е почти двойно количество. Желязото, което трябва да си набавяме е една седма до една трета от грама дневно. Освен необходимите количества от всеки минерал, който се използва за поддържане на функциите на различните органи, се нуждаем от определени количества органични катализатори. Те активират процесите на изграждане и разграждане в клетките. Тези субстанции са познати под името витамини.

    - -

    Може би знаете, че повечето животни синтезират витамините си, а други имат подходяща чревна флора, която прави това за тях. Но не и хората. Ние трябва да си набавяме витамините чрез храната (тези витамини нямат нищо общо със синтетичните витамини, продавани в цветни шишенца и рекламирани по телевизията!)

    - -

    И ето още една забравена истина: при примитивните раси съществува животински инстинкт в селекцията на храната. Тъй като храната, която те консумират често е бедна на калории, това ги принуждава да приемат големи количества високо минерална и витаминозна храна, за да обезпечат енергийните си нужди.

    - -

    Държа още веднъж да подчертая разликата между естествените витамини и синтетичните им форми. Първите се отличават с отлична усвояемост от клетката, поради подходящия, разпознаваем (биологичен) състав. Те благоприятстват протичането на физиологичните процеси в нея. На другият бряг са синтетичните им “близнаци”, при чиято направа са използвани суровини като ацетон, амоняк, формалдехид и петролни производни. Не ви звучат като “жизненоважни” елементи, нали? Всъщност къде се крие истината за витамините е изключително актуална тема, по която скоро ще напиша повече. За сега трябва да знаем само, че единственото което правим приемайки синтетични мултивитамини е да повишаваме цената на телесните течности, които отделяме.

    - -

    На база книгата на д-р Прайс и семейството зъболекари д-р Мелънби, които са провели опити с пациенти, прилагайки различни начини на хранене, може да се направи следното заключение: -Качеството и здравината на зъбните структури се влияе от три главни фактора:

    - -
    1. Наличието на достатъчно минерали в храната
    -2. Наличието на достатъчно мастно-разтворими витамини А, Д, Е и К в храната
    -3. Усвояемостта на минералите и витамините от организма.
    -
    - -

    Надявам се, че началните уроци по биохимия и физиология са ви били интересни и ще прочетете и следващите материали, който съм подготвила за храненето на нецивилизованите племена, витамините и как всички те да заработят заедно в тялото ни, за да възстановим и най-вече да не губим красотата на усмивката си.

    -;T; @-I"G/blog/2014-02-27-храни-за-здрави-зъби-част-1/;T{;{ ;I"~A - - - - - - - Какво да ядем, за да имаме здрави зъби? част 1 - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Какво да ядем, за да имаме здрави зъби? част 1 -

    - -
    -
      -
    • - - February 27, 2014 -
    • -
    -
    - - -

    Пай от мравки и пълнена рибя глава с дроб: това ли е ключът към здравите зъби? Трябва ли тепърва да се учим как да се храним или вече имаме основите за това? Можем ли да се храним пълноценно, пазарувайки от супермаркета?

    - -

    Говорейки за човешко здраве, от гледна точка на способността на отделни групи хора да отглеждат деца, които нямат зъбно-челюстни деформации, кариеси, възпаление на венците (гингивит) или криви зъби съвсем естествено достигаме до въпроса “С какво се хранят. Особено внимание е обърнато на храненето на бременните жени и на подрастващите.

    - -

    Трите основни фактора за здрави, бели и красиви зъби са: - 1. Присъствие на достатъчно минерали в храната. - 2. Присъствие на достатъчно мастно-разтворими витамини А, Д, Е, К в храната. - 3. Способността на организма да усвои минералите и витамините, приети чрез храната.

    - -

    Ето някои интересни факти от книгата Nutrition and Physical Degeneration на д-р У. Прайс

    - -

    Хората, живеещи във високите и изолирани долини в Швейцарските Алпи се хранят основно с ръжен хляб и млечни продукти, една порция месо седмично и средно количество зеленчуци - свежи през лятото и естествено ферментирали през зимата. Лабораторни анализи показват високия витаминен и минерален състав на млякото, което е издоеното от крави, хранещи се само с трева, която в тези планински части е с много високо съдържание на хлорофил. Ръжта, смляна непосредствено преди замесване на хляба също е с много висок минерален състав.

    - -

    Диетата на жителите на Шотландските групи от острови -вътрешни и външни Хебридски Острови се състои от овес и морска храна - риба, черупчести и мекотели. В тяхното хранене липсват изцяло млечните продукти. Пасбища липсват, а овесът е единствената култура, която вирее на този климат. Зеленчуците са ограничени, а пресните са само през лятото. Интересен факт е, че въпреки неограничените количества морска храна и риба която имат, рибеният черен дроб се консумира като деликатес. Изключително важно ястие за подрастващи е изпечена глава на риба треска, пълна с овес и черен дроб. Минералният и витаминен състав на това блюдо е изключително подходящ за създаване на имунитет и превенция на кариес.

    - -

    Естествената диета на Ескимосите в Аляска се състои от неограничено количество органи и специални части от големите обитатели на океана и голямо количество мазна риба. Китовата мас се използва в големи количества, заедно със замразена, сушена или прясна риба. Често в менюто присъства и месо от лос или тюлен, но по-ценни са органите на животните. Плодовете са ограничени до минимално количество дребни диворастящи плодчета от типа на боровинките. Те биват събирани и изсушавани или консервирани в мазнина за зимата. Специалното ястие за подрастващи и бременни са части от органите на кит.

    - -

    Индианците, живеещи във вътрешността на Скалистите Планини в най-далечните части на Северна Канада, девет месеца от годината се хранят с месо от елен или лос. Достъпа им до зелена растителност е само през лятото. През зимата използват известно количество дървесна кора или пъпки. Те ядат всички вътрешности, а често с месото (мускулите на убитото животно) хранят кучетата си. Важна част от менюто на подрастващите са различни блюда от костен мозък. Той е използван и като заместител на млякото или като подсилващо средство за болни хора.

    - -

    За Островитяните в Южните Морета, мастно-разтворимите витамини и много от минералите са осигурявани чрез консумирането на ракообразни и други черупчести обитатели на океана.

    - -

    Племената, родени и обитаващи централна Африка използват големи количества сладки картофи, бобови култури и някои зърнени храни. Тъй като повечето имат достъп до водни източници като езера и естуари, рибата често присъства на трапезата. Специфично за този район, че техният извор на минерали идва са инсектите - деликатес са щурците и скакалците. Насекомите биват изяждани директно, но често се изсушават и стриват на брашно. Най-питателен е паят от мравки. Също така, зърнените храни са смилани непосредствено преди готвене.

    - -

    Австралийските Аборигени, живеещи близо до океана използвали неограничени количества морска храна, заедно с диворастящи растения, нерядко са ловували дивеч. -Във вътрешността на континента, хората се изхранвали предимно с дивечово месо - кенгуру, антилопа, дребни гризачи. Всички части на животното са оползотворявани за храна, включително червата и вътрешните органи.

    - -

    Новозеландски маори - в менюто им влизат основно морски храни. Дори децата в обедната почивка в училище отиват до океана и си ловят омар от морето.

    - -

    Наследниците на маите - изобилие от морски храни, както и животни от рода на камилата и ламата. Често към ястията добавят морски свинчета. Случайно или не, те са животните които произвеждат най-много витамин Д от изцяло растителна храна.

    - -

    Индианците в Британска Колумбия са познати с техният лек за диабет: подобна на инсулина по действие отвара от дяволски корен. Използвана в медицински изследвания, тази отвара има отлично действие за контрол на кръвната захар.

    - -

    Кое ви направи най-силно впечатление от диетите на примитивните хора? Включвате ли някои от тези храни в менюто си? А бихте ли го правили, ако знаете, че ще имате полза? Напишете отговорите си като коментар под статията.

    - -

    А какво е открил по българските земи ще прочетете в продължението…

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"1%###Пай от мравки и пълнена рибя глава с дроб: това ли е ключът към здравите зъби? Трябва ли тепърва да се учим как да се храним или вече имаме основите за това? Можем ли да се храним пълноценно, пазарувайки от супермаркета? - -Говорейки за човешко здраве, от гледна точка на способността на отделни групи хора да отглеждат деца, които нямат зъбно-челюстни деформации, кариеси, възпаление на венците (гингивит) или криви зъби съвсем естествено достигаме до въпроса "С какво се хранят. Особено внимание е обърнато на храненето на бременните жени и на подрастващите. - -Трите основни фактора за здрави, бели и красиви зъби са: - 1. Присъствие на достатъчно минерали в храната. - 2. Присъствие на достатъчно мастно-разтворими витамини А, Д, Е, К в храната. - 3. Способността на организма да усвои минералите и витамините, приети чрез храната. - -Ето някои интересни факти от книгата Nutrition and Physical Degeneration на д-р У. Прайс - -Хората, живеещи във високите и изолирани долини в Швейцарските Алпи се хранят основно с ръжен хляб и млечни продукти, една порция месо седмично и средно количество зеленчуци - свежи през лятото и естествено ферментирали през зимата. Лабораторни анализи показват високия витаминен и минерален състав на млякото, което е издоеното от крави, хранещи се само с трева, която в тези планински части е с много високо съдържание на хлорофил. Ръжта, смляна непосредствено преди замесване на хляба също е с много висок минерален състав. - -Диетата на жителите на Шотландските групи от острови -вътрешни и външни Хебридски Острови се състои от овес и морска храна - риба, черупчести и мекотели. В тяхното хранене липсват изцяло млечните продукти. Пасбища липсват, а овесът е единствената култура, която вирее на този климат. Зеленчуците са ограничени, а пресните са само през лятото. Интересен факт е, че въпреки неограничените количества морска храна и риба която имат, рибеният черен дроб се консумира като деликатес. Изключително важно ястие за подрастващи е изпечена глава на риба треска, пълна с овес и черен дроб. Минералният и витаминен състав на това блюдо е изключително подходящ за създаване на имунитет и превенция на кариес. - -Естествената диета на Ескимосите в Аляска се състои от неограничено количество органи и специални части от големите обитатели на океана и голямо количество мазна риба. Китовата мас се използва в големи количества, заедно със замразена, сушена или прясна риба. Често в менюто присъства и месо от лос или тюлен, но по-ценни са органите на животните. Плодовете са ограничени до минимално количество дребни диворастящи плодчета от типа на боровинките. Те биват събирани и изсушавани или консервирани в мазнина за зимата. Специалното ястие за подрастващи и бременни са части от органите на кит. - -Индианците, живеещи във вътрешността на Скалистите Планини в най-далечните части на Северна Канада, девет месеца от годината се хранят с месо от елен или лос. Достъпа им до зелена растителност е само през лятото. През зимата използват известно количество дървесна кора или пъпки. Те ядат всички вътрешности, а често с месото (мускулите на убитото животно) хранят кучетата си. Важна част от менюто на подрастващите са различни блюда от костен мозък. Той е използван и като заместител на млякото или като подсилващо средство за болни хора. - -За Островитяните в Южните Морета, мастно-разтворимите витамини и много от минералите са осигурявани чрез консумирането на ракообразни и други черупчести обитатели на океана. - -Племената, родени и обитаващи централна Африка използват големи количества сладки картофи, бобови култури и някои зърнени храни. Тъй като повечето имат достъп до водни източници като езера и естуари, рибата често присъства на трапезата. Специфично за този район, че техният извор на минерали идва са инсектите - деликатес са щурците и скакалците. Насекомите биват изяждани директно, но често се изсушават и стриват на брашно. Най-питателен е паят от мравки. Също така, зърнените храни са смилани непосредствено преди готвене. - -Австралийските Аборигени, живеещи близо до океана използвали неограничени количества морска храна, заедно с диворастящи растения, нерядко са ловували дивеч. -Във вътрешността на континента, хората се изхранвали предимно с дивечово месо - кенгуру, антилопа, дребни гризачи. Всички части на животното са оползотворявани за храна, включително червата и вътрешните органи. - -Новозеландски маори - в менюто им влизат основно морски храни. Дори децата в обедната почивка в училище отиват до океана и си ловят омар от морето. - -Наследниците на маите - изобилие от морски храни, както и животни от рода на камилата и ламата. Често към ястията добавят морски свинчета. Случайно или не, те са животните които произвеждат най-много витамин Д от изцяло растителна храна. - -Индианците в Британска Колумбия са познати с техният лек за диабет: подобна на инсулина по действие отвара от дяволски корен. Използвана в медицински изследвания, тази отвара има отлично действие за контрол на кръвната захар. - -Кое ви направи най-силно впечатление от диетите на примитивните хора? Включвате ли някои от тези храни в менюто си? А бихте ли го правили, ако знаете, че ще имате полза? Напишете отговорите си като коментар под статията. - -А какво е открил по българските земи ще прочетете в продължението...;T; -I"%

    Пай от мравки и пълнена рибя глава с дроб: това ли е ключът към здравите зъби? Трябва ли тепърва да се учим как да се храним или вече имаме основите за това? Можем ли да се храним пълноценно, пазарувайки от супермаркета?

    - -

    Говорейки за човешко здраве, от гледна точка на способността на отделни групи хора да отглеждат деца, които нямат зъбно-челюстни деформации, кариеси, възпаление на венците (гингивит) или криви зъби съвсем естествено достигаме до въпроса “С какво се хранят. Особено внимание е обърнато на храненето на бременните жени и на подрастващите.

    - -

    Трите основни фактора за здрави, бели и красиви зъби са: - 1. Присъствие на достатъчно минерали в храната. - 2. Присъствие на достатъчно мастно-разтворими витамини А, Д, Е, К в храната. - 3. Способността на организма да усвои минералите и витамините, приети чрез храната.

    - -

    Ето някои интересни факти от книгата Nutrition and Physical Degeneration на д-р У. Прайс

    - -

    Хората, живеещи във високите и изолирани долини в Швейцарските Алпи се хранят основно с ръжен хляб и млечни продукти, една порция месо седмично и средно количество зеленчуци - свежи през лятото и естествено ферментирали през зимата. Лабораторни анализи показват високия витаминен и минерален състав на млякото, което е издоеното от крави, хранещи се само с трева, която в тези планински части е с много високо съдържание на хлорофил. Ръжта, смляна непосредствено преди замесване на хляба също е с много висок минерален състав.

    - -

    Диетата на жителите на Шотландските групи от острови -вътрешни и външни Хебридски Острови се състои от овес и морска храна - риба, черупчести и мекотели. В тяхното хранене липсват изцяло млечните продукти. Пасбища липсват, а овесът е единствената култура, която вирее на този климат. Зеленчуците са ограничени, а пресните са само през лятото. Интересен факт е, че въпреки неограничените количества морска храна и риба която имат, рибеният черен дроб се консумира като деликатес. Изключително важно ястие за подрастващи е изпечена глава на риба треска, пълна с овес и черен дроб. Минералният и витаминен състав на това блюдо е изключително подходящ за създаване на имунитет и превенция на кариес.

    - -

    Естествената диета на Ескимосите в Аляска се състои от неограничено количество органи и специални части от големите обитатели на океана и голямо количество мазна риба. Китовата мас се използва в големи количества, заедно със замразена, сушена или прясна риба. Често в менюто присъства и месо от лос или тюлен, но по-ценни са органите на животните. Плодовете са ограничени до минимално количество дребни диворастящи плодчета от типа на боровинките. Те биват събирани и изсушавани или консервирани в мазнина за зимата. Специалното ястие за подрастващи и бременни са части от органите на кит.

    - -

    Индианците, живеещи във вътрешността на Скалистите Планини в най-далечните части на Северна Канада, девет месеца от годината се хранят с месо от елен или лос. Достъпа им до зелена растителност е само през лятото. През зимата използват известно количество дървесна кора или пъпки. Те ядат всички вътрешности, а често с месото (мускулите на убитото животно) хранят кучетата си. Важна част от менюто на подрастващите са различни блюда от костен мозък. Той е използван и като заместител на млякото или като подсилващо средство за болни хора.

    - -

    За Островитяните в Южните Морета, мастно-разтворимите витамини и много от минералите са осигурявани чрез консумирането на ракообразни и други черупчести обитатели на океана.

    - -

    Племената, родени и обитаващи централна Африка използват големи количества сладки картофи, бобови култури и някои зърнени храни. Тъй като повечето имат достъп до водни източници като езера и естуари, рибата често присъства на трапезата. Специфично за този район, че техният извор на минерали идва са инсектите - деликатес са щурците и скакалците. Насекомите биват изяждани директно, но често се изсушават и стриват на брашно. Най-питателен е паят от мравки. Също така, зърнените храни са смилани непосредствено преди готвене.

    - -

    Австралийските Аборигени, живеещи близо до океана използвали неограничени количества морска храна, заедно с диворастящи растения, нерядко са ловували дивеч. -Във вътрешността на континента, хората се изхранвали предимно с дивечово месо - кенгуру, антилопа, дребни гризачи. Всички части на животното са оползотворявани за храна, включително червата и вътрешните органи.

    - -

    Новозеландски маори - в менюто им влизат основно морски храни. Дори децата в обедната почивка в училище отиват до океана и си ловят омар от морето.

    - -

    Наследниците на маите - изобилие от морски храни, както и животни от рода на камилата и ламата. Често към ястията добавят морски свинчета. Случайно или не, те са животните които произвеждат най-много витамин Д от изцяло растителна храна.

    - -

    Индианците в Британска Колумбия са познати с техният лек за диабет: подобна на инсулина по действие отвара от дяволски корен. Използвана в медицински изследвания, тази отвара има отлично действие за контрол на кръвната захар.

    - -

    Кое ви направи най-силно впечатление от диетите на примитивните хора? Включвате ли някои от тези храни в менюто си? А бихте ли го правили, ако знаете, че ще имате полза? Напишете отговорите си като коментар под статията.

    - -

    А какво е открил по българските земи ще прочетете в продължението…

    -;T; @3I"G/blog/2014-03-03-храни-за-здрави-зъби-част-2/;T{;{ ;I"[D - - - - - - - Какво да ядем, за да имаме здрави зъби? част 2 - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Какво да ядем, за да имаме здрави зъби? част 2 -

    - -
    -
      -
    • - - March 3, 2014 -
    • -
    -
    - - - -

    Продължението на статията за храната на примитивните народи.

    - -

    В [Първата част](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/ “Какво да ядем за здрави зъби?”част1) на този материал се запознахме накратко с хранителните порядки на няколко групи хора, живеещи далеч от цивилизацията. Навярно много от вас не са изненадани от прочетеното: всички знаем, че цивилизацията наред с големият технологичен напредък, за добро или лошо ни е отдалечила от естествената ни среда. Но знаем ли как се е променил нашият живот, в сравнение с този на прародителите ни?

    - -

    Спомняте си за всички племена, с които се срещнахме тук. Един интересен факт свързва всички тях. -В кожените сакове и дисаги на ловците и пътуващите хора от племето той намира топче глина с размерите на голям орех. Малка част от глината се разтваряла във вода и в тази течност се потапяла всяка хапка, преди да се постави в устата. Обяснението било, че това предпазва от “стомашни болки”. Това е начинът на примитивните хора да се предпазват от дизентерия и хранителни натравяния.

    - -

    Случайно или не, през последните две десетилетия Американската и Британската фармакопеи включиха каолинът(глината) в техните списъци с лекарствени средства. -Наследниците на инките, племена живеещи до езерото Титикака имат 100% растителна диета. Те също ползват глина при хранене. -В последствие става ясно, че глината има богат набор от органични и неорганични съставки, висок минерален състав, но също така съдържа и някои токсини (напр. кумарин).

    - -

    В практиката си и в специализираната литература съм срещала много форми на минерален дефицит - често тези индивиди имат голяма предразположеност към кариес и други състояния, свързани с липсата на калций, фосфор и мастно-разтворими активатори, въпреки адекватният калориен прием.

    - -

    Най-големият проблем на преработената храна е че се храним по-обилно от всякога, а клетките ни гладуват. А какво да ядем? От къде да си купим полезна за зъбите храна? Няма нужда да четете етикетите, защото истинската храна няма етикет.

    - -

    Ето и българската следа: -Специално внимание е обърнато и на хранителните навици на българите. В началото на 20 век в България е имало най-много столетници, от всички страни на света и по време на своето пътешествие семейство Прайс са потърсили истината за удивителното здраве и дълголетие по нашите земи. Ето част от коментара на Д-р Прайс: ->Pastured meat of all kinds was valued in Bulgaria, and wild game was a favorite. Meat in Bulgaria was almost always served with the natural fat, cooked with fat, and served with other foods containing fat. ->The traditional Bulgarian diet valued all kinds of organ meats, serving them in many forms, with “Organs Soup” being a favorite dish. ->Wild fish and seafood were favorites in Bulgaria, and were widely and frequently eaten as part of the traditional diet. Fish eggs were valued, and often served. ->Eggs and poultry were an important part of the Bulgarian diet. Eggs were not only eaten as a valued dish, but were added in large amounts to many other foods, such as traditional pasta and baking. ->Sauerkraut and other fermented foods were widely used in traditional Bulgarian cuisine, often being served at every meal in small quantities. ->Bulgaria had some of the richest soil on Еarth, and was famous for the wonderful qualities of their fruits and vegetables, which were widely eaten, and a crucial part of traditional cuisine. ->The Bulgarians traditionally made everything from scratch, using only traditional ways of preserving and fermenting foods. The Bulgarians did eat desserts made with lots of refined sugar and flour, but only on very rare occasions such as religious holidays. These rarely served desserts were served with a meal that was full of healthy fats and other healthy foods, which limited the damage done by the refined foods. ->The traditional Bulgarian attitude towards food was very similar to that of healthy traditional peoples. The idea was to let your appetite be your guide as to what you should eat, and how much. In other words, eat what you desire, and as much of it as you desire, and let the needs of your body as expressed by your appetite be your guide. -В обобщение на написаното: “Диетата на българите включва голямо количество мазно месо от животни, хранени само с трева и сено. Млякото и маслото също са добивани от такива крави, овце, кози. Вътрешностите на животните са консумирани като самостоятелно ястие. Рибата от естествени водоизточници и хайвера са високо ценена храна. Яйца и пилешко месо са също част от трапезата на българите, като яйцата често са в състава на други блюда. Туршията и други естествено ферментирали храни са консумирани ежедневно в малки количества. Благодарение на изключително плодородната почва, плодовете и зеленчуците са много хранителни и широко застъпени в менюто на българите. Използват се специфични начини за консервиране и ферментиране на храната. В България десертите са направени от бяла захар и брашно, но се консумират изключително рядко и винаги в комбинация с храни, богати на полезни мазнини и протеин. По този начин се намалява вредното действие на рафинираните продукти. Важно е да се отбележи, че хранителните навици на българите са близки до тези на народите, които се хранят най-здравословно. С други думи, те се хранят докато се заситят, независимо какво имат за ядене. Храненето зависи изцяло от нуждите на тялото.”

    - -

    Звучи ли ви познато? Помните ли как баба ви даваше комат домашен черен хляб, намазан със свинска мас и поръсен с ароматна шарена сол от планински билки и треви, с който изкарвахте цял ден в игри без да усетите глад? Въглехидрат в комбинация с животински мазнини: пълно несъответствие според съвременните лекарски съвети, нали? Растителните мазнини са един от източниците на мастно-разтворими витамини, но тези, идващи от жувотински мазнини са много по-лесно усвоими от човешкият отганизъм. Следващият път ще ви разкажа за витамините и хранителните добавки, които са да доближат модерната храна до тази на хората със здравите зъби от книгата на д-р Прайс.

    - -

    Изолирани швейцарци -Изолирани швейцарци

    - -

    Модернизирани швейцарци -Модернизирани швейцарци

    - -

    източник

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"' -###Продължението на статията за храната на примитивните народи. - -В [Първата част](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/ "Какво да ядем за здрави зъби?"част1) на този материал се запознахме накратко с хранителните порядки на няколко групи хора, живеещи далеч от цивилизацията. Навярно много от вас не са изненадани от прочетеното: всички знаем, че цивилизацията наред с големият технологичен напредък, за добро или лошо ни е отдалечила от естествената ни среда. Но знаем ли как се е променил нашият живот, в сравнение с този на прародителите ни? - -Спомняте си за всички племена, с които се срещнахме [тук](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/ "Какво да ядем за здрави зъби?част 1"). Един интересен факт свързва всички тях. -В кожените сакове и дисаги на ловците и пътуващите хора от племето той намира топче глина с размерите на голям орех. Малка част от глината се разтваряла във вода и в тази течност се потапяла всяка хапка, преди да се постави в устата. Обяснението било, че това предпазва от "стомашни болки". Това е начинът на примитивните хора да се предпазват от дизентерия и хранителни натравяния. - -Случайно или не, през последните две десетилетия **Американската и Британската фармакопеи включиха каолинът(глината) в техните списъци с лекарствени средства.** -Наследниците на инките, племена живеещи до езерото Титикака имат 100% растителна диета. Те също ползват глина при хранене. -В последствие става ясно, че глината има богат набор от органични и неорганични съставки, висок минерален състав, но също така съдържа и някои токсини (напр. кумарин). - -В практиката си и в специализираната литература съм срещала много форми на минерален дефицит - често тези индивиди имат голяма предразположеност към кариес и други състояния, свързани с липсата на калций, фосфор и мастно-разтворими активатори, въпреки адекватният калориен прием. - -Най-големият проблем на преработената храна е че се храним по-обилно от всякога, а клетките ни гладуват. А какво да ядем? От къде да си купим полезна за зъбите храна? Няма нужда да четете етикетите, защото истинската храна няма етикет. - -Ето и българската следа: -Специално внимание е обърнато и на хранителните навици на българите. В началото на 20 век в България е имало най-много столетници, от всички страни на света и по време на своето пътешествие семейство Прайс са потърсили истината за удивителното здраве и дълголетие по нашите земи. Ето част от коментара на Д-р Прайс: ->Pastured meat of all kinds was valued in Bulgaria, and wild game was a favorite. Meat in Bulgaria was almost always served with the natural fat, cooked with fat, and served with other foods containing fat. ->The traditional Bulgarian diet valued all kinds of organ meats, serving them in many forms, with “Organs Soup” being a favorite dish. ->Wild fish and seafood were favorites in Bulgaria, and were widely and frequently eaten as part of the traditional diet. Fish eggs were valued, and often served. ->Eggs and poultry were an important part of the Bulgarian diet. Eggs were not only eaten as a valued dish, but were added in large amounts to many other foods, such as traditional pasta and baking. ->Sauerkraut and other fermented foods were widely used in traditional Bulgarian cuisine, often being served at every meal in small quantities. ->Bulgaria had some of the richest soil on Еarth, and was famous for the wonderful qualities of their fruits and vegetables, which were widely eaten, and a crucial part of traditional cuisine. ->The Bulgarians traditionally made everything from scratch, using only traditional ways of preserving and fermenting foods. The Bulgarians did eat desserts made with lots of refined sugar and flour, but only on very rare occasions such as religious holidays. These rarely served desserts were served with a meal that was full of healthy fats and other healthy foods, which limited the damage done by the refined foods. ->The traditional Bulgarian attitude towards food was very similar to that of healthy traditional peoples. The idea was to let your appetite be your guide as to what you should eat, and how much. In other words, eat what you desire, and as much of it as you desire, and let the needs of your body as expressed by your appetite be your guide. -В обобщение на написаното: "Диетата на българите включва голямо количество мазно месо от животни, хранени само с трева и сено. Млякото и маслото също са добивани от такива крави, овце, кози. Вътрешностите на животните са консумирани като самостоятелно ястие. Рибата от естествени водоизточници и хайвера са високо ценена храна. Яйца и пилешко месо са също част от трапезата на българите, като яйцата често са в състава на други блюда. Туршията и други естествено ферментирали храни са консумирани ежедневно в малки количества. Благодарение на изключително плодородната почва, плодовете и зеленчуците са много хранителни и широко застъпени в менюто на българите. Използват се специфични начини за консервиране и ферментиране на храната. В България десертите са направени от бяла захар и брашно, но се консумират изключително рядко и винаги в комбинация с храни, богати на полезни мазнини и протеин. По този начин се намалява вредното действие на рафинираните продукти. Важно е да се отбележи, че хранителните навици на българите са близки до тези на народите, които се хранят най-здравословно. С други думи, те се хранят докато се заситят, независимо какво имат за ядене. Храненето зависи изцяло от нуждите на тялото." - -Звучи ли ви познато? Помните ли как баба ви даваше комат домашен черен хляб, намазан със свинска мас и поръсен с ароматна шарена сол от планински билки и треви, с който изкарвахте цял ден в игри без да усетите глад? Въглехидрат в комбинация с животински мазнини: пълно несъответствие според съвременните лекарски съвети, нали? Растителните мазнини са един от източниците на мастно-разтворими витамини, но тези, идващи от жувотински мазнини са много по-лесно усвоими от човешкият отганизъм. Следващият път ще ви разкажа за витамините и хранителните добавки, които са да доближат модерната храна до тази на хората със здравите зъби от книгата на д-р Прайс. - -![Изолирани швейцарци](/images/posts/pricepic1swiss.jpg) -Изолирани швейцарци - -![Модернизирани швейцарци](/images/posts/pricepic2swiss.jpg) -Модернизирани швейцарци - -[източник](http://www.amazon.com/gp/product/0916764206?ie=UTF8&tag=jourtofore-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0916764206 "amazon.com");T; -I"( -

    Продължението на статията за храната на примитивните народи.

    - -

    В [Първата част](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/ “Какво да ядем за здрави зъби?”част1) на този материал се запознахме накратко с хранителните порядки на няколко групи хора, живеещи далеч от цивилизацията. Навярно много от вас не са изненадани от прочетеното: всички знаем, че цивилизацията наред с големият технологичен напредък, за добро или лошо ни е отдалечила от естествената ни среда. Но знаем ли как се е променил нашият живот, в сравнение с този на прародителите ни?

    - -

    Спомняте си за всички племена, с които се срещнахме тук. Един интересен факт свързва всички тях. -В кожените сакове и дисаги на ловците и пътуващите хора от племето той намира топче глина с размерите на голям орех. Малка част от глината се разтваряла във вода и в тази течност се потапяла всяка хапка, преди да се постави в устата. Обяснението било, че това предпазва от “стомашни болки”. Това е начинът на примитивните хора да се предпазват от дизентерия и хранителни натравяния.

    - -

    Случайно или не, през последните две десетилетия Американската и Британската фармакопеи включиха каолинът(глината) в техните списъци с лекарствени средства. -Наследниците на инките, племена живеещи до езерото Титикака имат 100% растителна диета. Те също ползват глина при хранене. -В последствие става ясно, че глината има богат набор от органични и неорганични съставки, висок минерален състав, но също така съдържа и някои токсини (напр. кумарин).

    - -

    В практиката си и в специализираната литература съм срещала много форми на минерален дефицит - често тези индивиди имат голяма предразположеност към кариес и други състояния, свързани с липсата на калций, фосфор и мастно-разтворими активатори, въпреки адекватният калориен прием.

    - -

    Най-големият проблем на преработената храна е че се храним по-обилно от всякога, а клетките ни гладуват. А какво да ядем? От къде да си купим полезна за зъбите храна? Няма нужда да четете етикетите, защото истинската храна няма етикет.

    - -

    Ето и българската следа: -Специално внимание е обърнато и на хранителните навици на българите. В началото на 20 век в България е имало най-много столетници, от всички страни на света и по време на своето пътешествие семейство Прайс са потърсили истината за удивителното здраве и дълголетие по нашите земи. Ето част от коментара на Д-р Прайс: ->Pastured meat of all kinds was valued in Bulgaria, and wild game was a favorite. Meat in Bulgaria was almost always served with the natural fat, cooked with fat, and served with other foods containing fat. ->The traditional Bulgarian diet valued all kinds of organ meats, serving them in many forms, with “Organs Soup” being a favorite dish. ->Wild fish and seafood were favorites in Bulgaria, and were widely and frequently eaten as part of the traditional diet. Fish eggs were valued, and often served. ->Eggs and poultry were an important part of the Bulgarian diet. Eggs were not only eaten as a valued dish, but were added in large amounts to many other foods, such as traditional pasta and baking. ->Sauerkraut and other fermented foods were widely used in traditional Bulgarian cuisine, often being served at every meal in small quantities. ->Bulgaria had some of the richest soil on Еarth, and was famous for the wonderful qualities of their fruits and vegetables, which were widely eaten, and a crucial part of traditional cuisine. ->The Bulgarians traditionally made everything from scratch, using only traditional ways of preserving and fermenting foods. The Bulgarians did eat desserts made with lots of refined sugar and flour, but only on very rare occasions such as religious holidays. These rarely served desserts were served with a meal that was full of healthy fats and other healthy foods, which limited the damage done by the refined foods. ->The traditional Bulgarian attitude towards food was very similar to that of healthy traditional peoples. The idea was to let your appetite be your guide as to what you should eat, and how much. In other words, eat what you desire, and as much of it as you desire, and let the needs of your body as expressed by your appetite be your guide. -В обобщение на написаното: “Диетата на българите включва голямо количество мазно месо от животни, хранени само с трева и сено. Млякото и маслото също са добивани от такива крави, овце, кози. Вътрешностите на животните са консумирани като самостоятелно ястие. Рибата от естествени водоизточници и хайвера са високо ценена храна. Яйца и пилешко месо са също част от трапезата на българите, като яйцата често са в състава на други блюда. Туршията и други естествено ферментирали храни са консумирани ежедневно в малки количества. Благодарение на изключително плодородната почва, плодовете и зеленчуците са много хранителни и широко застъпени в менюто на българите. Използват се специфични начини за консервиране и ферментиране на храната. В България десертите са направени от бяла захар и брашно, но се консумират изключително рядко и винаги в комбинация с храни, богати на полезни мазнини и протеин. По този начин се намалява вредното действие на рафинираните продукти. Важно е да се отбележи, че хранителните навици на българите са близки до тези на народите, които се хранят най-здравословно. С други думи, те се хранят докато се заситят, независимо какво имат за ядене. Храненето зависи изцяло от нуждите на тялото.”

    - -

    Звучи ли ви познато? Помните ли как баба ви даваше комат домашен черен хляб, намазан със свинска мас и поръсен с ароматна шарена сол от планински билки и треви, с който изкарвахте цял ден в игри без да усетите глад? Въглехидрат в комбинация с животински мазнини: пълно несъответствие според съвременните лекарски съвети, нали? Растителните мазнини са един от източниците на мастно-разтворими витамини, но тези, идващи от жувотински мазнини са много по-лесно усвоими от човешкият отганизъм. Следващият път ще ви разкажа за витамините и хранителните добавки, които са да доближат модерната храна до тази на хората със здравите зъби от книгата на д-р Прайс.

    - -

    Изолирани швейцарци -Изолирани швейцарци

    - -

    Модернизирани швейцарци -Модернизирани швейцарци

    - -

    източник

    -;T; @9I")/blog/2014-03-07-избелване/;T{;{ ;I"7 - - - - - - - Как по естествен начин да избелим зъбите си? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как по естествен начин да избелим зъбите си? -

    - -
    -
      -
    • - - March 7, 2014 -
    • -
    -
    - - -

    Почнала съм да пиша за толкова много и все важни неща (как да повишим естествената способност на зъбите да се защитят от кариеса), изготвям лечебни планове на пациенти, имам и 3 почнати книги по темата (и ходя на работа и представете си даже ми остава време и за колелото :) ) но реших да разведря малко обстановката с един практичен и любопитен пост. Сигурна съм, че ще ви хареса ако изпробвате този лесен, евтин и безопасен метод за избелване на зъбите.

    - -

    Кой би помислил, че с въглен ще избелваме нещо?! Знаем че, активният въглен върши отлична работа при натравяне с храна и всякакви вътречревни токсини. Съответно, приложен в устната кухина, въгленът ще повлияе и върху субтанцииите от микроорганизмите, които водят до възпаление на венците и лош дъх.

    - -

    Активният въглен е вещество с високи абсорбционни свойства. Той премахва токсините като ги улавя и залепва по своята повърхност. Не се абсорбира от тялото, а преминава през храносмилателният тракт заедно с всички химикали и токсини полепнали по повърхността му. -Той е добро първо средство при всякакъв контакт с токсични агенти, но не бива да се приема, когато искаме нещо да се абсорбира от тялото (лекарства, витамини, добавки). Чудесно средство след употреба на алкохол. -Ако се налага да използвате активен въглен, поради някакво химично, медикаментозно или хранително отравяне, осигурете приема му през устата възможно най-бързо и потърсете Бърза Помощ. Смесват се 2 лъжици прах в чаша вода и се изпива възможно най-бързо. Или се приема съответната доза таблетки според предписанието върху опаковката. Неправилно е да се комбинира с млечни продукти, защото неутрализират действието му. Като самостоятелно лечение за възрастен човек се приема посочената доза 3 пъти дневно. Като силен дехидратант, не бива да забравяме, че заедно с активният въглен трябва да се приема много вода. -Можете да го намерите в състава на лекарства срещу ухапвания от насекоми, използва се в газовите маски и разбира се, е основното вещество във водните филтри за пречистване на вода в домашни условия.

    - -

    Но как всичко това помага зъбите да бъдат “избелени”

    - -

    активен въглен -активен въглен на прах

    - -

    Как се използва? -Купувате си активен въглен на прах или таблетки от аптеката (20 таблетки за 2,51 лв). Една чаена лъжичка прах (една стрита таблетка) е количеството, необходимо за една процедура. Потапяте навлажнена четка за зъби в черния прах и внимателно поставяте в устата си. Не се притеснявайте от вкуса - няма такъв. Четкане 2 минути с малки кръгови движения, без силен натиск. Черното се изплаква лесно и отдолу се появяват по-бели, лъскави и полирани зъби. Можете да използвате този метод, когато решите. Видим резултат има още след първите процедури.

    - -

    Естествено в първият момент, когато видите цялата си уста оцветена в черно, може би няма да съм най-любимият ви човек, но след добро изплакване и много добро изчеткване с чиста четка и почистване с конец ще промените мнението си. -В устата активният въглен прави точно това, което и в стомаха: премахва токсините и химичните наслагвания (оцветяванията от храна и напитки).

    - -

    При по-задълбочени проучвания става ясно, че активният въглен може да промени pH в устата и е възможно да се ползва като част от профилактиката срещу кариес и възпаления на венците.

    - -

    За най-добър ефект използвайте дървен въглен, а не произведен от петролни деривати.

    - -

    ВНИМАНИЕ! Да не се ползва от хора с отложен по зъбите зъбен камък и други налепи!! В този случай има вероятност въгленът да се отмие по-бавно (около 24-48 часа). Ако това се случи изпийте 1-2 чаши горещ чай. -По същият механизъм, би могло да се получи по-упорито оцветяване върху места с котлен камък по мивката.

    - -

    преди -след

    - -

    Надявам се, че тази статия ви е харесала. Ако решите да изпробвате идеята, споделете впечатленията си в коментар под нея. Благодаря.

    - -

    Аз ще продължа терапията и ще ви покажа резултата след няколко месеца.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Почнала съм да пиша за толкова много и все важни неща (как да повишим естествената способност на зъбите да се защитят от кариеса), изготвям лечебни планове на пациенти, имам и 3 почнати книги по темата (и ходя на работа и представете си даже ми остава време и за колелото :) ) но реших да разведря малко обстановката с един практичен и любопитен пост. **Сигурна съм, че ще ви хареса ако изпробвате този лесен, евтин и безопасен метод за избелване на зъбите.** - -Кой би помислил, че с въглен ще избелваме нещо?! Знаем че, активният въглен върши отлична работа при натравяне с храна и всякакви вътречревни токсини. Съответно, приложен в устната кухина, въгленът ще повлияе и върху субтанцииите от микроорганизмите, които водят до възпаление на венците и лош дъх. - -Активният въглен е вещество с високи абсорбционни свойства. Той премахва токсините като ги улавя и залепва по своята повърхност. Не се абсорбира от тялото, а преминава през храносмилателният тракт заедно с всички химикали и токсини полепнали по повърхността му. -Той е добро първо средство при всякакъв контакт с токсични агенти, но не бива да се приема, когато искаме нещо да се абсорбира от тялото (лекарства, витамини, добавки). Чудесно средство след употреба на алкохол. -**Ако се налага да използвате активен въглен, поради някакво химично, медикаментозно или хранително отравяне, осигурете приема му през устата възможно най-бързо и потърсете Бърза Помощ.** Смесват се 2 лъжици прах в чаша вода и се изпива възможно най-бързо. Или се приема съответната доза таблетки според предписанието върху опаковката. Неправилно е да се комбинира с млечни продукти, защото неутрализират действието му. Като самостоятелно лечение за възрастен човек се приема посочената доза 3 пъти дневно. Като силен дехидратант, не бива да забравяме, че заедно с активният въглен трябва да се приема много вода. -Можете да го намерите в състава на лекарства срещу ухапвания от насекоми, използва се в газовите маски и разбира се, е основното вещество във водните филтри за пречистване на вода в домашни условия. - -##Но как всичко това помага зъбите да бъдат "избелени"## - -![активен въглен](/images/posts/carbo1.jpg) -![активен въглен на прах](/images/posts/carbo2.jpg) - -Как се използва? -Купувате си активен въглен на прах или таблетки от аптеката (20 таблетки за 2,51 лв). Една чаена лъжичка прах (една стрита таблетка) е количеството, необходимо за една процедура. Потапяте навлажнена четка за зъби в черния прах и внимателно поставяте в устата си. Не се притеснявайте от вкуса - няма такъв. Четкане 2 минути с малки кръгови движения, без силен натиск. Черното се изплаква лесно и отдолу се появяват по-бели, лъскави и полирани зъби. Можете да използвате този метод, когато решите. Видим резултат има още след първите процедури. - -Естествено в първият момент, когато видите цялата си уста оцветена в черно, може би няма да съм най-любимият ви човек, но след добро изплакване и много добро изчеткване с чиста четка и почистване с конец ще промените мнението си. -В устата активният въглен прави точно това, което и в стомаха: премахва токсините и *химичните наслагвания* (оцветяванията от храна и напитки). - -При по-задълбочени проучвания става ясно, че активният въглен може да промени pH в устата и е възможно да се ползва като част от профилактиката срещу кариес и възпаления на венците. - -За най-добър ефект използвайте дървен въглен, а не произведен от петролни деривати. - -**ВНИМАНИЕ!** Да не се ползва от хора с отложен по зъбите зъбен камък и други налепи!! В този случай има вероятност въгленът да се отмие по-бавно (около 24-48 часа). Ако това се случи изпийте 1-2 чаши горещ чай. -По същият механизъм, би могло да се получи по-упорито оцветяване върху места с котлен камък по мивката. - -![преди](/images/posts/carbo3.jpg) -![след](/images/posts/carbo4.jpg) - -Надявам се, че тази статия ви е харесала. Ако решите да изпробвате идеята, споделете впечатленията си в коментар под нея. Благодаря. - -Аз ще продължа терапията и ще ви покажа резултата след няколко месеца.;T; -I"

    Почнала съм да пиша за толкова много и все важни неща (как да повишим естествената способност на зъбите да се защитят от кариеса), изготвям лечебни планове на пациенти, имам и 3 почнати книги по темата (и ходя на работа и представете си даже ми остава време и за колелото :) ) но реших да разведря малко обстановката с един практичен и любопитен пост. Сигурна съм, че ще ви хареса ако изпробвате този лесен, евтин и безопасен метод за избелване на зъбите.

    - -

    Кой би помислил, че с въглен ще избелваме нещо?! Знаем че, активният въглен върши отлична работа при натравяне с храна и всякакви вътречревни токсини. Съответно, приложен в устната кухина, въгленът ще повлияе и върху субтанцииите от микроорганизмите, които водят до възпаление на венците и лош дъх.

    - -

    Активният въглен е вещество с високи абсорбционни свойства. Той премахва токсините като ги улавя и залепва по своята повърхност. Не се абсорбира от тялото, а преминава през храносмилателният тракт заедно с всички химикали и токсини полепнали по повърхността му. -Той е добро първо средство при всякакъв контакт с токсични агенти, но не бива да се приема, когато искаме нещо да се абсорбира от тялото (лекарства, витамини, добавки). Чудесно средство след употреба на алкохол. -Ако се налага да използвате активен въглен, поради някакво химично, медикаментозно или хранително отравяне, осигурете приема му през устата възможно най-бързо и потърсете Бърза Помощ. Смесват се 2 лъжици прах в чаша вода и се изпива възможно най-бързо. Или се приема съответната доза таблетки според предписанието върху опаковката. Неправилно е да се комбинира с млечни продукти, защото неутрализират действието му. Като самостоятелно лечение за възрастен човек се приема посочената доза 3 пъти дневно. Като силен дехидратант, не бива да забравяме, че заедно с активният въглен трябва да се приема много вода. -Можете да го намерите в състава на лекарства срещу ухапвания от насекоми, използва се в газовите маски и разбира се, е основното вещество във водните филтри за пречистване на вода в домашни условия.

    - -

    Но как всичко това помага зъбите да бъдат “избелени”

    - -

    активен въглен -активен въглен на прах

    - -

    Как се използва? -Купувате си активен въглен на прах или таблетки от аптеката (20 таблетки за 2,51 лв). Една чаена лъжичка прах (една стрита таблетка) е количеството, необходимо за една процедура. Потапяте навлажнена четка за зъби в черния прах и внимателно поставяте в устата си. Не се притеснявайте от вкуса - няма такъв. Четкане 2 минути с малки кръгови движения, без силен натиск. Черното се изплаква лесно и отдолу се появяват по-бели, лъскави и полирани зъби. Можете да използвате този метод, когато решите. Видим резултат има още след първите процедури.

    - -

    Естествено в първият момент, когато видите цялата си уста оцветена в черно, може би няма да съм най-любимият ви човек, но след добро изплакване и много добро изчеткване с чиста четка и почистване с конец ще промените мнението си. -В устата активният въглен прави точно това, което и в стомаха: премахва токсините и химичните наслагвания (оцветяванията от храна и напитки).

    - -

    При по-задълбочени проучвания става ясно, че активният въглен може да промени pH в устата и е възможно да се ползва като част от профилактиката срещу кариес и възпаления на венците.

    - -

    За най-добър ефект използвайте дървен въглен, а не произведен от петролни деривати.

    - -

    ВНИМАНИЕ! Да не се ползва от хора с отложен по зъбите зъбен камък и други налепи!! В този случай има вероятност въгленът да се отмие по-бавно (около 24-48 часа). Ако това се случи изпийте 1-2 чаши горещ чай. -По същият механизъм, би могло да се получи по-упорито оцветяване върху места с котлен камък по мивката.

    - -

    преди -след

    - -

    Надявам се, че тази статия ви е харесала. Ако решите да изпробвате идеята, споделете впечатленията си в коментар под нея. Благодаря.

    - -

    Аз ще продължа терапията и ще ви покажа резултата след няколко месеца.

    -;T; @?I"'/blog/2014-03-12-витамини/;T{;{ ;I"? - - - - - - - Какви витамини и добавки да приемаме за здрави зъби? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Какви витамини и добавки да приемаме за здрави зъби? -

    - -
    -
      -
    • - - March 17, 2014 -
    • -
    -
    - - -

    Какво са витамините?

    -

    Не-научният отговор е, че те са важна част от храната, необходима за нормалното функциониране на организма. Ядейки дадена храна, тялото ни я разгражда до отделни фрагменти, които продължават пътя си по съответното направление. Природата ни дава цялостния набор от хранителни вещества в ябълката, домата или яйцето и ние трябва да мислим за тях като пълноценен продукт, а не като източник на конкретни нутритенти (нутритенти: химически вещества, органични и неорганични, от които организма се нуждае, за да живее и расте).

    - -

    Научният отговор: Витамините са вещества, нужни за метаболитните процеси (напр. деленето на клетката) и поддържането на здравето като цяло. Те са два вида: водно-разтворими и мастно-разтворими. -Искам тук да направя уговорката, че за всички витамини, и особено за мастно-разтворимите важи условието, че има хиляди изучени и неизучени активатори в храната, както и че всеки от тях има много различни форми, циркулирайки в тялото.

    - -

    Водно-разтворимите витамини са В и С. Те лесно се набавят чрез растителната храна, а излишъците се освобождават с урината. Единствено витамин В9 (фолиевата киселина) трябва да бъде приеман като добавка, особено в периода на бременността, тъй като фолатите (формата, под която се намира в растенията) се усвояват бавно и трудно. Витамин В12 се произвежда от микроорганизми в червата на човека, някои видове почва, водорасли и др.

    - -

    За Витамин С се знае толкова много от всеки, че смятам да пропусна всеизвестните факти. Единственият съвет, който бих искала да ви дам е задължително да приемате витамин С от храната, а не като синтетичен продукт. Естественият е богат на фитонутриенти и флавоноиди, а аскорбиновата киселина (синтетичният) се произвежда от царевичен сироп, третиран с ацетон.(Всъщност се предлагат и добавки с натурален витамин С, които може да откриете онлайн).

    - -

    Мастно-разтворими витамини (А, D, Е, К) -Това са витамините, от които телата ни имат крещяща нужда, защото съвременната храна е изключително дефицитна откъм тяхното съдържание. Те са важни не само като нутритенти, а най-вече като важни модулатори в процесите на усвояване на минералите, постъпващи с храната. -Естественият витамин А е бета-каротен. Той се трансформира в тялото, за да може да се използва. Имаме нужда от него като естествен защитник срещу различни увреждания в клетката. Влияе на костният растеж и репродукцията. -Естествен витамин D - технически, докато телата ни не го превърнат във витамин под действието на слънчевата светлина, това са различни химични съединения, циркулиращи в кръвта. Минималната дневна доза е 20 минути излагане на директна слънчева светлина. Но на географската ширина на България само слънцето от април до септември успява да изработи минимални дози витамин Д за 2 часа и то ако човек е минимално облечен, докато е под слънчевите лъчи. Изкуствено се синтезират форми на витамин D се от различни гъби, гъба за мая или от ланолин (овча мазнина). Витамин D е изключително важен за костите, обмяната на калций и фосфор и за естествената реминерализация на зъбите. Скоро ще се върна на него с много по-подробна информация. -Витамин Е този витамин всъщност представлява 8 различни мастно-разтворими компонента, които предпазват мазнините от окисление (антиоксиданти). Естествени източници са зърнените култури, семената, ядките и производните им. Синтетичният му близнак алфа токоферол се добива от рафинирани масла, обработени с химикали, като не се абсорбира, а се метаболизира бързо от тялото като непознат химикал. -Витамин К - това е витамин, който е в основата на два важни процеса, протичащи в човешкото тяло - кръвосъсирването и метаболизма на калция, като второто ни засяга пряко, от гледна точка на зъбното здраве. Това е витамин К2: запомнете го! Неговата роля е да насочва калция от кръвта към костите и зъбите. Без неговото участие дори перфектно хранене и суплементация не са ефективни. -Витамин К и К2 се съдържат в зеленолистните зеленчуци. Изкуствено се добиват от въглища (coal tar), хидрогенирано соево олио и никел. Това го прави високо токсична субстанция, способна да увреди имунната система.

    - -

    Какво е най-важното да знаете за витамините, добавките и храненето като цяло?

    -

    Важно е витамините ни да постъпват в тялото чрез храната ни, доколкото е възможно. Ако искате да приемате мултивитамини, набавяйте ги чрез пълноценни храни (whole food) като босилек, авокадо, черен дроб, различни подправки, плодове и зеленчуци. Синтетичните витамини са изолирани съставки, а в природата няма такъв вариант. Тя ни дава всичко нужно заедно, в един цял плод: енергия, витамини, минерали, фибри. Избягвайте добавки, които имат в името си ‘киселинен’, ‘-киселина’, завършват на ‘-ид’ или ‘-ат’, имат представка ‘D’ или ‘L’. Минералите също трябва да идват от цяла, непреработена храна, където неорганичните и органичните съставки са в идеален баланс, комбинирани с нужните ензими. Твоето тяло копнее за витамини и минерали, които познава, обича и ужасно му липсват!

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"####Какво са витамините? -Не-научният отговор е, че те са важна част от храната, необходима за нормалното функциониране на организма. Ядейки дадена храна, тялото ни я разгражда до отделни фрагменти, които продължават пътя си по съответното направление. Природата ни дава цялостния набор от хранителни вещества в ябълката, домата или яйцето и ние трябва да мислим за тях като пълноценен продукт, а не като източник на конкретни нутритенти (нутритенти: химически вещества, органични и неорганични, от които организма се нуждае, за да живее и расте). - -Научният отговор: Витамините са вещества, нужни за метаболитните процеси (напр. деленето на клетката) и поддържането на здравето като цяло. Те са два вида: водно-разтворими и мастно-разтворими. -Искам тук да направя уговорката, че за всички витамини, и особено за мастно-разтворимите важи условието, че има хиляди изучени и неизучени активатори в храната, както и че всеки от тях има много различни форми, циркулирайки в тялото. - -**Водно-разтворимите витамини** са **В** и **С**. Те лесно се набавят чрез растителната храна, а излишъците се освобождават с урината. Единствено витамин В9 (фолиевата киселина) трябва да бъде приеман като добавка, особено в периода на бременността, тъй като фолатите (формата, под която се намира в растенията) се усвояват бавно и трудно. Витамин В12 се произвежда от микроорганизми в червата на човека, някои видове почва, водорасли и др. - -За Витамин С се знае толкова много от всеки, че смятам да пропусна всеизвестните факти. Единственият съвет, който бих искала да ви дам е задължително да приемате витамин С от храната, а не като синтетичен продукт. Естественият е богат на фитонутриенти и флавоноиди, а аскорбиновата киселина (синтетичният) се произвежда от царевичен сироп, третиран с ацетон.(Всъщност се предлагат и добавки с натурален витамин С, които може да откриете онлайн). - -**Мастно-разтворими витамини (А, D, Е, К)** -Това са витамините, от които телата ни имат крещяща нужда, защото съвременната храна е изключително дефицитна откъм тяхното съдържание. Те са важни не само като нутритенти, а най-вече като важни модулатори в процесите на усвояване на минералите, постъпващи с храната. -**Естественият витамин А** е бета-каротен. Той се трансформира в тялото, за да може да се използва. Имаме нужда от него като естествен защитник срещу различни увреждания в клетката. Влияе на костният растеж и репродукцията. -**Естествен витамин D** - технически, докато телата ни не го превърнат във витамин под действието на слънчевата светлина, това са различни химични съединения, циркулиращи в кръвта. Минималната дневна доза е 20 минути излагане на директна слънчева светлина. Но на географската ширина на България само слънцето от април до септември успява да изработи минимални дози витамин Д за 2 часа и то ако човек е минимално облечен, докато е под слънчевите лъчи. Изкуствено се синтезират форми на витамин D се от различни гъби, гъба за мая или от ланолин (овча мазнина). *Витамин D е изключително важен за костите, обмяната на калций и фосфор и за естествената реминерализация на зъбите.* Скоро ще се върна на него с много по-подробна информация. -**Витамин Е** този витамин всъщност представлява 8 различни мастно-разтворими компонента, които предпазват мазнините от окисление (антиоксиданти). Естествени източници са зърнените култури, семената, ядките и производните им. Синтетичният му близнак алфа токоферол се добива от рафинирани масла, обработени с химикали, като не се абсорбира, а се метаболизира бързо от тялото като непознат химикал. -**Витамин К** - това е витамин, който е в основата на два важни процеса, протичащи в човешкото тяло - кръвосъсирването и метаболизма на калция, като второто ни засяга пряко, от гледна точка на зъбното здраве. Това е витамин К2: запомнете го! Неговата роля е да насочва калция от кръвта към костите и зъбите. Без неговото участие дори перфектно хранене и суплементация не са ефективни. -Витамин К и К2 се съдържат в зеленолистните зеленчуци. Изкуствено се добиват от въглища (coal tar), хидрогенирано соево олио и никел. Това го прави високо токсична субстанция, способна да увреди имунната система. - -###Какво е най-важното да знаете за витамините, добавките и храненето като цяло? -Важно е витамините ни да постъпват в тялото чрез храната ни, доколкото е възможно. Ако искате да приемате мултивитамини, набавяйте ги чрез пълноценни храни (whole food) като босилек, авокадо, черен дроб, различни подправки, плодове и зеленчуци. Синтетичните витамини са изолирани съставки, а в природата няма такъв вариант. Тя ни дава всичко нужно заедно, в един цял плод: енергия, витамини, минерали, фибри. Избягвайте добавки, които имат в името си 'киселинен', '-киселина', завършват на '-ид' или '-ат', имат представка 'D' или 'L'. Минералите също трябва да идват от цяла, непреработена храна, където неорганичните и органичните съставки са в идеален баланс, комбинирани с нужните ензими. **Твоето тяло копнее за витамини и минерали, които познава, обича и ужасно му липсват!**;T; -I"#

    Какво са витамините?

    -

    Не-научният отговор е, че те са важна част от храната, необходима за нормалното функциониране на организма. Ядейки дадена храна, тялото ни я разгражда до отделни фрагменти, които продължават пътя си по съответното направление. Природата ни дава цялостния набор от хранителни вещества в ябълката, домата или яйцето и ние трябва да мислим за тях като пълноценен продукт, а не като източник на конкретни нутритенти (нутритенти: химически вещества, органични и неорганични, от които организма се нуждае, за да живее и расте).

    - -

    Научният отговор: Витамините са вещества, нужни за метаболитните процеси (напр. деленето на клетката) и поддържането на здравето като цяло. Те са два вида: водно-разтворими и мастно-разтворими. -Искам тук да направя уговорката, че за всички витамини, и особено за мастно-разтворимите важи условието, че има хиляди изучени и неизучени активатори в храната, както и че всеки от тях има много различни форми, циркулирайки в тялото.

    - -

    Водно-разтворимите витамини са В и С. Те лесно се набавят чрез растителната храна, а излишъците се освобождават с урината. Единствено витамин В9 (фолиевата киселина) трябва да бъде приеман като добавка, особено в периода на бременността, тъй като фолатите (формата, под която се намира в растенията) се усвояват бавно и трудно. Витамин В12 се произвежда от микроорганизми в червата на човека, някои видове почва, водорасли и др.

    - -

    За Витамин С се знае толкова много от всеки, че смятам да пропусна всеизвестните факти. Единственият съвет, който бих искала да ви дам е задължително да приемате витамин С от храната, а не като синтетичен продукт. Естественият е богат на фитонутриенти и флавоноиди, а аскорбиновата киселина (синтетичният) се произвежда от царевичен сироп, третиран с ацетон.(Всъщност се предлагат и добавки с натурален витамин С, които може да откриете онлайн).

    - -

    Мастно-разтворими витамини (А, D, Е, К) -Това са витамините, от които телата ни имат крещяща нужда, защото съвременната храна е изключително дефицитна откъм тяхното съдържание. Те са важни не само като нутритенти, а най-вече като важни модулатори в процесите на усвояване на минералите, постъпващи с храната. -Естественият витамин А е бета-каротен. Той се трансформира в тялото, за да може да се използва. Имаме нужда от него като естествен защитник срещу различни увреждания в клетката. Влияе на костният растеж и репродукцията. -Естествен витамин D - технически, докато телата ни не го превърнат във витамин под действието на слънчевата светлина, това са различни химични съединения, циркулиращи в кръвта. Минималната дневна доза е 20 минути излагане на директна слънчева светлина. Но на географската ширина на България само слънцето от април до септември успява да изработи минимални дози витамин Д за 2 часа и то ако човек е минимално облечен, докато е под слънчевите лъчи. Изкуствено се синтезират форми на витамин D се от различни гъби, гъба за мая или от ланолин (овча мазнина). Витамин D е изключително важен за костите, обмяната на калций и фосфор и за естествената реминерализация на зъбите. Скоро ще се върна на него с много по-подробна информация. -Витамин Е този витамин всъщност представлява 8 различни мастно-разтворими компонента, които предпазват мазнините от окисление (антиоксиданти). Естествени източници са зърнените култури, семената, ядките и производните им. Синтетичният му близнак алфа токоферол се добива от рафинирани масла, обработени с химикали, като не се абсорбира, а се метаболизира бързо от тялото като непознат химикал. -Витамин К - това е витамин, който е в основата на два важни процеса, протичащи в човешкото тяло - кръвосъсирването и метаболизма на калция, като второто ни засяга пряко, от гледна точка на зъбното здраве. Това е витамин К2: запомнете го! Неговата роля е да насочва калция от кръвта към костите и зъбите. Без неговото участие дори перфектно хранене и суплементация не са ефективни. -Витамин К и К2 се съдържат в зеленолистните зеленчуци. Изкуствено се добиват от въглища (coal tar), хидрогенирано соево олио и никел. Това го прави високо токсична субстанция, способна да увреди имунната система.

    - -

    Какво е най-важното да знаете за витамините, добавките и храненето като цяло?

    -

    Важно е витамините ни да постъпват в тялото чрез храната ни, доколкото е възможно. Ако искате да приемате мултивитамини, набавяйте ги чрез пълноценни храни (whole food) като босилек, авокадо, черен дроб, различни подправки, плодове и зеленчуци. Синтетичните витамини са изолирани съставки, а в природата няма такъв вариант. Тя ни дава всичко нужно заедно, в един цял плод: енергия, витамини, минерали, фибри. Избягвайте добавки, които имат в името си ‘киселинен’, ‘-киселина’, завършват на ‘-ид’ или ‘-ат’, имат представка ‘D’ или ‘L’. Минералите също трябва да идват от цяла, непреработена храна, където неорганичните и органичните съставки са в идеален баланс, комбинирани с нужните ензими. Твоето тяло копнее за витамини и минерали, които познава, обича и ужасно му липсват!

    -;T; @EI" - - - - - - - Вегетарианският мит - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Вегетарианският мит -

    - -
    -
      -
    • - - March 26, 2014 -
    • -
    -
    - - -

    Или защо трябва да се замислиш още веднъж върху избора си да бъдеш вегетарианец или веган

    - -

    Има много причини, поради които човек решава да бъде вегетарианец или веган. Някои хора са защитници на идеята, че животните не са храна. Други са загрижени за влиянието, което оказва обработката на животинските продукти върху околната среда. Трети са водени от етични или религиозни причини. Аз уважавам тези причини и хората, които се опитват да повлияят на обществото и природата чрез избора си на храна. Аз също се хранех 6 години вегетариански, като една година бях веган и суровояд.

    - -

    Искам още в началото да подчертая, че днешният ми пост не оспорва нечий избор или начин на живот. Но много хора избират вегетарианството, защото са с впечатлението, че това е по-здравословният начин на хранене, а това е доста спорно. Вижте защо:

    - -

    През последните 50години бяхме накарани да повярваме, че месото, яйцата и животинските мазнини са вредни за хората и ако ги избягваме ще живеем дълго и щастливо. Този мит се заражда след едно изманипулирано изследване на Д-р Ансел Кийс: Seven Countries Study проведено през 60те години на миналия век и популяризирало Средиземноморската диета, която включва много зърнени храни и растителни мазнини. До ден днешен от лекари, учени и медии се пропагандира за вредата от холестерола и наситените мазнини и се издига на пиедестал растителната мазнина и зърнени култури. А човечеството става все по-болно, дебело и депресирано. Тази идея е толкова силно набита в главите ни, че дори не си задаваме въпроса “Истина ли е това, което лекаря ни казва?” Ако попитате случаен човек на улицата “Вегетарианският/веганският начин на хранене по-здравословен ли е от всеядният?” съм сигурна, че ще отговори утвърдително: “Да, по-здравословен е!” Но дали е така?

    - -

    Хранителните режими, в чиято основа стоят растителните храни включват: зеленчуци, които имат добра хранителна плътност (богат набор от минерали, витамини, ензими) и плодове с относителна хранителна стойност, но много подходящи за компенсиране на енергийните нужди на тялото. Често основен хранителен източник са пълнозърнести култури, които са бедни на биологично усвоими хранителни вещества и богати на анти-нутритенти (фитична киселина, лектини и др.) и кореноплодните, които имат известно количество нутритенти, но за да получим адекватно количество от тях се налага да изядем един чувал червено цвекло (или да си направим сок от него). Този тип хранене изключва напълно животински органи, животински мускули (месо), риба и черупчести, които са храните с най-висока хранителна плътност, които можете да дадете на тялото си.

    - -

    Изключването на животински продукти е предпоставка за непълноценно хранене

    -

    Веганските диети в частност, са дефицитни на някои от най-важните нутритенти за нормално функциониращ организъм. Немалко изследвания показват, че и вегетарианците, и веганите имат недостатъчност от следните: витамин В12, калций, желязо, цинк, дълговерижни мастни киселини ЕРА и DHA, както и мастно-разтворимите витамини А и Д.

    - -

    Преди да се спра по-подробно на всяко от гореизброените, не мога да подмина факта че има много всеядни, които също имат дефицитно хранене, дължащо се на избора им на преработена, непълноценна, генномодифицирана или храна с неизяснен произход.

    - -

    Витамин B12

    - -

    Изследване показва, че 68% от вегетарианците и 83% от веганите имат дефицит на витамин В12, сравнено с 5% от всеядните.

    - -

    Проблеми, причинени от недостиг на вит. В12:

    - -
      -
    • -

      Умора

      -
    • -
    • -

      Летаргия

      -
    • -
    • -

      Слабост

      -
    • -
    • -

      Нарушения в паметта

      -
    • -
    • -

      Неврологични проблеми

      -
    • -
    • -

      Анемия и други…

      -
    • -
    - -

    Най-тежко се отразява липсата на фолати при децата. В изследване е доказано, че деца отглеждани на веганска диета до 6 год. възраст, години след това не успяват да възстановят нивата на вит. В12. Засяга се общата интелигентност, въображението и краткотрайната памет.

    - -

    Популярен мит е, че витамин В12 може да се набави от някои водорасли, ферменнтирала соя, спирулина или бирена мая. Всъщност чрез тях се приема аналог, който блокира приема и повишава нуждата на тялото от истинският вит. В12.

    - -

    Калций

    - -

    По данни от изследване вегетарианците и всеядните имат еднакъв прием на калций (защото и двете групи консумират млечни продукти), но веганите често имат дефицит. Биоусвояемостта на калция от растителни източници е компрометирана от високите нива на фитати и оксалати в тях, тъй като те са инхибитори на калция и допълнително извличат калций от костите и зъбите. И макар зеленолистните като спанак и кейл да имат добро количество калций, той е неефективен и не се усвоява от тялото. Изследване показва, че за да си набави калций колкото има в чаша мляко, човек трябва да изяде 16 порции пресен спанак или 5-6 чинии сготвен. Подобно е и за другите зеленчуци.

    - -

    Желязо

    - -

    Вегетарианците приемат идентично количество желязо, както всеядните но усвояемостта му от растителни храни е подобна както при калция: много по-малка, в сравнение с желязото от животински продукти. Желязото от растителен произход се влияе от различни субстанции като кафе, чай, млечни продукти, фибри и калций. Поради това вегетарианците и веганите имат занижена абсорбционна способност, както и занижено общо количество желязо в кръвта.

    - -

    Цинк

    - -

    Дефицит на цинк при растителноядните диети се наблюдава заради наличието на фитати в източниците на този елемент. Те потискат усвояването му в сравнение с всеядните начини на хранене. Проучване показва, че вегетарианците трябва да приемат до 50% повече цинк, за да достигнат необходимата дневна доза.

    - -

    EPA и DHA

    - -

    Растителните храни съдържат омега-3 и омега-6 мастни киселини, които се определят като есенциални. Това са мастни киселини, които са жизнено необходими за тялото, но се набавят единствено с храната. EPA и DHA са дълговерижни омега-3 мастни киселини. Те имат проективна роля при много състояния и заболявания: рак, астма, депресия, ревматоиден артрит и др.

    - -

    Доказано е, че много малка част от растителните омега-3 мастни киселини се усвояват от човешкият организъм: между 5-10% за EPA и 2-5% за DHA. Вегетарианците имат 30% по-ниски нива от всеядните, а при веганите този процент спада до 50% за EPA и близо 60% за DHA.

    - -

    Мастно-разтворими витамини: A и D

    - -

    Може би най-големият проблем с вегетарианският и веганският начини на хранене е липсата на витамините А и Д. Те са изключително важни за човешкото здраве. Витамин А благоприятства имунната система, фертилността, зрението и кожата. Витамин Д регулира обмяната на калция в зъбите и костите и намалява възпалението в тъканите.

    - -

    Тези важни витамини са концентрирани най-вече в животинските храни: морски храни и риба, органи, яйца. Този факт обяснява защо нивата на витамин Д са със 58% по-ниски при вегетарианците и до 74% по-ниски при веганите.

    - -

    Известен факт е, че витамин А се съдържа в голямо количество в някои зеленчуци под формата на бета-каротен. Но една порция черен дроб е достатъчна да осигури нуждите от витамин А за цяла седмица, а с растителна храна трябва да приемаме по две купи моркови или една купа сладки картофи дневно, за да набавим същото количество. Още повече, че изолираните народи приемат около 10 пъти повече витамин А чрез храната си, в сравнение с модернизираните общности.

    - -

    След всичко прочетено сигурно си мислите: “Е, може би растителноядните режими са по-бедни на някои нутритенти, но защо тогава се казва, че вегетарианците живеят по-дълго?”

    -

    Така е: някои източници сочат, че вегетарианците и веганите имат по-голяма средна продължителност на живота, но причините са следните: Хора, които са склонни да водят здравословен начин на живот, често имат такова поведение в много насоки. Те не злоупотребяват с алкохол или опиати; не пушат тютюн; не се хранят с пакетирана и преработена храна. Голяма част от здравословно живеещите хора спортуват активно и редовно полагат грижи за здравето си. Те поддържат добра хигиена на тялото и съзнанието си. Приемат много плодове и зеленчуци и като цяло са по-загрижени за себе си и за околната среда. -Еквивалентно на това, тези които не обръщат внимание на здравето си често имат вредни навици: хранят се с чипс, вафли и хамбургери, които са пълни със захар, рафинирани брашна и мазнини, както и значително по-малко пресни зеленчуци и плодове. Редовно съпътсващи навици са тютюнопушене и редовна употреба на алкохол и липса на физическа активност. В тази група рисковете от сърдечно-съдови заболявания и лошо общо здравословно състояние са големи, но от къде можем да сме сигурни, че причина е не друго, а месото? -Единствен сигурен отговор бихме получили ако не сравняваме средностатистически всеяден (който навярно не е много загрижен за здравето си) със средностатистически вегетарианец (който вероятно полага много грижи за здравето си). Какво ще открием ако сравним група вегетарианци със група всеядни, които водят здравословен начин на живот? -За радост, имаме проучване, което е направило това. Резултатите са че и двете групи хора имат еднаква продължителност на живота.

    - -

    За финал

    -

    Според мен си заслужава да обърнем внимание на храната, която даваме на тялото си и да се опитаме да е най-добрата възможна. -С добре балансирано хранене и подходящи добавки можем да имаме пълноценен живот дори и при стриктно веганско хранене. Но от еволюционна гледна точка, ако приемем че телата ни ще се развиват така, че да нямаме нужда от всички хранителни вещества и поддържаме състояние на здраве с дефицитно хранене, то за децата важи точно обратното. Подрстващият и развиващ се организъм има нужда от пълният набор протеини, мазнини, въглехидрати, минерали, витамини и ензими, които природата предлага и нищо не е в състояние да оправдае лишаването му от тях.

    - -

    Благодарности: Този пост е написан с незаменимата помощ на Cioccolata. Благодаря!

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"G###Или защо трябва да се замислиш още веднъж върху избора си да бъдеш вегетарианец или веган - -Има много причини, поради които човек решава да бъде вегетарианец или веган. Някои хора са защитници на идеята, че животните не са храна. Други са загрижени за влиянието, което оказва обработката на животинските продукти върху околната среда. Трети са водени от етични или религиозни причини. Аз уважавам тези причини и хората, които се опитват да повлияят на обществото и природата чрез избора си на храна. Аз също се хранех 6 години вегетариански, като една година бях веган и суровояд. - -Искам още в началото да подчертая, че днешният ми пост не оспорва нечий избор или начин на живот. Но много хора избират вегетарианството, защото са с впечатлението, че това е по-здравословният начин на хранене, а това е доста спорно. Вижте защо: - -През последните 50години бяхме накарани да повярваме, че месото, яйцата и животинските мазнини са вредни за хората и ако ги избягваме ще живеем дълго и щастливо. Този мит се заражда след едно изманипулирано изследване на Д-р Ансел Кийс: [Seven Countries](http://en.wikipedia.org/wiki/Seven_Countries_Study) [Study](http://www.legacy.library.ucsf.edu/documentStore/n/o/z/noz55d00/Snoz55d00.pdf "seven countries study") проведено през 60те години на миналия век и популяризирало Средиземноморската диета, която включва много зърнени храни и растителни мазнини. До ден днешен от лекари, учени и медии се пропагандира за вредата от холестерола и наситените мазнини и се издига на пиедестал растителната мазнина и зърнени култури. А човечеството става все по-болно, дебело и депресирано. Тази идея е толкова силно набита в главите ни, че дори не си задаваме въпроса "Истина ли е това, което лекаря ни казва?" Ако попитате случаен човек на улицата "Вегетарианският/веганският начин на хранене по-здравословен ли е от всеядният?" съм сигурна, че ще отговори утвърдително: "Да, по-здравословен е!" Но дали е така? - -Хранителните режими, в чиято основа стоят растителните храни включват: зеленчуци, които имат добра хранителна плътност (богат набор от минерали, витамини, ензими) и плодове с относителна хранителна стойност, но много подходящи за компенсиране на енергийните нужди на тялото. Често основен хранителен източник са пълнозърнести култури, които са бедни на биологично усвоими хранителни вещества и богати на анти-нутритенти (фитична киселина, лектини и др.) и кореноплодните, които имат известно количество нутритенти, но за да получим адекватно количество от тях се налага да изядем един чувал червено цвекло (или да си направим сок от него). Този тип хранене изключва напълно животински органи, животински мускули (месо), риба и черупчести, които са храните с най-висока хранителна плътност, които можете да дадете на тялото си. - -###Изключването на животински продукти е предпоставка за непълноценно хранене -Веганските диети в частност, са дефицитни на някои от най-важните нутритенти за нормално функциониращ организъм. Немалко изследвания показват, че и вегетарианците, и веганите имат недостатъчност от следните: витамин В12, калций, желязо, цинк, дълговерижни мастни киселини ЕРА и DHA, както и мастно-разтворимите витамини А и Д. - -Преди да се спра по-подробно на всяко от гореизброените, не мога да подмина факта че има **много всеядни, които също имат дефицитно хранене, дължащо се на избора им на преработена, непълноценна, генномодифицирана или храна с неизяснен произход.** - - -**Витамин B12** - -[Изследване](http://www.ncbi.nlm.nih.gov/pubmed/12816782) показва, че 68% от вегетарианците и 83% от веганите имат дефицит на витамин В12, сравнено с 5% от всеядните. - -Проблеми, причинени от недостиг на вит. В12: - - * Умора - - * Летаргия - - * Слабост - - * Нарушения в паметта - - * Неврологични проблеми - - * Анемия и други... - - -Най-тежко се отразява липсата на фолати при децата. В [изследване](http://www.ncbi.nlm.nih.gov/pubmed/10966896) е доказано, че деца отглеждани на веганска диета до 6 год. възраст, години след това не успяват да възстановят нивата на вит. В12. Засяга се общата интелигентност, въображението и краткотрайната памет. - -Популярен мит е, че витамин В12 може да се набави от някои водорасли, ферменнтирала соя, спирулина или бирена мая. Всъщност чрез тях се приема аналог, който блокира приема и [повишава нуждата на тялото от истинският вит. В12](http://www.ncbi.nlm.nih.gov/pubmed/10552882). - - -**Калций** - -По данни от [изследване](http://www.ncbi.nlm.nih.gov/pubmed/21139125) вегетарианците и всеядните имат еднакъв прием на калций (защото и двете групи консумират млечни продукти), но веганите често имат дефицит. Биоусвояемостта на калция от растителни източници е компрометирана от високите нива на фитати и оксалати в тях, тъй като те са инхибитори на калция и допълнително [извличат калций от костите и зъбите](http://ajcn.nutrition.org/content/70/3/543s.full). И макар зеленолистните като спанак и кейл да имат добро количество калций, той е неефективен и не се усвоява от тялото. [Изследване](http://ajcn.nutrition.org/content/70/3/543s/T2.expansion.html) показва, че за да си набави калций колкото има в чаша мляко, човек трябва да изяде 16 порции пресен спанак или 5-6 чинии сготвен. Подобно е и за другите зеленчуци. - - -**Желязо** - -Вегетарианците приемат идентично количество желязо, както всеядните но усвояемостта му от растителни храни е подобна както при калция: много по-малка, в сравнение с желязото от животински продукти. Желязото от растителен произход се влияе от различни субстанции като кафе, чай, млечни продукти, фибри и калций. Поради това вегетарианците и веганите имат занижена [абсорбционна способност](http://www.ncbi.nlm.nih.gov/pubmed/7956998), както и занижено общо количество желязо в кръвта. - - -**Цинк** - -Дефицит на цинк при растителноядните диети се наблюдава заради наличието на фитати в източниците на този елемент. Те потискат усвояването му в сравнение с [всеядните начини на хранене](http://ajcn.nutrition.org/content/78/3/633S.long). [Проучване](http://ajcn.nutrition.org/content/78/3/633S.long) показва, че вегетарианците трябва да приемат до 50% повече цинк, за да достигнат необходимата дневна доза. - - -**EPA и DHA** - -Растителните храни съдържат омега-3 и омега-6 мастни киселини, които се определят като есенциални. Това са мастни киселини, които са жизнено необходими за тялото, но се набавят единствено с храната. EPA и DHA са дълговерижни омега-3 мастни киселини. Те имат проективна роля при много състояния и заболявания: рак, астма, депресия, ревматоиден артрит и др. - -Доказано е, че много малка част от растителните омега-3 мастни киселини се усвояват от човешкият организъм: [между 5-10% за EPA и 2-5% за DHA](http://www.ncbi.nlm.nih.gov/pubmed/12936959). Вегетарианците имат 30% по-ниски нива от всеядните, а при веганите този процент спада до [50% за EPA и близо 60% за DHA](http://ajcn.nutrition.org/content/82/2/327abstract). - - -**Мастно-разтворими витамини: A и D** - -Може би най-големият проблем с вегетарианският и веганският начини на хранене е липсата на витамините А и Д. Те са изключително важни за човешкото здраве. Витамин А благоприятства имунната система, фертилността, зрението и кожата. Витамин Д регулира обмяната на калция в зъбите и костите и намалява възпалението в тъканите. - -Тези важни витамини са концентрирани най-вече в животинските храни: морски храни и риба, органи, яйца. Този факт [обяснява](http://www.ncbi.nlm.nih.gov/pubmed/21139125) защо нивата на витамин Д са със 58% по-ниски при вегетарианците и до 74% по-ниски при веганите. - -Известен факт е, че витамин А се съдържа в голямо количество в някои зеленчуци под формата на бета-каротен. Но една порция черен дроб е достатъчна да осигури нуждите от витамин А за цяла седмица, а с растителна храна трябва да приемаме по две купи моркови или една купа сладки картофи дневно, за да набавим същото количество. Още повече, че изолираните народи [приемат](http://www.westonaprice.org/fat-soluble-activators/vitamin-a-on-trial) около 10 пъти повече витамин А чрез храната си, в сравнение с модернизираните общности. - - -###След всичко прочетено сигурно си мислите: "Е, може би растителноядните режими са по-бедни на някои нутритенти, но защо тогава се казва, че вегетарианците живеят по-дълго?" -Така е: някои [източници]( http://www.ncbi.nlm.nih.gov/pubmed/17411462/) сочат, че вегетарианците и веганите имат по-голяма средна продължителност на живота, но причините са следните: Хора, които са склонни да водят здравословен начин на живот, често имат такова поведение в много насоки. Те не злоупотребяват с алкохол или опиати; не пушат тютюн; не се хранят с пакетирана и преработена храна. Голяма част от здравословно живеещите хора спортуват активно и редовно полагат грижи за здравето си. Те поддържат добра хигиена на тялото и съзнанието си. Приемат много плодове и зеленчуци и като цяло са по-загрижени за себе си и за околната среда. -Еквивалентно на това, тези които не обръщат внимание на здравето си често имат вредни навици: хранят се с чипс, вафли и хамбургери, които са пълни със захар, рафинирани брашна и мазнини, както и значително по-малко пресни зеленчуци и плодове. Редовно съпътсващи навици са тютюнопушене и редовна употреба на алкохол и липса на физическа активност. В тази група рисковете от сърдечно-съдови заболявания и лошо общо здравословно състояние са големи, но от къде можем да сме сигурни, че причина е не друго, а месото? -Единствен сигурен отговор бихме получили ако не сравняваме средностатистически всеяден (който навярно не е много загрижен за здравето си) със средностатистически вегетарианец (който вероятно полага много грижи за здравето си). Какво ще открием ако сравним група вегетарианци със група всеядни, които водят здравословен начин на живот? -За радост, имаме [проучване](http://www.ncbi.nlm.nih.gov/pubmed/8842068), което е направило това. Резултатите са че и двете групи хора имат еднаква продължителност на живота. - - -###За финал -Според мен си заслужава да обърнем внимание на храната, която даваме на тялото си и да се опитаме да е най-добрата възможна. -С добре балансирано хранене и подходящи добавки можем да имаме пълноценен живот дори и при стриктно веганско хранене. Но от еволюционна гледна точка, ако приемем че телата ни ще се развиват така, че да нямаме нужда от всички хранителни вещества и поддържаме състояние на здраве с дефицитно хранене, то за децата важи точно обратното. **Подрстващият и развиващ се организъм има нужда от пълният набор протеини, мазнини, въглехидрати, минерали, витамини и ензими, които природата предлага и нищо не е в състояние да оправдае лишаването му от тях.** - -Благодарности: Този пост е написан с незаменимата помощ на [Cioccolata](http://cioccolatascorner.blogspot.com/2013/09/iii.html). **Благодаря!**;T; -I"J

    Или защо трябва да се замислиш още веднъж върху избора си да бъдеш вегетарианец или веган

    - -

    Има много причини, поради които човек решава да бъде вегетарианец или веган. Някои хора са защитници на идеята, че животните не са храна. Други са загрижени за влиянието, което оказва обработката на животинските продукти върху околната среда. Трети са водени от етични или религиозни причини. Аз уважавам тези причини и хората, които се опитват да повлияят на обществото и природата чрез избора си на храна. Аз също се хранех 6 години вегетариански, като една година бях веган и суровояд.

    - -

    Искам още в началото да подчертая, че днешният ми пост не оспорва нечий избор или начин на живот. Но много хора избират вегетарианството, защото са с впечатлението, че това е по-здравословният начин на хранене, а това е доста спорно. Вижте защо:

    - -

    През последните 50години бяхме накарани да повярваме, че месото, яйцата и животинските мазнини са вредни за хората и ако ги избягваме ще живеем дълго и щастливо. Този мит се заражда след едно изманипулирано изследване на Д-р Ансел Кийс: Seven Countries Study проведено през 60те години на миналия век и популяризирало Средиземноморската диета, която включва много зърнени храни и растителни мазнини. До ден днешен от лекари, учени и медии се пропагандира за вредата от холестерола и наситените мазнини и се издига на пиедестал растителната мазнина и зърнени култури. А човечеството става все по-болно, дебело и депресирано. Тази идея е толкова силно набита в главите ни, че дори не си задаваме въпроса “Истина ли е това, което лекаря ни казва?” Ако попитате случаен човек на улицата “Вегетарианският/веганският начин на хранене по-здравословен ли е от всеядният?” съм сигурна, че ще отговори утвърдително: “Да, по-здравословен е!” Но дали е така?

    - -

    Хранителните режими, в чиято основа стоят растителните храни включват: зеленчуци, които имат добра хранителна плътност (богат набор от минерали, витамини, ензими) и плодове с относителна хранителна стойност, но много подходящи за компенсиране на енергийните нужди на тялото. Често основен хранителен източник са пълнозърнести култури, които са бедни на биологично усвоими хранителни вещества и богати на анти-нутритенти (фитична киселина, лектини и др.) и кореноплодните, които имат известно количество нутритенти, но за да получим адекватно количество от тях се налага да изядем един чувал червено цвекло (или да си направим сок от него). Този тип хранене изключва напълно животински органи, животински мускули (месо), риба и черупчести, които са храните с най-висока хранителна плътност, които можете да дадете на тялото си.

    - -

    Изключването на животински продукти е предпоставка за непълноценно хранене

    -

    Веганските диети в частност, са дефицитни на някои от най-важните нутритенти за нормално функциониращ организъм. Немалко изследвания показват, че и вегетарианците, и веганите имат недостатъчност от следните: витамин В12, калций, желязо, цинк, дълговерижни мастни киселини ЕРА и DHA, както и мастно-разтворимите витамини А и Д.

    - -

    Преди да се спра по-подробно на всяко от гореизброените, не мога да подмина факта че има много всеядни, които също имат дефицитно хранене, дължащо се на избора им на преработена, непълноценна, генномодифицирана или храна с неизяснен произход.

    - -

    Витамин B12

    - -

    Изследване показва, че 68% от вегетарианците и 83% от веганите имат дефицит на витамин В12, сравнено с 5% от всеядните.

    - -

    Проблеми, причинени от недостиг на вит. В12:

    - -
      -
    • -

      Умора

      -
    • -
    • -

      Летаргия

      -
    • -
    • -

      Слабост

      -
    • -
    • -

      Нарушения в паметта

      -
    • -
    • -

      Неврологични проблеми

      -
    • -
    • -

      Анемия и други…

      -
    • -
    - -

    Най-тежко се отразява липсата на фолати при децата. В изследване е доказано, че деца отглеждани на веганска диета до 6 год. възраст, години след това не успяват да възстановят нивата на вит. В12. Засяга се общата интелигентност, въображението и краткотрайната памет.

    - -

    Популярен мит е, че витамин В12 може да се набави от някои водорасли, ферменнтирала соя, спирулина или бирена мая. Всъщност чрез тях се приема аналог, който блокира приема и повишава нуждата на тялото от истинският вит. В12.

    - -

    Калций

    - -

    По данни от изследване вегетарианците и всеядните имат еднакъв прием на калций (защото и двете групи консумират млечни продукти), но веганите често имат дефицит. Биоусвояемостта на калция от растителни източници е компрометирана от високите нива на фитати и оксалати в тях, тъй като те са инхибитори на калция и допълнително извличат калций от костите и зъбите. И макар зеленолистните като спанак и кейл да имат добро количество калций, той е неефективен и не се усвоява от тялото. Изследване показва, че за да си набави калций колкото има в чаша мляко, човек трябва да изяде 16 порции пресен спанак или 5-6 чинии сготвен. Подобно е и за другите зеленчуци.

    - -

    Желязо

    - -

    Вегетарианците приемат идентично количество желязо, както всеядните но усвояемостта му от растителни храни е подобна както при калция: много по-малка, в сравнение с желязото от животински продукти. Желязото от растителен произход се влияе от различни субстанции като кафе, чай, млечни продукти, фибри и калций. Поради това вегетарианците и веганите имат занижена абсорбционна способност, както и занижено общо количество желязо в кръвта.

    - -

    Цинк

    - -

    Дефицит на цинк при растителноядните диети се наблюдава заради наличието на фитати в източниците на този елемент. Те потискат усвояването му в сравнение с всеядните начини на хранене. Проучване показва, че вегетарианците трябва да приемат до 50% повече цинк, за да достигнат необходимата дневна доза.

    - -

    EPA и DHA

    - -

    Растителните храни съдържат омега-3 и омега-6 мастни киселини, които се определят като есенциални. Това са мастни киселини, които са жизнено необходими за тялото, но се набавят единствено с храната. EPA и DHA са дълговерижни омега-3 мастни киселини. Те имат проективна роля при много състояния и заболявания: рак, астма, депресия, ревматоиден артрит и др.

    - -

    Доказано е, че много малка част от растителните омега-3 мастни киселини се усвояват от човешкият организъм: между 5-10% за EPA и 2-5% за DHA. Вегетарианците имат 30% по-ниски нива от всеядните, а при веганите този процент спада до 50% за EPA и близо 60% за DHA.

    - -

    Мастно-разтворими витамини: A и D

    - -

    Може би най-големият проблем с вегетарианският и веганският начини на хранене е липсата на витамините А и Д. Те са изключително важни за човешкото здраве. Витамин А благоприятства имунната система, фертилността, зрението и кожата. Витамин Д регулира обмяната на калция в зъбите и костите и намалява възпалението в тъканите.

    - -

    Тези важни витамини са концентрирани най-вече в животинските храни: морски храни и риба, органи, яйца. Този факт обяснява защо нивата на витамин Д са със 58% по-ниски при вегетарианците и до 74% по-ниски при веганите.

    - -

    Известен факт е, че витамин А се съдържа в голямо количество в някои зеленчуци под формата на бета-каротен. Но една порция черен дроб е достатъчна да осигури нуждите от витамин А за цяла седмица, а с растителна храна трябва да приемаме по две купи моркови или една купа сладки картофи дневно, за да набавим същото количество. Още повече, че изолираните народи приемат около 10 пъти повече витамин А чрез храната си, в сравнение с модернизираните общности.

    - -

    След всичко прочетено сигурно си мислите: “Е, може би растителноядните режими са по-бедни на някои нутритенти, но защо тогава се казва, че вегетарианците живеят по-дълго?”

    -

    Така е: някои източници сочат, че вегетарианците и веганите имат по-голяма средна продължителност на живота, но причините са следните: Хора, които са склонни да водят здравословен начин на живот, често имат такова поведение в много насоки. Те не злоупотребяват с алкохол или опиати; не пушат тютюн; не се хранят с пакетирана и преработена храна. Голяма част от здравословно живеещите хора спортуват активно и редовно полагат грижи за здравето си. Те поддържат добра хигиена на тялото и съзнанието си. Приемат много плодове и зеленчуци и като цяло са по-загрижени за себе си и за околната среда. -Еквивалентно на това, тези които не обръщат внимание на здравето си често имат вредни навици: хранят се с чипс, вафли и хамбургери, които са пълни със захар, рафинирани брашна и мазнини, както и значително по-малко пресни зеленчуци и плодове. Редовно съпътсващи навици са тютюнопушене и редовна употреба на алкохол и липса на физическа активност. В тази група рисковете от сърдечно-съдови заболявания и лошо общо здравословно състояние са големи, но от къде можем да сме сигурни, че причина е не друго, а месото? -Единствен сигурен отговор бихме получили ако не сравняваме средностатистически всеяден (който навярно не е много загрижен за здравето си) със средностатистически вегетарианец (който вероятно полага много грижи за здравето си). Какво ще открием ако сравним група вегетарианци със група всеядни, които водят здравословен начин на живот? -За радост, имаме проучване, което е направило това. Резултатите са че и двете групи хора имат еднаква продължителност на живота.

    - -

    За финал

    -

    Според мен си заслужава да обърнем внимание на храната, която даваме на тялото си и да се опитаме да е най-добрата възможна. -С добре балансирано хранене и подходящи добавки можем да имаме пълноценен живот дори и при стриктно веганско хранене. Но от еволюционна гледна точка, ако приемем че телата ни ще се развиват така, че да нямаме нужда от всички хранителни вещества и поддържаме състояние на здраве с дефицитно хранене, то за децата важи точно обратното. Подрстващият и развиващ се организъм има нужда от пълният набор протеини, мазнини, въглехидрати, минерали, витамини и ензими, които природата предлага и нищо не е в състояние да оправдае лишаването му от тях.

    - -

    Благодарности: Този пост е написан с незаменимата помощ на Cioccolata. Благодаря!

    -;T; @KI"j/blog/2014-04-02-три-храни-които-се-заблуждавате-че-са-полезни/;T{;{ ;I"C - - - - - - - Три храни, за които се заблуждавате, че са полезни - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Три храни, за които се заблуждавате, че са полезни -

    - -
    -
      -
    • - - April 2, 2014 -
    • -
    -
    - - -

    1. Кафяв ориз

    -

    Популярно твърдение е, че белите храни са вредни: бял ориз, бяло брашно, бяла захар и т.н. Те са демонизирани от хората, които проповядват здравословното хранене и всячески се избягват от тези, които се опитват да го прилагат в ежедневието си.

    - -

    Причините са следните: Белият ориз е преработен, за разлика от кафевия, който е пълнозърнест и богат на фибри. Тези фибри подпомагат перисталтиката на червата и също така държат усещането за ситост по-дълго.

    - -

    Истината: Кафявият ориз наистина има повече фибри, които се съдържат в зародиша и обвивката му, но част от състава им са фитичната киселина и лектините, които вече знаем че ограбват тялото от така ценните му минерали - калций и магнезий. -Кафявият ориз като самостоятелна храна наистина би имал по-дълго време на престой в стомаха, но често той бива комбиниран със други зеленчуци, протеин и/или мазнини. Тогава разликата с белият ориз е… няма такава! -Кафявият ориз може да бъде направен по-лесно усвоим като преди това се накисне във вода със морска или хималайска сол или лимонов сок. По този начин се намалява значително количеството на фитичната киселина. Друго задължително условие, за да се извлекат ползите от него е да се консумира като самостоятелно ястие, само с малко подправки. В контекста на здравето на зъбите и костите е важно да знаем тези важни разлики. Те са намерили място и в книгата на Д-р Уестън Прайс за храненето на нецивилизованите народи, а също така можем да видим, че в съвременните азиатски страни се използва основно бял ориз. Т.е. ако оризът е гарнитура към останалата ви храна, няма причина да не предпочетете белият ориз.

    - -

    Истината за вредата от белите храни е, че много по-лесно се помни: “Не яжте нищо бяло”, тъй като често белите брашно, захар, ориз, сол са в състава на т.нар. “джънк фууд” или не-храни. Това са пълните с хидрогенирани мазнини, захар, сол, още захар, нишесте, царевичен сироп и така до безкрай вредни стоки, които се рекламират и продават в търговската мрежа. Тях избягвайте напълно!

    - -

    2. Фреш от плодове

    -

    Прясно изцеденият плодов сок, т.нар. плодов фреш е с репутацията на здравословна напитка. Разбираемо е, тъй като е изцяло естествен продукт, направен от плодове. -Но.. това, което много хора пропускат е, че плодовите фрешове са пълни със захар. Всъщност често количеството й е същото като това в газираните напитки:

    - -
    -

    Coca Cola: 140 калории (40 грама захар)

    -
    - -
    -

    Ябълков сок: 165 калории (39 грама захар)

    -
    - -

    Да, наистина прясно изцедените плодови сокове съдържат известни количества витамини и антиоксиданти, но те не компенсират огромната порция захар, която идва с всяка чаша фреш. Освен това в сокът липсват фибрите, които са част от целият плод. Тяхната роля е да забавят усвояването на фруктозата и по този начин да се избегне пикът на кръвната захар и инсулина. Така целият плод е наистина полезна и здравословна храна, докато сокът се превръща в калорийна захарна бомба. Освен това целият плод е засищащ и е трудно да се изядат прекомерни количества, докато в чаша сок се съдържа захарта от минимум 3-4 плода, като около 2/3 са плодова захар(фруктоза). Това е голямо количество фруктоза, което натоварва черният дроб. ->Фруктозата се метаболизира изцяло от черният дроб и нейните излишъци се превръщат веднага в мазнини.

    - -

    И в крайна сметка се оказва, че плодовите фрешове са еквивалентни по вредност с газираните напитки, ако се приемат в еднакви количества. -Затова яжте плодове, но не ги правете на сок.

    - -

    Консумацията на тези напитки, от гледна точка на здравето на зъбите е също с недобра репутация. Плодовите сокове, освен вече споменатито съдържание на захар, са с много висока киселинност, която води до резорбция на емайла и в последствие до кариеси. Изследване доказва, че ежедневната консумация на плодови фрешове е еднакво увреждаща както избелващите агенти. Но обичайно след избелване в клинични условия се провежда реминерализация, а след прием на кисели напитки зъбите остават незащитени под обстрела на огромните дози захар.

    - -

    3. “Здравословни” блокчета от типа на Корни

    -

    Сега е много модерно да се храним здравословно. И наистина е чудесно, че най-накрая здравето дойде на мода, но знайте че хранителната индустрия не работи за хората, които искат да са здрави и силни. Тя работи в услуга на печалбите си. Все по-често срещам хора които със задоволство ми обясняват как се хранят здравословно и сутрин започват деня или заместват хранене с пълнозърнести бисквити или пълнозърнесто блокче ядки и сушени плодове. Или още по-лошо: дават ги на децата си. -Истината е, че всички тези стоки (казвам стоки, защото това не е храна) мога спокойно да причисля към категорията “джънк фууд”. Не искам да цитирам състава им, но вие си направете труда да погледнете етикета следващият път, когато това нещо попадне в ръцете ви: в него влизат хидрогенирани мазнини/маргарин/естерифицирани растителни мазнини; глюкозо-фруктозен сироп/захар/царевичен сироп; оцветители, ароматизатори, консерванти, стабилизатори, емулгатори, сол… Това не е здравословна храна, а топка химикали, която тялото ви се чуди откъде се е взела и кое по-напред да обработи и обезвреди. Спрете да купувате “здравословни” сладки и солени не-храни в лъскави опаковки още днес. Или поне спрете да ги давате на децата си.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"%###1. Кафяв ориз -Популярно твърдение е, че белите храни са вредни: бял ориз, бяло брашно, бяла захар и т.н. Те са демонизирани от хората, които проповядват здравословното хранене и всячески се избягват от тези, които се опитват да го прилагат в ежедневието си. - -Причините са следните: Белият ориз е преработен, за разлика от кафевия, който е пълнозърнест и богат на фибри. Тези фибри подпомагат перисталтиката на червата и също така държат усещането за ситост по-дълго. - -Истината: Кафявият ориз наистина има повече фибри, които се съдържат в зародиша и обвивката му, но част от състава им са фитичната киселина и лектините, които вече знаем че ограбват тялото от така ценните му минерали - калций и магнезий. -Кафявият ориз като самостоятелна храна наистина би имал по-дълго време на престой в стомаха, но често той бива комбиниран със други зеленчуци, протеин и/или мазнини. Тогава разликата с белият ориз е... няма такава! -Кафявият ориз може да бъде направен по-лесно усвоим като преди това се накисне във вода със морска или хималайска сол или лимонов сок. По този начин се намалява значително количеството на фитичната киселина. Друго задължително условие, за да се извлекат ползите от него е да се консумира като [самостоятелно ястие](http://www.ncbi.nlm.nih.gov/pubmed/19919509), само с малко подправки. В контекста на здравето на зъбите и костите е важно да знаем тези важни разлики. Те са намерили място и в книгата на Д-р Уестън Прайс за храненето на нецивилизованите народи, а също така можем да видим, че в съвременните азиатски страни се използва основно бял ориз. Т.е. ако оризът е гарнитура към останалата ви храна, няма причина да не предпочетете белият ориз. - -Истината за вредата от белите храни е, че много по-лесно се помни: "Не яжте нищо бяло", тъй като често белите брашно, захар, ориз, сол са в състава на т.нар. "джънк фууд" или не-храни. Това са пълните с хидрогенирани мазнини, захар, сол, още захар, нишесте, царевичен сироп и така до безкрай вредни стоки, които се рекламират и продават в търговската мрежа. Тях избягвайте напълно! - - -###2. Фреш от плодове -Прясно изцеденият плодов сок, т.нар. плодов фреш е с репутацията на здравословна напитка. Разбираемо е, тъй като е изцяло естествен продукт, направен от плодове. -Но.. това, което много хора пропускат е, че плодовите фрешове са пълни със [захар](http://www.ncbi.nlm.nih.gov/pubmed/22813423). Всъщност често количеството й е същото като това в газираните напитки: - ->**Coca Cola: 140 калории (40 грама захар)** - ->**Ябълков сок: 165 калории (39 грама захар)** - -Да, наистина прясно изцедените плодови сокове съдържат известни количества витамини и антиоксиданти, но те не компенсират огромната порция захар, която идва с всяка чаша фреш. Освен това в сокът липсват фибрите, които са част от целият плод. Тяхната роля е да забавят усвояването на фруктозата и по този начин да се избегне пикът на кръвната захар и инсулина. Така целият плод е наистина полезна и здравословна храна, докато сокът се превръща в калорийна захарна бомба. Освен това целият плод е засищащ и е трудно да се изядат прекомерни количества, докато в чаша сок се съдържа захарта от минимум 3-4 плода, като около 2/3 са плодова захар([фруктоза](http://ajcn.nutrition.org/content/86/4/895.full)). Това е голямо количество фруктоза, което натоварва черният дроб. ->Фруктозата се метаболизира изцяло от черният дроб и нейните излишъци се превръщат веднага в мазнини. - -И в крайна сметка се оказва, че плодовите фрешове са еквивалентни по вредност с газираните напитки, ако се приемат в еднакви количества. -Затова яжте плодове, но не ги правете на [сок](http://www.ncbi.nlm.nih.gov/pubmed/22813423). - -Консумацията на тези напитки, от гледна точка на [здравето на зъбите](http://www.ncbi.nlm.nih.gov/pubmed/22206891) е също с недобра репутация. Плодовите сокове, освен вече споменатито съдържание на захар, са с много висока киселинност, която води до резорбция на емайла и в последствие до кариеси. [Изследване](http://www.ncbi.nlm.nih.gov/pubmed/24298810) доказва, че ежедневната консумация на плодови фрешове е еднакво увреждаща както избелващите агенти. Но обичайно след избелване в клинични условия се провежда реминерализация, а след прием на кисели напитки зъбите остават незащитени под обстрела на огромните дози захар. - -###3. "Здравословни" блокчета от типа на Корни -Сега е много модерно да се храним здравословно. И наистина е чудесно, че най-накрая здравето дойде на мода, но знайте че хранителната индустрия не работи за хората, които искат да са здрави и силни. Тя работи в услуга на печалбите си. Все по-често срещам хора които със задоволство ми обясняват как се хранят здравословно и сутрин започват деня или заместват хранене с пълнозърнести бисквити или пълнозърнесто блокче ядки и сушени плодове. Или още по-лошо: дават ги на децата си. -Истината е, че всички тези стоки (казвам стоки, защото това не е храна) мога спокойно да причисля към категорията "джънк фууд". Не искам да цитирам състава им, но вие си направете труда да погледнете етикета следващият път, когато това нещо попадне в ръцете ви: в него влизат хидрогенирани мазнини/маргарин/естерифицирани растителни мазнини; глюкозо-фруктозен сироп/захар/царевичен сироп; оцветители, ароматизатори, консерванти, стабилизатори, емулгатори, сол... Това не е здравословна храна, а топка химикали, която тялото ви се чуди откъде се е взела и кое по-напред да обработи и обезвреди. Спрете да купувате "здравословни" сладки и солени не-храни в лъскави опаковки още днес. Или поне спрете да ги давате на децата си.;T; -I"'

    1. Кафяв ориз

    -

    Популярно твърдение е, че белите храни са вредни: бял ориз, бяло брашно, бяла захар и т.н. Те са демонизирани от хората, които проповядват здравословното хранене и всячески се избягват от тези, които се опитват да го прилагат в ежедневието си.

    - -

    Причините са следните: Белият ориз е преработен, за разлика от кафевия, който е пълнозърнест и богат на фибри. Тези фибри подпомагат перисталтиката на червата и също така държат усещането за ситост по-дълго.

    - -

    Истината: Кафявият ориз наистина има повече фибри, които се съдържат в зародиша и обвивката му, но част от състава им са фитичната киселина и лектините, които вече знаем че ограбват тялото от така ценните му минерали - калций и магнезий. -Кафявият ориз като самостоятелна храна наистина би имал по-дълго време на престой в стомаха, но често той бива комбиниран със други зеленчуци, протеин и/или мазнини. Тогава разликата с белият ориз е… няма такава! -Кафявият ориз може да бъде направен по-лесно усвоим като преди това се накисне във вода със морска или хималайска сол или лимонов сок. По този начин се намалява значително количеството на фитичната киселина. Друго задължително условие, за да се извлекат ползите от него е да се консумира като самостоятелно ястие, само с малко подправки. В контекста на здравето на зъбите и костите е важно да знаем тези важни разлики. Те са намерили място и в книгата на Д-р Уестън Прайс за храненето на нецивилизованите народи, а също така можем да видим, че в съвременните азиатски страни се използва основно бял ориз. Т.е. ако оризът е гарнитура към останалата ви храна, няма причина да не предпочетете белият ориз.

    - -

    Истината за вредата от белите храни е, че много по-лесно се помни: “Не яжте нищо бяло”, тъй като често белите брашно, захар, ориз, сол са в състава на т.нар. “джънк фууд” или не-храни. Това са пълните с хидрогенирани мазнини, захар, сол, още захар, нишесте, царевичен сироп и така до безкрай вредни стоки, които се рекламират и продават в търговската мрежа. Тях избягвайте напълно!

    - -

    2. Фреш от плодове

    -

    Прясно изцеденият плодов сок, т.нар. плодов фреш е с репутацията на здравословна напитка. Разбираемо е, тъй като е изцяло естествен продукт, направен от плодове. -Но.. това, което много хора пропускат е, че плодовите фрешове са пълни със захар. Всъщност често количеството й е същото като това в газираните напитки:

    - -
    -

    Coca Cola: 140 калории (40 грама захар)

    -
    - -
    -

    Ябълков сок: 165 калории (39 грама захар)

    -
    - -

    Да, наистина прясно изцедените плодови сокове съдържат известни количества витамини и антиоксиданти, но те не компенсират огромната порция захар, която идва с всяка чаша фреш. Освен това в сокът липсват фибрите, които са част от целият плод. Тяхната роля е да забавят усвояването на фруктозата и по този начин да се избегне пикът на кръвната захар и инсулина. Така целият плод е наистина полезна и здравословна храна, докато сокът се превръща в калорийна захарна бомба. Освен това целият плод е засищащ и е трудно да се изядат прекомерни количества, докато в чаша сок се съдържа захарта от минимум 3-4 плода, като около 2/3 са плодова захар(фруктоза). Това е голямо количество фруктоза, което натоварва черният дроб. ->Фруктозата се метаболизира изцяло от черният дроб и нейните излишъци се превръщат веднага в мазнини.

    - -

    И в крайна сметка се оказва, че плодовите фрешове са еквивалентни по вредност с газираните напитки, ако се приемат в еднакви количества. -Затова яжте плодове, но не ги правете на сок.

    - -

    Консумацията на тези напитки, от гледна точка на здравето на зъбите е също с недобра репутация. Плодовите сокове, освен вече споменатито съдържание на захар, са с много висока киселинност, която води до резорбция на емайла и в последствие до кариеси. Изследване доказва, че ежедневната консумация на плодови фрешове е еднакво увреждаща както избелващите агенти. Но обичайно след избелване в клинични условия се провежда реминерализация, а след прием на кисели напитки зъбите остават незащитени под обстрела на огромните дози захар.

    - -

    3. “Здравословни” блокчета от типа на Корни

    -

    Сега е много модерно да се храним здравословно. И наистина е чудесно, че най-накрая здравето дойде на мода, но знайте че хранителната индустрия не работи за хората, които искат да са здрави и силни. Тя работи в услуга на печалбите си. Все по-често срещам хора които със задоволство ми обясняват как се хранят здравословно и сутрин започват деня или заместват хранене с пълнозърнести бисквити или пълнозърнесто блокче ядки и сушени плодове. Или още по-лошо: дават ги на децата си. -Истината е, че всички тези стоки (казвам стоки, защото това не е храна) мога спокойно да причисля към категорията “джънк фууд”. Не искам да цитирам състава им, но вие си направете труда да погледнете етикета следващият път, когато това нещо попадне в ръцете ви: в него влизат хидрогенирани мазнини/маргарин/естерифицирани растителни мазнини; глюкозо-фруктозен сироп/захар/царевичен сироп; оцветители, ароматизатори, консерванти, стабилизатори, емулгатори, сол… Това не е здравословна храна, а топка химикали, която тялото ви се чуди откъде се е взела и кое по-напред да обработи и обезвреди. Спрете да купувате “здравословни” сладки и солени не-храни в лъскави опаковки още днес. Или поне спрете да ги давате на децата си.

    -;T; @QI"_/blog/2014-04-08-защо-никога-не-трябва-да-ядете-маргарин/;T{;{ ;I"L - - - - - - - Защо не трябва никога да ядете маргарин и растително олио - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Защо не трябва никога да ядете маргарин и растително олио -

    - -
    -
      -
    • - - April 8, 2014 -
    • -
    -
    - - -

    Навярно не веднъж сте чували за здравословната алтернатива на “запушващите-артерии-наситени-мазнини”: мазнините, извлечени от зърнени култури и семена, и тяхната твърда форма маргаринът. Тези мазнини имат славата, че помагат за намаляване на холестврола и кръвното налягане, подпомагат отслабването и като цяло подобряват здравето.

    - -

    Вече ми стана навик да ви провокирам със статии, които противоречат на 180градуса на всичко което сте вярвали до сега. И този път няма да ви разочаровам, а ще продължа традицията да ви казвам истината: растителните олиа и маргаринът са изключително вредни храни, които незабавно трябва да изключите от менюто си.

    - -

    Съвсем на кратко ще ви разкажа как се правят тези продукти. Растителните олиа и маргарин са извлечени от соеви зърна, царевица, слънчоглед, рапица и др. Те на практика не са съществували преди 1900година, когато е открит нов химичен процес, позволяващ добиването им. За разлика от зехтина или кокосовото масло, които могат да се извлекат директно чрез пресоване на кокос или маслини, останалите растителни мазнини се подлагат на загряване на висока температура, с последващо третиране с петролен разтворител, който извлича маслото. Следва още едно загряване и добавяне на киселина, с която се отстраняват твърдите части на мазнините(восъците, които се образуват на първият етап). Тук вече имаме течно масло, но то е с неприятен петролен мирис и цвят, които се премахват с още химикали, естествено! Ако растителното олио трябва да се превърне в маргарин, химическата атака продължава с пълна сила. Тези олиа нямат естествена твърда форма и затова се хидрогенират или естерифицират и на този етап се създават небезизвестните и много вредните транс-мазнини.

    - -

    За сравнение ще ви дам стъпките при правенето на масло: Кравата се издоява; оставя се каймака да се отдели по естествен начин; отделя се от млякото; бие се до получаванто на масло.

    - -

    Сега сигурно сте доста объркани и се чудите защо навсякъде се тръби за здравословните растителни мазнини и вредните животински. Ако е така, не прескачайте следващият абзац, който е с малко научна информация.

    - -

    Нашите тела имат нужда от мазнини. Ние трябва да приемаме мазнини с храната ежедневно. Клетъчната стена на всяка наша клетка е изградена от холестерол. Той е строителният материал, тухлата на клетъчната стена. Холестеролът е наситена мазнина от животински произход. Съдържанието на мазнини в човешкото тяло е 97% наситени и мононенаситени мазнини и само 3% полиненаситени мазнини, от които половината са Омега-3 мастни киселини. Растителните олиа съдържат огромни количества полиненаситени мастни киселини и небалансирано количество Омега-6 мастни киселини.

    - -

    Телата ни се нуждаят от правилните мазнини, за да изграждат клетки, за производство на хормони и за усвояването на мастно-разтворимите витамини. Ако им даваме неподходящи (растителни) мазнини, те изграждат дефектни структури.

    - -

    Най-големият проблем на растителните мазнини е, че са нестабилни и лесно се окисляват. Това предизвиква възпаление и мутация на клетките. Всъщност в клетките на сърцето, именно тези мазнини образуват плаки и причиняват запушване на артериите. Холестеролът е естествена структура за тялото и преминава свободно в кръвотока, а не задръства кръвоносните съдове. Когато такива мазнини се включат в състава на кожните клетки, те могат да доведат до образуването на рак на кожата. Именно по тази причина ракът на кожата често засяга хора, неизлагащи се на слънце или се появява на части от тялото, които винаги са покрити. Друга причина за раковите заболявания е дисбалансът на Омега-3 и Омега-6 мазнини, който трябва да е в съотношение 1:1. Проблемът е отново нестабилни, лесно окисляеми мастни киселини.

    - -

    При групи животни, хранени с растителни олиа и маргарин са наблюдавани следните ефекти: намалена способност за учене; токсикоза на черният дроб; намалена функционалност на имунната система; умственото и физическо изоставане на подрастващите индивиди; увеличаване на пикочната киселина в кръвта; непропорционално увеличаване на мастната тъкан; сърдечни заболявания; затлъстяване; диабет; рак.

    - -

    Знам какъв въпрос ви вълнува сега: “Колко е безопасната доза от тези храни?” Според мен, няма безопасно количество, но изследване показва, че количество до 2 чаени лъжички дневно растително олио не носи риск за здравето, ако бъде компенсирано със съответното количество Омега-3. Аз ви призовавам да изключите напълно консумацията на маргарин и растителни олиа, както и на стоките, съдържащи ги (кексове, вафли, бисквити, готови сосове, тестени изделия, шоколад, майонези, чипсове и т.н.)

    - -

    И за да не се получи дезинформиране, ето списък на здравословните и полезни за тялото ни мазнини, които са с подходящ химичен състав, благоприятен за този в клетките ни.

    - -
      -
    • -

      Кокосово масло (нерафинирано, необезмирисено)

      -
    • -
    • -

      Масло

      -
    • -
    • -

      Мас (свинска, патешки, т.н.)

      -
    • -
    • -

      Студено пресован, нерафиниран зехтин (маслиново масло)

      -
    • -
    • -

      Рибено масло (приема се като хранителна добавка)

      -
    • -
    • -

      Каймак от мляко

      -
    • -
    • -

      Сланина, мазно месо

      -
    • -
    • -

      Авокадо

      -
    • -
    - -

    Ето и една таблица, която сравнява хранителните характеристики на много от познатите ни мазнини, включително и човешката кърма. Може да забележите удивителната й еднаквост със свинската мас. Май ще се окаже, че бабите ни наистина знаят повече от нас ;-)

    - -

    Състав на мазнините

    - -

    Растителни мазнини, които могат да се консумират в минимални количества са:

    - -
      -
    • -

      Орехово масло

      -
    • -
    • -

      Масло от ленено семе

      -
    • -
    • -

      Ядки, тахани

      -
    • -
    - -

    Да, правилно забелязвате: слънчогледовото олио и шарланът (нерафинирано слънчогледово масло) не присъстват в списъка с позволените мазнини, макар да е най-консумираната мазнина в България. Съдържанието на витамин Е не компенсира непропорционалните количества Омега-6 мазнини. Това е продукт с минимална или дори никаква хранителна стойност за човешкият организъм. Заменете употребата му с масло или мас (или кокосово масло) при топлинната обработка на храната си и със зехтин в салатите и студените ястия. И след време ще ми благодарите!

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I",Навярно не веднъж сте чували за здравословната алтернатива на "запушващите-артерии-наситени-мазнини": мазнините, извлечени от зърнени култури и семена, и тяхната твърда форма маргаринът. Тези мазнини имат славата, че помагат за намаляване на холестврола и кръвното налягане, подпомагат отслабването и като цяло подобряват здравето. - -Вече ми стана навик да ви провокирам със статии, които противоречат на 180градуса на всичко което сте вярвали до сега. И този път няма да ви разочаровам, а ще продължа традицията да ви казвам истината: **растителните олиа и маргаринът са изключително вредни храни, които незабавно трябва да изключите от менюто си.** - -Съвсем на кратко ще ви разкажа **как се правят тези продукти**. Растителните олиа и маргарин са извлечени от соеви зърна, царевица, слънчоглед, рапица и др. Те на практика не са съществували преди 1900година, когато е открит нов химичен процес, позволяващ добиването им. За разлика от зехтина или кокосовото масло, които могат да се извлекат директно чрез пресоване на кокос или маслини, останалите растителни мазнини се подлагат на загряване на висока температура, с последващо третиране с петролен разтворител, който извлича маслото. Следва още едно загряване и добавяне на киселина, с която се отстраняват твърдите части на мазнините(восъците, които се образуват на първият етап). Тук вече имаме течно масло, но то е с неприятен петролен мирис и цвят, които се премахват с още химикали, естествено! Ако растителното олио трябва да се превърне в маргарин, химическата атака продължава с пълна сила. Тези олиа нямат естествена твърда форма и затова се хидрогенират или естерифицират и на този етап се създават небезизвестните и много вредните [транс-](http://ajcn.nutrition.org/content/66/4/1006S.short)[мазнини](http://onlinelibrary.wiley.com/doi/10.1111/j.1745-4522.1994.tb00244.x/abstract). - -За сравнение ще ви дам стъпките при правенето на **масло**: Кравата се издоява; оставя се каймака да се отдели по естествен начин; отделя се от млякото; бие се до получаванто на масло. - -Сега сигурно сте доста объркани и се чудите защо навсякъде се тръби за здравословните растителни мазнини и вредните животински. Ако е така, не прескачайте следващият абзац, който е с малко научна информация. - -Нашите тела имат нужда от мазнини. Ние трябва да приемаме мазнини с храната ежедневно. Клетъчната стена на всяка наша клетка е изградена от [холестерол](http://www.ncbi.nlm.nih.gov/pubmedhealth/PMH0058548/). Той е строителният материал, тухлата на клетъчната стена. Холестеролът е наситена мазнина от животински произход. Съдържанието на мазнини в човешкото тяло е 97% наситени и мононенаситени мазнини и само 3% полиненаситени мазнини, от които половината са Омега-3 мастни киселини. Растителните олиа съдържат огромни количества полиненаситени мастни киселини и небалансирано количество [Омега-6 мастни киселини](http://ajcn.nutrition.org/content/83/6/S1483.full.pdf). - -Телата ни се нуждаят от правилните мазнини, за да изграждат клетки, за производство на хормони и за усвояването на мастно-разтворимите витамини. Ако им даваме неподходящи (растителни) мазнини, те изграждат дефектни структури. - -**Най-големият проблем на растителните мазнини** е, че са нестабилни и лесно се окисляват. Това предизвиква възпаление и мутация на клетките. Всъщност в клетките на сърцето, именно тези мазнини образуват плаки и причиняват запушване на артериите. Холестеролът е естествена структура за тялото и преминава свободно в кръвотока, а не задръства кръвоносните съдове. Когато такива мазнини се включат в състава на кожните клетки, те могат да доведат до образуването на рак на кожата. Именно по тази причина ракът на кожата често засяга хора, неизлагащи се на слънце или се появява на части от тялото, които винаги са покрити. Друга причина за раковите заболявания е дисбалансът на Омега-3 и Омега-6 мазнини, който трябва да е в съотношение 1:1. Проблемът е отново нестабилни, лесно окисляеми мастни киселини. - -При групи животни, хранени с растителни олиа и маргарин са наблюдавани следните ефекти: **намалена способност за учене**; **токсикоза на [черният дроб](http://onlinelibrary.wiley.com/doi/10.1002/hep.20821/abstract)**; **намалена функционалност на [имунната система](http://www.sciencedirect.com/science/article/pii/S009167490502316X)**; **умственото и физическо изоставане** на подрастващите индивиди; увеличаване на **пикочната киселина в кръвта**; непропорционално **увеличаване на мастната тъкан**; **сърдечни заболявания**; **затлъстяване**; **диабет**; **[рак](http://www.biomedcentral.com/1741-7015/10/50)**. - -Знам какъв въпрос ви вълнува сега: **"Колко е безопасната доза от тези храни?"** Според мен, няма безопасно количество, но [изследване](http://www.ncbi.nlm.nih.gov/pubmed/16387724) показва, че количество до 2 чаени лъжички дневно растително олио не носи риск за здравето, ако бъде компенсирано със съответното количество Омега-3. Аз ви призовавам да изключите напълно консумацията на маргарин и растителни олиа, както и на стоките, съдържащи ги (кексове, вафли, бисквити, готови сосове, тестени изделия, шоколад, майонези, чипсове и т.н.) - -И за да не се получи дезинформиране, ето списък на здравословните и полезни за тялото ни мазнини, които са с подходящ химичен състав, благоприятен за този в клетките ни. - -* **[Кокосово масло](http://www.ncbi.nlm.nih.gov/pubmed/9229205)** (нерафинирано, необезмирисено) - -* **[Масло](http://www.ncbi.nlm.nih.gov/pubmed/9229205)** - -* **Мас** (свинска, патешки, т.н.) - -* Студено пресован, нерафиниран **зехтин** (маслиново масло) - -* **Рибено масло** (приема се като хранителна добавка) - -* **Каймак** от мляко - -* **Сланина**, мазно **месо** - -* **Авокадо** - -Ето и една таблица, която сравнява хранителните характеристики на много от познатите ни мазнини, включително и човешката кърма. Може да забележите удивителната й еднаквост със свинската мас. Май ще се окаже, че бабите ни наистина знаят повече от нас ;-) - -![Състав на мазнините](/images/posts/Fats.jpg) - -Растителни мазнини, които могат да се консумират в минимални количества са: - -* Орехово масло - -* Масло от ленено семе - -* Ядки, тахани - -Да, правилно забелязвате: **слънчогледовото олио** и шарланът (нерафинирано слънчогледово масло) не присъстват в списъка с позволените мазнини, макар да е най-консумираната мазнина в България. Съдържанието на витамин Е не компенсира непропорционалните количества Омега-6 мазнини. Това е продукт с минимална или дори никаква хранителна стойност за човешкият организъм. Заменете употребата му с масло или мас (или кокосово масло) при топлинната обработка на храната си и със зехтин в салатите и студените ястия. И след време ще ми благодарите!;T; -I"0

    Навярно не веднъж сте чували за здравословната алтернатива на “запушващите-артерии-наситени-мазнини”: мазнините, извлечени от зърнени култури и семена, и тяхната твърда форма маргаринът. Тези мазнини имат славата, че помагат за намаляване на холестврола и кръвното налягане, подпомагат отслабването и като цяло подобряват здравето.

    - -

    Вече ми стана навик да ви провокирам със статии, които противоречат на 180градуса на всичко което сте вярвали до сега. И този път няма да ви разочаровам, а ще продължа традицията да ви казвам истината: растителните олиа и маргаринът са изключително вредни храни, които незабавно трябва да изключите от менюто си.

    - -

    Съвсем на кратко ще ви разкажа как се правят тези продукти. Растителните олиа и маргарин са извлечени от соеви зърна, царевица, слънчоглед, рапица и др. Те на практика не са съществували преди 1900година, когато е открит нов химичен процес, позволяващ добиването им. За разлика от зехтина или кокосовото масло, които могат да се извлекат директно чрез пресоване на кокос или маслини, останалите растителни мазнини се подлагат на загряване на висока температура, с последващо третиране с петролен разтворител, който извлича маслото. Следва още едно загряване и добавяне на киселина, с която се отстраняват твърдите части на мазнините(восъците, които се образуват на първият етап). Тук вече имаме течно масло, но то е с неприятен петролен мирис и цвят, които се премахват с още химикали, естествено! Ако растителното олио трябва да се превърне в маргарин, химическата атака продължава с пълна сила. Тези олиа нямат естествена твърда форма и затова се хидрогенират или естерифицират и на този етап се създават небезизвестните и много вредните транс-мазнини.

    - -

    За сравнение ще ви дам стъпките при правенето на масло: Кравата се издоява; оставя се каймака да се отдели по естествен начин; отделя се от млякото; бие се до получаванто на масло.

    - -

    Сега сигурно сте доста объркани и се чудите защо навсякъде се тръби за здравословните растителни мазнини и вредните животински. Ако е така, не прескачайте следващият абзац, който е с малко научна информация.

    - -

    Нашите тела имат нужда от мазнини. Ние трябва да приемаме мазнини с храната ежедневно. Клетъчната стена на всяка наша клетка е изградена от холестерол. Той е строителният материал, тухлата на клетъчната стена. Холестеролът е наситена мазнина от животински произход. Съдържанието на мазнини в човешкото тяло е 97% наситени и мононенаситени мазнини и само 3% полиненаситени мазнини, от които половината са Омега-3 мастни киселини. Растителните олиа съдържат огромни количества полиненаситени мастни киселини и небалансирано количество Омега-6 мастни киселини.

    - -

    Телата ни се нуждаят от правилните мазнини, за да изграждат клетки, за производство на хормони и за усвояването на мастно-разтворимите витамини. Ако им даваме неподходящи (растителни) мазнини, те изграждат дефектни структури.

    - -

    Най-големият проблем на растителните мазнини е, че са нестабилни и лесно се окисляват. Това предизвиква възпаление и мутация на клетките. Всъщност в клетките на сърцето, именно тези мазнини образуват плаки и причиняват запушване на артериите. Холестеролът е естествена структура за тялото и преминава свободно в кръвотока, а не задръства кръвоносните съдове. Когато такива мазнини се включат в състава на кожните клетки, те могат да доведат до образуването на рак на кожата. Именно по тази причина ракът на кожата често засяга хора, неизлагащи се на слънце или се появява на части от тялото, които винаги са покрити. Друга причина за раковите заболявания е дисбалансът на Омега-3 и Омега-6 мазнини, който трябва да е в съотношение 1:1. Проблемът е отново нестабилни, лесно окисляеми мастни киселини.

    - -

    При групи животни, хранени с растителни олиа и маргарин са наблюдавани следните ефекти: намалена способност за учене; токсикоза на черният дроб; намалена функционалност на имунната система; умственото и физическо изоставане на подрастващите индивиди; увеличаване на пикочната киселина в кръвта; непропорционално увеличаване на мастната тъкан; сърдечни заболявания; затлъстяване; диабет; рак.

    - -

    Знам какъв въпрос ви вълнува сега: “Колко е безопасната доза от тези храни?” Според мен, няма безопасно количество, но изследване показва, че количество до 2 чаени лъжички дневно растително олио не носи риск за здравето, ако бъде компенсирано със съответното количество Омега-3. Аз ви призовавам да изключите напълно консумацията на маргарин и растителни олиа, както и на стоките, съдържащи ги (кексове, вафли, бисквити, готови сосове, тестени изделия, шоколад, майонези, чипсове и т.н.)

    - -

    И за да не се получи дезинформиране, ето списък на здравословните и полезни за тялото ни мазнини, които са с подходящ химичен състав, благоприятен за този в клетките ни.

    - -
      -
    • -

      Кокосово масло (нерафинирано, необезмирисено)

      -
    • -
    • -

      Масло

      -
    • -
    • -

      Мас (свинска, патешки, т.н.)

      -
    • -
    • -

      Студено пресован, нерафиниран зехтин (маслиново масло)

      -
    • -
    • -

      Рибено масло (приема се като хранителна добавка)

      -
    • -
    • -

      Каймак от мляко

      -
    • -
    • -

      Сланина, мазно месо

      -
    • -
    • -

      Авокадо

      -
    • -
    - -

    Ето и една таблица, която сравнява хранителните характеристики на много от познатите ни мазнини, включително и човешката кърма. Може да забележите удивителната й еднаквост със свинската мас. Май ще се окаже, че бабите ни наистина знаят повече от нас ;-)

    - -

    Състав на мазнините

    - -

    Растителни мазнини, които могат да се консумират в минимални количества са:

    - -
      -
    • -

      Орехово масло

      -
    • -
    • -

      Масло от ленено семе

      -
    • -
    • -

      Ядки, тахани

      -
    • -
    - -

    Да, правилно забелязвате: слънчогледовото олио и шарланът (нерафинирано слънчогледово масло) не присъстват в списъка с позволените мазнини, макар да е най-консумираната мазнина в България. Съдържанието на витамин Е не компенсира непропорционалните количества Омега-6 мазнини. Това е продукт с минимална или дори никаква хранителна стойност за човешкият организъм. Заменете употребата му с масло или мас (или кокосово масло) при топлинната обработка на храната си и със зехтин в салатите и студените ястия. И след време ще ми благодарите!

    -;T; @WI"#/blog/2014-04-15-яйцето/;T{;{ ;I". - - - - - - - Храната като лекарство: Яйцето - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Храната като лекарство: Яйцето -

    - -
    -
      -
    • - - April 15, 2014 -
    • -
    -
    - - -

    Яйцето е храна, изключително богата на полезни за тялото вещества. В него има перфектното съотношение на белтъчини, мазнини и въглехидрати. Само в жълтъкът се съдържат 13 есенциални нутриента:

    - -

    Витамин В, Д и Е: жизнено важни за нормалното функциониране на клетката и растеж и развитие на човешкият организъм. Лесно усвоим витамин А за здравето на очите ни. Йодинът подпомага функциите на тиреоидната жлеза и хормони, а фосфорът участва в калциевата-фосфорната обмяна в зъбите и костите. Холинът е важен нутриент за мозъка. Голямо количество антиоксиданти можем да си набавим с яйцата. Два от тях са лутеин и зеаксантин и допринасят за доброто зрение. Всичко изброено прави яйцето изключително ценен продукт, който няма причина да ограничавате до 2-3 броя седмично, а да ядете по толкова всеки ден! Особено ако има откъде да си набавяте яйца от щастливи кокошки, хранени с трева и семенца.

    - -

    Сигурна съм, че не веднъж сте чували колко е опасно да се изяждат повече от две яйца седмично, заради холестерола. Аз съм го чувала от колеги лекари, от възрастни, от млади информирани и образовани хора, от кой ли не…

    - -

    Е, време е да кажем нещата в прав текст: яденето на яйца няма пряка връзка с риска от сърдечно-съдови заболявания. Това е поредният мит.

    - -

    Проучване показва, че консумацията на яйца няма отношение към холестерола при 70% от хората. При другите 30% (т.нар. хиперреактивни) яйцата повишават HDL и LDL холестеролът (познати като добрият и лошият).

    - -

    Сигурно мислите, че всичко което би могло да повиши лошият (LDL) холестерол трябва да се избягва като дявол от тамян. Последните проучвания доказват, че отношение към сърдечно-съдовите заболявания има количеството холестерол в частиците LDL-C, а не общото количество LDL холестерол. Има и стари изследвания които доказват това.

    - -

    Ако изобщо нещо се случва между холестерола ви и яйцето, то е че мазнините в яйчният жълтък доставят големи LDL частици, което означава че в кръвта има по-малко общо количество холестерол. Т.е. ядейки яйца намаляваме количеството лош (и общ) холестерол и това ни предпазва от сърдечно-съдови заболявания.

    - -

    Ако имате нужда от още причини, за да ядете повече яйца:

    - -

    Те са евтини, могат да се комбинират с почти всяка друга храна, имат 77кал за едно яйце, което ги прави диетични и… са наистина вкусни!

    - -

    Весели празници на всички! -великденски яйца

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Яйцето е храна, изключително [богата на полезни за тялото вещества](http://nutritiondata.self.com/facts/dairy-and-egg-products/117/2). В него има перфектното съотношение на белтъчини, мазнини и въглехидрати. Само в жълтъкът се съдържат 13 есенциални нутриента: - -**Витамин В**, **Д** и **Е**: жизнено важни за нормалното функциониране на клетката и растеж и развитие на човешкият организъм. Лесно усвоим **витамин А** за здравето на очите ни. **Йодинът** подпомага функциите на тиреоидната жлеза и хормони, а **фосфорът** участва в калциевата-фосфорната обмяна в зъбите и костите. [**Холинът**](http://www.fasebj.org/cgi/content/meeting_abstract/21/6/LB46-c) е важен нутриент за мозъка. Голямо количество **антиоксиданти** можем да си набавим с яйцата. Два от тях са [**лутеин** и **зеаксантин**](http://ajcn.nutrition.org/content/70/2/247.short) и допринасят за доброто зрение. Всичко изброено прави яйцето изключително ценен продукт, който няма причина да ограничавате до **2-3 броя** седмично, а да ядете по толкова **всеки ден**! Особено ако има откъде да си набавяте яйца от щастливи кокошки, хранени с трева и семенца. - -Сигурна съм, че не веднъж сте чували колко е опасно да се изяждат повече от две яйца седмично, заради холестерола. Аз съм го чувала от колеги лекари, от възрастни, от млади информирани и образовани хора, от кой ли не... - -Е, време е да кажем нещата в прав текст: **яденето на яйца няма пряка връзка с риска от сърдечно-съдови заболявания**. Това е поредният мит. - -[Проучване](http://www.ncbi.nlm.nih.gov/pubmed/16340654?ordinalpos=1&itool=EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_RVDocSum) показва, че консумацията на яйца няма отношение към холестерола при 70% от хората. При другите 30% (т.нар. хиперреактивни) яйцата повишават HDL и LDL холестеролът (познати като добрият и лошият). - -Сигурно мислите, че всичко което би могло да повиши лошият (LDL) холестерол трябва да се избягва като дявол от тамян. Последните проучвания доказват, че отношение към сърдечно-съдовите заболявания има количеството холестерол в частиците LDL-C, а не общото количество [LDL холестерол]( http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3070150/). Има и [стари изследвания](http://onlinelibrary.wiley.com/doi/10.1111/j.1467-3010.2006.00543.x/full) които доказват това. - -Ако изобщо нещо се случва между холестерола ви и яйцето, то е че мазнините в яйчният жълтък доставят големи [LDL](http://www.ncbi.nlm.nih.gov/pubmed/8782636) частици, което означава че в кръвта има по-малко общо количество холестерол. Т.е. ядейки яйца намаляваме количеството лош (и общ) холестерол и това ни предпазва от сърдечно-съдови заболявания. - -Ако имате нужда от още причини, за да ядете повече яйца: - -Те са евтини, могат да се комбинират с почти всяка друга храна, имат 77кал за едно яйце, което ги прави диетични и... са наистина вкусни! - -Весели празници на всички! -![великденски яйца](/images/posts/eggs.jpg);T; -I"

    Яйцето е храна, изключително богата на полезни за тялото вещества. В него има перфектното съотношение на белтъчини, мазнини и въглехидрати. Само в жълтъкът се съдържат 13 есенциални нутриента:

    - -

    Витамин В, Д и Е: жизнено важни за нормалното функциониране на клетката и растеж и развитие на човешкият организъм. Лесно усвоим витамин А за здравето на очите ни. Йодинът подпомага функциите на тиреоидната жлеза и хормони, а фосфорът участва в калциевата-фосфорната обмяна в зъбите и костите. Холинът е важен нутриент за мозъка. Голямо количество антиоксиданти можем да си набавим с яйцата. Два от тях са лутеин и зеаксантин и допринасят за доброто зрение. Всичко изброено прави яйцето изключително ценен продукт, който няма причина да ограничавате до 2-3 броя седмично, а да ядете по толкова всеки ден! Особено ако има откъде да си набавяте яйца от щастливи кокошки, хранени с трева и семенца.

    - -

    Сигурна съм, че не веднъж сте чували колко е опасно да се изяждат повече от две яйца седмично, заради холестерола. Аз съм го чувала от колеги лекари, от възрастни, от млади информирани и образовани хора, от кой ли не…

    - -

    Е, време е да кажем нещата в прав текст: яденето на яйца няма пряка връзка с риска от сърдечно-съдови заболявания. Това е поредният мит.

    - -

    Проучване показва, че консумацията на яйца няма отношение към холестерола при 70% от хората. При другите 30% (т.нар. хиперреактивни) яйцата повишават HDL и LDL холестеролът (познати като добрият и лошият).

    - -

    Сигурно мислите, че всичко което би могло да повиши лошият (LDL) холестерол трябва да се избягва като дявол от тамян. Последните проучвания доказват, че отношение към сърдечно-съдовите заболявания има количеството холестерол в частиците LDL-C, а не общото количество LDL холестерол. Има и стари изследвания които доказват това.

    - -

    Ако изобщо нещо се случва между холестерола ви и яйцето, то е че мазнините в яйчният жълтък доставят големи LDL частици, което означава че в кръвта има по-малко общо количество холестерол. Т.е. ядейки яйца намаляваме количеството лош (и общ) холестерол и това ни предпазва от сърдечно-съдови заболявания.

    - -

    Ако имате нужда от още причини, за да ядете повече яйца:

    - -

    Те са евтини, могат да се комбинират с почти всяка друга храна, имат 77кал за едно яйце, което ги прави диетични и… са наистина вкусни!

    - -

    Весели празници на всички! -великденски яйца

    -;T; @]I"}/blog/2014-04-19-полезна-ли-е-пастата-за-зъби (radosveta simeonova's conflicted copy 2015-07-08)/;T{;{ ;I"= - - - - - - - - - Полезна ли е пастата за зъби? - - - - - - - - - - - - - - - -
    -
    -
    -

    - Полезна ли е пастата за зъби? -

    - -
    -
      -
    • - - April 19, 2014 -
    • -
    -
    - - -

    Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност!

    - -

    Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно:

    - -

    Как по естествен начин да лекуваме зъбите си от кариес

    -

    (без болезнени посещения при зъболекар)

    - -

    Тук и тук ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци.

    - -

    Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл.

    - -

    За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят.

    - -
      -
    • Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозиране то е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива.
    • -
    • Сулфиди - веществата, които образуват пяната. Увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост)
    • -
    • Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали
    • -
    • Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба
    • -
    • Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на сапун за уста, който набира популярност в САЩ и Великобритания.
    • -
    - -

    Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини.

    - -

    Тогава как да поддържаме добра и безопасна устна хигиена?

    - -

    Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми.

    - -

    Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н.

    - -

    Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето една, друга, още три

    - -

    С домашната паста, в комбинация с този лесен метод за избелване, при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца.

    - -

    Домашна паста за зъби

    - -
      -
    • 4 супени лъжици кокосово масло
    • -
    • 1 пълна супена лъжица сода за хляб
    • -
    • 1 чаена лъжичка листа от стевия на прах (опционално)
    • -
    • 2-3 зърна карамфил, смлени на прах
    • -
    • 7 капки ментово масло (или друго по избор)
    • -
    • 2-3 супени лъжици гореща вода -съставки -Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството. -пастата -
    • -
    - -

    Върши ли наистина работа?

    - -

    Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията (бактерии причиняващи кариес, хранителни остатъци и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки!

    - -

    Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.?

    - -

    Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й.

    - -

    Отново държа да подчертая, че трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.

    - -
    -
    - - -
    - - - - - - - -;T; I"*+Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност! - -Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно: - -###Как по естествен начин да лекуваме зъбите си от кариес -(без болезнени посещения при зъболекар) - -[Тук](http://blog.zabolekar-varna.com/2014/02/27/%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/) и [тук](http://blog.zabolekar-varna.com/2014/03/03/%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-2/) ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци. - -Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл. - -За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят. - - * Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозиране то е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива. - * Сулфиди - веществата, които образуват пяната. Увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост) - * Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали - * Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба - * Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на [сапун за уста](http://www.amazon.com/Tooth-Soap-Peppermint-Liquid/dp/B0043L4JBI), който набира популярност в САЩ и Великобритания. - -Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини. - -###Тогава как да поддържаме добра и безопасна устна хигиена? - -Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми. - -Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н. - -Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето [една](http://desilifestyle.net/2012/09/%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B0-%D0%BA%D0%BE%D0%BA%D0%BE%D1%81%D0%BE%D0%B2%D0%B0-%D0%BF%D0%B0%D1%81%D1%82%D0%B0-%D0%B7%D0%B0-%D0%B7%D1%8A%D0%B1%D0%B8/), [друга](http://www.otnishtoneshto.com/2011/08/blog-post.html), [още три](http://www.mnn.com/lifestyle/natural-beauty-fashion/stories/3-simple-homemade-toothpaste-recipes)... - -С домашната паста, в комбинация с този лесен [метод за избелване](http://blog.zabolekar-varna.com/2014/03/07/%D0%B8%D0%B7%D0%B1%D0%B5%D0%BB%D0%B2%D0%B0%D0%BD%D0%B5/), при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца. - -**Домашна паста за зъби** - - * 4 супени лъжици кокосово масло - * 1 пълна супена лъжица сода за хляб - * 1 чаена лъжичка листа от стевия на прах (опционално) - * 2-3 зърна карамфил, смлени на прах - * 7 капки ментово масло (или друго по избор) - * 2-3 супени лъжици гореща вода -![съставки](http://blog.zabolekar-varna.com/images/posts/Ingredients.jpg) -Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството. -![пастата](http://blog.zabolekar-varna.com/images/posts/Paste.jpg) - -Върши ли наистина работа? - -Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията ([бактерии](http://www.ncbi.nlm.nih.gov/pubmed/18408265) причиняващи [кариес](http://www.walkbythewayjournal.com/wp-content/uploads/2013/10/Anand-et-al.pdf), [хранителни остатъци](http://www.ijdr.in/article.asp?issn=0970-9290;year=2009;volume=20;issue=1;spage=47;epage=51;aulast=Asokan) и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки! - -Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.? - -Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й. - -Отново държа да подчертая, че **трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.** ;T; -I",

    Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност!

    - -

    Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно:

    - -

    Как по естествен начин да лекуваме зъбите си от кариес

    -

    (без болезнени посещения при зъболекар)

    - -

    Тук и тук ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци.

    - -

    Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл.

    - -

    За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят.

    - -
      -
    • Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозиране то е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива.
    • -
    • Сулфиди - веществата, които образуват пяната. Увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост)
    • -
    • Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали
    • -
    • Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба
    • -
    • Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на сапун за уста, който набира популярност в САЩ и Великобритания.
    • -
    - -

    Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини.

    - -

    Тогава как да поддържаме добра и безопасна устна хигиена?

    - -

    Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми.

    - -

    Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н.

    - -

    Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето една, друга, още три

    - -

    С домашната паста, в комбинация с този лесен метод за избелване, при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца.

    - -

    Домашна паста за зъби

    - -
      -
    • 4 супени лъжици кокосово масло
    • -
    • 1 пълна супена лъжица сода за хляб
    • -
    • 1 чаена лъжичка листа от стевия на прах (опционално)
    • -
    • 2-3 зърна карамфил, смлени на прах
    • -
    • 7 капки ментово масло (или друго по избор)
    • -
    • 2-3 супени лъжици гореща вода -съставки -Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството. -пастата -
    • -
    - -

    Върши ли наистина работа?

    - -

    Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията (бактерии причиняващи кариес, хранителни остатъци и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки!

    - -

    Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.?

    - -

    Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й.

    - -

    Отново държа да подчертая, че трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.

    -;T; @cI"J/blog/2014-04-19-полезна-ли-е-пастата-за-зъби/;T{;{ ;I"D - - - - - - - Полезна ли е пастата за зъби? - - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Полезна ли е пастата за зъби? -

    - -
    -
      -
    • - - June 30, 2015 -
    • -
    -
    - - -

    Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност!

    - -

    Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно:

    - -

    Как по естествен начин да лекуваме зъбите си от кариес

    -

    (без болезнени посещения при зъболекар)

    - -

    Тук и тук ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци.

    - -

    Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл.

    - -

    За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят.

    - -
      -
    • Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозиране то е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива.
    • -
    • Сулфиди - веществата, които образуват пяната. Увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост)
    • -
    • Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали
    • -
    • Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба
    • -
    • Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на сапун за уста, който набира популярност в САЩ и Великобритания.
    • -
    - -

    Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини.

    - -

    Тогава как да поддържаме добра и безопасна устна хигиена?

    - -

    Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми.

    - -

    Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н.

    - -

    Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето една, друга, още три

    - -

    С домашната паста, в комбинация с този лесен метод за избелване, при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца.

    - -

    Домашна паста за зъби

    - -
      -
    • 4 супени лъжици кокосово масло
    • -
    • 1 пълна супена лъжица сода за хляб
    • -
    • 1 чаена лъжичка листа от стевия на прах (опционално)
    • -
    • 2-3 зърна карамфил, смлени на прах
    • -
    • 7 капки ментово масло (или друго по избор)
    • -
    • 2-3 супени лъжици гореща вода -съставки -Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството. -пастата -
    • -
    - -

    Върши ли наистина работа?

    - -

    Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията (бактерии причинители на кариес, хранителни остатъци и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки!

    - -

    Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.?

    - -

    Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й.

    - -

    Отново държа да подчертая, че трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.

    - - -
    -
    - - -
    - -
    -
    - - -
    - - - - - - - - - -;T; I"R*Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност! - -Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно: - -###Как по естествен начин да лекуваме зъбите си от кариес -(без болезнени посещения при зъболекар) - -[Тук](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/) и [тук](/blog/2014-03-03-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-2/) ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци. - -Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл. - -За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят. - - * Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозиране то е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива. - * Сулфиди - веществата, които образуват пяната. Увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост) - * Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали - * Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба - * Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на [сапун за уста](http://www.amazon.com/Tooth-Soap-Peppermint-Liquid/dp/B0043L4JBI), който набира популярност в САЩ и Великобритания. - -Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини. - -###Тогава как да поддържаме добра и безопасна устна хигиена? - -Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми. - -Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н. - -Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето [една](http://desilifestyle.net/2012/09/%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B0-%D0%BA%D0%BE%D0%BA%D0%BE%D1%81%D0%BE%D0%B2%D0%B0-%D0%BF%D0%B0%D1%81%D1%82%D0%B0-%D0%B7%D0%B0-%D0%B7%D1%8A%D0%B1%D0%B8/), [друга](http://www.otnishtoneshto.com/2011/08/blog-post.html), [още три](http://www.mnn.com/lifestyle/natural-beauty-fashion/stories/3-simple-homemade-toothpaste-recipes)... - -С домашната паста, в комбинация с този лесен [метод за избелване](/blog/2014-03-07-%D0%B8%D0%B7%D0%B1%D0%B5%D0%BB%D0%B2%D0%B0%D0%BD%D0%B5/), при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца. - -**Домашна паста за зъби** - - * 4 супени лъжици кокосово масло - * 1 пълна супена лъжица сода за хляб - * 1 чаена лъжичка листа от стевия на прах (опционално) - * 2-3 зърна карамфил, смлени на прах - * 7 капки ментово масло (или друго по избор) - * 2-3 супени лъжици гореща вода -![съставки](/images/posts/Ingredients.jpg) -Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството. -![пастата](/images/posts/Paste.jpg) - -Върши ли наистина работа? - -Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията ([бактерии](http://www.ncbi.nlm.nih.gov/pubmed/18408265) причинители на кариес, [хранителни остатъци](http://www.ijdr.in/article.asp?issn=0970-9290;year=2009;volume=20;issue=1;spage=47;epage=51;aulast=Asokan) и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки! - -Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.? - -Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й. - -Отново държа да подчертая, че **трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.** ;T; -I"+

    Как бихте реагирали, ако ви кажа, че вашите зъби имат способността да се излекуват от кариес сами?! Да, заявявам ви го с голяма увереност!

    - -

    Реминерализацията на зъбите е процес, който зъболекарското съсловие до скоро смяташе за невъзможен. С тази статия ще започнем да навлизаме малко по-малко в дебрите на науката и по точно:

    - -

    Как по естествен начин да лекуваме зъбите си от кариес

    -

    (без болезнени посещения при зъболекар)

    - -

    Тук и тук ви запознах с проучванията на Д-р Уестън Прайс, от които стана ясно колко е важно пълноценното хранене, за да имаме здрави зъби и венци.

    - -

    Разбира се, храната е само една брънка от целият процес на създаване на здрав, твърд и устойчив зъбен емайл.

    - -

    За да протече правилна реминерализация отвътре-навън, изключително важно е зъбите да са перфектно чисти. Уви, това не може да се случи с масовите пасти за зъби. Те съдържат богат набор от съставки, които не само не допринасят за здравето на вашата уста, а дори могат и да ви разболеят.

    - -
      -
    • Флуор - това е изключително токсично химично вещество, което вместо да прави зъбите по-здрави, ги прави крехки и чупливи. Флуорозата е нерядко срещано явление, тъй като предозиране то е твърде лесно. В пастите за зъби, флуора е в много висока концентрация, защото иначе не действа. Но ако се поглъща дори и минимално количество от пастата (най-често при деца) се стига до системно натравяне и следващи проблеми. Флуора се свързва с проблеми с бъбреците и щитовидната жлеза. А вече има данни, че влияе и на ДНК. Друг силно негативен ефект е, че флуора действа като клетъчна отрова (натриев флуорид е отровата за мишки). Така той уврежда венците и пародонта, и подтиска възстановителните им механизми. И не на последно място, миенето на зъбите с флуорираната паста причинява корозия на амалгамените пломби, ако има такива.
    • -
    • Сулфиди - веществата, които образуват пяната. Увреждат венците и пародонта (влакната, които поддържат зъбът в челюстната кост)
    • -
    • Токсични метали - често в състава на зъбните пасти можете да срещнете алуминий и други метали
    • -
    • Изкуствени подсладители като сорбитол или аспартам - доказани кариесогнени при продължителна употреба
    • -
    • Глицерин - според проучванията на Д-р Джерард Джъд, който е изследвал задълбочено де- и реминерализацията на зъбите, както и влиянието на флуора, глицеринът оставя тънък, лепкав и труден за премахване слой върху зъбната повърхност. Този слой не позволява слюнката да навлезе в емайла и да се осъществят химичните реакции на реминереализацията.в научните среди това твърдение все още се смята за спорно. Д-р Джъд пръв предлага използването на сапун за уста, който набира популярност в САЩ и Великобритания.
    • -
    - -

    Както може би си припомнихте от горните линкове, Д-р Прайс беше открил абсолютно здрави зъби и челюсти при хора, никога не използвали каквито и да били средства за хигиена. Такива зъби се срещали при хора с диета с естествени храни, богата на минерали и витамини.

    - -

    Тогава как да поддържаме добра и безопасна устна хигиена?

    - -

    Предлагам ви рецепта за домашна паста за зъби, с която ще имате чисти зъби и свеж дъх, без вредни съставки, с достъпни суровини. Тя е без флуор, така че е подходяща за деца, бебета, хора с тироидни проблеми.

    - -

    Разбира се, в специализирани магазини бихте могли да откриете също добра и качествена паста без флуор, но задължително четете етикетите. В повечето ще откриете доста химични вещества, които са вложени, за да удължат срока на годност, за по-висока течливост (за да се изстисква от тубичката) и т.н.

    - -

    Много рецепти за домашна паста за зъби можете да намерите в Интернет: например ето една, друга, още три

    - -

    С домашната паста, в комбинация с този лесен метод за избелване, при редовна употреба бихте могли да имате по-здрава и бяла усмивка до няколко месеца.

    - -

    Домашна паста за зъби

    - -
      -
    • 4 супени лъжици кокосово масло
    • -
    • 1 пълна супена лъжица сода за хляб
    • -
    • 1 чаена лъжичка листа от стевия на прах (опционално)
    • -
    • 2-3 зърна карамфил, смлени на прах
    • -
    • 7 капки ментово масло (или друго по избор)
    • -
    • 2-3 супени лъжици гореща вода -съставки -Разтопеното или размекнато кокосово масло се разбърква със содата, стевията, карамфила на прах и етеричното масло по избор. Добавят горещата вода и всичко се хомогенизира. Изсипва се в чист стъклен или пластмасов съд с капак (бурканче, кутийка от крем). За да се избегне контаминирането с бактерии, пастата се нанася върху четката с малка лъжичка или шпатула. Може да се гребва и директно от съда, но тогава трябва да има отделна паста за всеки член на домакинството. -пастата -
    • -
    - -

    Върши ли наистина работа?

    - -

    Да! Кокосовото масло - растителното масло (олио) има свойството да увлича молекулите на мръсотията (бактерии причинители на кариес, хранителни остатъци и др.). Содата има лек полиращ ефект и неутрализира киселините, които разяждат емайла. Ментовото масло е за свеж дъх, карамфилът има противовъзпалително действие и повлиява проблеми с венците. Стевията прикрива соленият вкус на содата, но на нея се дължи и странният цвят. С тази паста ще усетите зъбите си по-чисти и гладки!

    - -

    Подходяща ли е за хора с чувствителни зъби/пломби/коронки и т.н.?

    - -

    Задължително се консултирайте с вашият зъболекар, ако имате някакви специфични заболявания по зъбите или в устата. Аз лично смятам, че съставките са безопасни и добре балансирани и е подходяща за ежедневна употреба от всеки, включително и деца. Все пак избягвайте поглъщането й.

    - -

    Отново държа да подчертая, че трябва да съобщите на зъболекаря си за промяната в средствата за хигиена.

    -;T; @iI"a/blog/2014-04-23-кой-е-най-големият-причинител-на-кариеса/;T{;{ ;I"s; - - - - - - - Кой е най-големият виновник за кариеса? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Кой е най-големият виновник за кариеса? -

    - -
    -
      -
    • - - April 23, 2014 -
    • -
    -
    - - -

    Имало едно време едни хора които решили, че кариесите се образуват от микроби. Предполагам, че са видяли как червей яде ябълка и стигнали до извода, че вероятно микроскопични червеи прояждат дупките в нашите зъби.

    - -

    Съвременната теория за образуването на кариеса е почти същата. Вместо вярването, че микробите пробиват зъбите, погрешно се смята, че кариеса се образува благодарение на отпадните киселинни продукти на бактерията Streptococcus Mutans, която се храни със захар. Тази теория продължава да толерира мита, че кариесът започва развитието си от външната страна на зъба.

    - -

    През 1924г. изследователя Кларк изолира вид Стрептококи от парченца кариозен зъб. Той решава, че това е мутирала форма на бактерията Стрептокок и я кръщава така: Мутанс (мутанти). Всъщност при по-подробно задълбочаване в изследването му се установява следното: Кларк доказва, че Streptococcus Mutans съществува в латентно състояние и само когато тялото е в процес на декомпенсация (влошаване) те стават активни и доминантни. Казано на прост език, бактериите които имат връзка с образуването на кариес се разпространяват единствено когато в тялото има някакъв дисбаланс, дължащ се на недоимъчно хранене (на минерали и витамини, а не на калории).

    - -

    Всеки от нас има Streptococcus Mutans

    - -

    Streptococcus Mutans е естествен обитател на нашето тяло. Има няколко разновидности, някои от които имат връзка с кариеса, а други - не. Например при Танзанийските деца, които са имунизирани срещу кариес (благодарение на тяхната диета) се среща Streptococcus Mutans. Този факт обърква изследователите, но въпреки това те отказват да преразгледат теориите си и да видят, че причината за кариеса е храната.

    - -

    Да, зъболекарите и учените смятат че храната има връзка с образуването на кариес, но я виждат като веществото, което полепва по зъбите и служи за храна на бактериите. А всъщност знаете ли, че захарта убива бактериите?! Микроорганизмите, които обитават устата сложени в 20% разтвор на захар умират. Т.е. голяма доза захар, приета наведнъж унищожава причинителите на кариеса, а не ги стимулира. Но това не значи да започнете да се тъпчете с шоколади, бонбони и торти! Не! Захарта и рафинираните въглехидрати вредят на тялото, защото променят минералният баланс в кръвта и тя става бедна на полезни вещества. Това рефлектира върху състава и киселинността на слюнката, но по-важно: променя калциево-фосфорният баланс, който поддържа състоянието на здраве за зъбите и костите. В този момент заспалите бактерии се събуждат и започват да се хранят с наличните остатъци, като отделят киселини. Така че, киселините произвеждани от бактериите са част от процеса на кариеса, но не и причината. Здравият зъб с плътен и напълно изграден емайл е неразтворим под киселинните атаки и не е склонен към образуване на кариеси.

    - -

    Това, че кариесът е предизвикан от недоимъчно хранене, е доказано от учените Д-р Стейнман и Д-р Леонора. Хипоталамусът в мозъка е жлеза, която контролира връзката между централната нервна система и ендокринната система посредством хипофизата. Хипоталамусът комуникира с устната кухина и челюстите посредством околоушната (паротидната) жлеза. Тя отделя хормон, който стимулира секреция та богата на минерали дентална лимфа, която се намира във вътрешността на дентиновите каналчета в зъба. Тази течност дезинфекцира и реминерализира зъбите отвътре. Когато храната е кариесогнена, хипоталамусът не дава сигнали към паротидната жлеза и реминерализиращата течност спира да се произвежда. Малко по малко това довежда до отслабване здравината на зъбните структури и те стават податливи на външни влияния като въглехидрати, бактерии, киселини и др. В подкрепа на вярността на това твърдение е факта, че има хора с изключително здрави зъби, въпреки лошото хранене, т.е. те са родени със силна паротидната жлеза, чиято работа не се влияе от вторични фактори.

    - -

    И тъй като вече знаем, че вина за кариеса има лошата диета, а не бактериите или генетични фактори, ние можем да го предотвратим и да го лекуваме по-лесно.

    - -

    Да обвиняваме Streptococcus Mutans за заболяванията на зъбите е удобен начин да игнорираме истинският виновник за кариеса: нашите хранителни навици и начин на живот, храната която ядем, излагането на токсини и стрес. Това са фактори, които можем да контролираме и по този начин да решим проблемите си със зъбите леко и безболезнено.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"Имало едно време едни хора които решили, че кариесите се образуват от микроби. Предполагам, че са видяли как червей яде ябълка и стигнали до извода, че вероятно микроскопични червеи прояждат дупките в нашите зъби. - -**Съвременната теория за образуването на кариеса е почти същата**. Вместо вярването, че микробите пробиват зъбите, погрешно се смята, че кариеса се образува благодарение на отпадните киселинни продукти на бактерията Streptococcus Mutans, която се храни със захар. Тази теория продължава да толерира мита, че кариесът започва развитието си от външната страна на зъба. - -През 1924г. изследователя Кларк изолира вид Стрептококи от парченца кариозен зъб. Той решава, че това е мутирала форма на бактерията Стрептокок и я кръщава така: Мутанс (мутанти). Всъщност при по-подробно задълбочаване в изследването му се установява следното: Кларк доказва, че Streptococcus Mutans съществува в латентно състояние и само когато тялото е в процес на декомпенсация (влошаване) те стават активни и доминантни. Казано на прост език, бактериите които имат връзка с образуването на кариес се разпространяват единствено когато в тялото има някакъв дисбаланс, дължащ се на недоимъчно хранене (на минерали и витамини, а не на калории). - -###**Всеки от нас има Streptococcus Mutans** - -Streptococcus Mutans е естествен обитател на нашето тяло. Има няколко разновидности, някои от които имат връзка с кариеса, а други - не. Например при Танзанийските деца, които са имунизирани срещу кариес (благодарение на тяхната диета) се среща Streptococcus Mutans. Този факт обърква изследователите, но въпреки това те отказват да преразгледат теориите си и да видят, че причината за кариеса е храната. - -Да, зъболекарите и учените смятат че храната има връзка с образуването на кариес, но я виждат като веществото, което полепва по зъбите и служи за храна на бактериите. **А всъщност знаете ли, че захарта убива бактериите?!** Микроорганизмите, които обитават устата сложени в 20% разтвор на захар умират. Т.е. голяма доза захар, приета наведнъж унищожава причинителите на кариеса, а не ги стимулира. Но това не значи да започнете да се тъпчете с шоколади, бонбони и торти! Не! Захарта и рафинираните въглехидрати вредят на тялото, защото променят минералният баланс в кръвта и тя става бедна на полезни вещества. Това рефлектира върху състава и киселинността на слюнката, но по-важно: променя калциево-фосфорният баланс, който поддържа състоянието на здраве за зъбите и костите. В този момент заспалите бактерии се събуждат и започват да се хранят с наличните остатъци, като отделят киселини. Така че, киселините произвеждани от бактериите са част от процеса на кариеса, но не и причината. **Здравият зъб с плътен и напълно изграден емайл е неразтворим под киселинните атаки и не е склонен към образуване на кариеси**. - -Това, че кариесът е предизвикан от недоимъчно хранене, е [доказано](http://dr-jacques-imbeau.com/PDF/Dentinal%20fluid%20transport%20and%20caries.pdf) от учените Д-р Стейнман и Д-р Леонора. Хипоталамусът в мозъка е жлеза, която контролира връзката между централната нервна система и ендокринната система посредством хипофизата. Хипоталамусът комуникира с устната кухина и челюстите посредством околоушната (паротидната) жлеза. Тя отделя хормон, който стимулира секреция та богата на минерали дентална лимфа, която се намира във вътрешността на дентиновите каналчета в зъба. Тази течност дезинфекцира и реминерализира зъбите отвътре. Когато храната е кариесогнена, хипоталамусът не дава сигнали към паротидната жлеза и реминерализиращата течност спира да се произвежда. Малко по малко това довежда до отслабване здравината на зъбните структури и те стават податливи на външни влияния като въглехидрати, бактерии, киселини и др. В подкрепа на вярността на това твърдение е факта, че има **хора с изключително здрави зъби, въпреки лошото хранене**, т.е. те са родени със силна паротидната жлеза, чиято работа не се влияе от вторични фактори. - -**И тъй като вече знаем, че вина за кариеса има лошата диета, а не бактериите или генетични фактори, ние можем да го предотвратим и да го лекуваме по-лесно**. - -Да обвиняваме Streptococcus Mutans за заболяванията на зъбите е удобен начин да игнорираме истинският виновник за кариеса: нашите хранителни навици и начин на живот, храната която ядем, излагането на токсини и стрес. Това са фактори, които можем да контролираме и по този начин да решим проблемите си със зъбите леко и безболезнено.;T; -I"a

    Имало едно време едни хора които решили, че кариесите се образуват от микроби. Предполагам, че са видяли как червей яде ябълка и стигнали до извода, че вероятно микроскопични червеи прояждат дупките в нашите зъби.

    - -

    Съвременната теория за образуването на кариеса е почти същата. Вместо вярването, че микробите пробиват зъбите, погрешно се смята, че кариеса се образува благодарение на отпадните киселинни продукти на бактерията Streptococcus Mutans, която се храни със захар. Тази теория продължава да толерира мита, че кариесът започва развитието си от външната страна на зъба.

    - -

    През 1924г. изследователя Кларк изолира вид Стрептококи от парченца кариозен зъб. Той решава, че това е мутирала форма на бактерията Стрептокок и я кръщава така: Мутанс (мутанти). Всъщност при по-подробно задълбочаване в изследването му се установява следното: Кларк доказва, че Streptococcus Mutans съществува в латентно състояние и само когато тялото е в процес на декомпенсация (влошаване) те стават активни и доминантни. Казано на прост език, бактериите които имат връзка с образуването на кариес се разпространяват единствено когато в тялото има някакъв дисбаланс, дължащ се на недоимъчно хранене (на минерали и витамини, а не на калории).

    - -

    Всеки от нас има Streptococcus Mutans

    - -

    Streptococcus Mutans е естествен обитател на нашето тяло. Има няколко разновидности, някои от които имат връзка с кариеса, а други - не. Например при Танзанийските деца, които са имунизирани срещу кариес (благодарение на тяхната диета) се среща Streptococcus Mutans. Този факт обърква изследователите, но въпреки това те отказват да преразгледат теориите си и да видят, че причината за кариеса е храната.

    - -

    Да, зъболекарите и учените смятат че храната има връзка с образуването на кариес, но я виждат като веществото, което полепва по зъбите и служи за храна на бактериите. А всъщност знаете ли, че захарта убива бактериите?! Микроорганизмите, които обитават устата сложени в 20% разтвор на захар умират. Т.е. голяма доза захар, приета наведнъж унищожава причинителите на кариеса, а не ги стимулира. Но това не значи да започнете да се тъпчете с шоколади, бонбони и торти! Не! Захарта и рафинираните въглехидрати вредят на тялото, защото променят минералният баланс в кръвта и тя става бедна на полезни вещества. Това рефлектира върху състава и киселинността на слюнката, но по-важно: променя калциево-фосфорният баланс, който поддържа състоянието на здраве за зъбите и костите. В този момент заспалите бактерии се събуждат и започват да се хранят с наличните остатъци, като отделят киселини. Така че, киселините произвеждани от бактериите са част от процеса на кариеса, но не и причината. Здравият зъб с плътен и напълно изграден емайл е неразтворим под киселинните атаки и не е склонен към образуване на кариеси.

    - -

    Това, че кариесът е предизвикан от недоимъчно хранене, е доказано от учените Д-р Стейнман и Д-р Леонора. Хипоталамусът в мозъка е жлеза, която контролира връзката между централната нервна система и ендокринната система посредством хипофизата. Хипоталамусът комуникира с устната кухина и челюстите посредством околоушната (паротидната) жлеза. Тя отделя хормон, който стимулира секреция та богата на минерали дентална лимфа, която се намира във вътрешността на дентиновите каналчета в зъба. Тази течност дезинфекцира и реминерализира зъбите отвътре. Когато храната е кариесогнена, хипоталамусът не дава сигнали към паротидната жлеза и реминерализиращата течност спира да се произвежда. Малко по малко това довежда до отслабване здравината на зъбните структури и те стават податливи на външни влияния като въглехидрати, бактерии, киселини и др. В подкрепа на вярността на това твърдение е факта, че има хора с изключително здрави зъби, въпреки лошото хранене, т.е. те са родени със силна паротидната жлеза, чиято работа не се влияе от вторични фактори.

    - -

    И тъй като вече знаем, че вина за кариеса има лошата диета, а не бактериите или генетични фактори, ние можем да го предотвратим и да го лекуваме по-лесно.

    - -

    Да обвиняваме Streptococcus Mutans за заболяванията на зъбите е удобен начин да игнорираме истинският виновник за кариеса: нашите хранителни навици и начин на живот, храната която ядем, излагането на токсини и стрес. Това са фактори, които можем да контролираме и по този начин да решим проблемите си със зъбите леко и безболезнено.

    -;T; @oI"Z/blog/2014-05-05-наистина-ли-захарта-е-толкова-вредна/;T{;{ ;I"E - - - - - - - Наистина ли захарта е толкова вредна? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Наистина ли захарта е толкова вредна? -

    - -
    -
      -
    • - - May 5, 2014 -
    • -
    -
    - - -

    От всичко по малко…

    - -

    В умерено количество не вреди…

    - -

    Това е гориво за мозъка…

    - -

    Чувала съм всички оправдания за употребата на захар.

    - -

    Въпросът е: трябва ли да ядем захар и ако да, в какво количество?

    - -

    Къде всъщност е проблемът?

    -

    Захарта има много форми освен бялата кристална захар, която се намира на рафтовете на супермаркетите. Тя е под формата на глюкозо-фруктозен сироп, царевичен сироп, мед, кленов сироп или нектар от кактуса агаве. Тя провокира силна реакция в човешкото тяло и съвременните хора използват все по-големи количества от нея. Захар откриваме в съдържанието на около 80% от пакетираните стоки: плодови сокове, газирани напитки, вафли, бисквити, шоколад, колбаси, пастети, кетчуп, майонеза, сосове, лютеници, млечни десерти, зърнени закуски, хляб, макарони, чипсове и солети, чай, тестени изделия, мариновани риби и меса, бульони за готвене и още, и още…

    - -

    Често ми казват, че съм крайна като казвам на хората да изключат захарта и рафинираните въглехидрати от храната си. “Не мога да изключа цяла хранителна група” - ми казват. Да, но захарта не е хранителна група. Захарта съдържа:

    - -
      -
    • нула нутритенти
    • -
    • нула протеин
    • -
    • никакви полезни мазнини
    • -
    • никакви ензими
    • -
    - -

    Захарта е просто бързи и празни калории, които се метаболизират изключително бързо в енергия, която трябва да се изразходи веднага или се натрупва като излишък. Всъщност захарта съдържа 12 въглеродни атома, 22 водородни атома и 11 кислородни атома (C12H22O11). Това е всичко, което тя дава на тялото ви. И отнема много минерали, докато се метаболизира! Захарта е една химически извлечена субстанция, по същият начин по който се произвежда кокаинът. И има същият пристрастяват ефект за мозъка. Между другото формулата на кокаина е C17H21NO4. Можете да забележите, че на захарта й липсва азотният N атом.

    - -

    Има ли все пак безопасно количество?

    -

    Според мен няма безопасно количество. Естествено съдържащите захар плодове и зеленчуци са с балансирано количество фибри, витамини, ензими и други вещества, които подпомагат усвояването на захарта и не затрудняват и ограбват тялото. Добавената захар не доставя нищо, а вместо това: -Уврежда черният дроб: когато приемаме фруктоза (50%от захарта) тя отива към черният дроб. Ако чернодробният гликоген (храната за мускулите) е нисък, например след тренировка тя ще се използва, за да възстанови липсите. Но повечето хора не приемат фруктозата след бягане или физическо натоварване, а често когато дробовете им са пълни с гликоген. Когато това стане, черният дроб превръща гликогенът в запаси от мазнини. Част от мазнината отива към мастните депа, но част се запазва в дроба. Малко по малко това може да доведе до редица чернодробни заболявания; Повишаване на холестерола и триглицеридите в кръвта; ЛЕПТИНОВА резистентност с последващо затлъстяване, проблеми със съня, неконтролируемо желание за храна; Липса на усещане за ситост и пристрастяване към захар и въглехидрати, т.нар. непрестанен глад за сладко.

    - -

    С какво да заместим захарта?

    -

    Напълно съзнавам, че в съвремнният свят е невъзможно да имаме хранене с 0% захар. За съжаление и заместители те, които се предлагат не са най-здравословният избор. Ето все пак кратък разбор на най-често срещаните:

    - -
      -
    • -Бялото кристално вещество, което е направено от захарно цвекло съставлява 50% глюкоза и 50% фруктоза. Често в етикетите ще я прочетете и като “декстроза”.
    • -
    • -Глюкозо-фруктозен сироп съдържа 55% фруктоза и 45% глюкоза.
    • -
    • -Етанол (алкохолът за пиене) не е точно захар, макар бирата и виното да съдържат остатъчни захари и нишесте, плюс алкохол. Те се метаболизират по същият начин като фруктозата и “ограбват” тялото от ценни минерали и соли.
    • -
    • -Захарните алкохоли като ксилитол, глицерол, сорбитол, малтитол, манитол и еритритол не са нито захар, нито алкохол. Те се усвояват от клетките на тънкото черво и макар да са с по-малко калории, могат да причинят доста вреди на тялото: подуване, диария, главоболие и световъртеж. Прекомерната им употреба се свързва и с клетъчни мутации и рак. Ксилитолът е полезна съставка в някои пасти за зъби и има антикариесогенен ефект.
    • -
    • -Мед - той съдържа около 53% фруктоза, но е напълно естествен продукт, който приет в малки количества и суров (не топлинно обработен или в горещи напитки) има много ползи за тялото. Богатото съдържание на минерали и антиоксиданти (повече от тези в спанака) го правят отлична добавка към храненето.
    • -
    • -Стевия - листата на това растение от Южна Америка са много сладки и употребата им е напълно безопасна. Не може да се каже същото обаче, за екстрактите (стевиол) или тинктурите от стевия които се продават в търговската мрежа. Използвайте само стрити листа или чай от листа на сладката билка. Подобно растение е Ло Хан, но от него се използват плодовете му.
    • -
    • -Фруктоза - изолираната плодова захар е популярен заместител в диетичните и диабетични стоки.
    • -
    - -

    В заключение ще ви дам малко домашно. Изгледайте този филм: Горчивата истина за захарта (Sugar - the bitter truth). Ако аз не съм ви убедила да се замислите за вредата от захарта, то Д-р Р. Лъстинг със сигурност ще го направи!

    - - - -

    Вие използвате ли захар? Кога и как? Защо бихте или не бихте се отказали от употребата на захар?

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"S'От всичко по малко... - -В умерено количество не вреди... - -Това е гориво за мозъка... - -Чувала съм всички оправдания за употребата на захар. - -##Въпросът е: трябва ли да ядем захар и ако да, в какво количество? - -###Къде всъщност е проблемът? -Захарта има много форми освен бялата кристална захар, която се намира на рафтовете на супермаркетите. Тя е под формата на глюкозо-фруктозен сироп, царевичен сироп, мед, кленов сироп или нектар от кактуса агаве. Тя провокира силна реакция в човешкото тяло и съвременните хора използват все по-големи количества от нея. Захар откриваме в съдържанието на около 80% от пакетираните стоки: плодови сокове, газирани напитки, вафли, бисквити, шоколад, колбаси, пастети, кетчуп, майонеза, сосове, лютеници, млечни десерти, зърнени закуски, хляб, макарони, чипсове и солети, чай, тестени изделия, мариновани риби и меса, бульони за готвене и още, и още... - -Често ми казват, че съм крайна като казвам на хората да изключат захарта и рафинираните въглехидрати от храната си. "Не мога да изключа цяла хранителна група" - ми казват. Да, но захарта не е хранителна група. Захарта съдържа: - -* нула нутритенти -* нула протеин -* никакви полезни мазнини -* никакви ензими - -Захарта е просто бързи и празни калории, които се метаболизират изключително бързо в енергия, която трябва да се изразходи веднага или се натрупва като излишък. Всъщност захарта съдържа 12 въглеродни атома, 22 водородни атома и 11 кислородни атома (C12H22O11). Това е всичко, което тя дава на тялото ви. И отнема много минерали, докато се метаболизира! Захарта е една химически извлечена субстанция, по същият начин по който се произвежда кокаинът. И има същият пристрастяват ефект за мозъка. Между другото формулата на кокаина е C17H21NO4. Можете да забележите, че на захарта й липсва азотният N атом. - -###Има ли все пак безопасно количество? -Според мен няма [безопасно количество](http://rense.com/general45/sguar.htm). Естествено съдържащите захар плодове и зеленчуци са с балансирано количество фибри, витамини, ензими и други вещества, които подпомагат усвояването на захарта и не затрудняват и ограбват тялото. Добавената захар не доставя нищо, а вместо това: -Уврежда черният дроб: когато приемаме фруктоза (50%от захарта) тя отива към черният дроб. Ако чернодробният гликоген (храната за мускулите) е нисък, например след тренировка тя ще се използва, за да възстанови липсите. Но повечето хора не приемат фруктозата след бягане или физическо натоварване, а често когато дробовете им са пълни с гликоген. Когато това стане, черният дроб превръща гликогенът в [запаси от мазнини](http://diabetes.diabetesjournals.org/content/54/7/1907.short). Част от мазнината отива към мастните депа, но част се запазва в дроба. Малко по малко това може да доведе до [редица](http://hyper.ahajournals.org/content/45/5/1012.short) [чернодробни](http://www.journal-of-hepatology.eu/article/S0168-8278%2808%2900164-5/abstract) [заболявания](http://www.journal-of-hepatology.eu/article/S0168-8278%2807%2900427-8/abstract); Повишаване на холестерола и триглицеридите в кръвта; ЛЕПТИНОВА резистентност с последващо [затлъстяване](http://www.theguardian.com/society/2013/mar/20/sugar-deadly-obesity-epidemic), проблеми със съня, неконтролируемо желание за храна; Липса на усещане за ситост и пристрастяване към захар и въглехидрати, т.нар. [непрестанен глад за сладко](http://www.sciencedirect.com/science/article/pii/S0306452205004288). - -###С какво да заместим захарта? -Напълно съзнавам, че в съвремнният свят е невъзможно да имаме хранене с 0% захар. За съжаление и заместители те, които се предлагат не са най-здравословният избор. Ето все пак кратък разбор на най-често срещаните: - -* **Бялото кристално вещество**, което е направено от захарно цвекло съставлява 50% глюкоза и 50% фруктоза. Често в етикетите ще я прочетете и като "декстроза". -* **Глюкозо-фруктозен сироп** съдържа 55% фруктоза и 45% глюкоза. -* **Етанол** (алкохолът за пиене) не е точно захар, макар бирата и виното да съдържат остатъчни захари и нишесте, плюс алкохол. Те се метаболизират по същият начин като фруктозата и "ограбват" тялото от ценни минерали и соли. -* [**Захарните**](http://articles.mercola.com/sites/articles/archive/2013/10/23/aspartame-artificial-sweeteners.aspx) [**алкохоли**](http://health.howstuffworks.com/wellness/food-nutrition/facts/artificial-sweetners-unhealthy-eco.htm) като **ксилитол**, **глицерол**, **сорбитол**, **малтитол**, **манитол** и **еритритол** не са нито захар, нито алкохол. Те се усвояват от клетките на тънкото черво и макар да са с по-малко калории, могат да причинят доста вреди на тялото: подуване, диария, главоболие и световъртеж. Прекомерната им употреба се свързва и с клетъчни мутации и рак. Ксилитолът е полезна съставка в някои пасти за зъби и има антикариесогенен ефект. -* **Мед** - той съдържа около 53% фруктоза, но е напълно естествен продукт, който приет в малки количества и суров (не топлинно обработен или в горещи напитки) има много ползи за тялото. Богатото съдържание на минерали и антиоксиданти (повече от тези в спанака) го правят отлична добавка към храненето. -* **Стевия** - листата на това растение от Южна Америка са много сладки и употребата им е напълно безопасна. Не може да се каже същото обаче, за екстрактите (стевиол) или тинктурите от стевия които се продават в търговската мрежа. Използвайте само стрити листа или чай от листа на сладката билка. Подобно растение е Ло Хан, но от него се използват плодовете му. -* **Фруктоза** - изолираната плодова захар е популярен заместител в диетичните и диабетични стоки. - -В заключение ще ви дам малко домашно. Изгледайте този филм: Горчивата истина за захарта (Sugar - the bitter truth). Ако аз не съм ви убедила да се замислите за вредата от захарта, то Д-р Р. Лъстинг със сигурност ще го направи! - - - -**Вие използвате ли захар? Кога и как? Защо бихте или не бихте се отказали от употребата на захар?**;T; -I")

    От всичко по малко…

    - -

    В умерено количество не вреди…

    - -

    Това е гориво за мозъка…

    - -

    Чувала съм всички оправдания за употребата на захар.

    - -

    Въпросът е: трябва ли да ядем захар и ако да, в какво количество?

    - -

    Къде всъщност е проблемът?

    -

    Захарта има много форми освен бялата кристална захар, която се намира на рафтовете на супермаркетите. Тя е под формата на глюкозо-фруктозен сироп, царевичен сироп, мед, кленов сироп или нектар от кактуса агаве. Тя провокира силна реакция в човешкото тяло и съвременните хора използват все по-големи количества от нея. Захар откриваме в съдържанието на около 80% от пакетираните стоки: плодови сокове, газирани напитки, вафли, бисквити, шоколад, колбаси, пастети, кетчуп, майонеза, сосове, лютеници, млечни десерти, зърнени закуски, хляб, макарони, чипсове и солети, чай, тестени изделия, мариновани риби и меса, бульони за готвене и още, и още…

    - -

    Често ми казват, че съм крайна като казвам на хората да изключат захарта и рафинираните въглехидрати от храната си. “Не мога да изключа цяла хранителна група” - ми казват. Да, но захарта не е хранителна група. Захарта съдържа:

    - -
      -
    • нула нутритенти
    • -
    • нула протеин
    • -
    • никакви полезни мазнини
    • -
    • никакви ензими
    • -
    - -

    Захарта е просто бързи и празни калории, които се метаболизират изключително бързо в енергия, която трябва да се изразходи веднага или се натрупва като излишък. Всъщност захарта съдържа 12 въглеродни атома, 22 водородни атома и 11 кислородни атома (C12H22O11). Това е всичко, което тя дава на тялото ви. И отнема много минерали, докато се метаболизира! Захарта е една химически извлечена субстанция, по същият начин по който се произвежда кокаинът. И има същият пристрастяват ефект за мозъка. Между другото формулата на кокаина е C17H21NO4. Можете да забележите, че на захарта й липсва азотният N атом.

    - -

    Има ли все пак безопасно количество?

    -

    Според мен няма безопасно количество. Естествено съдържащите захар плодове и зеленчуци са с балансирано количество фибри, витамини, ензими и други вещества, които подпомагат усвояването на захарта и не затрудняват и ограбват тялото. Добавената захар не доставя нищо, а вместо това: -Уврежда черният дроб: когато приемаме фруктоза (50%от захарта) тя отива към черният дроб. Ако чернодробният гликоген (храната за мускулите) е нисък, например след тренировка тя ще се използва, за да възстанови липсите. Но повечето хора не приемат фруктозата след бягане или физическо натоварване, а често когато дробовете им са пълни с гликоген. Когато това стане, черният дроб превръща гликогенът в запаси от мазнини. Част от мазнината отива към мастните депа, но част се запазва в дроба. Малко по малко това може да доведе до редица чернодробни заболявания; Повишаване на холестерола и триглицеридите в кръвта; ЛЕПТИНОВА резистентност с последващо затлъстяване, проблеми със съня, неконтролируемо желание за храна; Липса на усещане за ситост и пристрастяване към захар и въглехидрати, т.нар. непрестанен глад за сладко.

    - -

    С какво да заместим захарта?

    -

    Напълно съзнавам, че в съвремнният свят е невъзможно да имаме хранене с 0% захар. За съжаление и заместители те, които се предлагат не са най-здравословният избор. Ето все пак кратък разбор на най-често срещаните:

    - -
      -
    • -Бялото кристално вещество, което е направено от захарно цвекло съставлява 50% глюкоза и 50% фруктоза. Често в етикетите ще я прочетете и като “декстроза”.
    • -
    • -Глюкозо-фруктозен сироп съдържа 55% фруктоза и 45% глюкоза.
    • -
    • -Етанол (алкохолът за пиене) не е точно захар, макар бирата и виното да съдържат остатъчни захари и нишесте, плюс алкохол. Те се метаболизират по същият начин като фруктозата и “ограбват” тялото от ценни минерали и соли.
    • -
    • -Захарните алкохоли като ксилитол, глицерол, сорбитол, малтитол, манитол и еритритол не са нито захар, нито алкохол. Те се усвояват от клетките на тънкото черво и макар да са с по-малко калории, могат да причинят доста вреди на тялото: подуване, диария, главоболие и световъртеж. Прекомерната им употреба се свързва и с клетъчни мутации и рак. Ксилитолът е полезна съставка в някои пасти за зъби и има антикариесогенен ефект.
    • -
    • -Мед - той съдържа около 53% фруктоза, но е напълно естествен продукт, който приет в малки количества и суров (не топлинно обработен или в горещи напитки) има много ползи за тялото. Богатото съдържание на минерали и антиоксиданти (повече от тези в спанака) го правят отлична добавка към храненето.
    • -
    • -Стевия - листата на това растение от Южна Америка са много сладки и употребата им е напълно безопасна. Не може да се каже същото обаче, за екстрактите (стевиол) или тинктурите от стевия които се продават в търговската мрежа. Използвайте само стрити листа или чай от листа на сладката билка. Подобно растение е Ло Хан, но от него се използват плодовете му.
    • -
    • -Фруктоза - изолираната плодова захар е популярен заместител в диетичните и диабетични стоки.
    • -
    - -

    В заключение ще ви дам малко домашно. Изгледайте този филм: Горчивата истина за захарта (Sugar - the bitter truth). Ако аз не съм ви убедила да се замислите за вредата от захарта, то Д-р Р. Лъстинг със сигурност ще го направи!

    - - - -

    Вие използвате ли захар? Кога и как? Защо бихте или не бихте се отказали от употребата на захар?

    -;T; @uI"!/blog/2014-05-09-солта/;T{;{ ;I"Q - - - - - - - Храната като лекарство: Солта - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Храната като лекарство: Солта -

    - -
    -
      -
    • - - May 9, 2014 -
    • -
    -
    - - -

    Ако гледате телевизия, четете печатната преса или ходите на лекар, шансовете да смятате прекомерната употреба на сол за голяма опасност за здравето е около 100%. И сте прави… ако говорим за обикновенната трапезна сол, която се използва масово в производството на хранителни стоки.

    - -

    Но аз имам една голяма новина за вас: Солта е жизненоважна за човешкото тяло и ние трябва да си я набавяме ежедневно! Нали не мислите, че е случайност щастливият трепет, който ви обзема при мисълта за морските летни бани (сол + витамин D) ;-)

    - -

    Трапезната сол = вредна за тялото!

    - -

    Трапезната йодирана сол е химичен продукт, направен в лабораторни условия, със съдържание на 97% Натриев Хлорид (NaCl), избелена с химикали като алуминий и др. и не съдържа никакви полезни вещества. Нейната употреба води до дисбаланс на минералите в кръвта и клетъчните течности и вреди на тялото. Всъщност соленоводни риби, поставени в разтвор на вода и трапезна сол… умират.

    - -

    А сега нека ви разкажа за истинската сол, която е дала живота на Земята.

    - -

    Знаете, че телата ни се нуждаят от вода. Но костите, мускулите и органите имат нужда от определени количества минерали и соли, които си набавят чрез водата. Физиологичната течност, която е нормалната среда на всяка клетка е разтвор на вода с 0,9% сол. Следователно солта е важна част от оптималното здраве и баланс в организма.

    - -

    Нерядко ще срещнете твърдения, че солта е причина за високо кръвно налягане и други сърдечни проблеми. Всъщност изследване доказва, че високото кръвно налягане се дължи на дисбаланс в минералите и микроелементите в кръвта: т.е. ако се приема само NaCl без оптималното количество Магнезий, Калций и др.

    - -
    -

    В проучване на университа Харвард взели участие 60 000 медицински сестри. Тези, чиято диета била бедна на магнезий и калций имали по-голям риск от повишено кръвно налягане.

    -
    - -

    Реално можем да избегнем риска от хипертония(високо кръвно налягане) не чрез редуциране на натрия, а чрез балансирането му с другите важни минерали.

    - -

    Истинската сол = полезна за тялото!

    - -

    Истинската сол е най-добрият източник на микроелементи. Това са химични елементи, които се съдържат в организмите в хилядни части от процента (желязо, мед, цинк, молибден, бром, флуор, аргон, йод и др.). Те са необходими за нормалната жизнена дейност. Влизат в състава на ензими, витамини, хормони. Влияят на растежа, размножаването, кръвообразуването и др. Недостигът или излишъкът им води до нарушения в обмяната на веществата.

    - -

    Какви са ползите от солта?

    - -

    Страдате ли от:

    - -
      -
    • Целулит
    • -
    • Високо кръвно налягане
    • -
    • Камъни в бъбреците
    • -
    • Проблеми с жлъчният мехур
    • -
    • Проблеми със ставите
    • -
    • Умора
    • -
    • Причерняване
    • -
    • Лош сън
    • -
    • Астма или дихателни заболявания
    • -
    • Неравномерен пулс
    • -
    • Проблеми с надбъбречните жлези
    • -
    • Диабет или проблеми с кръвната захар
    • -
    • Слаб мускулен тонус
    • -
    • Задържане на вода, отоци и подпухване
    • -
    - -

    Всички тези състояния могат да се дължат на дисбаланс в минералите и липсата на сол в клетките (да, дори и задържането на вода).

    - -

    Отново искам да се спра на факта, че обикновенната трапезна сол би задълбочила тези проблеми, внасяйки твърде много натрий и хлор в системата, за сметка на другите макро- и микроелементи.

    - -

    Негативно заредените йони на солта, разтворени във вода подпомагат хормоналните, химичните и електричните процеси в тялото. Микроелементите подпомагат нервната и сърдечна функции.

    - -

    Ето някои от най-честите състояния, които адекватната употреба на сол може да подобри:

    - -
      -
    • Абсорбцията на храната, храносмилане: минералният баланс, който се създава от солта и микроелементите й подпомагат усвояването на храната от тънките черва. Солта участва в състава на стомашният сок и подобрява храносмилането.
    • -
    • Извличане на токсини от клетката чрез негативно заредените йони на солта.
    • -
    • Контрол на кръвното налягане - истинската сол регулира, а не повишава кръвното налягане, когато се приема в умерени количества. Отрицателно-заредените йони стабилизират електричните импулси и регулират сърдечният ритъм.
    • -
    • -Киселинен баланс - солта има алкализиращ ефект и взима участие в механизмите, които поддържат pH на тялото.
    • -
    • -Кръвна захар - употребата на истинска сол повишава инсулиновата чувствителност, включително и при пациенти с диабет II и I тип.
    • -
    • -Алергии - истинската сол, разтворена във вода е естествен и ефективен антихистамин. Подобрява и състоянието на кожни заболявания като Екзема и Псориазис.
    • -
    • Влияят върху почивката и съня - микроелементите подпомагат хормоналните процеси в тялото и подобряват качеството и количеството на съня. Намаляването на количеството на хормона на стреса от кръвта - кортизол се забързва при наличие на достатъчно сол. Неслучайно стресовите състояния провокират желание за силносолени храни (чипс, солети, пържено)
    • -
    • -Репродуктивно здраве - подпомагайки хормоналният баланс, истинската сол подобрява фертилността и при мъже, и при жени.
    • -
    • -Целулит - отстраняването му се подобрява с приема на умерено количество полезна сол.
    • -
    • -Мускули - Мускулните крампи и напрежение се облекчават при редовна употреба на истинска сол. Тук незаменим помощник е Магнезият. Професионалните атлети използват вани с Магнезий и сол, за да лекуват тези състояния.
    • -
    • -Кости - около 1/4 от солите в тялото се намират в костите. Ако някъде в тялото има недостиг на сол или микроелементи, те се набавят от костите, за да може тялото да функционира нормално. Следователно консумацията на полезна сол е профилактика срещу остеопороза.
    • -
    • -Щитовидна и надбъбречната жлези - ако имате проблеми с някоя от тези жлези, умерената консумация на сол ще облекчи състоянието ви, благодарение на ефекта, който оказва върху регулацията на pH.
    • -
    • -Нерви - електричните заряд на солта помага нормалното функциониране и невронните комуникации в тялото.
    • -
    • -Уста и зъби - микроелементите помагат за възстановяване на електролитният баланс и реминерализацията на зъбите. Плакнене със слабосолен разтвор убива бактериите и дезинфекцира.
    • -
    • -Хидратация - солта и микроелементите й са есенциални за добрата хидратация на тялото.
    • -
    - -

    Как да изберем добрата сол?

    - -

    Истинската сол съдържа целият набор от 84 микроелемента и има мек вкус и приятен аромат. Често тя е със седефен блясък и в различни цветове.

    - -

    За съжаление естествено-богатите на минерали храни са част от миналото. Съвременните методи за обрботка на почвите са ги направили бедни на хранителни вещества. Те са буквално “измити” от земята. Затова пък моретата са поели тези нутритенти и сега можем да ги открием в морската сол. Тя е един чудесен избор за набавяне на нужните минерали и микроелементи. Разбира се, винаги купувайте възможно най-чистата сол, която можете да си позволите, тъй като в големите водни източници често има доста токсини и замърсители.

    - -

    Най-добрият избор остава небезизвестната Хималайска розова сол, която се добива в дълбочина от едноименните планински масиви и при нея липсват всякакви съмнения за индустриални замърсявания.

    - -

    С която и от двете - натурална морска или розова хималайска сол да изберете да замените обикновенната трапезна сол у дома, със сигурност ще подобрите значително здравето си и това на близките си.

    - -

    Вие какво мислите за солта? Страхувате ли се от нея? Смятате ли, че солта може да е полезна? Напишете в коментар.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"3Ако гледате телевизия, четете печатната преса или ходите на лекар, шансовете да смятате прекомерната употреба на сол за голяма опасност за здравето е около 100%. И сте прави... ако говорим за обикновенната трапезна сол, която се използва масово в производството на хранителни стоки. - -Но аз имам една голяма новина за вас: Солта е жизненоважна за човешкото тяло и ние трябва да си я набавяме ежедневно! Нали не мислите, че е случайност щастливият трепет, който ви обзема при мисълта за морските летни бани (сол + витамин D) ;-) - -**Трапезната сол = вредна за тялото!** - -Трапезната йодирана сол е химичен продукт, направен в лабораторни условия, със съдържание на 97% Натриев Хлорид (NaCl), избелена с химикали като алуминий и др. и не съдържа никакви полезни вещества. Нейната употреба води до дисбаланс на минералите в кръвта и клетъчните течности и вреди на тялото. Всъщност соленоводни риби, поставени в разтвор на вода и трапезна сол... умират. - -А сега нека ви разкажа за истинската сол, която е дала живота на Земята. - -Знаете, че телата ни се нуждаят от вода. Но костите, мускулите и органите имат нужда от определени количества минерали и соли, които си набавят чрез водата. Физиологичната течност, която е нормалната среда на всяка клетка е разтвор на вода с 0,9% сол. Следователно солта е важна част от оптималното здраве и баланс в организма. - -Нерядко ще срещнете твърдения, че солта е причина за високо кръвно налягане и други сърдечни проблеми. Всъщност [изследване](http://www.nytimes.com/1991/12/31/science/hypertension-research-challenges-role-of-salt.html?pagewanted=all&src=pm) доказва, че високото кръвно налягане се дължи на дисбаланс в минералите и микроелементите в кръвта: т.е. ако се приема само NaCl без оптималното количество Магнезий, Калций и др. - ->В проучване на университа Харвард взели участие 60 000 медицински сестри. Тези, чиято диета била бедна на магнезий и калций имали по-голям риск от повишено кръвно налягане. - -Реално можем да избегнем риска от хипертония(високо кръвно налягане) не чрез редуциране на натрия, а чрез балансирането му с другите важни минерали. - -**Истинската сол = полезна за тялото!** - -Истинската сол е най-добрият източник на [микроелементи](http://www.fitday.com/fitness-articles/nutrition/vitamins-minerals/trace-minerals-what-they-are-and-their-importance.html). Това са химични елементи, които се съдържат в организмите в хилядни части от процента (желязо, мед, цинк, молибден, бром, флуор, аргон, йод и др.). Те са необходими за нормалната жизнена дейност. Влизат в състава на ензими, витамини, хормони. Влияят на растежа, размножаването, кръвообразуването и др. Недостигът или излишъкът им води до нарушения в обмяната на веществата. - -##Какви са ползите от солта? - -Страдате ли от: - -* Целулит -* Високо кръвно налягане -* Камъни в бъбреците -* Проблеми с жлъчният мехур -* Проблеми със ставите -* Умора -* Причерняване -* Лош сън -* Астма или дихателни заболявания -* Неравномерен пулс -* Проблеми с надбъбречните жлези -* Диабет или проблеми с кръвната захар -* Слаб мускулен тонус -* Задържане на вода, отоци и подпухване - -Всички тези състояния могат да се дължат на дисбаланс в минералите и липсата на сол в клетките (да, дори и задържането на вода). - -Отново искам да се спра на факта, че обикновенната трапезна сол би задълбочила тези проблеми, внасяйки твърде много натрий и хлор в системата, за сметка на другите макро- и микроелементи. - -Негативно заредените йони на солта, разтворени във вода подпомагат хормоналните, химичните и електричните процеси в тялото. Микроелементите подпомагат нервната и сърдечна функции. - -Ето някои от най-честите състояния, които адекватната употреба на сол може да подобри: - -* Абсорбцията на храната, **храносмилане**: минералният баланс, който се създава от солта и микроелементите й подпомагат усвояването на храната от тънките черва. Солта участва в състава на стомашният сок и подобрява храносмилането. -* Извличане на **токсини** от клетката чрез негативно заредените йони на солта. -* Контрол на **кръвното налягане** - истинската сол регулира, а **не** повишава кръвното налягане, когато се приема в умерени количества. Отрицателно-заредените йони стабилизират електричните импулси и регулират сърдечният ритъм. -* **Киселинен баланс** - солта има алкализиращ ефект и взима участие в механизмите, които поддържат pH на тялото. -* **Кръвна захар** - употребата на истинска сол повишава инсулиновата чувствителност, включително и при пациенти с **диабет** II и I тип. -* **Алергии** - истинската сол, разтворена във вода е естествен и ефективен антихистамин. Подобрява и състоянието на кожни заболявания като **Екзема** и **Псориазис**. -* Влияят върху почивката и **съня** - микроелементите подпомагат хормоналните процеси в тялото и подобряват качеството и количеството на съня. Намаляването на количеството на хормона на стреса от кръвта - **кортизол** се забързва при наличие на достатъчно сол. Неслучайно стресовите състояния провокират желание за силносолени храни (чипс, солети, пържено) -* **Репродуктивно здраве** - подпомагайки хормоналният баланс, истинската сол подобрява фертилността и при мъже, и при жени. -* **Целулит** - отстраняването му се подобрява с приема на умерено количество полезна сол. -* **Мускули** - Мускулните крампи и напрежение се облекчават при редовна употреба на истинска сол. Тук незаменим помощник е Магнезият. Професионалните атлети използват вани с **Магнезий** и сол, за да лекуват тези състояния. -* **Кости** - около 1/4 от солите в тялото се намират в костите. Ако някъде в тялото има недостиг на сол или микроелементи, те се набавят от костите, за да може тялото да функционира нормално. Следователно консумацията на полезна сол е профилактика срещу остеопороза. -* **Щитовидна** и **надбъбречната жлези** - ако имате проблеми с някоя от тези жлези, умерената консумация на сол ще облекчи състоянието ви, благодарение на ефекта, който оказва върху регулацията на pH. -* **Нерви** - електричните заряд на солта помага нормалното функциониране и невронните комуникации в тялото. -* **Уста и зъби** - микроелементите помагат за възстановяване на електролитният баланс и реминерализацията на зъбите. Плакнене със слабосолен разтвор убива бактериите и дезинфекцира. -* **Хидратация** - солта и микроелементите й са есенциални за добрата хидратация на тялото. - -##Как да изберем добрата сол? - -Истинската сол съдържа целият набор от 84 микроелемента и има мек вкус и приятен аромат. Често тя е със седефен блясък и в различни цветове. - -За съжаление естествено-богатите на минерали храни са част от миналото. Съвременните методи за обрботка на почвите са ги направили бедни на хранителни вещества. Те са буквално "измити" от земята. Затова пък моретата са поели тези нутритенти и сега можем да ги открием в морската сол. Тя е един чудесен избор за набавяне на нужните минерали и микроелементи. Разбира се, винаги купувайте възможно най-чистата сол, която можете да си позволите, тъй като в големите водни източници често има доста токсини и замърсители. - -Най-добрият избор остава небезизвестната Хималайска розова сол, която се добива в дълбочина от едноименните планински масиви и при нея липсват всякакви съмнения за индустриални замърсявания. - -С която и от двете - натурална морска или розова хималайска сол да изберете да замените обикновенната трапезна сол у дома, със сигурност ще подобрите значително здравето си и това на близките си. - -**Вие какво мислите за солта? Страхувате ли се от нея? Смятате ли, че солта може да е полезна? Напишете в коментар.**;T; -I"7

    Ако гледате телевизия, четете печатната преса или ходите на лекар, шансовете да смятате прекомерната употреба на сол за голяма опасност за здравето е около 100%. И сте прави… ако говорим за обикновенната трапезна сол, която се използва масово в производството на хранителни стоки.

    - -

    Но аз имам една голяма новина за вас: Солта е жизненоважна за човешкото тяло и ние трябва да си я набавяме ежедневно! Нали не мислите, че е случайност щастливият трепет, който ви обзема при мисълта за морските летни бани (сол + витамин D) ;-)

    - -

    Трапезната сол = вредна за тялото!

    - -

    Трапезната йодирана сол е химичен продукт, направен в лабораторни условия, със съдържание на 97% Натриев Хлорид (NaCl), избелена с химикали като алуминий и др. и не съдържа никакви полезни вещества. Нейната употреба води до дисбаланс на минералите в кръвта и клетъчните течности и вреди на тялото. Всъщност соленоводни риби, поставени в разтвор на вода и трапезна сол… умират.

    - -

    А сега нека ви разкажа за истинската сол, която е дала живота на Земята.

    - -

    Знаете, че телата ни се нуждаят от вода. Но костите, мускулите и органите имат нужда от определени количества минерали и соли, които си набавят чрез водата. Физиологичната течност, която е нормалната среда на всяка клетка е разтвор на вода с 0,9% сол. Следователно солта е важна част от оптималното здраве и баланс в организма.

    - -

    Нерядко ще срещнете твърдения, че солта е причина за високо кръвно налягане и други сърдечни проблеми. Всъщност изследване доказва, че високото кръвно налягане се дължи на дисбаланс в минералите и микроелементите в кръвта: т.е. ако се приема само NaCl без оптималното количество Магнезий, Калций и др.

    - -
    -

    В проучване на университа Харвард взели участие 60 000 медицински сестри. Тези, чиято диета била бедна на магнезий и калций имали по-голям риск от повишено кръвно налягане.

    -
    - -

    Реално можем да избегнем риска от хипертония(високо кръвно налягане) не чрез редуциране на натрия, а чрез балансирането му с другите важни минерали.

    - -

    Истинската сол = полезна за тялото!

    - -

    Истинската сол е най-добрият източник на микроелементи. Това са химични елементи, които се съдържат в организмите в хилядни части от процента (желязо, мед, цинк, молибден, бром, флуор, аргон, йод и др.). Те са необходими за нормалната жизнена дейност. Влизат в състава на ензими, витамини, хормони. Влияят на растежа, размножаването, кръвообразуването и др. Недостигът или излишъкът им води до нарушения в обмяната на веществата.

    - -

    Какви са ползите от солта?

    - -

    Страдате ли от:

    - -
      -
    • Целулит
    • -
    • Високо кръвно налягане
    • -
    • Камъни в бъбреците
    • -
    • Проблеми с жлъчният мехур
    • -
    • Проблеми със ставите
    • -
    • Умора
    • -
    • Причерняване
    • -
    • Лош сън
    • -
    • Астма или дихателни заболявания
    • -
    • Неравномерен пулс
    • -
    • Проблеми с надбъбречните жлези
    • -
    • Диабет или проблеми с кръвната захар
    • -
    • Слаб мускулен тонус
    • -
    • Задържане на вода, отоци и подпухване
    • -
    - -

    Всички тези състояния могат да се дължат на дисбаланс в минералите и липсата на сол в клетките (да, дори и задържането на вода).

    - -

    Отново искам да се спра на факта, че обикновенната трапезна сол би задълбочила тези проблеми, внасяйки твърде много натрий и хлор в системата, за сметка на другите макро- и микроелементи.

    - -

    Негативно заредените йони на солта, разтворени във вода подпомагат хормоналните, химичните и електричните процеси в тялото. Микроелементите подпомагат нервната и сърдечна функции.

    - -

    Ето някои от най-честите състояния, които адекватната употреба на сол може да подобри:

    - -
      -
    • Абсорбцията на храната, храносмилане: минералният баланс, който се създава от солта и микроелементите й подпомагат усвояването на храната от тънките черва. Солта участва в състава на стомашният сок и подобрява храносмилането.
    • -
    • Извличане на токсини от клетката чрез негативно заредените йони на солта.
    • -
    • Контрол на кръвното налягане - истинската сол регулира, а не повишава кръвното налягане, когато се приема в умерени количества. Отрицателно-заредените йони стабилизират електричните импулси и регулират сърдечният ритъм.
    • -
    • -Киселинен баланс - солта има алкализиращ ефект и взима участие в механизмите, които поддържат pH на тялото.
    • -
    • -Кръвна захар - употребата на истинска сол повишава инсулиновата чувствителност, включително и при пациенти с диабет II и I тип.
    • -
    • -Алергии - истинската сол, разтворена във вода е естествен и ефективен антихистамин. Подобрява и състоянието на кожни заболявания като Екзема и Псориазис.
    • -
    • Влияят върху почивката и съня - микроелементите подпомагат хормоналните процеси в тялото и подобряват качеството и количеството на съня. Намаляването на количеството на хормона на стреса от кръвта - кортизол се забързва при наличие на достатъчно сол. Неслучайно стресовите състояния провокират желание за силносолени храни (чипс, солети, пържено)
    • -
    • -Репродуктивно здраве - подпомагайки хормоналният баланс, истинската сол подобрява фертилността и при мъже, и при жени.
    • -
    • -Целулит - отстраняването му се подобрява с приема на умерено количество полезна сол.
    • -
    • -Мускули - Мускулните крампи и напрежение се облекчават при редовна употреба на истинска сол. Тук незаменим помощник е Магнезият. Професионалните атлети използват вани с Магнезий и сол, за да лекуват тези състояния.
    • -
    • -Кости - около 1/4 от солите в тялото се намират в костите. Ако някъде в тялото има недостиг на сол или микроелементи, те се набавят от костите, за да може тялото да функционира нормално. Следователно консумацията на полезна сол е профилактика срещу остеопороза.
    • -
    • -Щитовидна и надбъбречната жлези - ако имате проблеми с някоя от тези жлези, умерената консумация на сол ще облекчи състоянието ви, благодарение на ефекта, който оказва върху регулацията на pH.
    • -
    • -Нерви - електричните заряд на солта помага нормалното функциониране и невронните комуникации в тялото.
    • -
    • -Уста и зъби - микроелементите помагат за възстановяване на електролитният баланс и реминерализацията на зъбите. Плакнене със слабосолен разтвор убива бактериите и дезинфекцира.
    • -
    • -Хидратация - солта и микроелементите й са есенциални за добрата хидратация на тялото.
    • -
    - -

    Как да изберем добрата сол?

    - -

    Истинската сол съдържа целият набор от 84 микроелемента и има мек вкус и приятен аромат. Често тя е със седефен блясък и в различни цветове.

    - -

    За съжаление естествено-богатите на минерали храни са част от миналото. Съвременните методи за обрботка на почвите са ги направили бедни на хранителни вещества. Те са буквално “измити” от земята. Затова пък моретата са поели тези нутритенти и сега можем да ги открием в морската сол. Тя е един чудесен избор за набавяне на нужните минерали и микроелементи. Разбира се, винаги купувайте възможно най-чистата сол, която можете да си позволите, тъй като в големите водни източници често има доста токсини и замърсители.

    - -

    Най-добрият избор остава небезизвестната Хималайска розова сол, която се добива в дълбочина от едноименните планински масиви и при нея липсват всякакви съмнения за индустриални замърсявания.

    - -

    С която и от двете - натурална морска или розова хималайска сол да изберете да замените обикновенната трапезна сол у дома, със сигурност ще подобрите значително здравето си и това на близките си.

    - -

    Вие какво мислите за солта? Страхувате ли се от нея? Смятате ли, че солта може да е полезна? Напишете в коментар.

    -;T; @{I"R/blog/2014-05-18-здравословното-хранене-е-измама/;T{;{ ;I"5N - - - - - - - Здравословното хранене е измама - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Здравословното хранене е измама -

    - -
    -
      -
    • - - May 18, 2014 -
    • -
    -
    - - -

    Живеем във време, в което 24 часа в денонощие не са ни достатъчни за всичко, което искаме да свършим. Стресът в работата, на улицата и дори в дома ни е огромен. Недоспиването и набързо приготвената храна ни карат да се чувстваме отпаднали и летаргични. Това неминуемо вреди на физическото и психическото ни здраве.

    - -

    Като съвременни интелигентни хора решаваме да се справим със заобикалящите ни проблеми. Няма как да спрем да ходим на работа, решаваме поне да се погрижим за здравето си. Но как?

    - -

    Сещаме се за безгрижното ни детство, когато бяхме с крепко здраве, дълбок сън и толкова енергични… -Питаме се: Какво се е променило? Не съм ли същият човек, но малко по-порастнал? Как мога да върна времето и да се чувствам пак толкова добре? -И лампичката светва: Ако се върна крачка назад и започна да се храня по-здравословно и да се движа повече, вероятно ще се почувствам по-добре!

    - -

    Втори сценарий: Имаме познат, колега или роднина с тежка диагноза рак, диабет или друго сериозно заболяване. Замисляме се за бъдещето, търсим информация за профилактика на болестите, решаваме да подобрим качеството си на живот. -Съвсем естествено светва тази същата лампичка: ако водя здравословен начин на живот, вероятността да ме застигнат тежките диагнози значително намалява.

    - -

    Трети сценарий: По телевизията, във вестниците, в Интернет непрекъснато се говори за вредата от наднорменото тегло и последствията му. Забелязваме, че се налага да отпуснем една дупка на колана или по-лошо: дънките вече не ни стават. Цък! Лампичката! Време е за здравословно хранене!

    - -

    Има и още варианти. Има и я и ТВОЯТА версия.

    - -

    Най-големият проблем на здравословното хранене, е че то няма ясна дефиниция.

    - -

    Разликата между здравословно и нездравословно е в нашето разбиране за света.

    - -

    За вегетарианците, здравословни са растетелните храни, а месото е отрова и води до подкиселяване на организма, рак и смърт.

    - -

    За бодибилдърите и хората от фитнес индустрията протеините - естествени и синтетични са най-ценната храна, а плодовете, хляба и захарта са отрова.

    - -

    За палео последователите естествените цели храни са източника на здраве и дълголетие, а млечните, зърнените и алкохола са най-вредните продукти.

    - -

    Правителствата на развитите държави като САЩ, Великобритания и др. поощряват консумацията на големи количества пшенични продукти и твърдят, че наситените мазнини от животински произход водят до сърдечно-съдови заболявания и рак.

    - -

    Натуралистите се хранят само с истински, цели храни и изцяло избягват всички преработени, пакетирани, рафинирани стоки. Те не консумират нищо, което е претърпяло човешка намеса.

    - -

    И какво се случва в крайна сметка? Всяка храна е вредна и опасна за някого!

    - -

    Ето каква е истината. Няма добри и лоши храни.

    - -

    Има три начина по които храната може да ви навреди:

    - -
      -
    • Прекомерна консумация на храна, която може да доведе до наднормено тегло и заболяванията съпътсващи го.
    • -
    • Да доведе до дефицит на някои нутриенти в тялото.
    • -
    • Директно да повлияе метаболизма и телесните функции.
    • -
    - -

    1. Излишъкът от калории

    - -

    Калорийният излишък е само една възможна причина за наднормено тегло. Хормоналният дисбаланс и колебанията в нивата на половите хормони, хормона на стреса (кортизол), инсулина в комбинация с лептин и грелин (хормони, свързани с храненето) също оказват влияние на теглото. Хроничната липса на един или група биоактивни вещества (макро- и микронутриенти, ензими, витамини) карат тялото да се презапасява и да задържа всички хранителни вещества, които постъпват в него. -Почти винаги прекаляването с храна се случва, когато човек приема бедна на нутриенти, витамини и соли храна. Тогава мозъка изпраща сигнали за намиране на необходимото и се появява неконтролируем глад: човек унищожава каквато и да е храна, която е попаднала в полезрението му. Независимо дали знае или не знае колко е вредна или безполезна за организма. Тези липси на хранителни вещества могат да се породят и от състояния като силен стрес, преумора, безсъние. Това пък от друга страна може да доведе до проблеми с хормоните, които могат да се задълбочат до много по-сериозни състояния. Ако се върнем 50 години назад ще открием много по-малко затлъстели хора. Причините за това са, че хората тогава са били подложени на по-малко стрес? Едва ли! Спортували са повече? По-скоро не! Причината, в съвременното общество да има епидемия от затлъстяване, е храната която ядем. Очевидно е, че трябва да отделяме повече внимание на качеството й, а количеството ще се регулира без усилие. -Последствията от излишното тегло са всеизвестни: повиншен пулс и кръвно налягане, сърдечно-съдови заболявания, диабет, умора, понижаване на либидото, обездвижване и липса на енергия. Но още повече влияе на психиката и душевният комфорт на всеки от нас. И носи още стрес.

    - -

    2. Храни, които ограбват тялото

    - -
      -
    • Храни с празни калории - това са храните, които доставят на тялото бърза енергия. Ако тя не се изразходи веднага, се отлага като запаси. Това са захарта, алкохола, бялото пшенично брашно. Да, те са вкусни и при консумацията им усещаме този прилив на енергия, освобождават се и хормоните на щастието, но така или иначе не получаваме нищо с дълготраен ефект. Дори напротив: бялата захар и белият хляб са храни, които при храносмилането извличат и се свързват с минерали и биоактивни вещества от тялото. Само по този начин те могат да се усвоят, тъй като в състава им липсва всичко друго, освен енергийни молекули.
    • -
    • Храни, които имат съставки-антагонисти. Пример за това са храни с високо съдържание на Калций (мляко, млечни продукти) и Магнезий (пълнозърнести храни, варива и ядки). При смесването на тези храни не може да усвоят и двата важни микроелемента, тъй като за тази цел се използва един и същ път в тялото. Обикновено Калцият надделява и не случайно недостигът на Магнезий е много разпространен. Изявява се със следните симптоми: схващания на мускули (крампи), проблеми със стави и сухожилия, отпадналост и безсъние, тежък ПМС.
    • -
    - -

    3. Директно влияние върху организма

    - -

    Алергиите към храна не са рядкост. Някои от най-силните алергени са глутенът (протеин в пшеницата), ядки, дребните плодове от семейството на ягодите, лактозата в млякото. Реакцията към алергена е моментална и много бурна. Това са медикаментозно-контролирани състояния и най-разумно е да се избягва употребата на проблемната храна и производните й.

    - -

    И ако сега си мислите, че ме е обхванала някаква лудост и се отричам от всичко написано до сега…Не, но не е изключено да се случи! -

    - -

    Аз все още се оповавам на Хипократовите думи “Лекарството ви трябва да е вашата храна и вашата храна - лекарство”. Целта на тази статия е да ви припомня да не се страхувате от новите идеи и различното мнение. В него ще откриете част от вашата истина.

    - -

    Бъдете готови да променяте гледната си точка, за да намерите най-верният път към вашето психическо и физическо здраве и благосъстояние.

    - -

    Ако тази статия ви е харесала - моля, споделете я с приятелите си.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"0Живеем във време, в което 24 часа в денонощие не са ни достатъчни за всичко, което искаме да свършим. Стресът в работата, на улицата и дори в дома ни е огромен. Недоспиването и набързо приготвената храна ни карат да се чувстваме **отпаднали** и **летаргични**. Това неминуемо вреди на физическото и психическото ни здраве. - -Като съвременни интелигентни хора решаваме да се справим със заобикалящите ни проблеми. Няма как да спрем да ходим на работа, решаваме поне **да се погрижим за здравето си**. Но как? - -Сещаме се за безгрижното ни детство, когато бяхме с крепко здраве, дълбок сън и толкова енергични... -Питаме се: Какво се е променило? Не съм ли същият човек, но малко по-порастнал? Как мога да върна времето и да се чувствам пак толкова добре? -И лампичката светва: Ако се върна крачка назад и започна да се храня по-здравословно и да се движа повече, вероятно ще се почувствам по-добре! - -Втори сценарий: Имаме познат, колега или роднина с тежка диагноза рак, диабет или друго сериозно заболяване. Замисляме се за бъдещето, търсим информация за профилактика на болестите, решаваме да подобрим качеството си на живот. -Съвсем естествено светва тази същата лампичка: ако водя здравословен начин на живот, вероятността да ме застигнат тежките диагнози значително намалява. - -Трети сценарий: По телевизията, във вестниците, в Интернет непрекъснато се говори за вредата от наднорменото тегло и последствията му. Забелязваме, че се налага да отпуснем една дупка на колана или по-лошо: дънките вече не ни стават. Цък! Лампичката! Време е за здравословно хранене! - -Има и още варианти. Има и я и **ТВОЯТА версия**. - -###Най-големият проблем на здравословното хранене, е че то няма ясна дефиниция. - -Разликата между здравословно и нездравословно е в нашето разбиране за света. - -За **вегетарианците**, здравословни са растетелните храни, а месото е отрова и води до подкиселяване на организма, рак и смърт. - -За бодибилдърите и хората от **фитнес индустрията** протеините - естествени и синтетични са най-ценната храна, а плодовете, хляба и захарта са отрова. - -За **палео** последователите естествените цели храни са източника на здраве и дълголетие, а млечните, зърнените и алкохола са най-вредните продукти. - -**Правителствата на развитите държави** като САЩ, Великобритания и др. поощряват консумацията на големи количества пшенични продукти и твърдят, че наситените мазнини от животински произход водят до сърдечно-съдови заболявания и рак. - -**Натуралистите** се хранят само с истински, цели храни и изцяло избягват всички преработени, пакетирани, рафинирани стоки. Те не консумират нищо, което е претърпяло човешка намеса. - -И какво се случва в крайна сметка? Всяка храна е вредна и опасна за някого! - -Ето каква е истината. **Няма добри и лоши храни**. - -###Има три начина по които храната може да ви навреди: - -* Прекомерна консумация на храна, която може да доведе до наднормено тегло и заболяванията съпътсващи го. -* Да доведе до дефицит на някои нутриенти в тялото. -* Директно да повлияе метаболизма и телесните функции. - -**1. Излишъкът от калории** - -Калорийният излишък е само една възможна причина за наднормено тегло. Хормоналният дисбаланс и колебанията в нивата на половите хормони, хормона на стреса (кортизол), инсулина в комбинация с лептин и грелин (хормони, свързани с храненето) също оказват влияние на теглото. Хроничната липса на един или група биоактивни вещества (макро- и микронутриенти, ензими, витамини) карат тялото да се презапасява и да задържа всички хранителни вещества, които постъпват в него. -Почти винаги прекаляването с храна се случва, когато човек приема бедна на нутриенти, витамини и соли храна. Тогава мозъка изпраща сигнали за намиране на необходимото и се появява неконтролируем глад: човек унищожава каквато и да е храна, която е попаднала в полезрението му. Независимо дали знае или не знае колко е вредна или безполезна за организма. Тези липси на хранителни вещества могат да се породят и от състояния като силен стрес, преумора, безсъние. Това пък от друга страна може да доведе до проблеми с хормоните, които могат да се задълбочат до много по-сериозни състояния. Ако се върнем 50 години назад ще открием много по-малко затлъстели хора. Причините за това са, че хората тогава са били подложени на по-малко стрес? Едва ли! Спортували са повече? По-скоро не! Причината, в съвременното общество да има епидемия от затлъстяване, е храната която ядем. Очевидно е, че трябва да отделяме повече внимание на качеството й, а количеството ще се регулира без усилие. -Последствията от излишното тегло са всеизвестни: повиншен пулс и кръвно налягане, сърдечно-съдови заболявания, диабет, умора, понижаване на либидото, обездвижване и липса на енергия. Но още повече влияе на психиката и душевният комфорт на всеки от нас. И носи още стрес. - -**2. Храни, които ограбват тялото** - -* Храни с празни калории - това са храните, които доставят на тялото бърза енергия. Ако тя не се изразходи веднага, се отлага като запаси. Това са захарта, алкохола, бялото пшенично брашно. Да, те са вкусни и при консумацията им усещаме този прилив на енергия, освобождават се и хормоните на щастието, но така или иначе не получаваме нищо с дълготраен ефект. Дори напротив: бялата захар и белият хляб са храни, които при храносмилането извличат и се свързват с минерали и биоактивни вещества от тялото. Само по този начин те могат да се усвоят, тъй като в състава им липсва всичко друго, освен енергийни молекули. -* Храни, които имат съставки-антагонисти. Пример за това са храни с високо съдържание на Калций (мляко, млечни продукти) и Магнезий (пълнозърнести храни, варива и ядки). При смесването на тези храни не може да усвоят и двата важни микроелемента, тъй като за тази цел се използва един и същ път в тялото. Обикновено Калцият надделява и не случайно недостигът на Магнезий е много разпространен. Изявява се със следните симптоми: схващания на мускули (крампи), проблеми със стави и сухожилия, отпадналост и безсъние, тежък ПМС. - -**3. Директно влияние върху организма** - -Алергиите към храна не са рядкост. Някои от най-силните алергени са глутенът (протеин в пшеницата), ядки, дребните плодове от семейството на ягодите, лактозата в млякото. Реакцията към алергена е моментална и много бурна. Това са медикаментозно-контролирани състояния и най-разумно е да се избягва употребата на проблемната храна и производните й. - -####И ако сега си мислите, че ме е обхванала някаква лудост и се отричам от всичко написано до сега...**Не, но не е изключено да се случи!** - -Аз все още се оповавам на Хипократовите думи “Лекарството ви трябва да е вашата храна и вашата храна - лекарство”. Целта на тази статия е да ви припомня да не се страхувате от новите идеи и различното мнение. **В него ще откриете част от вашата истина.** - -Бъдете готови да променяте гледната си точка, за да намерите най-верният път към вашето психическо и физическо здраве и благосъстояние. - -Ако тази статия ви е харесала - моля, споделете я с приятелите си.;T; -I"2

    Живеем във време, в което 24 часа в денонощие не са ни достатъчни за всичко, което искаме да свършим. Стресът в работата, на улицата и дори в дома ни е огромен. Недоспиването и набързо приготвената храна ни карат да се чувстваме отпаднали и летаргични. Това неминуемо вреди на физическото и психическото ни здраве.

    - -

    Като съвременни интелигентни хора решаваме да се справим със заобикалящите ни проблеми. Няма как да спрем да ходим на работа, решаваме поне да се погрижим за здравето си. Но как?

    - -

    Сещаме се за безгрижното ни детство, когато бяхме с крепко здраве, дълбок сън и толкова енергични… -Питаме се: Какво се е променило? Не съм ли същият човек, но малко по-порастнал? Как мога да върна времето и да се чувствам пак толкова добре? -И лампичката светва: Ако се върна крачка назад и започна да се храня по-здравословно и да се движа повече, вероятно ще се почувствам по-добре!

    - -

    Втори сценарий: Имаме познат, колега или роднина с тежка диагноза рак, диабет или друго сериозно заболяване. Замисляме се за бъдещето, търсим информация за профилактика на болестите, решаваме да подобрим качеството си на живот. -Съвсем естествено светва тази същата лампичка: ако водя здравословен начин на живот, вероятността да ме застигнат тежките диагнози значително намалява.

    - -

    Трети сценарий: По телевизията, във вестниците, в Интернет непрекъснато се говори за вредата от наднорменото тегло и последствията му. Забелязваме, че се налага да отпуснем една дупка на колана или по-лошо: дънките вече не ни стават. Цък! Лампичката! Време е за здравословно хранене!

    - -

    Има и още варианти. Има и я и ТВОЯТА версия.

    - -

    Най-големият проблем на здравословното хранене, е че то няма ясна дефиниция.

    - -

    Разликата между здравословно и нездравословно е в нашето разбиране за света.

    - -

    За вегетарианците, здравословни са растетелните храни, а месото е отрова и води до подкиселяване на организма, рак и смърт.

    - -

    За бодибилдърите и хората от фитнес индустрията протеините - естествени и синтетични са най-ценната храна, а плодовете, хляба и захарта са отрова.

    - -

    За палео последователите естествените цели храни са източника на здраве и дълголетие, а млечните, зърнените и алкохола са най-вредните продукти.

    - -

    Правителствата на развитите държави като САЩ, Великобритания и др. поощряват консумацията на големи количества пшенични продукти и твърдят, че наситените мазнини от животински произход водят до сърдечно-съдови заболявания и рак.

    - -

    Натуралистите се хранят само с истински, цели храни и изцяло избягват всички преработени, пакетирани, рафинирани стоки. Те не консумират нищо, което е претърпяло човешка намеса.

    - -

    И какво се случва в крайна сметка? Всяка храна е вредна и опасна за някого!

    - -

    Ето каква е истината. Няма добри и лоши храни.

    - -

    Има три начина по които храната може да ви навреди:

    - -
      -
    • Прекомерна консумация на храна, която може да доведе до наднормено тегло и заболяванията съпътсващи го.
    • -
    • Да доведе до дефицит на някои нутриенти в тялото.
    • -
    • Директно да повлияе метаболизма и телесните функции.
    • -
    - -

    1. Излишъкът от калории

    - -

    Калорийният излишък е само една възможна причина за наднормено тегло. Хормоналният дисбаланс и колебанията в нивата на половите хормони, хормона на стреса (кортизол), инсулина в комбинация с лептин и грелин (хормони, свързани с храненето) също оказват влияние на теглото. Хроничната липса на един или група биоактивни вещества (макро- и микронутриенти, ензими, витамини) карат тялото да се презапасява и да задържа всички хранителни вещества, които постъпват в него. -Почти винаги прекаляването с храна се случва, когато човек приема бедна на нутриенти, витамини и соли храна. Тогава мозъка изпраща сигнали за намиране на необходимото и се появява неконтролируем глад: човек унищожава каквато и да е храна, която е попаднала в полезрението му. Независимо дали знае или не знае колко е вредна или безполезна за организма. Тези липси на хранителни вещества могат да се породят и от състояния като силен стрес, преумора, безсъние. Това пък от друга страна може да доведе до проблеми с хормоните, които могат да се задълбочат до много по-сериозни състояния. Ако се върнем 50 години назад ще открием много по-малко затлъстели хора. Причините за това са, че хората тогава са били подложени на по-малко стрес? Едва ли! Спортували са повече? По-скоро не! Причината, в съвременното общество да има епидемия от затлъстяване, е храната която ядем. Очевидно е, че трябва да отделяме повече внимание на качеството й, а количеството ще се регулира без усилие. -Последствията от излишното тегло са всеизвестни: повиншен пулс и кръвно налягане, сърдечно-съдови заболявания, диабет, умора, понижаване на либидото, обездвижване и липса на енергия. Но още повече влияе на психиката и душевният комфорт на всеки от нас. И носи още стрес.

    - -

    2. Храни, които ограбват тялото

    - -
      -
    • Храни с празни калории - това са храните, които доставят на тялото бърза енергия. Ако тя не се изразходи веднага, се отлага като запаси. Това са захарта, алкохола, бялото пшенично брашно. Да, те са вкусни и при консумацията им усещаме този прилив на енергия, освобождават се и хормоните на щастието, но така или иначе не получаваме нищо с дълготраен ефект. Дори напротив: бялата захар и белият хляб са храни, които при храносмилането извличат и се свързват с минерали и биоактивни вещества от тялото. Само по този начин те могат да се усвоят, тъй като в състава им липсва всичко друго, освен енергийни молекули.
    • -
    • Храни, които имат съставки-антагонисти. Пример за това са храни с високо съдържание на Калций (мляко, млечни продукти) и Магнезий (пълнозърнести храни, варива и ядки). При смесването на тези храни не може да усвоят и двата важни микроелемента, тъй като за тази цел се използва един и същ път в тялото. Обикновено Калцият надделява и не случайно недостигът на Магнезий е много разпространен. Изявява се със следните симптоми: схващания на мускули (крампи), проблеми със стави и сухожилия, отпадналост и безсъние, тежък ПМС.
    • -
    - -

    3. Директно влияние върху организма

    - -

    Алергиите към храна не са рядкост. Някои от най-силните алергени са глутенът (протеин в пшеницата), ядки, дребните плодове от семейството на ягодите, лактозата в млякото. Реакцията към алергена е моментална и много бурна. Това са медикаментозно-контролирани състояния и най-разумно е да се избягва употребата на проблемната храна и производните й.

    - -

    И ако сега си мислите, че ме е обхванала някаква лудост и се отричам от всичко написано до сега…Не, но не е изключено да се случи! -

    - -

    Аз все още се оповавам на Хипократовите думи “Лекарството ви трябва да е вашата храна и вашата храна - лекарство”. Целта на тази статия е да ви припомня да не се страхувате от новите идеи и различното мнение. В него ще откриете част от вашата истина.

    - -

    Бъдете готови да променяте гледната си точка, за да намерите най-верният път към вашето психическо и физическо здраве и благосъстояние.

    - -

    Ако тази статия ви е харесала - моля, споделете я с приятелите си.

    -;T; @I"L/blog/2014-05-25-изяж-си-слънцезащитният-крем/;T{;{ ;I"L - - - - - - - Изяж си слънцезащитният крем - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Изяж си слънцезащитният крем -

    - -
    -
      -
    • - - May 25, 2014 -
    • -
    -
    - - -

    Всички очакваме лятото скоро да ни зарадва с по-слънчеви дни, море, разходки и слънчеви бани по полянки и плажове.

    - -

    А знаем ли как да се радваме на слънцето? Как да получим най-доброто от него, без ужасните и болезнени изгаряния по кожата?

    - -

    Да поговорим малко за влиянието на слънцето върху човека. От всякъде ни заливат с истерични новини за това колко е вредно слънцето. То състарява кожата, изгарянията водат до рак и най-добрата превенция била “да не си показваме носа навън”, ако не сме се намазали обилно с поне 2-3 мазила от аптеката със слънцезащитен фактор 20-30-50 и поне 10 непроизносимо химични вещества в състава..

    - -

    Всичко това нямаше да е толкова страшно, ако всъщност беше вярно. Лошото е, че въпреки все по-масовото използване на слънцезащитни кремове, статистките показват, че броят на болните от рак на кожата не намалява.

    - -

    Освен това, нанасяйки подобни помади по кожата си, ние блокираме достъпа на слънчеви лъчи и неволно спираме производството на важният за здравето витамин Д. Той всъщност не е точно витамин, а бъдещ хормон, който има важна роля за здравето на костите, зъбите, и нормално функциониращата имунна система. Последствията от недостига на витамин Д не закъсняват: мускулни и ставни болки, повишен риск от сърдечно-съдови заболявания, проблеми със зъбите и венците, тежка астма в детска възраст, диабет, някои форми на рак и възможна теоретична връзка с болестта на Крон и мултиплена склероза.

    - -

    Всъщност слънчевата енергия е животворна и е храна за всички растения, които ни снабдяват с кислород и на свой ред стават храна за хора и животни. Слънцето не е враг и не трябва да се страхуваме от него, просто трябва да знаем как да го използваме в наша полза.

    - -

    Аз съм от хората с изключително светла кожа и винаги съм изгаряла, дори при най-кратко слънчево излагане. Никога не съм имала загар, а само червенина и отоци. За мен слънцето беше враг номер едно и още от дете мразех да ходя на море. Лятото се обличах с дълги ръкави и крачоли, защото изгарянията бяха бързи и болезнени.

    - -

    Ето обаче какво забелязах миналото лято: освен, че всеки уикенд бях някъде в планината с моят любим велосипед под жарко слънце, някъде между резервната гума и пакетчето с ядки и плодове в раницата намерих недокосната опаковката със слънцезащитен крем, която носех. А нямах изгаряния! Мистерия? Всъщност не. Истината е, че слънцезащитата става отвътре-навън и в тяло, което е чисто от токсини, слънцето не предизвиква възпаление. А слънчевото изгаряне е точно това: класическо възпаление - оток, болка, зачервяване, повишена температура.

    - -

    Кожата е един от органите, чрез който тялото отделя токсини. Когато течностите (пот, вода, мазнини), които се отделят през нея са токсични, кожата буквално се “пържи” в тях. Тогава вероятността да се стигне до слънчево изгаряне е почти 100%. При редовни токсични слънчеви бани съответно нараства и вероятността от проблеми като изсушаване и сбръчкване на кожата, алергии, поява на пигментни петна и дори рак.

    - -

    Не бих искала да пропусна и корелацията, която може да се направи със зачестилата диагноза меланома (рак на кожата) и високата консумация на рафинирани растителни мазнини, богати на Омега-6 мастни киселини. В последните 50 години и могат да се наблюдават и двете събития. Дали има връзка можем само да предполагаме. Аз съм склонна да мисля, че да. В статията ми за мазнините може да си припомните защо те са неподходяща храна за хора.

    - -

    Както вредната храна може да повлияе негативно на кожата и здравето като цяло, така правилната диета може да ви донесе много ползи.

    - -

    Ето как да подобрите естествената слънцезащита на тялото си:

    - -
      -
    1. -

      Яжте достатъчно добри мазнини. На човешкото тяло ежедневно са необходими наситени животински мазнини (масло, мазно месо, яйчен жълтък), мощно ненаситени мазнини (кокосово масло), Омега - 3 мастни киселини (риба, рибено масло). Избягвайте рафинирани те животински мазнини и маргарина.

      -
    2. -
    3. -

      Прием на достатъчно антиоксиданти. Тези малки частички, които приемаме с храната се свързват със свободните радикали, които ограбват тялото от важни минерали и микроелементи. Ако избягвате употребата на зърнени храни и най-вече пшенични продукти и вредни мазнини, най-вероятно в храната ви има достатъчно антиоксиданти. Ако искате обаче наистина ударна доза, то хапвайте редовно дребни плодове от рода на боровинките, какаови зърна, зеленият чай и животинските мазнини.

      -
    4. -
    5. -

      Достатъчно витамин Д. Тъмният пигмент меланин, на който се дължи бронзовият загар по кожата започва да се произвежда само ако има достатъчно витамин Д в тялото. Т.е. ако има недостиг получаваме изгаряне, а не тен. Ако се кажем с крем, блокираме производството на витамина и задълбочаваме проблема. Оптималното ниво на витамин Д помага производството на меланина да е по-бързо и след това да се задържи в кожата по-дълго.

      -
    6. -
    7. -

      Постепенно излагане на слънце. В зависимост от типа на кожата, човек трябва да започне с кратки слънчеви бани от 5 до 30 мин дневно. На тялото трябва да се даде възможност да произведе достатъчно витамин Д и меланин, иначе слънчевото изгаряне е неизбежно.

      -
    8. -
    9. -

      Избягвайте да нанасяте по кожата си химически вещества и използвайте натурална козметика. Тъй като слънцезащитните кремове реално не предпазват от вредните ефекти на слънцето, а дори могат да ги задълбочат, по-добре ги пропуснете. Някои масла имат естествен слънцезащитен фактор и влизат в състава на качествените и безвредни слънцезащитният продукти: например кокосовото масло SPF4 или масло от ший SPF6.

      -
    10. -
    11. -

      Хидратирайте се. За всички процеси в тялото е нужна вода. Не забравяйте да пиете ежедневно по 2.5-3 литра вода, особено когато сте под слънчевите лъчи.

      -
    12. -
    - -

    Не е ли страхотно, че с пълноценно хранене можем да решим още един проблем! Ето още хора, които мислят така.

    - -

    Избягвайте:

    - -
      -
    • преработени храни
    • -
    • растителни олиа
    • -
    • зърнени и пшенични продукти
    • -
    • захар и нишесте
    • -
    - -

    Яжте:

    - -
      -
    • Много наситени животински мазнини
    • -
    • Много храни, богати на Омега - 3
    • -
    • Много зеленолистните зеленчуци
    • -
    • Домати и доматено пюре (ликопенът е естествена защита срещу възпалението)
    • -
    - -

    А вие как се защитавате от слънцето? Лесно ли хващате тен или по-често изгаряте? Напишете ми отговора си в коментар.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I".Всички очакваме лятото скоро да ни зарадва с по-слънчеви дни, море, разходки и слънчеви бани по полянки и плажове. - -**А знаем ли как да се радваме на слънцето? Как да получим най-доброто от него, без ужасните и болезнени изгаряния по кожата?** - -Да поговорим малко за влиянието на слънцето върху човека. От всякъде ни заливат с истерични новини за това колко е вредно слънцето. То състарява кожата, изгарянията водат до рак и най-добрата превенция била "да не си показваме носа навън", ако не сме се намазали обилно с поне 2-3 мазила от аптеката със слънцезащитен фактор 20-30-50 и поне 10 непроизносимо химични вещества в състава.. - -**Всичко това нямаше да е толкова страшно, ако всъщност беше вярно.** Лошото е, че въпреки все по-масовото използване на слънцезащитни кремове, статистките показват, че броят на болните от рак на кожата [не](http://www.healthiertalk.com/skin-cancer-rates-rising-record-pace-1703) [намалява](http://phys.org/news155384568.html). - -Освен това, нанасяйки подобни помади по кожата си, ние блокираме достъпа на слънчеви лъчи и неволно спираме производството на важният за здравето **витамин Д**. Той всъщност не е точно витамин, а бъдещ **хормон, който има важна роля за здравето на костите, зъбите, и нормално функциониращата имунна система**. Последствията от недостига на витамин Д не закъсняват: мускулни и ставни болки, повишен риск от сърдечно-съдови заболявания, проблеми със зъбите и венците, тежка астма в детска възраст, [диабет](http://www.webmd.com/diabetes/guide/type-2-diabetes), някои форми на рак и възможна теоретична връзка с [болестта на Крон](https://www.vitamindcouncil.org/vitamin-d-news/vitamin-d-deficiency-linked-to-active-crohns-disease/) и [мултиплена склероза](http://www.webmd.com/multiple-sclerosis/default.htm). - -Всъщност слънчевата енергия е животворна и е храна за всички растения, които ни снабдяват с кислород и на свой ред стават храна за хора и животни. **Слънцето не е враг и не трябва да се страхуваме от него, просто трябва да знаем как да го използваме в наша полза.** - -Аз съм от хората с изключително светла кожа и винаги съм изгаряла, дори при най-кратко слънчево излагане. Никога не съм имала загар, а само червенина и отоци. За мен слънцето беше враг номер едно и още от дете мразех да ходя на море. Лятото се обличах с дълги ръкави и крачоли, защото изгарянията бяха бързи и болезнени. - -Ето обаче какво забелязах миналото лято: освен, че всеки уикенд бях някъде в планината с моят любим велосипед под жарко слънце, някъде между резервната гума и пакетчето с ядки и плодове в раницата намерих недокосната опаковката със слънцезащитен крем, която носех. А нямах изгаряния! Мистерия? Всъщност не. **Истината е, че слънцезащитата става отвътре-навън и в тяло, което е чисто от токсини, слънцето не предизвиква възпаление.** А слънчевото изгаряне е точно това: класическо възпаление - оток, болка, зачервяване, повишена температура. - -Кожата е един от органите, чрез който тялото отделя токсини. Когато течностите (пот, вода, мазнини), които се отделят през нея са токсични, кожата буквално се "пържи" в тях. Тогава вероятността да се стигне до слънчево изгаряне е почти 100%. При редовни токсични слънчеви бани съответно нараства и вероятността от проблеми като изсушаване и сбръчкване на кожата, алергии, поява на пигментни петна и дори рак. - -Не бих искала да пропусна и [корелацията](http://www.dldewey.com/hydroil.htm), която може да се направи със зачестилата диагноза меланома (рак на кожата) и високата консумация на рафинирани растителни мазнини, богати на Омега-6 мастни киселини. В последните 50 години и могат да се наблюдават и двете събития. Дали има връзка можем само да предполагаме. Аз съм склонна да мисля, че да. В [статията](/blog/2014-04-08-%D0%B7%D0%B0%D1%89%D0%BE-%D0%BD%D0%B8%D0%BA%D0%BE%D0%B3%D0%B0-%D0%BD%D0%B5-%D1%82%D1%80%D1%8F%D0%B1%D0%B2%D0%B0-%D0%B4%D0%B0-%D1%8F%D0%B4%D0%B5%D1%82%D0%B5-%D0%BC%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D0%BD/) ми за мазнините може да си припомните защо те са неподходяща храна за хора. - -Както вредната храна може да повлияе негативно на кожата и здравето като цяло, така правилната диета може да ви донесе много ползи. - -###Ето как да подобрите естествената слънцезащита на тялото си: - -1. Яжте достатъчно **добри мазнини**. На човешкото тяло ежедневно са необходими наситени животински мазнини (масло, мазно месо, яйчен жълтък), мощно ненаситени мазнини (кокосово масло), Омега - 3 мастни киселини (риба, рибено масло). Избягвайте рафинирани те животински мазнини и маргарина. - -2. Прием на достатъчно **антиоксиданти**. Тези малки частички, които приемаме с храната се свързват със свободните радикали, които ограбват тялото от важни минерали и микроелементи. Ако избягвате употребата на зърнени храни и най-вече пшенични продукти и вредни мазнини, най-вероятно в храната ви има достатъчно антиоксиданти. Ако искате обаче наистина ударна доза, то хапвайте редовно дребни плодове от рода на боровинките, какаови зърна, зеленият чай и животинските мазнини. - -3. Достатъчно **витамин Д**. Тъмният пигмент меланин, на който се дължи бронзовият загар по кожата започва да се произвежда само ако има достатъчно витамин Д в тялото. Т.е. ако има недостиг получаваме изгаряне, а не тен. Ако се кажем с крем, блокираме производството на витамина и задълбочаваме проблема. Оптималното ниво на витамин Д помага производството на меланина да е по-бързо и след това да се задържи в кожата по-дълго. - -4. **Постепенно излагане на слънце**. В зависимост от типа на кожата, човек трябва да започне с кратки слънчеви бани от 5 до 30 мин дневно. На тялото трябва да се даде възможност да произведе достатъчно витамин Д и меланин, иначе слънчевото изгаряне е неизбежно. - -5. Избягвайте да нанасяте по кожата си [химически вещества](http://www.nature.com/clpt/journal/v89/n1/abs/clpt2010227a.html) и използвайте **натурална козметика**. Тъй като слънцезащитните кремове реално не предпазват от вредните ефекти на слънцето, а дори могат да ги задълбочат, по-добре ги пропуснете. Някои масла имат естествен слънцезащитен фактор и влизат в състава на качествените и безвредни слънцезащитният продукти: например кокосовото масло SPF4 или [масло от ший](http://theglamlaboratory.blogspot.com/2011/06/cracking-code-shea-butter-and-spf.html) SPF6. - -6. **Хидратирайте** се. За всички процеси в тялото е нужна вода. Не забравяйте да пиете ежедневно по 2.5-3 литра вода, особено когато сте под слънчевите лъчи. - -Не е ли страхотно, че с пълноценно хранене можем да решим още един проблем! [Ето](http://www.marksdailyapple.com/forum/thread27271.html) [още](http://www.marksdailyapple.com/8-natural-ways-to-prevent-a-sunburn-and-sunscreens-not-one-of-them/#axzz32jepnEmn) хора, които мислят така. - -Избягвайте: - -* преработени храни -* растителни олиа -* зърнени и пшенични продукти -* захар и нишесте - -Яжте: - -* Много наситени животински мазнини -* Много храни, богати на Омега - 3 -* Много зеленолистните зеленчуци -* Домати и доматено пюре (ликопенът е естествена защита срещу възпалението) - -**А вие как се защитавате от слънцето? Лесно ли хващате тен или по-често изгаряте?** Напишете ми отговора си в коментар.;T; -I"r1

    Всички очакваме лятото скоро да ни зарадва с по-слънчеви дни, море, разходки и слънчеви бани по полянки и плажове.

    - -

    А знаем ли как да се радваме на слънцето? Как да получим най-доброто от него, без ужасните и болезнени изгаряния по кожата?

    - -

    Да поговорим малко за влиянието на слънцето върху човека. От всякъде ни заливат с истерични новини за това колко е вредно слънцето. То състарява кожата, изгарянията водат до рак и най-добрата превенция била “да не си показваме носа навън”, ако не сме се намазали обилно с поне 2-3 мазила от аптеката със слънцезащитен фактор 20-30-50 и поне 10 непроизносимо химични вещества в състава..

    - -

    Всичко това нямаше да е толкова страшно, ако всъщност беше вярно. Лошото е, че въпреки все по-масовото използване на слънцезащитни кремове, статистките показват, че броят на болните от рак на кожата не намалява.

    - -

    Освен това, нанасяйки подобни помади по кожата си, ние блокираме достъпа на слънчеви лъчи и неволно спираме производството на важният за здравето витамин Д. Той всъщност не е точно витамин, а бъдещ хормон, който има важна роля за здравето на костите, зъбите, и нормално функциониращата имунна система. Последствията от недостига на витамин Д не закъсняват: мускулни и ставни болки, повишен риск от сърдечно-съдови заболявания, проблеми със зъбите и венците, тежка астма в детска възраст, диабет, някои форми на рак и възможна теоретична връзка с болестта на Крон и мултиплена склероза.

    - -

    Всъщност слънчевата енергия е животворна и е храна за всички растения, които ни снабдяват с кислород и на свой ред стават храна за хора и животни. Слънцето не е враг и не трябва да се страхуваме от него, просто трябва да знаем как да го използваме в наша полза.

    - -

    Аз съм от хората с изключително светла кожа и винаги съм изгаряла, дори при най-кратко слънчево излагане. Никога не съм имала загар, а само червенина и отоци. За мен слънцето беше враг номер едно и още от дете мразех да ходя на море. Лятото се обличах с дълги ръкави и крачоли, защото изгарянията бяха бързи и болезнени.

    - -

    Ето обаче какво забелязах миналото лято: освен, че всеки уикенд бях някъде в планината с моят любим велосипед под жарко слънце, някъде между резервната гума и пакетчето с ядки и плодове в раницата намерих недокосната опаковката със слънцезащитен крем, която носех. А нямах изгаряния! Мистерия? Всъщност не. Истината е, че слънцезащитата става отвътре-навън и в тяло, което е чисто от токсини, слънцето не предизвиква възпаление. А слънчевото изгаряне е точно това: класическо възпаление - оток, болка, зачервяване, повишена температура.

    - -

    Кожата е един от органите, чрез който тялото отделя токсини. Когато течностите (пот, вода, мазнини), които се отделят през нея са токсични, кожата буквално се “пържи” в тях. Тогава вероятността да се стигне до слънчево изгаряне е почти 100%. При редовни токсични слънчеви бани съответно нараства и вероятността от проблеми като изсушаване и сбръчкване на кожата, алергии, поява на пигментни петна и дори рак.

    - -

    Не бих искала да пропусна и корелацията, която може да се направи със зачестилата диагноза меланома (рак на кожата) и високата консумация на рафинирани растителни мазнини, богати на Омега-6 мастни киселини. В последните 50 години и могат да се наблюдават и двете събития. Дали има връзка можем само да предполагаме. Аз съм склонна да мисля, че да. В статията ми за мазнините може да си припомните защо те са неподходяща храна за хора.

    - -

    Както вредната храна може да повлияе негативно на кожата и здравето като цяло, така правилната диета може да ви донесе много ползи.

    - -

    Ето как да подобрите естествената слънцезащита на тялото си:

    - -
      -
    1. -

      Яжте достатъчно добри мазнини. На човешкото тяло ежедневно са необходими наситени животински мазнини (масло, мазно месо, яйчен жълтък), мощно ненаситени мазнини (кокосово масло), Омега - 3 мастни киселини (риба, рибено масло). Избягвайте рафинирани те животински мазнини и маргарина.

      -
    2. -
    3. -

      Прием на достатъчно антиоксиданти. Тези малки частички, които приемаме с храната се свързват със свободните радикали, които ограбват тялото от важни минерали и микроелементи. Ако избягвате употребата на зърнени храни и най-вече пшенични продукти и вредни мазнини, най-вероятно в храната ви има достатъчно антиоксиданти. Ако искате обаче наистина ударна доза, то хапвайте редовно дребни плодове от рода на боровинките, какаови зърна, зеленият чай и животинските мазнини.

      -
    4. -
    5. -

      Достатъчно витамин Д. Тъмният пигмент меланин, на който се дължи бронзовият загар по кожата започва да се произвежда само ако има достатъчно витамин Д в тялото. Т.е. ако има недостиг получаваме изгаряне, а не тен. Ако се кажем с крем, блокираме производството на витамина и задълбочаваме проблема. Оптималното ниво на витамин Д помага производството на меланина да е по-бързо и след това да се задържи в кожата по-дълго.

      -
    6. -
    7. -

      Постепенно излагане на слънце. В зависимост от типа на кожата, човек трябва да започне с кратки слънчеви бани от 5 до 30 мин дневно. На тялото трябва да се даде възможност да произведе достатъчно витамин Д и меланин, иначе слънчевото изгаряне е неизбежно.

      -
    8. -
    9. -

      Избягвайте да нанасяте по кожата си химически вещества и използвайте натурална козметика. Тъй като слънцезащитните кремове реално не предпазват от вредните ефекти на слънцето, а дори могат да ги задълбочат, по-добре ги пропуснете. Някои масла имат естествен слънцезащитен фактор и влизат в състава на качествените и безвредни слънцезащитният продукти: например кокосовото масло SPF4 или масло от ший SPF6.

      -
    10. -
    11. -

      Хидратирайте се. За всички процеси в тялото е нужна вода. Не забравяйте да пиете ежедневно по 2.5-3 литра вода, особено когато сте под слънчевите лъчи.

      -
    12. -
    - -

    Не е ли страхотно, че с пълноценно хранене можем да решим още един проблем! Ето още хора, които мислят така.

    - -

    Избягвайте:

    - -
      -
    • преработени храни
    • -
    • растителни олиа
    • -
    • зърнени и пшенични продукти
    • -
    • захар и нишесте
    • -
    - -

    Яжте:

    - -
      -
    • Много наситени животински мазнини
    • -
    • Много храни, богати на Омега - 3
    • -
    • Много зеленолистните зеленчуци
    • -
    • Домати и доматено пюре (ликопенът е естествена защита срещу възпалението)
    • -
    - -

    А вие как се защитавате от слънцето? Лесно ли хващате тен или по-често изгаряте? Напишете ми отговора си в коментар.

    -;T; @I"K/blog/2014-06-02-как-мария-си-върна-усмивката/;T{;{ ;I"M - - - - - - - Как Мария си върна усмивката - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как Мария си върна усмивката -

    - -
    -
      -
    • - - June 2, 2014 -
    • -
    -
    - - -

    Днес искам да ви разкажа една история. Главен герой в нея е (да я наречем) Мария.

    - -

    Мария е на 26 години, образована жена, с многостранни интереси. Тя също така държи на здравето си и веднъж годишно ходи на профилактичен преглед при зъболекаря си. На 25 години тя има 2 пломби, поставени в детските й години. Не пуши, не пие газирано и не яде вредна храна. Отвреме-навреме си позволява по малко шоколад и чаша алкохол. Спортува редовно. Общото и здравословно състояние е чудесно. Зъбите и венците й са в перфектно състояние.

    - -

    През последните 12 месеца Мария решава да промени драстично начина си на живот и да започне да се храни само със сурова храна, като изключи също така всички животински продукти. Менюто и се състои само от плодове, зеленчуци, ядки, растителни мазнини и няколко вида водорасли и т.нар. суперхрани. Плодовите фрешове и смутита често заменят твърдата храна.

    - -

    И какво мислите установява зъболекаря след една година? Шестнадесет (Да! 16!!) кариеса!!

    - -

    Няма да осъждам избора на Мария да се храни според своите разбирания.

    - -

    Няма да чета лекции колко е полезно или вредно здравословното хранене.

    - -

    Няма да ви развивам научни теории защо са се получили тези кариеси.

    - -

    Искам само да ви дам няколко практически съвета как да подобрите състоянието на зъбите си, ако храната ви изключва една или няколко групи храни или страдате от множествени кариеси без ясно видима причина.

    - -
      -
    1. -Голямото трио - Витамин Д, витамин К2 и витамин А -Калцият е Супермен за вашите зъби. Но той не може да дойде и да изиграе своята роля да поправя и заздравява емайла и дентина, ако организмът не може да го складира на правилните места. Витамин К2 кара Калция от храната да се връща към зъбите. Витамин Д подобрява абсорбцията на Калций в червата. Витамин А участва във формирането на костите и зъбите. Това са трите витамина, които работят в защита на вашите зъби от кариес. А комбинирани заедно техният ефект е толкова голям, че могат да възстановят вече налични кариеси и емайлови изтривания. -
        -
      • Витамин К2: този малко известен (дори на лекарите) особняк е трудно да си набавите, ако сте на веганска диета, въпреки че най-богатата храна е вид ферментирала соя - натто, до която, ако имате достъп - нямате проблем. Ако не сте фенове на соята обаче може да си набавите К2 от твърди и меки високомаслени сирена, особено ако са от сурово мляко. Други източници са органни меса, яйчният жълтък и рибен хайвер. Ако и вие като мен не обичате хапчета, но по някаква причина не можете да си осигурите този витамин с храната, то нямате друг избор освен да добавите една таблетка към дневното меню. Убедена съм, че това е липсващата част в пъзела на кариесите при хората с множествен кариес. -
      • -
      • Витамин Д: Слънчевият витамин! Ако живеете някъде на тропиците и всекидневно ви огрява силно слънце, най-вероятно имате достатъчно витамин Д. Ако обаче сте далеч от Екватора, то нивата на този важен витамин-хормон се нуждаят от оптимизиране, особено през зимата. В България можем да постигнем добро ниво на витамин Д от май до септември и то ако ежедневно се излагаме на слънце за 2-3 часа по оскъдно облекло. Т.е. суплементирайте с витамин Д почти целогодишно. За предпочитане е да си набавите Д3, а не Д2 форма.
      • -
      • Витамин А: Да, витамин А е най-ценната съставка на оранжевите моркови или сладките картофи. Обаче при тях получаваме бета-каротен, а нашите тела търсят витамин А (каротен). Повечето хора нямат проблем да превърнат провитамина във витамин, но при някои това не се случва, в това число децата, диабетно болни и хора с проблеми на щитовидната жлеза. Освен оранжевите плодове и зеленчуци, богат източник на витамин А са зеленолистните, яйчният жълтък, черният дроб, пълномаслено мляко. Тъй като витамин А е мастно-разтворим, винаги добавяйте полезна мазнина към салатите.
      • -
      -
    2. -
    3. Как да предпазите зъбите си от киселинни атаки. Ако четете блогове и статии за здравословно хранене, със сигурност сте запознати със благотворното влияние на ферментиралите храни върху човешкото здраве. И то безспорно е такова, но има едно “но”. Ако след хранене с ферментирали, кисели храни имате чувствителност в зъбите, то значи че те са подложени на ерозивното действие на киселината. -Друга киселинна атака идва от прясно изцедените плодови сокове, особено тези, които съдържат цитрусови плодове, ябълки, грозде. Защо фрешовете не са най-добрият избор може да прочетете тук. Ако все пак това е важна част от диетата ви, която не може да бъде изключена, следвайте тези правила: -
        -
      • Пийте киселата напитка през сламка и възможно най-бързо.
      • -
      • След киселинно хранене изплакнете устата си с разтвор от половин лъжичка сода за хляб в половин чаша вода. Содата неутрализира остантъчната киселинност в устата.
      • -
      • -Не мийте зъбите си поне 1 час след прием на кисела напитка или храна. Обяснявам: преди слюнката да е извършила своето реминерализиращо действие върху зъбите, емайлът е крехък заради киселинната баня в който е бил току-що. Ако започнете да четкате зъбите, докато балансът не се е възстановил, вие ще нараните допълнително крехкият емайл. Получават се микропукнатини и микроскопични кариеси, особено на местата, където емайлът е на тънък слой: около пломби, при резците, около зъбната шийка (до венеца).
      • -
      -
    4. -
    5. Не забравяйте хигиената. Въпреки, че се храните с подбрани продукти, без замърсявания и химикали не забравяйте редовната хигиена. Ежедневното изчеткване на зъбите с подходяща четка и паста е задължително. Както и ежедневното почистване на междузъбните пространства с конец за зъби. Ако се храните изключително със сурова храна, не забравяйте да посещавате редовно своят стоматолог. Нека той ви препоръча подходящи средства за хигиена, за да се предотврати изтриването на зъбите, което е често срещано при такъв тип хранене.
    6. -
    - -

    Съвременната наука се развива непрекъснато и вече лечението на кариеса не е свързано само с болезнени посещения при зъболекаря. Бъдете информирани за избора, който правите относно здравето си и винаги изисквайте най-доброто за себе си и децата си!

    - -

    За да завърша днешната история ще ви разкажа какво се случи с кариесите на Мария: След шест месеца, тя има четири нови пломби, а останалите дванадесет спряха развитието си и се очаква зъбите да се възстановят напълно. И Мария си върна усмивката, само защото спазваше съветите, които споделих и с вас днес!

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"/Днес искам да ви разкажа една история. Главен герой в нея е (да я наречем) Мария. - -Мария е на 26 години, образована жена, с многостранни интереси. **Тя също така държи на здравето си и веднъж годишно ходи на профилактичен преглед при зъболекаря си.** На 25 години тя има 2 пломби, поставени в детските й години. Не пуши, не пие газирано и не яде вредна храна. Отвреме-навреме си позволява по малко шоколад и чаша алкохол. Спортува редовно. Общото и здравословно състояние е чудесно. Зъбите и венците й са в перфектно състояние. - -През последните 12 месеца Мария решава да промени драстично начина си на живот и да започне да се храни само със сурова храна, като изключи също така всички животински продукти. Менюто и се състои само от плодове, зеленчуци, ядки, растителни мазнини и няколко вида водорасли и т.нар. суперхрани. Плодовите фрешове и смутита често заменят твърдата храна. - -И какво мислите установява зъболекаря след една година? Шестнадесет (Да! 16!!) кариеса!! - -Няма да осъждам избора на Мария да се храни според своите разбирания. - -Няма да чета лекции колко е полезно или вредно здравословното хранене. - -Няма да ви развивам научни теории защо са се получили тези кариеси. - -Искам само да ви дам няколко практически съвета **как да подобрите състоянието на зъбите си**, ако храната ви изключва една или няколко групи храни или страдате от **множествени кариеси** без ясно видима причина. - -1. **Голямото трио - Витамин Д, витамин К2 и витамин А** -Калцият е Супермен за вашите зъби. Но той не може да дойде и да изиграе своята роля да поправя и заздравява емайла и дентина, ако организмът не може да го складира на правилните места. Витамин К2 кара Калция от храната да се връща към зъбите. Витамин Д подобрява абсорбцията на Калций в червата. Витамин А участва във формирането на костите и зъбите. Това са трите витамина, които работят в защита на вашите зъби от кариес. **А комбинирани заедно техният ефект е толкова голям, че могат да възстановят вече налични кариеси и емайлови изтривания.** - * Витамин К2: този малко известен (дори на лекарите) особняк е трудно да си набавите, ако сте на веганска диета, въпреки че най-богатата храна е вид ферментирала соя - [натто](http://en.wikipedia.org/wiki/Natt%C5%8D), до която, ако имате достъп - нямате проблем. Ако не сте фенове на соята обаче може да си набавите К2 от твърди и меки високомаслени сирена, особено ако са от сурово мляко. Други източници са органни меса, яйчният жълтък и рибен хайвер. Ако и вие като мен не обичате хапчета, но по някаква причина не можете да си осигурите този витамин с храната, то нямате друг избор освен да добавите една таблетка към дневното меню. **Убедена съм, че това е липсващата част в пъзела на кариесите при хората с множествен кариес.** - * Витамин Д: Слънчевият витамин! Ако живеете някъде на тропиците и всекидневно ви огрява силно слънце, най-вероятно имате достатъчно витамин Д. Ако обаче сте далеч от Екватора, то **нивата на този важен витамин-хормон се нуждаят от оптимизиране**, особено през зимата. В [България](http://www.bb-team.org/articles/4614_ednogodishen-eksperiment-s-vitamin-d) можем да постигнем добро ниво на витамин Д от май до септември и то ако ежедневно се излагаме на слънце за 2-3 часа по оскъдно облекло. Т.е. суплементирайте с витамин Д почти целогодишно. За предпочитане е да си набавите Д3, а не Д2 форма. - * Витамин А: Да, витамин А е най-ценната съставка на оранжевите моркови или сладките картофи. Обаче при тях получаваме **бета-каротен, а нашите тела търсят витамин А (каротен)**. Повечето хора нямат проблем да превърнат провитамина във витамин, но при някои това не се случва, в това число **децата**, диабетно болни и хора с проблеми на щитовидната жлеза. Освен оранжевите плодове и зеленчуци, богат източник на витамин А са зеленолистните, яйчният жълтък, черният дроб, пълномаслено мляко. Тъй като витамин А е мастно-разтворим, винаги добавяйте [полезна мазнина](/blog/2014-04-08-%D0%B7%D0%B0%D1%89%D0%BE-%D0%BD%D0%B8%D0%BA%D0%BE%D0%B3%D0%B0-%D0%BD%D0%B5-%D1%82%D1%80%D1%8F%D0%B1%D0%B2%D0%B0-%D0%B4%D0%B0-%D1%8F%D0%B4%D0%B5%D1%82%D0%B5-%D0%BC%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D0%BD/) към салатите. - -2. Как да предпазите зъбите си от киселинни атаки. Ако четете блогове и статии за здравословно хранене, със сигурност сте запознати със **благотворното влияние на ферментиралите храни върху човешкото здраве**. И то безспорно е такова, но има едно "но". Ако след хранене с ферментирали, кисели храни имате чувствителност в зъбите, то значи че те са подложени на ерозивното действие на киселината. -Друга киселинна атака идва от прясно изцедените плодови сокове, особено тези, които съдържат цитрусови плодове, ябълки, грозде. Защо фрешовете не са най-добрият избор може да прочетете [тук](/blog/2014-04-02-%D1%82%D1%80%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%BA%D0%BE%D0%B8%D1%82%D0%BE-%D1%81%D0%B5-%D0%B7%D0%B0%D0%B1%D0%BB%D1%83%D0%B6%D0%B4%D0%B0%D0%B2%D0%B0%D1%82%D0%B5-%D1%87%D0%B5-%D1%81%D0%B0-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%B8/). Ако все пак това е важна част от диетата ви, която не може да бъде изключена, следвайте тези правила: - * Пийте киселата напитка през **сламка** и възможно най-бързо. - * След киселинно хранене **изплакнете устата си** с разтвор от половин лъжичка сода за хляб в половин чаша вода. Содата неутрализира остантъчната киселинност в устата. - * **Не мийте зъбите си** поне 1 час след прием на кисела напитка или храна. Обяснявам: преди слюнката да е извършила своето реминерализиращо действие върху зъбите, емайлът е крехък заради киселинната баня в който е бил току-що. Ако започнете да четкате зъбите, докато балансът не се е възстановил, вие ще нараните допълнително крехкият емайл. Получават се микропукнатини и микроскопични кариеси, особено на местата, където емайлът е на тънък слой: около пломби, при резците, около зъбната шийка (до венеца). - -3. Не забравяйте **хигиената**. Въпреки, че се храните с подбрани продукти, без замърсявания и химикали не забравяйте редовната хигиена. Ежедневното изчеткване на зъбите с [подходяща четка и паста](/blog/2014-02-19-%D0%BA%D0%BE%D0%B8-%D1%81%D0%B0-%D0%BD%D0%B0%D0%B8%CC%86-%D0%B4%D0%BE%D0%B1%D1%80%D0%B8%D1%82%D0%B5-%D1%87%D0%B5%D1%82%D0%BA%D0%B0-%D0%B8-%D0%BF%D0%B0%D1%81%D1%82%D0%B0-%D0%B7%D0%B0-%D0%B7%D1%8A%D0%B1%D0%B8/) е задължително. Както и ежедневното почистване на междузъбните пространства с **конец за зъби**. Ако се храните изключително със сурова храна, не забравяйте да посещавате редовно своят стоматолог. Нека той ви препоръча подходящи средства за хигиена, за да се предотврати изтриването на зъбите, което е често срещано при такъв тип хранене. - -Съвременната наука се развива непрекъснато и вече лечението на кариеса не е свързано само с **болезнени посещения при зъболекаря**. Бъдете информирани за избора, който правите относно здравето си и винаги изисквайте най-доброто за себе си и децата си! - -За да завърша днешната история ще ви разкажа какво се случи с кариесите на Мария: **След шест месеца, тя има четири нови пломби, а останалите дванадесет спряха развитието си и се очаква зъбите да се възстановят напълно**. И Мария си върна усмивката, само защото спазваше съветите, които споделих и с вас днес! ;T; -I"1

    Днес искам да ви разкажа една история. Главен герой в нея е (да я наречем) Мария.

    - -

    Мария е на 26 години, образована жена, с многостранни интереси. Тя също така държи на здравето си и веднъж годишно ходи на профилактичен преглед при зъболекаря си. На 25 години тя има 2 пломби, поставени в детските й години. Не пуши, не пие газирано и не яде вредна храна. Отвреме-навреме си позволява по малко шоколад и чаша алкохол. Спортува редовно. Общото и здравословно състояние е чудесно. Зъбите и венците й са в перфектно състояние.

    - -

    През последните 12 месеца Мария решава да промени драстично начина си на живот и да започне да се храни само със сурова храна, като изключи също така всички животински продукти. Менюто и се състои само от плодове, зеленчуци, ядки, растителни мазнини и няколко вида водорасли и т.нар. суперхрани. Плодовите фрешове и смутита често заменят твърдата храна.

    - -

    И какво мислите установява зъболекаря след една година? Шестнадесет (Да! 16!!) кариеса!!

    - -

    Няма да осъждам избора на Мария да се храни според своите разбирания.

    - -

    Няма да чета лекции колко е полезно или вредно здравословното хранене.

    - -

    Няма да ви развивам научни теории защо са се получили тези кариеси.

    - -

    Искам само да ви дам няколко практически съвета как да подобрите състоянието на зъбите си, ако храната ви изключва една или няколко групи храни или страдате от множествени кариеси без ясно видима причина.

    - -
      -
    1. -Голямото трио - Витамин Д, витамин К2 и витамин А -Калцият е Супермен за вашите зъби. Но той не може да дойде и да изиграе своята роля да поправя и заздравява емайла и дентина, ако организмът не може да го складира на правилните места. Витамин К2 кара Калция от храната да се връща към зъбите. Витамин Д подобрява абсорбцията на Калций в червата. Витамин А участва във формирането на костите и зъбите. Това са трите витамина, които работят в защита на вашите зъби от кариес. А комбинирани заедно техният ефект е толкова голям, че могат да възстановят вече налични кариеси и емайлови изтривания. -
        -
      • Витамин К2: този малко известен (дори на лекарите) особняк е трудно да си набавите, ако сте на веганска диета, въпреки че най-богатата храна е вид ферментирала соя - натто, до която, ако имате достъп - нямате проблем. Ако не сте фенове на соята обаче може да си набавите К2 от твърди и меки високомаслени сирена, особено ако са от сурово мляко. Други източници са органни меса, яйчният жълтък и рибен хайвер. Ако и вие като мен не обичате хапчета, но по някаква причина не можете да си осигурите този витамин с храната, то нямате друг избор освен да добавите една таблетка към дневното меню. Убедена съм, че това е липсващата част в пъзела на кариесите при хората с множествен кариес. -
      • -
      • Витамин Д: Слънчевият витамин! Ако живеете някъде на тропиците и всекидневно ви огрява силно слънце, най-вероятно имате достатъчно витамин Д. Ако обаче сте далеч от Екватора, то нивата на този важен витамин-хормон се нуждаят от оптимизиране, особено през зимата. В България можем да постигнем добро ниво на витамин Д от май до септември и то ако ежедневно се излагаме на слънце за 2-3 часа по оскъдно облекло. Т.е. суплементирайте с витамин Д почти целогодишно. За предпочитане е да си набавите Д3, а не Д2 форма.
      • -
      • Витамин А: Да, витамин А е най-ценната съставка на оранжевите моркови или сладките картофи. Обаче при тях получаваме бета-каротен, а нашите тела търсят витамин А (каротен). Повечето хора нямат проблем да превърнат провитамина във витамин, но при някои това не се случва, в това число децата, диабетно болни и хора с проблеми на щитовидната жлеза. Освен оранжевите плодове и зеленчуци, богат източник на витамин А са зеленолистните, яйчният жълтък, черният дроб, пълномаслено мляко. Тъй като витамин А е мастно-разтворим, винаги добавяйте полезна мазнина към салатите.
      • -
      -
    2. -
    3. Как да предпазите зъбите си от киселинни атаки. Ако четете блогове и статии за здравословно хранене, със сигурност сте запознати със благотворното влияние на ферментиралите храни върху човешкото здраве. И то безспорно е такова, но има едно “но”. Ако след хранене с ферментирали, кисели храни имате чувствителност в зъбите, то значи че те са подложени на ерозивното действие на киселината. -Друга киселинна атака идва от прясно изцедените плодови сокове, особено тези, които съдържат цитрусови плодове, ябълки, грозде. Защо фрешовете не са най-добрият избор може да прочетете тук. Ако все пак това е важна част от диетата ви, която не може да бъде изключена, следвайте тези правила: -
        -
      • Пийте киселата напитка през сламка и възможно най-бързо.
      • -
      • След киселинно хранене изплакнете устата си с разтвор от половин лъжичка сода за хляб в половин чаша вода. Содата неутрализира остантъчната киселинност в устата.
      • -
      • -Не мийте зъбите си поне 1 час след прием на кисела напитка или храна. Обяснявам: преди слюнката да е извършила своето реминерализиращо действие върху зъбите, емайлът е крехък заради киселинната баня в който е бил току-що. Ако започнете да четкате зъбите, докато балансът не се е възстановил, вие ще нараните допълнително крехкият емайл. Получават се микропукнатини и микроскопични кариеси, особено на местата, където емайлът е на тънък слой: около пломби, при резците, около зъбната шийка (до венеца).
      • -
      -
    4. -
    5. Не забравяйте хигиената. Въпреки, че се храните с подбрани продукти, без замърсявания и химикали не забравяйте редовната хигиена. Ежедневното изчеткване на зъбите с подходяща четка и паста е задължително. Както и ежедневното почистване на междузъбните пространства с конец за зъби. Ако се храните изключително със сурова храна, не забравяйте да посещавате редовно своят стоматолог. Нека той ви препоръча подходящи средства за хигиена, за да се предотврати изтриването на зъбите, което е често срещано при такъв тип хранене.
    6. -
    - -

    Съвременната наука се развива непрекъснато и вече лечението на кариеса не е свързано само с болезнени посещения при зъболекаря. Бъдете информирани за избора, който правите относно здравето си и винаги изисквайте най-доброто за себе си и децата си!

    - -

    За да завърша днешната история ще ви разкажа какво се случи с кариесите на Мария: След шест месеца, тя има четири нови пломби, а останалите дванадесет спряха развитието си и се очаква зъбите да се възстановят напълно. И Мария си върна усмивката, само защото спазваше съветите, които споделих и с вас днес!

    -;T; @I"P/blog/2014-06-07-Храната-като-лекарство-Маслото/;T{;{ ;I"G - - - - - - - Храната като лекарство: Маслото - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Храната като лекарство: Маслото -

    - -
    -
      -
    • - - June 7, 2014 -
    • -
    -
    - - -

    Ако искате крепко здраве и дълголетие, то яжте редовно масло! Наистина.. то е добро за вас и от него не се пълнее.

    - -
      -
    1. -

      Маслото е “пакетирано” с много важни и ценни витамини: витамин А, витамин Д и витамин К се откриват в големи количества в истинското масло. За тяхната роля относно здравето съм писала тук, тук и тук. И все пак ще повторя: Витамин А е ключов фактор при изграждането на костите и зъбите, нервната тъкан и очите. В маслото той се намира в най-лесната за усвояване от човека форма: ретинол. Витамин А, който се намира в оранжевите зеленчуци или се приема като синтетична добавка е бета-каротен. Той лесно се превръща в каротен от възрастни здрави индивиди. Но при деца, хора с диабет, тиреоидни проблеми, жлъчни заболявания или хранене бедно на мазнини това е невъзможно. За тях е задължителен приемът на витамин А от истински храни: масло, жълтък, черен дроб. -Витамин Д е всъщност хормон, който има влияние върху цялостното здраве и работи в комбинация с витамин А. Той подпомага абсорбцията му и предотвратява предозирането му. Най-добрият източник на витамин Д е слънцето, но често хората не могат да си набавят достатъчно чрез него. Една от най-честите причини за недостиг на витамин Д се среща при хора на нискомазнинно хранене и/или диета без животински продукти. -Витамин К Ако си спомняте в проучванията на Д-р Уестън Прайс се споменаваше “вълшебната” съставка, която предпазва от кариес и лекува вече налични такива. Той го нарича Активатор Х. Истината е, че това е витамин К2. Най-добрият източник на този витамин е масло, направено от млякото на крави, хранени само на паша. Такова масло е изключително ценна храна, която трябва да присъства ежедневно в храната на децата и на цялото семейство.

      -
    2. -
    3. -

      Маслото има здравословни ползи за вашето тяло. Маслото е най-богатият източник на линолеова киселина (CLA) и бутирова киселина. Тези мастни киселини имат доказан противораков ефект при рак на гърдата и тумори в млечните жлези, антивъзпалително действие в стомаха и червата и имат стимулиращ ефект върху имунитета на бързорастящия и развиващ се организъм при децата.

      -
    4. -
    5. -

      От маслото НЕ се пълнее! То е източник на късоверижни и средноверижни мастни киселини, чиито молекули не се откриват никъде в складираната мастна тъкан в тялото. Всъщност тези мазнини имат важна роля в поддържането на теглото и контролът на апетита. -Първо, мазнината стимулира освобождаването на жлъчна течност, която подпомага усвояването на витамините от храната, елиминира токсините и изхвърля остарелите хормони извън тялото. -Друг полезен ефект е, че мастните киселини от маслото забавят повишаването на кръвната захар и по този начин създават усещане за ситост, което се запазва по-дълго. Дори при прием на захар и други бързо усвоими въглехидрати (хляб, сладкиши), комбинацията им с масло стабилизира кръвната захар и човек няма онова чувство, че трябва да “похапне нещо сладичко” след основното хранене. И все пак това е доста неблагоприятна комбинация, от гледна точка на храносмилането, така че не я използвайте често. Това което трябва да правите, е да се храните с повече мазнини и достатъчно протеини. По този начин тялото ви няма да усеща глад дълго време, а така можете да контролирате приема на храна и да намалите излишното си тегло.

      -
    6. -
    - -

    Ами холестерола?

    -

    Спомняте ли си изследването на Ансел Кийс от 1950г, което анатемосва животинските мазнини и пропагандира зърнените култури и растителните мазнини? Е, вече неколкократно е доказано, че неговата хипотеза, че сърдечно-съдовите заболявания се причиняват от консумацията на холестерол е грешна! Новите проучвания доказват, че нискомазнинното хранене повишава триглицеридите, и намалява HDL холестеролът, а вие със сигурност не искате това, повярвайте ми! Ниските нива на холестерола се свързват с много заболявания сред които:

    - -
      -
    • -

      по-висока смъртност 1, 2, 3

      -
    • -
    • -

      повишен риск от депресии 4, 5

      -
    • -
    • -

      повишен риск от насилствено поведение и суицидни действия 6, 7

      -
    • -
    • -

      повишен риск от деменция и болест на Алцхаймер 8, 9

      -
    • -
    - -

    Популярен е мита, че HDL холестеролът е добър, а LDL холестеролът е лош. Всъщност един подвид на LDL холестеролът е този, който наранява артериите и в последствие по тях полепват плаки и токсини. Това са малки и плътни частици холестерол. Те се превръщат в безопасните големи и пухкави частици LDL холестерол, когато се консумират полезни наситени мазнини като яйца, масло, кокосово масло и предпазват от инфаркт. Ето още интересна информация по темата.

    - -

    Е, убедихте ли се, че маслото е суперхрана? Надявам се тази статия да ви е била интересна и полезна. Съветвам ви винаги да избирате висококачествено масло, направено от млякото на крави, отглеждани на паша. Такова масло е безценен продукт, който трябва да присъства ежедневно на трапезата ви!

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"%)###Ако искате крепко здраве и дълголетие, то яжте редовно масло! Наистина.. то е добро за вас и от него не се пълнее. - -1. **Маслото е "пакетирано" с много важни и ценни витамини**: витамин А, витамин Д и витамин К се откриват в големи количества в истинското масло. За тяхната роля относно здравето съм писала [тук](/blog/2014-03-17-%D0%B2%D0%B8%D1%82%D0%B0%D0%BC%D0%B8%D0%BD%D0%B8/), [тук](/blog/2014-02-24-%D0%B2%D0%B8%D0%B6%D1%82%D0%B5-%D1%82%D0%B0%D0%B8%CC%86%D0%BD%D0%B0%D1%82%D0%B0-%D0%B7%D0%B0-%D0%BF%D0%B5%D1%80%D1%84%D0%B5%D0%BA%D1%82%D0%BD%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8/) и [тук](/blog/2014-06-02-%D0%BA%D0%B0%D0%BA-%D0%BC%D0%B0%D1%80%D0%B8%D1%8F-%D1%81%D0%B8-%D0%B2%D1%8A%D1%80%D0%BD%D0%B0-%D1%83%D1%81%D0%BC%D0%B8%D0%B2%D0%BA%D0%B0%D1%82%D0%B0/). И все пак ще повторя: **Витамин А** е ключов фактор при изграждането на костите и зъбите, нервната тъкан и очите. В маслото той се намира в най-лесната за усвояване от човека форма: ретинол. Витамин А, който се намира в оранжевите зеленчуци или се приема като синтетична добавка е бета-каротен. Той лесно се превръща в каротен от възрастни здрави индивиди. Но при деца, хора с диабет, тиреоидни проблеми, жлъчни заболявания или хранене бедно на мазнини това е невъзможно. За тях е задължителен приемът на витамин А от истински храни: масло, жълтък, черен дроб. -**Витамин Д** е всъщност хормон, който има влияние върху цялостното здраве и работи в комбинация с витамин А. Той подпомага абсорбцията му и предотвратява предозирането му. Най-добрият източник на витамин Д е слънцето, но често хората не могат да си набавят достатъчно чрез него. Една от най-честите причини за недостиг на витамин Д се среща при хора на нискомазнинно хранене и/или диета без животински продукти. -**Витамин К** Ако си спомняте в проучванията на [Д-р Уестън](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/) [Прайс](/blog/2014-03-03-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-2/) се споменаваше "вълшебната" съставка, която предпазва от кариес и лекува вече налични такива. Той го нарича Активатор Х. Истината е, че това е витамин К2. Най-добрият източник на този витамин е масло, направено от млякото на крави, хранени само на паша. Такова масло е изключително ценна храна, която трябва да присъства ежедневно в храната на децата и на цялото семейство. - -2. **Маслото има здравословни ползи за вашето тяло**. Маслото е най-богатият източник на линолеова киселина (CLA) и бутирова киселина. Тези мастни киселини имат доказан [противораков](http://jn.nutrition.org/content/127/6/1055.short?related-urls=yes&legid=nutrition;127/6/1055) [ефект](http://ar.iiarjournals.org/content/26/1A/27.long) при [рак на гърдата](http://link.springer.com/article/10.1007%2Fs11745-009-3288-4) и [тумори в млечните жлези](http://www.ncbi.nlm.nih.gov/pubmed/10386321), [антивъзпалително](http://www.ncbi.nlm.nih.gov/pubmed/11989838) [действие](http://www.fasebj.org/content/early/2000/12/02/fj.00-0359fje.long) в стомаха и червата и имат стимулиращ ефект върху имунитета на бързорастящия и развиващ се организъм при децата. - -3. **От маслото НЕ се пълнее!** То е източник на късоверижни и средноверижни мастни киселини, чиито молекули не се откриват никъде в складираната мастна тъкан в тялото. Всъщност тези мазнини имат важна роля в поддържането на теглото и контролът на апетита. -Първо, мазнината стимулира освобождаването на жлъчна течност, която подпомага усвояването на витамините от храната, елиминира токсините и изхвърля остарелите хормони извън тялото. -Друг полезен ефект е, че мастните киселини от маслото забавят повишаването на кръвната захар и по този начин създават усещане за ситост, което се запазва по-дълго. Дори при прием на захар и други бързо усвоими въглехидрати (хляб, сладкиши), комбинацията им с масло стабилизира кръвната захар и човек няма онова чувство, че трябва да "похапне нещо сладичко" след основното хранене. И все пак това е доста неблагоприятна комбинация, от гледна точка на храносмилането, така че не я използвайте често. Това което трябва да правите, е да се храните с повече мазнини и достатъчно протеини. По този начин тялото ви няма да усеща глад дълго време, а така можете да контролирате приема на храна и да намалите излишното си тегло. - -####Ами холестерола? -Спомняте ли си [изследването на Ансел Кийс](/blog/2014-03-26-%D0%B2%D0%B5%D0%B3%D0%B5%D1%82%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D1%8F%D1%82-%D0%BC%D0%B8%D1%82/) от 1950г, което анатемосва животинските мазнини и пропагандира зърнените култури и растителните мазнини? Е, вече неколкократно е доказано, че неговата хипотеза, че сърдечно-съдовите заболявания се причиняват от консумацията на холестерол е грешна! Новите проучвания доказват, че нискомазнинното хранене [повишава триглицеридите](http://www.jci.org/articles/view/6572), и [намалява HDL холестеролът](http://www.ncbi.nlm.nih.gov/pmc/articles/PMC296399/), а вие със сигурност не искате това, повярвайте ми! Ниските нива на холестерола се свързват с много заболявания сред които: - -* по-висока смъртност [1](http://www.sciencedirect.com/science/article/pii/S0022395608002525), [2](http://www.ncbi.nlm.nih.gov/pubmed/21951982), [3](http://www.amjmed.com/article/S0002-934300354-1/abstract) - -* повишен риск от депресии [4](psychosomaticmedicine), [5](http://www.sciencedirect.com/science/article/pii/0140673693925569) - -* повишен риск от насилствено поведение и суицидни действия [6](http://www.psychologytoday.com/blog/the-breakthrough-depression-solution/201106/low-cholesterol-and-its-psychological-effects), [7](http://www.ncbi.nlm.nih.gov/pubmed/11104842) - -* повишен риск от деменция и болест на Алцхаймер [8](http://www.neurology.org/content/64/10/1689.abstract), [9](http://people.csail.mit.edu/seneff/EJIM_PUBLISHED.pdf) - -Популярен е мита, че HDL холестеролът е добър, а LDL холестеролът е лош. Всъщност един подвид на LDL холестеролът е този, който наранява артериите и в последствие по тях полепват плаки и токсини. Това са малки и плътни частици холестерол. Те се превръщат в безопасните големи и пухкави частици LDL холестерол, когато се консумират полезни наситени мазнини като яйца, масло, кокосово масло и предпазват от инфаркт. [Ето](http://authoritynutrition.com/top-9-biggest-lies-about-dietary-fat-and-cholesterol/) още интересна информация по темата. - -Е, убедихте ли се, че маслото е суперхрана? Надявам се тази статия да ви е била интересна и полезна. Съветвам ви винаги да избирате висококачествено масло, направено от млякото на крави, отглеждани на паша. Такова масло е безценен продукт, който трябва да присъства ежедневно на трапезата ви!;T; -I"{+

    Ако искате крепко здраве и дълголетие, то яжте редовно масло! Наистина.. то е добро за вас и от него не се пълнее.

    - -
      -
    1. -

      Маслото е “пакетирано” с много важни и ценни витамини: витамин А, витамин Д и витамин К се откриват в големи количества в истинското масло. За тяхната роля относно здравето съм писала тук, тук и тук. И все пак ще повторя: Витамин А е ключов фактор при изграждането на костите и зъбите, нервната тъкан и очите. В маслото той се намира в най-лесната за усвояване от човека форма: ретинол. Витамин А, който се намира в оранжевите зеленчуци или се приема като синтетична добавка е бета-каротен. Той лесно се превръща в каротен от възрастни здрави индивиди. Но при деца, хора с диабет, тиреоидни проблеми, жлъчни заболявания или хранене бедно на мазнини това е невъзможно. За тях е задължителен приемът на витамин А от истински храни: масло, жълтък, черен дроб. -Витамин Д е всъщност хормон, който има влияние върху цялостното здраве и работи в комбинация с витамин А. Той подпомага абсорбцията му и предотвратява предозирането му. Най-добрият източник на витамин Д е слънцето, но често хората не могат да си набавят достатъчно чрез него. Една от най-честите причини за недостиг на витамин Д се среща при хора на нискомазнинно хранене и/или диета без животински продукти. -Витамин К Ако си спомняте в проучванията на Д-р Уестън Прайс се споменаваше “вълшебната” съставка, която предпазва от кариес и лекува вече налични такива. Той го нарича Активатор Х. Истината е, че това е витамин К2. Най-добрият източник на този витамин е масло, направено от млякото на крави, хранени само на паша. Такова масло е изключително ценна храна, която трябва да присъства ежедневно в храната на децата и на цялото семейство.

      -
    2. -
    3. -

      Маслото има здравословни ползи за вашето тяло. Маслото е най-богатият източник на линолеова киселина (CLA) и бутирова киселина. Тези мастни киселини имат доказан противораков ефект при рак на гърдата и тумори в млечните жлези, антивъзпалително действие в стомаха и червата и имат стимулиращ ефект върху имунитета на бързорастящия и развиващ се организъм при децата.

      -
    4. -
    5. -

      От маслото НЕ се пълнее! То е източник на късоверижни и средноверижни мастни киселини, чиито молекули не се откриват никъде в складираната мастна тъкан в тялото. Всъщност тези мазнини имат важна роля в поддържането на теглото и контролът на апетита. -Първо, мазнината стимулира освобождаването на жлъчна течност, която подпомага усвояването на витамините от храната, елиминира токсините и изхвърля остарелите хормони извън тялото. -Друг полезен ефект е, че мастните киселини от маслото забавят повишаването на кръвната захар и по този начин създават усещане за ситост, което се запазва по-дълго. Дори при прием на захар и други бързо усвоими въглехидрати (хляб, сладкиши), комбинацията им с масло стабилизира кръвната захар и човек няма онова чувство, че трябва да “похапне нещо сладичко” след основното хранене. И все пак това е доста неблагоприятна комбинация, от гледна точка на храносмилането, така че не я използвайте често. Това което трябва да правите, е да се храните с повече мазнини и достатъчно протеини. По този начин тялото ви няма да усеща глад дълго време, а така можете да контролирате приема на храна и да намалите излишното си тегло.

      -
    6. -
    - -

    Ами холестерола?

    -

    Спомняте ли си изследването на Ансел Кийс от 1950г, което анатемосва животинските мазнини и пропагандира зърнените култури и растителните мазнини? Е, вече неколкократно е доказано, че неговата хипотеза, че сърдечно-съдовите заболявания се причиняват от консумацията на холестерол е грешна! Новите проучвания доказват, че нискомазнинното хранене повишава триглицеридите, и намалява HDL холестеролът, а вие със сигурност не искате това, повярвайте ми! Ниските нива на холестерола се свързват с много заболявания сред които:

    - -
      -
    • -

      по-висока смъртност 1, 2, 3

      -
    • -
    • -

      повишен риск от депресии 4, 5

      -
    • -
    • -

      повишен риск от насилствено поведение и суицидни действия 6, 7

      -
    • -
    • -

      повишен риск от деменция и болест на Алцхаймер 8, 9

      -
    • -
    - -

    Популярен е мита, че HDL холестеролът е добър, а LDL холестеролът е лош. Всъщност един подвид на LDL холестеролът е този, който наранява артериите и в последствие по тях полепват плаки и токсини. Това са малки и плътни частици холестерол. Те се превръщат в безопасните големи и пухкави частици LDL холестерол, когато се консумират полезни наситени мазнини като яйца, масло, кокосово масло и предпазват от инфаркт. Ето още интересна информация по темата.

    - -

    Е, убедихте ли се, че маслото е суперхрана? Надявам се тази статия да ви е била интересна и полезна. Съветвам ви винаги да избирате висококачествено масло, направено от млякото на крави, отглеждани на паша. Такова масло е безценен продукт, който трябва да присъства ежедневно на трапезата ви!

    -;T; @I"Y/blog/2014-06-15-как-да-се-откажем-от-вредните-навици/;T{;{ ;I"A - - - - - - - Как да се откажем от вредните навици? - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Как да се откажем от вредните навици? -

    - -
    -
      -
    • - - June 15, 2014 -
    • -
    -
    - - -

    Случвало ли ви се е някога да решите да се откажете от някой вреден навик и да се провалите? На мен да! И съм сигурна, че на много от вас също!

    - -

    Но защо се получава така? Нали осъзнато решаваме, че нещо е вредно за нас, че не се нуждаем от него в живота си ни и носи само негативи… и все пак е толкова трудно да спрем, да изкореним гадния навик да пушим, да си лягаме късно, да ядем чипс и т.н.

    - -

    Това се случва, защото отказвайки се от нещото, вие се обричате на провал!

    - -

    За да се откажете от нещо и да нямате нужда от него в ежедневието си се налага да мобилизирате цялата си воля, а това е бързо изчерпаем ресурс. Знаете какво се случва: всеки път когато отворите хладилника виждате бутилката с Кола и се изискват сериозни усилия да не си налеете една чаша, както е било до вчера. Опитвате се да се разсеете с нещо, но след час отново стигате до хладилника и Колата пак е там… и волята ви вече не е толкова силна.

    - -

    За да премахнете един лош навик не трябва да се опитвате да СПРЕТЕ да го правите, а трябва да го ЗАМЕНИТЕ с нещо полезно.

    - -

    Ето как да премахнете три вредни навика и да ги замените с полезни:

    - -

    1.Да спрете вредните газирани напитки от типа на Кока-Кола

    - -

    Тези от вас, които ме познават сигурно си спомнят, че до преди 3 години аз не се разделях с бутилката диетична кола. За тези, които не ме познават обяснявам: пиех литри кола на ден. С диетичната кола се изчерпваха всички течности, които приемах за деня. Тя беше напитка, служеше ми и за десерт, пиех кола преди лягане, след ставане, по всяко време. Трябва да призная, че неколкократно съм правила опити да я спра, но след максимум няколко седмици се връщах към вредния навик и наваксвах и за пропуснатите дни. Защо се получаваше така? Защото решавах, че ще спра колата и ще пия само вода. Е, колкото и благородно да звучи пиенето само на чиста вода, след като си свикнал със сладкия, газиран вкус… ами просто не се получава. Затова замених колата с газирана вода с парче лимон или лайм, изстуден плодов или билков чай, в по-студеното време топъл чай, например ройбос или мента. Така напитката все пак има вкус, без да е пълна с вредности като подсладители, оцветители и хиляда Е-та. Дори на заведение можете да си поръчате всички тези здравословни напитки, които по никакъв начин няма да ви отнемат нещо от приятното изкарване с приятели.

    - -

    2.Да спрете да похапвате между другото чипс, бисквити, бонбони

    - -

    Да спрете вредната боклучава храна е страхотна идея, но тя няма да бъде успешно реализирана, ако не си направите план! -Ако имате навика да похапвате чипс или солети между храненията, първо трябва да помислите защо имате тази нужда. -Възможно ли е основното ви хранене да не е достатъчно засищащо и скоро след това да изпитвате глад и да посягате към вредната храна в лъскава опаковка? Ако се опитвате да спазвате някакъв режим или да ограничавате калориите в основните хранения, от изключителна важност е да преценявате добре количеството и качеството на нутриентите си, защото ако се лишавате от протеини или мазнини тялото ви ще се опита да си навакса. Тогава идва момента на умопомрачение, в който унищожавате цял шоколад за 10 минути и се чувствате виновни… и все още гладни! -Ако пък похапвате от скука пред телевизора или пред компютъра, то значи правите това неосъзнато. За да коригирате този лош навик трябва да положите усилие и да подбирате храната по-внимателно.

    - -

    За преходният период между похапването на джънк и премахването му от вашето ежедневие трябва да намерите здравословен заместител. Например морков, нарязан на пръчици, стъбла целина, сурови ядки (не прекалявайте с тях), резенчета зелена ябълка, лентички от разноцветни чушки или дори можете да си направите домашни соленки от семена и подправки по ваш вкус.

    - -

    3.Да спрете да се успивате сутрин.

    - -

    Да ставате винаги в последната минута и да бързате за работа всяка сутрин е много стресиращ навик. Но как да промените това? Как да се научите да ставате на време и денят ви да започва с усмивка на лицето? Лесно е: трябва да си лягате на време. -Да, знам, че е трудно да оставиш по средата интересният филм или книга и да легнеш да спиш. Още по-трудно е да зарежеш по средата прането за гладене или проекта, чийто краен срок е утре. Ето какво можете да направите: Навийте си аларма, която да ви сигнализира, че трябва да си лягате. Ключовият момент е да оставите 30-45 мин толеранс до момента в който трябва да си миете зъбите и да сте на път към леглото. Ако навиете алармата за часа в който вече се предполага, че трябва да сте легнали и реално не успеете да го спазите това ще ви изнерви и ще зарежете цялата схема. За това оставете този интервал, в който спокойно можете да приключите деня си и същевременно да си легнете на време.

    - -

    Ако все пак не успеете да се вместите в този интервал, тук можете да изчислите в колко часа трябва да си легнете, за да се събудите свежи и отпочинали, в синхрон с циклите на почивка и работа на мозъка. Аз го ползвам понякога и според мен работи успешно.

    - -

    В заключение: природата не търпи вакуум! За да преустановите един навик, той трябва да бъде заменен с друг. Иначе сте обречени на провал. Ако искате да успеете ви трябва план!

    - -

    Вие с кой вреден навик сте се преборили? Как? Напишете ми в коментар.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"$Случвало ли ви се е някога да решите да се откажете от някой вреден навик и да се провалите? На мен да! И съм сигурна, че на много от вас също! - -Но защо се получава така? Нали осъзнато решаваме, че нещо е вредно за нас, че не се нуждаем от него в живота си ни и носи само негативи... и все пак е толкова трудно да спрем, да изкореним гадния навик да пушим, да си лягаме късно, да ядем чипс и т.н. - -Това се случва, защото отказвайки се от нещото, вие се обричате на провал! - -За да се откажете от нещо и да нямате нужда от него в ежедневието си се налага да мобилизирате цялата си воля, а това е бързо изчерпаем ресурс. Знаете какво се случва: всеки път когато отворите хладилника виждате бутилката с Кола и се изискват сериозни усилия да не си налеете една чаша, както е било до вчера. Опитвате се да се разсеете с нещо, но след час отново стигате до хладилника и Колата пак е там... и волята ви вече не е толкова силна. - -За да премахнете един лош навик не трябва да се опитвате да СПРЕТЕ да го правите, а трябва да го ЗАМЕНИТЕ с нещо полезно. - -Ето как да премахнете три вредни навика и да ги замените с полезни: - -1.**Да спрете вредните газирани напитки** от типа на Кока-Кола - -Тези от вас, които ме познават сигурно си спомнят, че до преди 3 години аз не се разделях с бутилката диетична кола. За тези, които не ме познават обяснявам: пиех литри кола на ден. С диетичната кола се изчерпваха всички течности, които приемах за деня. Тя беше напитка, служеше ми и за десерт, пиех кола преди лягане, след ставане, по всяко време. Трябва да призная, че неколкократно съм правила опити да я спра, но след максимум няколко седмици се връщах към вредния навик и наваксвах и за пропуснатите дни. Защо се получаваше така? Защото решавах, че ще спра колата и ще пия само вода. Е, колкото и благородно да звучи пиенето само на чиста вода, след като си свикнал със сладкия, газиран вкус... ами просто не се получава. Затова замених колата с газирана вода с парче лимон или лайм, изстуден плодов или билков чай, в по-студеното време топъл чай, например ройбос или мента. Така напитката все пак има вкус, без да е пълна с вредности като подсладители, оцветители и хиляда Е-та. Дори на заведение можете да си поръчате всички тези здравословни напитки, които по никакъв начин няма да ви отнемат нещо от приятното изкарване с приятели. - -2.**Да спрете да похапвате между другото** чипс, бисквити, бонбони - -Да спрете вредната боклучава храна е страхотна идея, но тя няма да бъде успешно реализирана, ако не си направите план! -Ако имате навика да похапвате чипс или солети между храненията, първо трябва да помислите защо имате тази нужда. -Възможно ли е основното ви хранене да не е достатъчно засищащо и скоро след това да изпитвате глад и да посягате към вредната храна в лъскава опаковка? Ако се опитвате да спазвате някакъв режим или да ограничавате калориите в основните хранения, от изключителна важност е да преценявате добре количеството и качеството на нутриентите си, защото **ако се лишавате от протеини или мазнини тялото ви ще се опита да си навакса**. Тогава идва момента на умопомрачение, в който унищожавате цял шоколад за 10 минути и се чувствате виновни... и все още гладни! -Ако пък похапвате от скука пред телевизора или пред компютъра, то значи правите това неосъзнато. За да коригирате този лош навик трябва да положите усилие и да подбирате храната по-внимателно. - -За преходният период между похапването на джънк и премахването му от вашето ежедневие трябва да намерите здравословен заместител. Например морков, нарязан на пръчици, стъбла целина, сурови ядки (не прекалявайте с тях), резенчета зелена ябълка, лентички от разноцветни чушки или дори можете да си направите домашни соленки от семена и подправки по ваш вкус. - -3.**Да спрете да се успивате** сутрин. - -Да ставате винаги в последната минута и да бързате за работа всяка сутрин е много стресиращ навик. Но как да промените това? Как да се научите да ставате на време и денят ви да започва с усмивка на лицето? Лесно е: трябва да си лягате на време. -Да, знам, че е трудно да оставиш по средата интересният филм или книга и да легнеш да спиш. Още по-трудно е да зарежеш по средата прането за гладене или проекта, чийто краен срок е утре. Ето какво можете да направите: Навийте си аларма, която да ви сигнализира, че трябва да си лягате. Ключовият момент е да оставите 30-45 мин толеранс до момента в който трябва да си миете зъбите и да сте на път към леглото. Ако навиете алармата за часа в който вече се предполага, че трябва да сте легнали и реално не успеете да го спазите това ще ви изнерви и ще зарежете цялата схема. За това оставете този интервал, в който спокойно можете да приключите деня си и същевременно да си легнете на време. - -Ако все пак не успеете да се вместите в този интервал, [тук](http://sleepyti.me/) можете да изчислите в колко часа трябва да си легнете, за да се събудите свежи и отпочинали, в синхрон с циклите на почивка и работа на мозъка. Аз го ползвам понякога и според мен работи успешно. - -В заключение: природата не търпи вакуум! За да преустановите един навик, той трябва да бъде заменен с друг. Иначе сте обречени на провал. **Ако искате да успеете ви трябва план!** - -Вие с кой вреден навик сте се преборили? Как? Напишете ми в коментар.;T; -I";%

    Случвало ли ви се е някога да решите да се откажете от някой вреден навик и да се провалите? На мен да! И съм сигурна, че на много от вас също!

    - -

    Но защо се получава така? Нали осъзнато решаваме, че нещо е вредно за нас, че не се нуждаем от него в живота си ни и носи само негативи… и все пак е толкова трудно да спрем, да изкореним гадния навик да пушим, да си лягаме късно, да ядем чипс и т.н.

    - -

    Това се случва, защото отказвайки се от нещото, вие се обричате на провал!

    - -

    За да се откажете от нещо и да нямате нужда от него в ежедневието си се налага да мобилизирате цялата си воля, а това е бързо изчерпаем ресурс. Знаете какво се случва: всеки път когато отворите хладилника виждате бутилката с Кола и се изискват сериозни усилия да не си налеете една чаша, както е било до вчера. Опитвате се да се разсеете с нещо, но след час отново стигате до хладилника и Колата пак е там… и волята ви вече не е толкова силна.

    - -

    За да премахнете един лош навик не трябва да се опитвате да СПРЕТЕ да го правите, а трябва да го ЗАМЕНИТЕ с нещо полезно.

    - -

    Ето как да премахнете три вредни навика и да ги замените с полезни:

    - -

    1.Да спрете вредните газирани напитки от типа на Кока-Кола

    - -

    Тези от вас, които ме познават сигурно си спомнят, че до преди 3 години аз не се разделях с бутилката диетична кола. За тези, които не ме познават обяснявам: пиех литри кола на ден. С диетичната кола се изчерпваха всички течности, които приемах за деня. Тя беше напитка, служеше ми и за десерт, пиех кола преди лягане, след ставане, по всяко време. Трябва да призная, че неколкократно съм правила опити да я спра, но след максимум няколко седмици се връщах към вредния навик и наваксвах и за пропуснатите дни. Защо се получаваше така? Защото решавах, че ще спра колата и ще пия само вода. Е, колкото и благородно да звучи пиенето само на чиста вода, след като си свикнал със сладкия, газиран вкус… ами просто не се получава. Затова замених колата с газирана вода с парче лимон или лайм, изстуден плодов или билков чай, в по-студеното време топъл чай, например ройбос или мента. Така напитката все пак има вкус, без да е пълна с вредности като подсладители, оцветители и хиляда Е-та. Дори на заведение можете да си поръчате всички тези здравословни напитки, които по никакъв начин няма да ви отнемат нещо от приятното изкарване с приятели.

    - -

    2.Да спрете да похапвате между другото чипс, бисквити, бонбони

    - -

    Да спрете вредната боклучава храна е страхотна идея, но тя няма да бъде успешно реализирана, ако не си направите план! -Ако имате навика да похапвате чипс или солети между храненията, първо трябва да помислите защо имате тази нужда. -Възможно ли е основното ви хранене да не е достатъчно засищащо и скоро след това да изпитвате глад и да посягате към вредната храна в лъскава опаковка? Ако се опитвате да спазвате някакъв режим или да ограничавате калориите в основните хранения, от изключителна важност е да преценявате добре количеството и качеството на нутриентите си, защото ако се лишавате от протеини или мазнини тялото ви ще се опита да си навакса. Тогава идва момента на умопомрачение, в който унищожавате цял шоколад за 10 минути и се чувствате виновни… и все още гладни! -Ако пък похапвате от скука пред телевизора или пред компютъра, то значи правите това неосъзнато. За да коригирате този лош навик трябва да положите усилие и да подбирате храната по-внимателно.

    - -

    За преходният период между похапването на джънк и премахването му от вашето ежедневие трябва да намерите здравословен заместител. Например морков, нарязан на пръчици, стъбла целина, сурови ядки (не прекалявайте с тях), резенчета зелена ябълка, лентички от разноцветни чушки или дори можете да си направите домашни соленки от семена и подправки по ваш вкус.

    - -

    3.Да спрете да се успивате сутрин.

    - -

    Да ставате винаги в последната минута и да бързате за работа всяка сутрин е много стресиращ навик. Но как да промените това? Как да се научите да ставате на време и денят ви да започва с усмивка на лицето? Лесно е: трябва да си лягате на време. -Да, знам, че е трудно да оставиш по средата интересният филм или книга и да легнеш да спиш. Още по-трудно е да зарежеш по средата прането за гладене или проекта, чийто краен срок е утре. Ето какво можете да направите: Навийте си аларма, която да ви сигнализира, че трябва да си лягате. Ключовият момент е да оставите 30-45 мин толеранс до момента в който трябва да си миете зъбите и да сте на път към леглото. Ако навиете алармата за часа в който вече се предполага, че трябва да сте легнали и реално не успеете да го спазите това ще ви изнерви и ще зарежете цялата схема. За това оставете този интервал, в който спокойно можете да приключите деня си и същевременно да си легнете на време.

    - -

    Ако все пак не успеете да се вместите в този интервал, тук можете да изчислите в колко часа трябва да си легнете, за да се събудите свежи и отпочинали, в синхрон с циклите на почивка и работа на мозъка. Аз го ползвам понякога и според мен работи успешно.

    - -

    В заключение: природата не търпи вакуум! За да преустановите един навик, той трябва да бъде заменен с друг. Иначе сте обречени на провал. Ако искате да успеете ви трябва план!

    - -

    Вие с кой вреден навик сте се преборили? Как? Напишете ми в коментар.

    -;T; @I"8/blog/2014-06-19-кафето-за-и-против/;T{;{ ;I"O= - - - - - - - Кафето: За и Против - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Кафето: За и Против -

    - -
    -
      -
    • - - June 19, 2014 -
    • -
    -
    - - -

    Любителите на кафе по света напоследък често имат поводи да се радват. Изследване след изследване доказват ползите за здравето от умерената консумация на кафе: предпазва от рак, предпазва от инсулт, предпазва от диабет, предпазва от развитие на сърдечно-съдови заболявания, за превенция от депресия, Алцхаймер, Паркинсон, бактериални инфекции, цироза и камъни в жлъчката. То подпомага горенето на мазнини и облекчава мускулната треска след тренировка! Има дори проучване, според което ако пиете кафе имате по-малка вероятност да умрете (независимо от причината). Т.е. кафето удължава живота ви!

    - -

    Ами не остава друго освен да вдигнем кафени чаши и да си кажем “Наздраве”, нали?

    - -

    Но да не бързаме толкова все пак…

    - -

    Всичко изброено може би е само причина да оправдаем зависимостта си към кафето. Вероятно знаете, че кофеинът има лек психотропен ефект върху мозъка. Ефектите като ободряване, подобряване на настроението, паметта и концентарцията се дължат на факта, че кофеинът блокира достъпа на инхибиращият (подтискащият мозъчната дейност) невротрансмитър Аденозин в мозъка, и по този начин другите два, които са стимулиращи мозъка - Норадреналин и Допамин увеличават концентрацията си. При ежедневен прием, обаче, тези ефекти намаляват и дори се изгубват, ако не се увеличи дозата на кофеина. За това кафето е една от най-разпространените пристрястяващи субстанции, използвана от хората днес.

    - -

    Друга причина в списъкът “Против” е, че зърната на кафето са семената на растението. Както всички семена и тези имат в състава си инхибитори и антинутриенти, чрез които те забавят покълването си и се защитават от животни, докато не попаднат на подходящо място, за да порастнат (топла и влажна почва). Тези антинутритенти попадат в червата и ги раздразват, а в последствие могат да доведат и до по-сериозни заболявания (синдром на пропускливите черва). Това разбира се се отнася не само за кафето и също от значение е честотата на консумацията му.

    - -

    Голям процент от хората се оплакват, че кафето разстройва стомаха им и/или създава киселини. Това е така, защото кафето стимулира освобождаването на хормона гастрин, който засилва секрецията на стомашен сок. Хормонът холецистокинин също се повишава и кара жлъчката да отделя повече жлъчна течност. В здрав индивид организмът бързо компенсира излишъците като забързва храносмилането, но прекалено честата консумация на кафе без да е придружено с храна води до хронично слабо възпаление на вътрешната повърхност на червата, заради киселият стомашен сок, който се излива там. По принцип той винаги е смесен с храна и не дразни лигавицата.

    - -

    Не може да подминем и факта, че пиенето на кафе влияе и върху изключително важният за здравето ни хормон - кортизол. Повишеният кортизол води до трудности със заспиването и неспокоен сън, лошо храносмилане и лошо настроение. При подобни редовни пикове на кортизола, човек се справя по-трудно със стресови ситуации, спрямо хора, които не пият кафе или пият само сутрин (ефектът върху кортизола спада за около 6 часа).

    - -

    Ако имате целиачна болест или чувствителност към глутен, трябва добре да преосмислите консумацията на кафе, тъй като то създава кръстосана реакция. Причината е в голямото подобие на някои от протеините в кафето с глутена. Ако здравето ви не се подобрява при изключване на глутена, то може би трябва да спрете и кафето като възможна причина за това.

    - -

    Много от ползите на кафето се приписват на голямото количество антиоксиданти и полифеноли в него. Разбира се тези вещества можете да намерите в много плодове и зеленчуци, без да са в комбинация с пристрястяващият ефект на кофеина. От друга страна безкофеиновото кафе се обработва така, че повечето от полезните вещества се изгубват.

    - -

    Да пиете кафе или не? Решението е ваше! Според мен ако сте напълно здрав и млад човек, нямате някое от гореизброените оплаквания, то можете да си позволявате по 1 чаша кафе веднъж на няколко дни, за да си набавите полезните ефекти от него. Но като цяло, кафето и кофеиновите напитки трябва да се употребяват с повишено внимание.

    - -

    Кафеено растение

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I" Любителите на кафе по света напоследък често имат поводи да се радват. [Изследване](http://www.zdrave.bg/?c=n&id=4192) [след](http://www.tialoto.bg/a/125-zdrave/1825-za-kakvo-e-polezno-kafeto/) [изследване](http://www.medicine.bg/novini/14-polezni-svoystva-na-kafeto) доказват ползите за здравето от умерената консумация на кафе: предпазва [от рак](http://onlinelibrary.wiley.com/doi/10.1002/ijc.20989/full), предпазва от [инсулт](http://aje.oxfordjournals.org/content/174/9/993.short), [предпазва](http://link.springer.com/article/10.1007%2Fs00125-009-1516-3) [от диабет](http://archinte.jamanetwork.com/article.aspx?articleid=773949), предпазва от развитие на [сърдечно-съдови заболявания](http://www.sciencedirect.com/science/article/pii/S0167527308008498), за превенция от [депресия](http://archinte.jamanetwork.com/article.aspx?articleid=1105943), [Алцхаймер](http://iospress.metapress.com/content/a423p6m256u26742/), [Паркинсон](http://jama.jamanetwork.com/article.aspx?articleid=192731), бактериални инфекции, цироза и камъни в жлъчката. То подпомага [горенето](http://ajcn.nutrition.org/content/79/1/40.full.pdf) [на мазнини](http://ajpendo.physiology.org/content/269/4/E671) и облекчава мускулната треска след тренировка! Има дори [проучване](http://annals.org/article.aspx?articleid=668690), според което ако пиете кафе имате по-малка вероятност да умрете (независимо от причината). Т.е. [кафето удължава живота](http://link.springer.com/article/10.1007%2Fs00125-006-0435-9?LI=true) ви! - -Ами не остава друго освен да вдигнем кафени чаши и да си кажем "Наздраве", нали? - -Но да не бързаме толкова все пак... - -Всичко изброено може би е само причина да оправдаем зависимостта си към кафето. Вероятно знаете, че [кофеинът](http://wikipedia.org/wiki/Caffeine) има лек **психотропен ефект върху мозъка**. Ефектите като ободряване, подобряване на настроението, паметта и концентарцията се дължат на факта, че кофеинът блокира достъпа на инхибиращият (подтискащият мозъчната дейност) невротрансмитър Аденозин в мозъка, и по този начин другите два, които са стимулиращи мозъка - Норадреналин и Допамин увеличават концентрацията си. При ежедневен прием, обаче, тези ефекти намаляват и дори се изгубват, ако не се увеличи **дозата на кофеина**. За това кафето е една от най-разпространените **пристрястяващи субстанции**, използвана от хората днес. - -Друга причина в списъкът "Против" е, че зърната на кафето са семената на растението. Както всички **семена** и тези имат в състава си **инхибитори и антинутриенти**, чрез които те забавят покълването си и се защитават от животни, докато не попаднат на подходящо място, за да порастнат (топла и влажна почва). Тези антинутритенти попадат в червата и ги раздразват, а в последствие могат да доведат и до по-сериозни заболявания (синдром на пропускливите черва). Това разбира се се отнася не само за кафето и също от значение е честотата на консумацията му. - -Голям процент от хората се оплакват, че кафето **разстройва стомаха** им и/или **създава киселини**. Това е така, защото кафето стимулира освобождаването на хормона гастрин, който засилва секрецията на стомашен сок. Хормонът холецистокинин също се повишава и кара жлъчката да отделя повече жлъчна течност. В здрав индивид организмът бързо компенсира излишъците като забързва храносмилането, но прекалено **честата консумация на кафе без да е придружено с храна** води до хронично слабо възпаление на вътрешната повърхност на червата, заради киселият стомашен сок, който се излива там. По принцип той винаги е смесен с храна и не дразни лигавицата. - -Не може да подминем и факта, че пиенето на кафе влияе и върху изключително важният за здравето ни хормон - **кортизол**. Повишеният кортизол води до трудности със заспиването и **неспокоен сън**, лошо храносмилане и лошо настроение. При подобни редовни пикове на кортизола, човек се справя по-трудно със **стресови ситуации**, спрямо хора, които не пият кафе или пият само сутрин (ефектът върху кортизола спада за около 6 часа). - -Ако имате целиачна болест или чувствителност към **глутен**, трябва добре да преосмислите консумацията на кафе, тъй като то създава кръстосана реакция. Причината е в голямото подобие на някои от протеините в кафето с глутена. Ако здравето ви не се подобрява при изключване на глутена, то може би трябва да спрете и кафето като възможна причина за това. - -Много от ползите на кафето се приписват на голямото количество **антиоксиданти** и **полифеноли** в него. Разбира се тези вещества можете да намерите в много плодове и зеленчуци, без да са в комбинация с пристрястяващият ефект на кофеина. От друга страна безкофеиновото кафе се обработва така, че повечето от полезните вещества се изгубват. - -Да пиете кафе или не? Решението е ваше! Според мен ако сте напълно здрав и млад човек, нямате някое от гореизброените оплаквания, то можете да си позволявате по 1 чаша кафе веднъж на няколко дни, за да си набавите полезните ефекти от него. Но като цяло, кафето и кофеиновите напитки трябва да се употребяват **с повишено внимание**. - -![Кафеено растение](/images/posts/Coffee.jpg);T; -I"v"

    Любителите на кафе по света напоследък често имат поводи да се радват. Изследване след изследване доказват ползите за здравето от умерената консумация на кафе: предпазва от рак, предпазва от инсулт, предпазва от диабет, предпазва от развитие на сърдечно-съдови заболявания, за превенция от депресия, Алцхаймер, Паркинсон, бактериални инфекции, цироза и камъни в жлъчката. То подпомага горенето на мазнини и облекчава мускулната треска след тренировка! Има дори проучване, според което ако пиете кафе имате по-малка вероятност да умрете (независимо от причината). Т.е. кафето удължава живота ви!

    - -

    Ами не остава друго освен да вдигнем кафени чаши и да си кажем “Наздраве”, нали?

    - -

    Но да не бързаме толкова все пак…

    - -

    Всичко изброено може би е само причина да оправдаем зависимостта си към кафето. Вероятно знаете, че кофеинът има лек психотропен ефект върху мозъка. Ефектите като ободряване, подобряване на настроението, паметта и концентарцията се дължат на факта, че кофеинът блокира достъпа на инхибиращият (подтискащият мозъчната дейност) невротрансмитър Аденозин в мозъка, и по този начин другите два, които са стимулиращи мозъка - Норадреналин и Допамин увеличават концентрацията си. При ежедневен прием, обаче, тези ефекти намаляват и дори се изгубват, ако не се увеличи дозата на кофеина. За това кафето е една от най-разпространените пристрястяващи субстанции, използвана от хората днес.

    - -

    Друга причина в списъкът “Против” е, че зърната на кафето са семената на растението. Както всички семена и тези имат в състава си инхибитори и антинутриенти, чрез които те забавят покълването си и се защитават от животни, докато не попаднат на подходящо място, за да порастнат (топла и влажна почва). Тези антинутритенти попадат в червата и ги раздразват, а в последствие могат да доведат и до по-сериозни заболявания (синдром на пропускливите черва). Това разбира се се отнася не само за кафето и също от значение е честотата на консумацията му.

    - -

    Голям процент от хората се оплакват, че кафето разстройва стомаха им и/или създава киселини. Това е така, защото кафето стимулира освобождаването на хормона гастрин, който засилва секрецията на стомашен сок. Хормонът холецистокинин също се повишава и кара жлъчката да отделя повече жлъчна течност. В здрав индивид организмът бързо компенсира излишъците като забързва храносмилането, но прекалено честата консумация на кафе без да е придружено с храна води до хронично слабо възпаление на вътрешната повърхност на червата, заради киселият стомашен сок, който се излива там. По принцип той винаги е смесен с храна и не дразни лигавицата.

    - -

    Не може да подминем и факта, че пиенето на кафе влияе и върху изключително важният за здравето ни хормон - кортизол. Повишеният кортизол води до трудности със заспиването и неспокоен сън, лошо храносмилане и лошо настроение. При подобни редовни пикове на кортизола, човек се справя по-трудно със стресови ситуации, спрямо хора, които не пият кафе или пият само сутрин (ефектът върху кортизола спада за около 6 часа).

    - -

    Ако имате целиачна болест или чувствителност към глутен, трябва добре да преосмислите консумацията на кафе, тъй като то създава кръстосана реакция. Причината е в голямото подобие на някои от протеините в кафето с глутена. Ако здравето ви не се подобрява при изключване на глутена, то може би трябва да спрете и кафето като възможна причина за това.

    - -

    Много от ползите на кафето се приписват на голямото количество антиоксиданти и полифеноли в него. Разбира се тези вещества можете да намерите в много плодове и зеленчуци, без да са в комбинация с пристрястяващият ефект на кофеина. От друга страна безкофеиновото кафе се обработва така, че повечето от полезните вещества се изгубват.

    - -

    Да пиете кафе или не? Решението е ваше! Според мен ако сте напълно здрав и млад човек, нямате някое от гореизброените оплаквания, то можете да си позволявате по 1 чаша кафе веднъж на няколко дни, за да си набавите полезните ефекти от него. Но като цяло, кафето и кофеиновите напитки трябва да се употребяват с повишено внимание.

    - -

    Кафеено растение

    -;T; @I"%/blog/2014-06-29-стресът/;T{;{ ;I"C - - - - - - - Стресът - ръководство за употреба - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Стресът - ръководство за употреба -

    - -
    -
      -
    • - - June 29, 2014 -
    • -
    -
    - - -

    Стресът е неизбежен спътник в живота на съвременният човек. Ако все пак успеем да го задържим в някакви граници, това ще доведе до по-добро здраве в краткосрочен и дългосрочен план.

    - -

    Какво имам предвид под “контрол върху стреса”? Това означава да контролирате нивата на хормонът кортизол в тялото ви. При напълно здрави хора, кортизолът е висок сутрин и започва да спада през целият ден. Но когато човек е под влияние на различни стресори (крайни срокове, проблеми в семейството, липса на сън, натоварено ежедневие), кортизолът остава висок и дори се покачва извън нормите. А този хормон оказва влияние върху цялото тяло: освобождаването на инсулин и другите хормони, свързани с храненето; настроението; храносмилането; имунната система и дори либидото.

    - -

    Как да разберете дали имате високи нива на кортизол? - Имате ли излишно тегло? Имате ли натрупани мазнини около талията и пъпа? Налага ли се да ставте посред нощ, за да пишкате? Имате ли проблеми със съня? Има ли спад в енергията ви в следобедните часове и пик в часовете след вечеря? Трудно ли сваляте тегло, въпреки че спазвате хранителен режим? Тренировките ви стават ли по-трудни с времето, въпреки че сте постоянни? Приемате ли твърде често кофеин? Ако сте отговорили с “Да” на някой от горните въпроси, то има голяма вероятност виновникът за това да е високият ви кортизол.

    - -

    Но как да “вкараме в ред” хормоните и по-точно кортизола? Ето три прости начина.

    - -

    1.Подобрете съня си. Опитайте се всяка нощ да имате достатъчно дълъг и качествен сън. За целта, можете да направите няколко неща:

    - -
      -
    • Избягвайте употребата на захар и въглехидрати вечер (дори от плодове)
    • -
    • Избягвайте кофеиновите напитки след обедните часове.
    • -
    • Опитайте се да вечеряте най-късно 2 часа преди сън (най-добре 4 часа)
    • -
    • Оставете си от 30 до 60 минути без телевизия, компютър, телефон преди сън.
    • -
    • Спете в хладна, тъмна, проветриво стая.
    • -
    • Добавки като магнезий и мелатонин ще помогнат за качественият сън и доброто възстановяване на тялото ви.
    • -
    - -

    2.Движете се повече. Човешкото тяло е създадено за да се движи. Съвременният начин на живот често предразполага към липсата на естествени за хората действия като ходене, бягане, вдигане на тежест от земята. Мога до утре сутрин да ви заспивам с проучвания за това, колко е важно да спортувате и какви ползи ще има това за тялото и духа ви… но няма смисъл. Докато сами се не убедите в тях, няма сила на света, която да ви накара да повярвате, че имате нужда от движение.

    - -

    Аз ще ви дам само няколко отправни точки как да започнете да изграждате своят двигателен режим.

    - -
      -
    • Не предозирайте. Това е най-честата грешка, която правят хората. Решават, че ще започнат да спортуват и се хвърлят с всичка сила в нещо. Резултата често е повишени нива на стрес, травми и не след дълго връщане към старият начин на живот. Започнете с темпо за начинаещи и в последствие постепенно увеличете натоварването. Ако днес изберете да правите йога, нали не очаквате че веднага ще успеете да направите стойка на глава?
    • -
    • Изберете активност, която включва и силово, и кардио натоварване. Но помнете, че никое от двете не трябва да е прекалено трудно за вас. Бягането в парка, комбинирано с леки упражнения е добър старт за повечето хора. Ако не можете да бягате, карайте колело, или се разхождайте. Плуването също е чудесен спорт, който натоварва цялото тяло равномерно.
    • -
    • Пазете ставите, гърба и мозъка си. Не избирайте спортове, които са непосилни за вашата физическа форма в момента и могат да доведат до травми или до “прегаряне” на нервната система от прекомерни усилия. Например ако имате над 20кг излишно тегло не е подходящо да започнете да бягате. По-добре си вземете колело и правете дълги разходки в парка с него.
    • -
    • Когато избирате своята активност мислете в дългосрочен план. Не се записвайте на катерене, ако имате страх от високо, въпреки че катерачите имат красиво оформени тела. Изберете спорт, в който ще имате желание да се развивате и практикувате дълго.
    • -
    • Правете го с удоволствие. Ако харесвате своят спорт, то ще искате да го правите по-дълго и по-често, а така ще имате повече ползи. Не избирайте вдигането на тежести или кросфит, ако не ви доставят удоволствие, независимо че резултатите при другите хора са невероятни. Ако все пак настъпи момент на отегчение, вземете си кратка почивка и се върнете с нови сили и желание към своята любима активност.
    • -
    - -

    3.Усмихвайте се. Даже по-добре: Смейте се! За невро-психологичният ефект от смеха се знае по-малко, отколкото предполагате, но все пак е доказано, че смехът активира определени части в кората на мозъка, което води до производството на ендорфини (хормонът на щастието). Те представляват пептиди (малки протеини), които се освобождават при спортуване, въодушевление, любов, оргазъм. Тяхната основна роля е да подпомогнат освобождаването на допамин, който от своя страна подобрява паметта, настроението, съня и контрола върху стреса. Също така ендорфините подтискат болката. Смехът активира и участъкът в мозъка, който се свързва с емоциите и усещането за щастие - лимбичната система. Това активира автономната (неволева) нервна система и подобрява нивата на кръвното налягане, дишането, и не на последно място намалява кортизолът.

    - -

    Усмивките и смехът действат по подобен механизъм, но навярно се досещате, че смехът има по-мощен ефект. Това, което ще ви изненада обаче, е че дори изкуственият смях има горепосочените ползи върху здравето ви. Така че усмихвайте се повече и света ще ви отвърне със същото (или поне мозъкът ви ще ви накара да мислите така).

    - -

    Стрес

    - -

    Вие как се справяте със стреса? Напишете ми в коментар.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I">'Стресът е неизбежен спътник в живота на съвременният човек. Ако все пак успеем да го задържим в някакви граници, това ще доведе до по-добро здраве в краткосрочен и дългосрочен план. - -Какво имам предвид под **"контрол върху стреса"**? Това означава да контролирате нивата на хормонът **кортизол** в тялото ви. При напълно здрави хора, кортизолът е висок сутрин и започва да спада през целият ден. Но когато човек е под влияние на различни стресори (крайни срокове, проблеми в семейството, липса на сън, натоварено ежедневие), кортизолът остава висок и дори се покачва извън нормите. А този хормон оказва влияние върху цялото тяло: освобождаването на инсулин и другите хормони, свързани с храненето; настроението; храносмилането; имунната система и дори либидото. - -**Как да разберете дали имате високи нива на кортизол?** - Имате ли излишно тегло? Имате ли натрупани мазнини около талията и пъпа? Налага ли се да ставте посред нощ, за да пишкате? Имате ли проблеми със съня? Има ли спад в енергията ви в следобедните часове и пик в часовете след вечеря? Трудно ли сваляте тегло, въпреки че спазвате хранителен режим? Тренировките ви стават ли по-трудни с времето, въпреки че сте постоянни? Приемате ли твърде често кофеин? Ако сте отговорили с "Да" на някой от горните въпроси, то има голяма вероятност виновникът за това да е високият ви кортизол. - -**Но как да "вкараме в ред" хормоните и по-точно кортизола? Ето три прости начина.** - -**1.Подобрете съня си.** Опитайте се всяка нощ да имате достатъчно дълъг и качествен сън. За целта, можете да направите няколко неща: - -* Избягвайте употребата на захар и въглехидрати вечер (дори от плодове) -* Избягвайте кофеиновите напитки след обедните часове. -* Опитайте се да вечеряте най-късно 2 часа преди сън (най-добре 4 часа) -* Оставете си от 30 до 60 минути без телевизия, компютър, телефон преди сън. -* Спете в хладна, тъмна, проветриво стая. -* Добавки като магнезий и мелатонин ще помогнат за качественият сън и доброто възстановяване на тялото ви. - -**2.Движете се повече.** Човешкото тяло е създадено за да се движи. Съвременният начин на живот често предразполага към липсата на естествени за хората действия като ходене, бягане, вдигане на тежест от земята. Мога до утре сутрин да ви заспивам с проучвания за това, колко е важно да спортувате и какви ползи ще има това за тялото и духа ви... но няма смисъл. Докато сами се не убедите в тях, няма сила на света, която да ви накара да повярвате, че имате нужда от движение. - -Аз ще ви дам само няколко отправни точки как да започнете да изграждате своят двигателен режим. - -* Не предозирайте. Това е най-честата грешка, която правят хората. Решават, че ще започнат да спортуват и се хвърлят с всичка сила в нещо. Резултата често е повишени нива на стрес, травми и не след дълго връщане към старият начин на живот. Започнете с темпо за начинаещи и в последствие постепенно увеличете натоварването. Ако днес изберете да правите йога, нали не очаквате че веднага ще успеете да направите стойка на глава? -* Изберете активност, която включва и силово, и кардио натоварване. Но помнете, че никое от двете не трябва да е прекалено трудно за вас. Бягането в парка, комбинирано с леки упражнения е добър старт за повечето хора. Ако не можете да бягате, карайте колело, или се разхождайте. Плуването също е чудесен спорт, който натоварва цялото тяло равномерно. -* Пазете ставите, гърба и мозъка си. Не избирайте спортове, които са непосилни за вашата физическа форма в момента и могат да доведат до травми или до "прегаряне" на нервната система от прекомерни усилия. Например ако имате над 20кг излишно тегло не е подходящо да започнете да бягате. По-добре си вземете колело и правете дълги разходки в парка с него. -* Когато избирате своята активност мислете в дългосрочен план. Не се записвайте на катерене, ако имате страх от високо, въпреки че катерачите имат красиво оформени тела. Изберете спорт, в който ще имате желание да се развивате и практикувате дълго. -* Правете го с удоволствие. Ако харесвате своят спорт, то ще искате да го правите по-дълго и по-често, а така ще имате повече ползи. Не избирайте вдигането на тежести или кросфит, ако не ви доставят удоволствие, независимо че резултатите при другите хора са невероятни. Ако все пак настъпи момент на отегчение, вземете си кратка почивка и се върнете с нови сили и желание към своята любима активност. - -**3.Усмихвайте се. Даже по-добре: Смейте се!** За невро-психологичният ефект от смеха се знае по-малко, отколкото предполагате, но все пак е доказано, че смехът активира определени части в кората на мозъка, което води до производството на ендорфини (хормонът на щастието). Те представляват пептиди (малки протеини), които се освобождават при спортуване, въодушевление, любов, оргазъм. Тяхната основна роля е да подпомогнат освобождаването на допамин, който от своя страна подобрява паметта, настроението, съня и контрола върху стреса. Също така ендорфините подтискат болката. Смехът активира и участъкът в мозъка, който се свързва с емоциите и усещането за щастие - лимбичната система. Това активира автономната (неволева) нервна система и подобрява нивата на кръвното налягане, дишането, и не на последно място намалява кортизолът. - -Усмивките и смехът действат по подобен механизъм, но навярно се досещате, че смехът има по-мощен ефект. Това, което ще ви изненада обаче, е че дори изкуственият смях има горепосочените ползи върху здравето ви. **Така че усмихвайте се повече и света ще ви отвърне със същото (или поне мозъкът ви ще ви накара да мислите така).** - -![Стрес](/images/posts/Stress.jpg) - -Вие как се справяте със стреса? Напишете ми в коментар.;T; -I"(

    Стресът е неизбежен спътник в живота на съвременният човек. Ако все пак успеем да го задържим в някакви граници, това ще доведе до по-добро здраве в краткосрочен и дългосрочен план.

    - -

    Какво имам предвид под “контрол върху стреса”? Това означава да контролирате нивата на хормонът кортизол в тялото ви. При напълно здрави хора, кортизолът е висок сутрин и започва да спада през целият ден. Но когато човек е под влияние на различни стресори (крайни срокове, проблеми в семейството, липса на сън, натоварено ежедневие), кортизолът остава висок и дори се покачва извън нормите. А този хормон оказва влияние върху цялото тяло: освобождаването на инсулин и другите хормони, свързани с храненето; настроението; храносмилането; имунната система и дори либидото.

    - -

    Как да разберете дали имате високи нива на кортизол? - Имате ли излишно тегло? Имате ли натрупани мазнини около талията и пъпа? Налага ли се да ставте посред нощ, за да пишкате? Имате ли проблеми със съня? Има ли спад в енергията ви в следобедните часове и пик в часовете след вечеря? Трудно ли сваляте тегло, въпреки че спазвате хранителен режим? Тренировките ви стават ли по-трудни с времето, въпреки че сте постоянни? Приемате ли твърде често кофеин? Ако сте отговорили с “Да” на някой от горните въпроси, то има голяма вероятност виновникът за това да е високият ви кортизол.

    - -

    Но как да “вкараме в ред” хормоните и по-точно кортизола? Ето три прости начина.

    - -

    1.Подобрете съня си. Опитайте се всяка нощ да имате достатъчно дълъг и качествен сън. За целта, можете да направите няколко неща:

    - -
      -
    • Избягвайте употребата на захар и въглехидрати вечер (дори от плодове)
    • -
    • Избягвайте кофеиновите напитки след обедните часове.
    • -
    • Опитайте се да вечеряте най-късно 2 часа преди сън (най-добре 4 часа)
    • -
    • Оставете си от 30 до 60 минути без телевизия, компютър, телефон преди сън.
    • -
    • Спете в хладна, тъмна, проветриво стая.
    • -
    • Добавки като магнезий и мелатонин ще помогнат за качественият сън и доброто възстановяване на тялото ви.
    • -
    - -

    2.Движете се повече. Човешкото тяло е създадено за да се движи. Съвременният начин на живот често предразполага към липсата на естествени за хората действия като ходене, бягане, вдигане на тежест от земята. Мога до утре сутрин да ви заспивам с проучвания за това, колко е важно да спортувате и какви ползи ще има това за тялото и духа ви… но няма смисъл. Докато сами се не убедите в тях, няма сила на света, която да ви накара да повярвате, че имате нужда от движение.

    - -

    Аз ще ви дам само няколко отправни точки как да започнете да изграждате своят двигателен режим.

    - -
      -
    • Не предозирайте. Това е най-честата грешка, която правят хората. Решават, че ще започнат да спортуват и се хвърлят с всичка сила в нещо. Резултата често е повишени нива на стрес, травми и не след дълго връщане към старият начин на живот. Започнете с темпо за начинаещи и в последствие постепенно увеличете натоварването. Ако днес изберете да правите йога, нали не очаквате че веднага ще успеете да направите стойка на глава?
    • -
    • Изберете активност, която включва и силово, и кардио натоварване. Но помнете, че никое от двете не трябва да е прекалено трудно за вас. Бягането в парка, комбинирано с леки упражнения е добър старт за повечето хора. Ако не можете да бягате, карайте колело, или се разхождайте. Плуването също е чудесен спорт, който натоварва цялото тяло равномерно.
    • -
    • Пазете ставите, гърба и мозъка си. Не избирайте спортове, които са непосилни за вашата физическа форма в момента и могат да доведат до травми или до “прегаряне” на нервната система от прекомерни усилия. Например ако имате над 20кг излишно тегло не е подходящо да започнете да бягате. По-добре си вземете колело и правете дълги разходки в парка с него.
    • -
    • Когато избирате своята активност мислете в дългосрочен план. Не се записвайте на катерене, ако имате страх от високо, въпреки че катерачите имат красиво оформени тела. Изберете спорт, в който ще имате желание да се развивате и практикувате дълго.
    • -
    • Правете го с удоволствие. Ако харесвате своят спорт, то ще искате да го правите по-дълго и по-често, а така ще имате повече ползи. Не избирайте вдигането на тежести или кросфит, ако не ви доставят удоволствие, независимо че резултатите при другите хора са невероятни. Ако все пак настъпи момент на отегчение, вземете си кратка почивка и се върнете с нови сили и желание към своята любима активност.
    • -
    - -

    3.Усмихвайте се. Даже по-добре: Смейте се! За невро-психологичният ефект от смеха се знае по-малко, отколкото предполагате, но все пак е доказано, че смехът активира определени части в кората на мозъка, което води до производството на ендорфини (хормонът на щастието). Те представляват пептиди (малки протеини), които се освобождават при спортуване, въодушевление, любов, оргазъм. Тяхната основна роля е да подпомогнат освобождаването на допамин, който от своя страна подобрява паметта, настроението, съня и контрола върху стреса. Също така ендорфините подтискат болката. Смехът активира и участъкът в мозъка, който се свързва с емоциите и усещането за щастие - лимбичната система. Това активира автономната (неволева) нервна система и подобрява нивата на кръвното налягане, дишането, и не на последно място намалява кортизолът.

    - -

    Усмивките и смехът действат по подобен механизъм, но навярно се досещате, че смехът има по-мощен ефект. Това, което ще ви изненада обаче, е че дори изкуственият смях има горепосочените ползи върху здравето ви. Така че усмихвайте се повече и света ще ви отвърне със същото (или поне мозъкът ви ще ви накара да мислите така).

    - -

    Стрес

    - -

    Вие как се справяте със стреса? Напишете ми в коментар.

    -;T; @I":/blog/2014-07-05-опасната-козметика/;T{;{ ;I"> - - - - - - - Опасната 'натурална' козметика - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Опасната 'натурална' козметика -

    - -
    -
      -
    • - - July 5, 2014 -
    • -
    -
    - - -

    Кой не иска да е вечно млад и красив? Никой не би отказал, нали? Хубавото е, че съвременната козметична индустрия предлага феноменална колекция от разкрасяващи, подмладяващи, освежаващи, възстановяващи, отслабващи, стягащи, слънцезащитни, антицелулитни, против бръчки и срещу пъпки, за блестящи зъби и коса, за слънчев загар и срещу напукани пети, и какви ли още не продукти. Наистина не мога да изброя всички, защото най-малкото не съм запозната с тях. Знаем ли обаче с какво се мажем?

    - -

    Първо да поговорим на кратко за кожата. Човешката кожа е много интересен орган. Знаете, че тя служи за бариера срещу външни влияния и пази цялото тяло и неговите мускули, органи и тъкани. Друга важна функция е, че през нея се освобождават част от излишните течности и токсини. Също така, през нея могат да навлязат различни вещества. Това става по два начина: чрез проникване и абсорбиране. -Проникването в кожата представлява навлизането на дадено вещество между най-горния (рогов) слой и най-долния (базален) слой. Например пигментът при татуиране. -Абсорбирането представлява преминаване на веществото през кожната бариера и навлизането му в кръвта. Това е процес, който се използва в медицината и почти не се използва в козметиката.

    - -

    А какво прониква и какво не в кожата? Кожата ни е напълно непропусклива за водата и всякакви водни разтвори. Нито навътре, нито навън. Ако това не беше така, вероятно след всяка морска баня щяхме да сме поели няколко литра вода или пък в горещите дни щяхме да сме пресъхнали като стафиди.

    - -

    Кожата е пропусклива само за вещества, които са разтворени в масло. Козметичните продукти, които проникват в кожата са на маслена основа: антицелулитни кремове, хидратиращи съставки, различни витамини и антиоксиданти. Има и съставки, които не искаме да проникват въобще: парфюм, консерванти, емулгатори, слънцезащитни съставки. -Как става проникването на полезните съставки? Има два начина. Първият е евтин, определено не-натурален и масово се използва от козметичната индустрия. В състава на продукта се слага разтворител от рода на пропилен-гликол и той разхлабва връзките между клетките на кожата и улеснява навлизането на съставките. Това разбира се уврежда структурата на кожата и в последствие води до изсушаване, излющване, микроскопични язви и други по-тежки проблеми. -Вторият, добрият начин за проникване в кожата е чрез “опаковане” на активната съставка в миниатюрни сфери с натурален лецитин, т.нар. липозоми или нанозоми. Продукти с такива съставки са много по-скъпи, но и много по-ефективни и безвредни. -Тук искам да направя една вметка относно етеричните масла. Много хора смятат, че тъй като са натурални са безвредни. Истината е, че тъй като са масла те проникват и дори могат да се абсорбират през кожата, което означава, че могат да бъдат и опасни. Те не рядко предизвикват алергични реакции и възпаления. Имайте едно на ум, когато ги използвате. Тези при които рискът да дадат реакция е най-голям са и най-силните като аромат: канела, мента, портокал, карамфил и др. Етеричните масла се изписват на опаковките на продуктите с латинските им наименования. Ако в състава на продукта, който ползвате няма парфюм, а мирише силно, то вероятно има доста етерични масла. Това е знак да бъдете внимателни с количествата, които използвате. -Още от съставките, за които трябва да бъдете бдителни в козметиката, която използвате ще прочетете във втората част на статията.

    - -

    Сигурна съм, че много от вас, също като мен избират натуралните продукти не само за тези, които приемаме вътрешно, но и тези, които нанасяме върху кожата си. Тук разбира се отново има маркетингов трик. Думата “натурален” продава! Също и “био”, и “растителен”. Но ако на етикета е изписано “Натурален”, а в състава му откриваме вещества като парафин, петролатум и други вредни за човека и природата съставки, това не е ли незаконно? Ами всъщност не! Търговците имат право да напишат на етикета “натурално” и “растително” ако има само 1% растителен екстракт в състава. Затова бъдете внимателни и винаги четете етикетите на кремовете, шампоаните, пастите за зъби, сапуни и др. -А какво да кажем за “био” продуктите? Наистина ли те са по-безвредни за кожата? Истината е, че не е напълно вярно. Всъщност био и естествените козметични средства могат да бъдат много агресивни, тъй като растителните екстракти често са силни алергени. Т.е. винаги трябва да внимаваме за съставките на продукта и да го тестваме на малки, скрити кожни участъци. Независимо от сертификатите и цената, която плащаме трябва да следим за реакцията на кожата. Когато тя го “одобри”, тогава означава, че продуктът е добър.

    - -

    Надявам се тази статия да ви е харесала и да ви е била полезна. Ако е така, споделете я с приятелите си. Очаквайте продължението й другата седмица.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"!Кой не иска да е вечно млад и красив? Никой не би отказал, нали? Хубавото е, че съвременната козметична индустрия предлага феноменална колекция от разкрасяващи, подмладяващи, освежаващи, възстановяващи, отслабващи, стягащи, слънцезащитни, антицелулитни, против бръчки и срещу пъпки, за блестящи зъби и коса, за слънчев загар и срещу напукани пети, и какви ли още не продукти. Наистина не мога да изброя всички, защото най-малкото не съм запозната с тях. **Знаем ли обаче с какво се мажем?** - -Първо да поговорим на кратко за кожата. **Човешката кожа е много интересен орган.** Знаете, че тя служи за бариера срещу външни влияния и пази цялото тяло и неговите мускули, органи и тъкани. Друга важна функция е, че през нея се освобождават част от излишните течности и токсини. Също така, през нея могат да навлязат различни вещества. Това става по два начина: чрез проникване и абсорбиране. -**Проникването** в кожата представлява навлизането на дадено вещество между най-горния (рогов) слой и най-долния (базален) слой. Например пигментът при татуиране. -**Абсорбирането** представлява преминаване на веществото през кожната бариера и навлизането му в кръвта. Това е процес, който се използва в медицината и почти не се използва в козметиката. - -**А какво прониква и какво не в кожата?** Кожата ни е напълно непропусклива за водата и всякакви водни разтвори. Нито навътре, нито навън. Ако това не беше така, вероятно след всяка морска баня щяхме да сме поели няколко литра вода или пък в горещите дни щяхме да сме пресъхнали като стафиди. - -Кожата е пропусклива само за вещества, които са разтворени в масло. Козметичните продукти, които проникват в кожата са на маслена основа: антицелулитни кремове, хидратиращи съставки, различни витамини и антиоксиданти. Има и съставки, които не искаме да проникват въобще: парфюм, консерванти, емулгатори, слънцезащитни съставки. -**Как става проникването на полезните съставки?** Има два начина. Първият е евтин, определено не-натурален и масово се използва от козметичната индустрия. В състава на продукта се слага **разтворител** от рода на пропилен-гликол и той разхлабва връзките между клетките на кожата и улеснява навлизането на съставките. Това разбира се уврежда структурата на кожата и в последствие води до изсушаване, излющване, микроскопични язви и други по-тежки проблеми. -Вторият, добрият начин за проникване в кожата е чрез "опаковане" на активната съставка в миниатюрни сфери с натурален лецитин, т.нар. **липозоми** или **нанозоми**. Продукти с такива съставки са много по-скъпи, но и много по-ефективни и безвредни. -Тук искам да направя една вметка относно **етеричните масла**. Много хора смятат, че тъй като са **натурални** са безвредни. Истината е, че тъй като са масла те проникват и дори могат да се абсорбират през кожата, което означава, че могат да бъдат и опасни. Те не рядко предизвикват алергични реакции и възпаления. Имайте едно на ум, когато ги използвате. Тези при които рискът да дадат реакция е най-голям са и най-силните като аромат: канела, мента, портокал, карамфил и др. Етеричните масла се изписват на опаковките на продуктите с латинските им наименования. Ако в състава на продукта, който ползвате няма парфюм, а мирише силно, то вероятно има доста етерични масла. Това е знак да бъдете внимателни с количествата, които използвате. -**Още от съставките, за които трябва да бъдете бдителни в козметиката, която използвате ще прочетете във втората част на статията.** - -Сигурна съм, че много от вас, също като мен избират **натуралните продукти** не само за тези, които приемаме вътрешно, но и тези, които нанасяме върху кожата си. Тук разбира се отново има маркетингов трик. Думата "натурален" продава! Също и "био", и "растителен". Но ако на етикета е изписано "Натурален", а в състава му откриваме вещества като парафин, петролатум и други вредни за човека и природата съставки, това не е ли незаконно? Ами всъщност не! Търговците имат право да напишат на етикета "натурално" и "растително" ако има **само 1% растителен екстракт** в състава. Затова бъдете внимателни и винаги четете етикетите на кремовете, шампоаните, пастите за зъби, сапуни и др. -А какво да кажем за **"био" продуктите**? Наистина ли те са **по-безвредни** за кожата? Истината е, че не е напълно вярно. Всъщност био и естествените козметични средства могат да бъдат много агресивни, тъй като растителните екстракти често са силни алергени. Т.е. винаги трябва да внимаваме за съставките на продукта и да го тестваме на малки, скрити кожни участъци. **Независимо от сертификатите и цената, която плащаме трябва да следим за реакцията на кожата.** Когато тя го "одобри", тогава означава, че продуктът е добър. - -Надявам се тази статия да ви е харесала и да ви е била полезна. Ако е така, споделете я с приятелите си. **Очаквайте продължението й другата седмица.**;T; -I""

    Кой не иска да е вечно млад и красив? Никой не би отказал, нали? Хубавото е, че съвременната козметична индустрия предлага феноменална колекция от разкрасяващи, подмладяващи, освежаващи, възстановяващи, отслабващи, стягащи, слънцезащитни, антицелулитни, против бръчки и срещу пъпки, за блестящи зъби и коса, за слънчев загар и срещу напукани пети, и какви ли още не продукти. Наистина не мога да изброя всички, защото най-малкото не съм запозната с тях. Знаем ли обаче с какво се мажем?

    - -

    Първо да поговорим на кратко за кожата. Човешката кожа е много интересен орган. Знаете, че тя служи за бариера срещу външни влияния и пази цялото тяло и неговите мускули, органи и тъкани. Друга важна функция е, че през нея се освобождават част от излишните течности и токсини. Също така, през нея могат да навлязат различни вещества. Това става по два начина: чрез проникване и абсорбиране. -Проникването в кожата представлява навлизането на дадено вещество между най-горния (рогов) слой и най-долния (базален) слой. Например пигментът при татуиране. -Абсорбирането представлява преминаване на веществото през кожната бариера и навлизането му в кръвта. Това е процес, който се използва в медицината и почти не се използва в козметиката.

    - -

    А какво прониква и какво не в кожата? Кожата ни е напълно непропусклива за водата и всякакви водни разтвори. Нито навътре, нито навън. Ако това не беше така, вероятно след всяка морска баня щяхме да сме поели няколко литра вода или пък в горещите дни щяхме да сме пресъхнали като стафиди.

    - -

    Кожата е пропусклива само за вещества, които са разтворени в масло. Козметичните продукти, които проникват в кожата са на маслена основа: антицелулитни кремове, хидратиращи съставки, различни витамини и антиоксиданти. Има и съставки, които не искаме да проникват въобще: парфюм, консерванти, емулгатори, слънцезащитни съставки. -Как става проникването на полезните съставки? Има два начина. Първият е евтин, определено не-натурален и масово се използва от козметичната индустрия. В състава на продукта се слага разтворител от рода на пропилен-гликол и той разхлабва връзките между клетките на кожата и улеснява навлизането на съставките. Това разбира се уврежда структурата на кожата и в последствие води до изсушаване, излющване, микроскопични язви и други по-тежки проблеми. -Вторият, добрият начин за проникване в кожата е чрез “опаковане” на активната съставка в миниатюрни сфери с натурален лецитин, т.нар. липозоми или нанозоми. Продукти с такива съставки са много по-скъпи, но и много по-ефективни и безвредни. -Тук искам да направя една вметка относно етеричните масла. Много хора смятат, че тъй като са натурални са безвредни. Истината е, че тъй като са масла те проникват и дори могат да се абсорбират през кожата, което означава, че могат да бъдат и опасни. Те не рядко предизвикват алергични реакции и възпаления. Имайте едно на ум, когато ги използвате. Тези при които рискът да дадат реакция е най-голям са и най-силните като аромат: канела, мента, портокал, карамфил и др. Етеричните масла се изписват на опаковките на продуктите с латинските им наименования. Ако в състава на продукта, който ползвате няма парфюм, а мирише силно, то вероятно има доста етерични масла. Това е знак да бъдете внимателни с количествата, които използвате. -Още от съставките, за които трябва да бъдете бдителни в козметиката, която използвате ще прочетете във втората част на статията.

    - -

    Сигурна съм, че много от вас, също като мен избират натуралните продукти не само за тези, които приемаме вътрешно, но и тези, които нанасяме върху кожата си. Тук разбира се отново има маркетингов трик. Думата “натурален” продава! Също и “био”, и “растителен”. Но ако на етикета е изписано “Натурален”, а в състава му откриваме вещества като парафин, петролатум и други вредни за човека и природата съставки, това не е ли незаконно? Ами всъщност не! Търговците имат право да напишат на етикета “натурално” и “растително” ако има само 1% растителен екстракт в състава. Затова бъдете внимателни и винаги четете етикетите на кремовете, шампоаните, пастите за зъби, сапуни и др. -А какво да кажем за “био” продуктите? Наистина ли те са по-безвредни за кожата? Истината е, че не е напълно вярно. Всъщност био и естествените козметични средства могат да бъдат много агресивни, тъй като растителните екстракти често са силни алергени. Т.е. винаги трябва да внимаваме за съставките на продукта и да го тестваме на малки, скрити кожни участъци. Независимо от сертификатите и цената, която плащаме трябва да следим за реакцията на кожата. Когато тя го “одобри”, тогава означава, че продуктът е добър.

    - -

    Надявам се тази статия да ви е харесала и да ви е била полезна. Ако е така, споделете я с приятелите си. Очаквайте продължението й другата седмица.

    -;T; @I"N/blog/2014-07-12-опасната-козметика-2 (conflicted copy)/;T{;{ ;I"eC - - - - - - - - - Опасната козметика - част 2 - - - - - - - - - - - - - - - -
    -
    -
    -

    - Опасната козметика - част 2 -

    - -
    -
      -
    • - - July 12, 2014 -
    • -
    -
    - - -

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    - -

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    - -

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    - -
      -
    1. -

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. -Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. -Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. -Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. -Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      -
    2. -
    3. -

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. -Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. -Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. -Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      -
    4. -
    5. -

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти -Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата -Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. -Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. -Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      -
    6. -
    7. -

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. -Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. -Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. -Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      -
    8. -
    9. -

      Sodium Lauryl Sulfate(SLS) -Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. -Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.

      -
    10. -
    11. -

      Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените -Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. -Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. -Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      -
    12. -
    - -

    7.Други: - * Всички цифри (80% от тях са рискови съставки) - * Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви. - * Всички С с последващ нечетен номер са синтетични съставки -* Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! -* Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.

    - -

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    - -
    -
    - - -
    - - - - - - - -;T; I"Q0В предишният [пост](/blog/2014-07-05-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0/) по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда. - -Как да разпознаем "лошите" от "добрите" съставки? Много просто! **Трябва да се научите да четете етикетите.** Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис "Био" или "Натурален". Винаги поглеждайте в задния двор! - -Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка: - -1. **Парабени**. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. -**Как да ги откриете**: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. -**Къде се намират**: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. -**Защо да ги избягваме**: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. -**Алтернативи**: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки. - -2. **Петролатум**. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. -**Как и къде да го открием**: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. -**Защо да го избягваме**: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. -Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. -**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum. - -3. **Триклозан** - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти -**Какво пише и къде се намира**: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата -**Защо да го избягваме**: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. -Подобен препарат е и **Хлорхексидинът**, използван масово в зъбната козметика. -**Алтернативи**: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба. - -4. **Пропиленгликолът** е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. -**Как и къде да го открием**: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. -**Защо да го избягваме**: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. -**Алтернативи**: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol - -5. **Sodium Lauryl Sulfate(SLS)** -**Как и къде да го открием**: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. -**Защо да го избягваме**: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. -**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate. - -6. **Формалдехид-отделящи консерванти** - консерванти, които се използват заедно с или вместо парабените -**Как и къде се намират**: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. -**Защо да ги избягваме**: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. **Европейският съюз ограничава** употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като "съдържащи формалдехид". -**Алтерантиви**: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти - -7.**Други**: - * Всички цифри (80% от тях са рискови съставки) - * Думи, които завършват на -one, -thicone, -siloxan: това са **силикони**, които със сигурност нямат място върху кожата ви. - * Всички С с последващ нечетен номер са синтетични съставки -* Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! -* Натуралните продукти са в тъмни, **пастелни цветове**. Искрящо жълтият или ярко розов сапун не е натурален. - -Надявам се тази статия да ви е била **интересна** и най-вече **полезна**. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.;T; -I"2

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    - -

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    - -

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    - -
      -
    1. -

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. -Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. -Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. -Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. -Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      -
    2. -
    3. -

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. -Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. -Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. -Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      -
    4. -
    5. -

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти -Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата -Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. -Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. -Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      -
    6. -
    7. -

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. -Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. -Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. -Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      -
    8. -
    9. -

      Sodium Lauryl Sulfate(SLS) -Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. -Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.

      -
    10. -
    11. -

      Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените -Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. -Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. -Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      -
    12. -
    - -

    7.Други: - * Всички цифри (80% от тях са рискови съставки) - * Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви. - * Всички С с последващ нечетен номер са синтетични съставки -* Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! -* Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.

    - -

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    -;T; @I" - - - - - - - Опасната козметика - част 2 - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Опасната козметика - част 2 -

    - -
    -
      -
    • - - July 12, 2014 -
    • -
    -
    - - -

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    - -

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    - -

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    - -
      -
    1. -

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. -Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. -Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. -Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. -Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      -
    2. -
    3. -

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. -Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. -Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. -Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      -
    4. -
    5. -

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти -Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата -Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. -Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. -Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      -
    6. -
    7. -

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. -Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. -Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. -Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      -
    8. -
    9. -Sodium Lauryl Sulfate(SLS) -Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. -Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.
      -
    10. -
    11. -Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените -Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. -Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. -Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      -
        -
      • -Други -
          -
        • Всички цифри (80% от тях са рискови съставки)
        • -
        • Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви.
        • -
        • Всички С с последващ нечетен номер са синтетични съставки
        • -
        • Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго!
        • -
        • Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.
        • -
        -
      • -
      -
    12. -
    - -

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"h0В предишният [пост](/blog/2014-07-05-%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%B7%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0/) по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда. - -Как да разпознаем "лошите" от "добрите" съставки? Много просто! **Трябва да се научите да четете етикетите.** Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис "Био" или "Натурален". Винаги поглеждайте в задния двор! - -Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка: - -1. **Парабени**. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. -**Как да ги откриете**: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. -**Къде се намират**: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. -**Защо да ги избягваме**: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. -**Алтернативи**: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки. - -2. **Петролатум**. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. -**Как и къде да го открием**: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. -**Защо да го избягваме**: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. -Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. -**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum. - -3. **Триклозан** - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти -**Какво пише и къде се намира**: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата -**Защо да го избягваме**: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. -Подобен препарат е и **Хлорхексидинът**, използван масово в зъбната козметика. -**Алтернативи**: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба. - -4. **Пропиленгликолът** е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. -**Как и къде да го открием**: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. -**Защо да го избягваме**: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. -**Алтернативи**: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol - -5. **Sodium Lauryl Sulfate(SLS)** -**Как и къде да го открием**: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. -**Защо да го избягваме**: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. -**Алтернативи**: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.
    -6. **Формалдехид-отделящи консерванти** - консерванти, които се използват заедно с или вместо парабените -**Как и къде се намират**: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. -**Защо да ги избягваме**: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. **Европейският съюз ограничава** употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като "съдържащи формалдехид". -**Алтерантиви**: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

    -* **Други** - * Всички цифри (80% от тях са рискови съставки) - * Думи, които завършват на -one, -thicone, -siloxan: това са **силикони**, които със сигурност нямат място върху кожата ви. - * Всички С с последващ нечетен номер са синтетични съставки - * Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго! - * Натуралните продукти са в тъмни, **пастелни цветове**. Искрящо жълтият или ярко розов сапун не е натурален. - -Надявам се тази статия да ви е била **интересна** и най-вече **полезна**. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.;T; -I"R3

    В предишният пост по темата ви посочих само малка част от потенциално опасните съставки на козметичните продукти. Днес ще ви запозная по-подробно с най-разпространените вещества, които се влагат навсякъде, а са потенциално опасни за хората и не по-маловажно: опасни са за околната среда.

    - -

    Как да разпознаем “лошите” от “добрите” съставки? Много просто! Трябва да се научите да четете етикетите. Винаги! Независимо какво ви обяснява продавачката в магазина, независимо, че на рекламата казват колко е качествен даден продукт, или пък отпред е изрисувано сладко бебе, а до него се разпростира огромен (вероятно) зален надпис “Био” или “Натурален”. Винаги поглеждайте в задния двор!

    - -

    Какво е първото нещо което трябва да ви направи впечатление? На всеки етикет независимо дали става въпрос за храна, козметика или препарат за почистване съставките са изброени според количеството им, вложено в продукта. Т.е. най-голямо количество има от първата съставка, а най-малко от последната. Това има известна тежест при определянето на качествата на продукта, но ето кои съставки не искаме да присъстват въобще в списъка:

    - -
      -
    1. -

      Парабени. Парабените са най-широко разпространените консерванти в козметичната индустрия. Използват се като антимикробно средство и удължават срока на годност на продуктите. -Как да ги откриете: най-често срещаните парабени са methylparaben, propylparaben, ethylparaben, benzylparaben и butylparaben. -Къде се намират: почти навсякъде - шампоани, лосиони, почистващи препарати, пасти за зъби, кремове и много други. -Защо да ги избягваме: Парабените имитират човешките хормони и могат да предизвикат различни ендокринни нарушения. Въпреки че няма достатъчно данни за продължителна употреба на ниски дози от парабени, концентрирани количества парабени са свързани с рак, ендокринни смущения, репродуктивна токсичност, имунотоксичност, невротоксичност и дразнения на кожата. -Алтернативи: избягвайте продукти, които съдържат парабени, когато това е възможно. Търсете продукти, които съдържат алтернативи на парабените като био козметиката,която съдържа екстракт от семена на грейпфрут, масло от нийм, екстракт от розмарин, калиев сорбат. Ако е възможно използвайте безводни продукти (и по този начин по-малко склонни към замърсяване) или продукти, опаковани във флакон с помпа. Избягвайте бурканчета и кутийки.

      -
    2. -
    3. -

      Петролатум. Популярен още като вазелин, това на практика е нефтен продукт, смес от въглевордороди. -Как и къде да го открием: На продуктите се изписва като petrolatum и petroleum jelly, mineral oil, paraffinum liquidum, минерално масло. Използва се в много продукти за грижа за кожата, защото е евтин. Може да го срещнете в балсами за устни, кремове, лосиони. -Защо да го избягваме: Petrolatum е минерално синтетично масло и причинява много проблеми тъй като нарушава естествените механизми на овлажняване на кожата, което от своя страна води до суха и напукна кожа. Производителите го използват защото е изключително евтино. -Petrolatum запушва порите и не позволява на кожата да диша и да се освобождава от токсините. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Petrolatum.

      -
    4. -
    5. -

      Триклозан - широкоспектърен антибактериален и антигъбичен агент, който се използва в много козметични продукти -Какво пише и къде се намира: Triclosan. Използва се в много сапуни, пасти за зъби, води за уста, продукти за грижа за кожата -Защо да го избягваме: Има доказателства, които сочат, че Триклозан може да допринесе за създаването на щамове на бактерии, които са резистентни към антибиотици. Също така е възможно да погълнете част от продукта, което ще наруши баланса на микроорганизми в храносмилателната ви система. -Подобен препарат е и Хлорхексидинът, използван масово в зъбната козметика. -Алтернативи: няма. Избягвайте да купувате антибактериални продукти за ежедневна употреба.

      -
    6. -
    7. -

      Пропиленгликолът е химически синтезиран овлажнител, който задържа водата и не й позволява да се изпари от кожата. -Как и къде да го открием: На етикетите се изписва като: propylene glycol, 1,2-propanediol, propane-1,2-diol. Намира в продукти за грижа за кожата, понякога в много големи дози - в сапуни, лосиони, кремове и др. -Защо да го избягваме: Пропилен гликол има малка молекула и се абсорбира през всички слоеве на кожата. Може да предизвика дразнене и чувствителност на кожата, очите и белите дробове, дори и в много малки дози. Свързва се с токсичност за определени органи и може да предизвика хормонални нарушения. -Алтернативи: няма. Проверете етикетите и избягвайте продукти, съдържащи Propylene Glycol

      -
    8. -
    9. -Sodium Lauryl Sulfate(SLS) -Как и къде да го открием: sodium laureth sulfate, sodium lauryl sulfate, sodium lauryl ether sulfate. Това синтетично вещество се използва в шампоаните, перилните препарати, пасти за зъби, води за уста и служи за образуване на пяна. -Защо да го избягваме: Предизвиква раздразнения на очите, кожни обриви, косопад, пърхот на скалпа и алергични реакции. Според научните изследвания SLS води до дразнене на кожата и може дза се свърже с появата на рак, смущения на ендокринната система, репродуктивна токсичност и невротоксичност. -Алтернативи: няма. Проверете етикетите си и избягвайте продукти, съдържащи Sodium Lauryl Sulfate.
      -
    10. -
    11. -Формалдехид-отделящи консерванти - консерванти, които се използват заедно с или вместо парабените -Как и къде се намират: срещат се под наименованията Quaternium-15, Dimethyl-dimethyl (DMDM) hydantoin, Imidazolidinyl urea, Diazolidinyl urea, 2-bromo-2-nitropropane-1,3-diol (bronopol). Търсете ги в продукти за косата и продукти за лична хигиена, бебешки кърпички и лакове за нокти. -Защо да ги избягваме: Urea and Diazolidinyl Urea са най-често използваните каонсерванти след парабените. Установено е, че са основна причина за контактен дерматит. Формалдехид-отделящите консерванти освобождават формалдехид, който е канцерогенен и се свързва с проблеми в развитието, ендокринни смущения, алергии, имуннологични проблеми и др. Формалдехидът е обявен за канцероген от много експертни и държавни органи. Европейският съюз ограничава употребата на формалдехиди в продукти за лична хигиена и изисква, продуктите с формалдехиди или формалдехид-отделящи съставки да се етикират като “съдържащи формалдехид”. -Алтерантиви: няма. Проверете етикетите си и избягвайте продукти, съдържащи формалдехид и формалдехид-отделящи консерванти

      -
        -
      • -Други -
          -
        • Всички цифри (80% от тях са рискови съставки)
        • -
        • Думи, които завършват на -one, -thicone, -siloxan: това са силикони, които със сигурност нямат място върху кожата ви.
        • -
        • Всички С с последващ нечетен номер са синтетични съставки
        • -
        • Етеричните масла се правят само от растения, освен тези от цитрусови плодове. Няма етерично масло от манго!
        • -
        • Натуралните продукти са в тъмни, пастелни цветове. Искрящо жълтият или ярко розов сапун не е натурален.
        • -
        -
      • -
      -
    12. -
    - -

    Надявам се тази статия да ви е била интересна и най-вече полезна. Ако сте загрижени за здравето на приятелите и семейството си, споделете я с тях.

    -;T; @I"U/blog/2014-07-27-храната-като-лекарство-черен-дроб/;T{;{ ;I"< - - - - - - - Храната като лекарство: Черен дроб - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Храната като лекарство: Черен дроб -

    - -
    -
      -
    • - - July 27, 2014 -
    • -
    -
    - - -

    Субпродуктите не са много популярна храна в съвременният начин на хранене, за разлика от миналото. Нашите прародители са употребявали всички части на закланото животно включително черен дроб, бъбреци, стомах, сърце, мозък и дори тестиси. Защо? Какво според вас има толкова ценно в тези части, сравнено с мускулното месо, което сме свикнали да ядем? Отговорът е ИМА МНОГО ПОВЕЧЕ ХРАНИТЕЛНИ ВЕЩЕСТВА!

    - -

    В труда на Д-р Уестън Прайс, за който можете да си припомните тук и тук често можете да срещнете племена и култури, които изяждат първо органите на животното, а мускулното месо се разпределя като храна за хората, за кучетата и за запаси. Освен това в немалко култури най-ценните органи са предоставяни на членовете на племето със специални нужди - бременни жени, деца, шаманите или пък ловците.

    - -

    Черният дроб и другите органни меса са най-концентрираният източник на витамини, минерали, полезни мазнини и незаменими аминокиселини.

    - -

    Сравнено с мускулното месо, органите са с далеч по-висока хранителна плътност и са по-богати на който и да е нутриент. Те включват в състава си големи дози витамини от групата В: В2, В6, В9(фолиева киселина) и много важният витамин В12. Субпродуктите също така съдържат минерали като фосфор, желязо, мед, магнезий, йод, калций, селен, калий, натрий, цинк, манган и доставят важните мастно-разтворими витамини A, D, E и K. В животинските органи се съдържа най-голямо количество лесно усвоим витамин D в сравнение със всеки друг източник. С тази питателна храна си набавяме и голямо количество есенциални мастни киселини, вкл. арахидонова киселина и Омега-3 киселините EPA и DHA.

    - -

    Черният дроб е най-концентрираният източник на витамин А, в сравнение с всички храни. Ето някои данни:

    - -
    -

    Черен дроб от риба треска - Vitamin А 100 000IU/ 100гр

    -
    - -
    -

    Черен дроб от теле, кърмаче - Vitamin A 70559IU/100гр

    -
    - -
    -

    Черен дроб от възрастно теле, пасящо - Vitamin A 31718IU/100гр

    -
    - -
    -

    Агнешки дроб - Vitamin A 24943 IU/100гр

    -
    - -
    -

    Свински дроб - Vitamin A 17998 IU/100гр

    -
    - -
    -

    Пилешки дроб - Vitamin A 13328 IU/100гр

    -
    - -

    За витамин А съм писала и преди. Той е изключително важен за здрави зъби и кости, но децата и хора, засегнати от определени състояния не могат да го преработват от растителни източници. За тях е задължителна употребата на черен дроб веднъж или два пъти седмично. Разбира се, консумацията на чернен дроб има и други важни ползи за човешкото тяло: той е източник на витамин D, Витамин B12(и други витамини от групата В), мед, магнезий, фосфор, манган и желязо, които са във възможно най-лесно усвоимата си форма.

    - -

    Бъбреците са богати на витамин В12, селен, желязо, мед, фосфор и цинк.

    - -

    Въпреки че сърцето е мускул, то също доставя богат набор от полезни вещества на човека. То е много концентриран източник на Коензим Q10, който е важен за здравето на нашето сърце и за силен имунитет. Сърцето съдържа витамин А, В12, фолиева киселина, желязо, селен, фосфор, цинк и е най-богатият източник на мед. От сърцето можем да си набавим два пъти повече колаген и еластин, спрямо обикновенното мускулно месо. Това е така, защото то е богато на аминокиселините глицин и пролин, които са важни за здрава съединителна тъкан, здрави стави и добро храносмилане.

    - -

    Още една причина да ядем повече черен дроб и субпродукти е, че те са много по-евтини, а всъщност дават много повече на организма. Най-добрият вариант е да купувате храната си директно от животновъди, които хранят животните си с паша и сено. Но дори и да се налага да купувате храната си от супермаркетите, все пак органните меса ще ви донесат много от гореизброените ползи.

    - -

    Разбира се, напълно на ясно съм, че следващата стъпка, а именно приготвянето на това месо, би могла да е препъни-камък по пътя, но с доза ентусиазъм и нужното търпение, съм сигурна, че ще успеете да намерите рецептата, която допада на вкуса на вашето семейство. Например черен дроб, приготвен като пастет е любимо ястие на много възрастни и деца. Ето и още варианти.

    - -

    Надявам се да съм ви убедила в полезността от консумацията на животински органи и да започнете да го включвате в менюто си, в случай че не го правите сега. Моята препоръка е да имате две хранения седмично, съдържащи някои от тези толкова полезни за човешкото тяло храни.

    - - - - - -
    - - -
    -
    - - -
    - - - - - - - - - -;T; I"8Субпродуктите не са много популярна храна в съвременният начин на хранене, за разлика от миналото. Нашите прародители са употребявали всички части на закланото животно включително черен дроб, бъбреци, стомах, сърце, мозък и дори тестиси. Защо? Какво според вас има толкова ценно в тези части, сравнено с мускулното месо, което сме свикнали да ядем? Отговорът е ИМА МНОГО ПОВЕЧЕ ХРАНИТЕЛНИ ВЕЩЕСТВА! - -В труда на Д-р Уестън Прайс, за който можете да си припомните [тук](/blog/2014-02-27-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-1/) и [тук](/blog/2014-03-03-%D1%85%D1%80%D0%B0%D0%BD%D0%B8-%D0%B7%D0%B0-%D0%B7%D0%B4%D1%80%D0%B0%D0%B2%D0%B8-%D0%B7%D1%8A%D0%B1%D0%B8-%D1%87%D0%B0%D1%81%D1%82-2/) често можете да срещнете племена и култури, които изяждат първо органите на животното, а мускулното месо се разпределя като храна за хората, за кучетата и за запаси. Освен това в немалко култури най-ценните органи са предоставяни на членовете на племето със специални нужди - бременни жени, деца, шаманите или пък ловците. - -**Черният дроб и другите органни меса са най-концентрираният източник на витамини, минерали, полезни мазнини и незаменими аминокиселини.** - -Сравнено с мускулното месо, органите са с далеч по-висока хранителна плътност и са по-богати на който и да е нутриент. Те включват в състава си големи дози витамини от групата В: В2, В6, В9(фолиева киселина) и много важният витамин В12. Субпродуктите също така съдържат минерали като фосфор, желязо, мед, магнезий, йод, калций, селен, калий, натрий, цинк, манган и доставят важните мастно-разтворими витамини A, D, E и K. В животинските органи се съдържа най-голямо количество лесно усвоим витамин D в сравнение със всеки друг източник. С тази питателна храна си набавяме и голямо количество есенциални мастни киселини, вкл. арахидонова киселина и Омега-3 киселините EPA и DHA. - -**Черният дроб** е най-концентрираният източник на витамин А, в сравнение с всички храни. Ето някои данни: - ->Черен дроб от риба треска - Vitamin А 100 000IU/ 100гр - ->Черен дроб от теле, кърмаче - Vitamin A 70559IU/100гр - ->Черен дроб от възрастно теле, пасящо - Vitamin A 31718IU/100гр - ->Агнешки дроб - Vitamin A 24943 IU/100гр - ->Свински дроб - Vitamin A 17998 IU/100гр - ->Пилешки дроб - Vitamin A 13328 IU/100гр - -За витамин А съм [писала](/blog/2014-06-02-%D0%BA%D0%B0%D0%BA-%D0%BC%D0%B0%D1%80%D0%B8%D1%8F-%D1%81%D0%B8-%D0%B2%D1%8A%D1%80%D0%BD%D0%B0-%D1%83%D1%81%D0%BC%D0%B8%D0%B2%D0%BA%D0%B0%D1%82%D0%B0/) и преди. Той е изключително важен за здрави зъби и кости, но децата и хора, засегнати от определени състояния не могат да го преработват от растителни източници. За тях е задължителна употребата на черен дроб веднъж или два пъти седмично. Разбира се, консумацията на чернен дроб има и други важни ползи за човешкото тяло: той е източник на витамин D, Витамин B12(и други витамини от групата В), мед, магнезий, фосфор, манган и желязо, които са във възможно най-лесно усвоимата си форма. - -**Бъбреците** са богати на витамин В12, селен, желязо, мед, фосфор и цинк. - -Въпреки че **сърцето** е мускул, то също доставя богат набор от полезни вещества на човека. То е много концентриран източник на Коензим Q10, който е важен за здравето на нашето сърце и за силен имунитет. Сърцето съдържа витамин А, В12, фолиева киселина, желязо, селен, фосфор, цинк и е най-богатият източник на мед. От сърцето можем да си набавим два пъти повече колаген и еластин, спрямо обикновенното мускулно месо. Това е така, защото то е богато на аминокиселините глицин и пролин, които са важни за здрава съединителна тъкан, здрави стави и добро храносмилане. - -Още една причина да ядем повече черен дроб и субпродукти е, че те са много по-евтини, а всъщност дават много повече на организма. Най-добрият вариант е да купувате храната си директно от животновъди, които хранят животните си с паша и сено. Но дори и да се налага да купувате храната си от супермаркетите, все пак органните меса ще ви донесат много от гореизброените ползи. - -Разбира се, напълно на ясно съм, че следващата стъпка, а именно приготвянето на това месо, би могла да е препъни-камък по пътя, но с доза ентусиазъм и нужното търпение, съм сигурна, че ще успеете да намерите рецептата, която допада на вкуса на вашето семейство. Например черен дроб, приготвен като пастет е любимо ястие на много възрастни и деца. [Ето](http://pep-4o.blogspot.com/2009/10/4-800-1-200-200.html) и [още](http://pep-4o.blogspot.com/2012/11/blog-post_25.html) варианти. - -Надявам се да съм ви убедила в полезността от консумацията на животински органи и да започнете да го включвате в менюто си, в случай че не го правите сега. Моята препоръка е да имате две хранения седмично, съдържащи някои от тези толкова полезни за човешкото тяло храни.;T; -I"

    Субпродуктите не са много популярна храна в съвременният начин на хранене, за разлика от миналото. Нашите прародители са употребявали всички части на закланото животно включително черен дроб, бъбреци, стомах, сърце, мозък и дори тестиси. Защо? Какво според вас има толкова ценно в тези части, сравнено с мускулното месо, което сме свикнали да ядем? Отговорът е ИМА МНОГО ПОВЕЧЕ ХРАНИТЕЛНИ ВЕЩЕСТВА!

    - -

    В труда на Д-р Уестън Прайс, за който можете да си припомните тук и тук често можете да срещнете племена и култури, които изяждат първо органите на животното, а мускулното месо се разпределя като храна за хората, за кучетата и за запаси. Освен това в немалко култури най-ценните органи са предоставяни на членовете на племето със специални нужди - бременни жени, деца, шаманите или пък ловците.

    - -

    Черният дроб и другите органни меса са най-концентрираният източник на витамини, минерали, полезни мазнини и незаменими аминокиселини.

    - -

    Сравнено с мускулното месо, органите са с далеч по-висока хранителна плътност и са по-богати на който и да е нутриент. Те включват в състава си големи дози витамини от групата В: В2, В6, В9(фолиева киселина) и много важният витамин В12. Субпродуктите също така съдържат минерали като фосфор, желязо, мед, магнезий, йод, калций, селен, калий, натрий, цинк, манган и доставят важните мастно-разтворими витамини A, D, E и K. В животинските органи се съдържа най-голямо количество лесно усвоим витамин D в сравнение със всеки друг източник. С тази питателна храна си набавяме и голямо количество есенциални мастни киселини, вкл. арахидонова киселина и Омега-3 киселините EPA и DHA.

    - -

    Черният дроб е най-концентрираният източник на витамин А, в сравнение с всички храни. Ето някои данни:

    - -
    -

    Черен дроб от риба треска - Vitamin А 100 000IU/ 100гр

    -
    - -
    -

    Черен дроб от теле, кърмаче - Vitamin A 70559IU/100гр

    -
    - -
    -

    Черен дроб от възрастно теле, пасящо - Vitamin A 31718IU/100гр

    -
    - -
    -

    Агнешки дроб - Vitamin A 24943 IU/100гр

    -
    - -
    -

    Свински дроб - Vitamin A 17998 IU/100гр

    -
    - -
    -

    Пилешки дроб - Vitamin A 13328 IU/100гр

    -
    - -

    За витамин А съм писала и преди. Той е изключително важен за здрави зъби и кости, но децата и хора, засегнати от определени състояния не могат да го преработват от растителни източници. За тях е задължителна употребата на черен дроб веднъж или два пъти седмично. Разбира се, консумацията на чернен дроб има и други важни ползи за човешкото тяло: той е източник на витамин D, Витамин B12(и други витамини от групата В), мед, магнезий, фосфор, манган и желязо, които са във възможно най-лесно усвоимата си форма.

    - -

    Бъбреците са богати на витамин В12, селен, желязо, мед, фосфор и цинк.

    - -

    Въпреки че сърцето е мускул, то също доставя богат набор от полезни вещества на човека. То е много концентриран източник на Коензим Q10, който е важен за здравето на нашето сърце и за силен имунитет. Сърцето съдържа витамин А, В12, фолиева киселина, желязо, селен, фосфор, цинк и е най-богатият източник на мед. От сърцето можем да си набавим два пъти повече колаген и еластин, спрямо обикновенното мускулно месо. Това е така, защото то е богато на аминокиселините глицин и пролин, които са важни за здрава съединителна тъкан, здрави стави и добро храносмилане.

    - -

    Още една причина да ядем повече черен дроб и субпродукти е, че те са много по-евтини, а всъщност дават много повече на организма. Най-добрият вариант е да купувате храната си директно от животновъди, които хранят животните си с паша и сено. Но дори и да се налага да купувате храната си от супермаркетите, все пак органните меса ще ви донесат много от гореизброените ползи.

    - -

    Разбира се, напълно на ясно съм, че следващата стъпка, а именно приготвянето на това месо, би могла да е препъни-камък по пътя, но с доза ентусиазъм и нужното търпение, съм сигурна, че ще успеете да намерите рецептата, която допада на вкуса на вашето семейство. Например черен дроб, приготвен като пастет е любимо ястие на много възрастни и деца. Ето и още варианти.

    - -

    Надявам се да съм ви убедила в полезността от консумацията на животински органи и да започнете да го включвате в менюто си, в случай че не го правите сега. Моята препоръка е да имате две хранения седмично, съдържащи някои от тези толкова полезни за човешкото тяло храни.

    -;T; @I"/blog/all_posts/;T{;{ ;I" -;T; I": -<%= render '_posts_small', :posts => posts_list %> - -;T; -I"p -
  • Documentation added to Forknote
  • - -;T; @I"&/static/images/facebook-icon.png/;T{;{I")/static/images/facebook-icon@2x.png/;T{;{I"/blog/feed/;T{;{;I"N - - - http://bezkaries.com/ - Forknote: Blog - 2015-10-11T21:00:00Z - - - - forknote - http://forknote.net/blog/ - - - tag:bezkaries.com,2015-10-12:/blog/2015-10-12-documentation-added-to-forknote/ - Documentation added to Forknote - 2015-10-11T21:00:00Z - 2015-10-11T21:00:00Z - - pmitchev - http://forknote.net/blog/ - - - -<p>Documentation was added for:</p> - -<ul> - <li><a href="/documentation/daemon/">Daemon</a></li> - <li><a href="/documentation/simplewallet/">Simplewallet</a></li> - <li><a href="/documentation/payment-gateway/">Payment gateway</a></li> -</ul> - -<p>Guides for the most common questions were created:</p> - -<ul> - <li><a href="/guide/getting-started/">Getting started</a></li> - <li><a href="/guide/create-coin/">Create coin</a></li> - <li><a href="/guide/starting-seed-node/">Starting seed node</a></li> -</ul> - - - - - -;T; I"= -<%= atom_feed :limit => 30, :articles => posts_list %> -;T; -@I" /CNAME/;T{;{I" -/404/;T{;{ ;I" - - - - - - - 404 error | Forknote.net - - - - - - - - - - - -
    - -
    - - - -
    -
    - -

    404 error

    - -The page you are looking for does not exist. - -
    -
    -
    -
    - - - - - - - - -;T; I" -
    -
    - -

    404 error

    - -The page you are looking for does not exist. - -
    -
    ;T; -I" -
    -
    - -

    404 error

    - -The page you are looking for does not exist. - -
    -
    -
    -
    -;T; @I"/contact/error/;T{;{ ;I"& - - - - - - - За контакти - грешка | BezKaries.com - - - - - - - - - - - -
    - -
    - -
    -
    - -

    Форма за контакт

    - -

    Имаше проблем с изпращането на вашето запитване. Моля, изпратете ни email на адрес info@bezkaries.com.

    - -
    - - - -
    - - - - - - - -;T; I" -# Форма за контакт - -Имаше проблем с изпращането на вашето запитване. Моля, изпратете ни email на адрес info@bezkaries.com.;T; -I"  -

    Форма за контакт

    - -

    Имаше проблем с изпращането на вашето запитване. Моля, изпратете ни email на адрес info@bezkaries.com.

    -;T; @I"/contact/success/;T{;{ ;I" - - - - - - - За контакти - успешно изпратено | BezKaries.com - - - - - - - - - - - -
    - -
    - -
    -
    - -

    Форма за контакт

    - -

    Вашето запитване беше изпратено успешно!

    - -
    - - - -
    - - - - - - - -;T; I"s -# Форма за контакт - -Вашето запитване беше изпратено успешно!;T; -I" -

    Форма за контакт

    - -

    Вашето запитване беше изпратено успешно!

    -;T; @I"/contact/invalid_field/;T{;{ ;I"H - - - - - - - За контакти - невалидно поле | BezKaries.com - - - - - - - - - - - -
    - -
    - -
    -
    - -

    Форма за контакт

    - -

    Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си.

    - -
    - - - -
    - - - - - - - -;T; I" -# Форма за контакт - -Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си.;T; -I" -

    Форма за контакт

    - -

    Не сте попълнили задължително поле. Моля, върнете се и попълнете задължителните полета, преди да изпратите съобщението си.

    -;T; @I"!/static/assets/js/base58.js/;T{;{I""/static/assets/js/cn_util.js/;T{;{I"!/static/assets/js/config.js/;T{;{I"!/static/assets/js/crypto.js/;T{;{I")/static/assets/js/lib/biginteger.js/;T{;{I"#/static/assets/js/mnemonic.js/;T{;{I"%/static/dist/ng-google-chart.js/;T{;{I"$/static/dist/showErrors.min.js/;T{;{I""/static/partials/create.html/;T{;{I" /static/partials/create.js/;T{;{I"'/static/images/forknote-large.png/;T{;{I"*/static/images/forknote-large@2x.png/;T{;{I"'/static/images/forknote-small.png/;T{;{I"*/static/images/forknote-small@2x.png/;T{;{I" /coins/;T{;{ ;I"/ - - - - - - - Existing coins | Forknote - - - - - - - - - - - -
    - -
    - - - - - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    -
      -
    • - -

      Bytecoin

      -

      The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

      -
    • -
    • - -

      Dashcoin

      -

      The original idea for cloning the core features of Bytecoin started with Dashcoin.

      -
    • -
    • - -

      OneEvilCoin

      -

      OneEvilCoin is the first coin joined the Forknote familly

      -
    • -
    -
    -
    -
      -
    • - E -

      Ethanolium

      -

      -
    • -
    • - -

      Add Your Coin

      -

      Contact us to get your Forknote coin added to this list.

      -
    • -
    • -   -

       

      -

      -
    • -
    -
    - -
    -
    - -

    New to Forknote?

    -

    A few tips you start:

    - -
    - -
    - -

    Want to create your own cryptocurrency?

    -

    Visit the developer section or go streight to the documentation:

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - -;T; I"# - - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    -
      -
    • - -

      Bytecoin

      -

      The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

      -
    • -
    • - -

      Dashcoin

      -

      The original idea for cloning the core features of Bytecoin started with Dashcoin.

      -
    • -
    • - -

      OneEvilCoin

      -

      OneEvilCoin is the first coin joined the Forknote familly

      -
    • -
    -
    -
    -
      -
    • - E -

      Ethanolium

      -

      -
    • -
    • - -

      Add Your Coin

      -

      Contact us to get your Forknote coin added to this list.

      -
    • -
    • -   -

       

      -

      -
    • -
    -
    - -
    -
    - -

    New to Forknote?

    -

    A few tips you start:

    - -
    - -
    - -

    Want to create your own cryptocurrency?

    -

    Visit the developer section or go streight to the documentation:

    - -
    -
    - - - - - - - - - - - - - -;T; -I"# - - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    -
      -
    • - -

      Bytecoin

      -

      The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

      -
    • -
    • - -

      Dashcoin

      -

      The original idea for cloning the core features of Bytecoin started with Dashcoin.

      -
    • -
    • - -

      OneEvilCoin

      -

      OneEvilCoin is the first coin joined the Forknote familly

      -
    • -
    -
    -
    -
      -
    • - E -

      Ethanolium

      -

      -
    • -
    • - -

      Add Your Coin

      -

      Contact us to get your Forknote coin added to this list.

      -
    • -
    • -   -

       

      -

      -
    • -
    -
    - -
    -
    - -

    New to Forknote?

    -

    A few tips you start:

    - -
    - -
    - -

    Want to create your own cryptocurrency?

    -

    Visit the developer section or go streight to the documentation:

    - -
    -
    - - - - - - - - - - - - - - - -;T; @I"/download/;T{;{ ;I" - - - - - - - Download | Forknote - - - - - - - - - - - -
    - -
    - - - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    -
      -
    • - -

      Windows CLI

      -

      Daemon, simplewallet and payment gateway for Windows (64bit)

      -
    • -
    • - -

      Linux CLI

      -

      Daemon, simplewallet and payment gateway for Ubuntu (64bit)

      -
    • -
    • - -

      Mac CLI

      -

      Daemon, simplewallet and payment gateway for Mac (64bit)

      -
    • -
    -
    - -
    -
    - -

    Want to connect to existing Forknote network?

    -

    Awesome! A few tips you may find useful:

    - -
    - -
    - -

    Want to create your own cryptocurrency?

    -

    Follow our guides and launch in a few minutes:

    - -
    -
    - - - - - - - - -;T; I" -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    -
      -
    • - -

      Windows CLI

      -

      Daemon, simplewallet and payment gateway for Windows (64bit)

      -
    • -
    • - -

      Linux CLI

      -

      Daemon, simplewallet and payment gateway for Ubuntu (64bit)

      -
    • -
    • - -

      Mac CLI

      -

      Daemon, simplewallet and payment gateway for Mac (64bit)

      -
    • -
    -
    - -
    -
    - -

    Want to connect to existing Forknote network?

    -

    Awesome! A few tips you may find useful:

    - -
    - -
    - -

    Want to create your own cryptocurrency?

    -

    Follow our guides and launch in a few minutes:

    - -
    -
    -;T; -I" -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    -
    -
    - -
    -
      -
    • - -

      Windows CLI

      -

      Daemon, simplewallet and payment gateway for Windows (64bit)

      -
    • -
    • - -

      Linux CLI

      -

      Daemon, simplewallet and payment gateway for Ubuntu (64bit)

      -
    • -
    • - -

      Mac CLI

      -

      Daemon, simplewallet and payment gateway for Mac (64bit)

      -
    • -
    -
    - -
    -
    - -

    Want to connect to existing Forknote network?

    -

    Awesome! A few tips you may find useful:

    - -
    - -
    - -

    Want to create your own cryptocurrency?

    -

    Follow our guides and launch in a few minutes:

    - -
    -
    -;T; @I"%/static/images/twitter-icon.png/;T{;{I"(/static/images/twitter-icon@2x.png/;T{;{I"'/static/images/coins/bytecoin.png/;T{;{I"*/static/images/coins/bytecoin@2x.png/;T{;{I"+/static/images/coins/bytecoin@org.png/;T{;{I"'/static/images/coins/dashcoin.png/;T{;{I"*/static/images/coins/dashcoin@2x.png/;T{;{I"+/static/images/coins/dashcoin@org.png/;T{;{I"*/static/images/coins/oneevilcoin.png/;T{;{I"-/static/images/coins/oneevilcoin@2x.png/;T{;{I"./static/images/coins/oneevilcoin@org.png/;T{;{I"/developers/;T{;{ ;I"U - - - - - - - Developers | Forknote - - - - - - - - - - - -
    - -
    - - - -
    -
    -

    Create Cryptonote cryptocurrencies fast and easy.

    -

    All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

    - Create now -
    -
    - -
    - -
    - -
    -
    - -

    Already have a configuration file?

    -

    We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

    - -
    - -
    - -

    Ready to start a Forknote-based service?

    -

    Helpful resources for individual developers and companies:

    - -
    -
    - - - - - - - - -;T; I" -
    -
    -

    Create Cryptonote cryptocurrencies fast and easy.

    -

    All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

    - Create now -
    -
    - -
    - -
    - -
    -
    - -

    Already have a configuration file?

    -

    We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

    - -
    - -
    - -

    Ready to start a Forknote-based service?

    -

    Helpful resources for individual developers and companies:

    - -
    -
    -;T; -I" -
    -
    -

    Create Cryptonote cryptocurrencies fast and easy.

    -

    All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

    - Create now -
    -
    - -
    - -
    - -
    -
    - -

    Already have a configuration file?

    -

    We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

    - -
    - -
    - -

    Ready to start a Forknote-based service?

    -

    Helpful resources for individual developers and companies:

    - -
    -
    -;T; @FI" /create/;T{;{ ;I" - - - - - - - Create Cryptonote coin | Forknote - - - - - - - - - - - -
    - -
    - - - -
    - - - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;T; I"L -
    - - - - -
    - - -
    - - - - - - - - - - - - - - - - -;T; -I"[ -
    - - - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;T; @LI"/static/js/app_create.js/;T{;{I",/coins/guides/create-coin-with-premine/;T{;{ ;I"_ - - - - - - - Create coin with premine | Forknote - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Getting Started

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Overview

    - -

    Most applications will use an existing wrapper library in the language -of your choice, but it’s important to familiarize yourself with the underlying API -HTTP methods first.

    - -

    There’s no easier way to kick the tires than through cURL.

    - -

    Hello World

    - -

    Let’s start by testing our setup. Open up a command prompt and enter the -following command (without the $):

    - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -

    The response will be a random selection from our design philosophies.

    - -

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    There are a few interesting bits in the response headers. As expected, the -Content-Type is application/json.

    - -

    Any headers beginning with X- are custom headers, and are not included in the -HTTP spec. Let’s take a look at a few of them:

    - -
      -
    • -X-GitHub-Media-Type has a value of github.v3. This lets us know the media type -for the response. Media types have helped us version our output in API v3. We’ll -talk more about that later.
    • -
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This -pair of headers indicate how many requests a client can make in -a rolling time period (typically an hour) and how many of those requests the -client has already spent.
    • -
    - -

    Authentication

    - -

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to -authenticate. In fact, doing anything interesting with the GitHub API requires -authentication.

    - -

    Basic

    - -

    The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication.

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -

    The -u flag sets the username, and cURL will prompt you for the password. You -can use -u "username:password" to avoid the prompt, but this leaves your -password in shell history and isn’t recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -X-RateLimit-Limit header.

    - -

    In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API.

    - -

    Two-factor authentication

    - -

    If you have two-factor authentication enabled, the API will return a -401 Unauthorized error code for the above request (and every other API request):

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -

    The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -OAuth section below for more information.

    - -

    Get your own user profile

    - -

    When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -your own user profile:

    - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -

    This time, in addition to the same set of public information we -retrieved for @defunkt earlier, you should also see the non-public -information for your user profile. For example, you’ll see a plan object -in the response which gives details about the GitHub plan for the account.

    - -

    OAuth

    - -

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use OAuth.

    - -

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big -features:

    - -
      -
    • -Revokable access: users can revoke authorization to third party apps at any time
    • -
    • -Limited access: users can review the specific access that a token -will provide before authorizing a third party app
    • -
    - -

    Normally, tokens are created via a web flow. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it’s authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application:

    - -

    GitHub's OAuth Prompt

    - -

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to create a personal access token via your -Personal access tokens settings page:

    - -

    Personal Token selection

    - -

    Also, the Authorizations API makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command:

    - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -

    There’s a lot going on in this one little call, so let’s break it down. First, -the -d flag indicates we’re doing a POST, using the -application/x-www-form-urlencoded content type (as opposed to GET). All POST -requests to the GitHub API should be in JSON.

    - -

    Next, let’s look at the scopes we’re sending over in this call. When creating -a new token, we include an optional array of scopes, or access -levels, that indicate what information this token can access. In this case, -we’re setting up the token with repo access, which grants access to read and -write to public and private repositories, and user scope, which grants read -and write access to public and private user profile data. See -the scopes docs for a full list of -scopes. You should only request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The 201 -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token.

    - -

    If you have two-factor authentication enabled, the API will -return the previously described 401 Unauthorized error code -for the above request. You can get around that error by providing a 2FA OTP code -in the X-GitHub-OTP request header:

    - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you’ll receive an SMS with your OTP code after making a request to -this endpoint.

    - -

    Now, we can use the forty character token instead of a username and password -in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -

    Treat OAuth tokens like passwords! Don’t share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent.

    - -

    Now that we’ve got the hang of making authenticated calls, let’s move along to -the Repositories API.

    - -

    Repositories

    - -

    Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can GET repository details in the same way we fetched user -details earlier:

    - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -

    In the same way, we can view repositories for the authenticated user:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -

    Or, we can list repositories for another user:

    - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -

    Or, we can list repositories for an organization:

    - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -

    The information returned from these calls will depend on how we authenticate:

    - -
      -
    • Using Basic Authentication, the response includes all repositories the -the user has access to see on github.com.
    • -
    • Using OAuth, private repositories are only returned if the OAuth token -contains the repo scope.
    • -
    - -

    As the docs indicate, these methods take a type parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team.

    - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -

    In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string.

    - -

    Create a repository

    - -

    Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To create a repository, -we need to POST some JSON containing the details and configuration options.

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -

    In this minimal example, we create a new repository for our blog (to be served -on GitHub Pages, perhaps). Though the blog will be public, we’ve made -the repository private. In this single step, we’ll also initialize it with -a README and a nanoc-flavored .gitignore template.

    - -

    The resulting repository will be found at https://github.com/<your_username>/blog. -To create a repository under an organization for which you’re -an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    - -

    Next, let’s fetch our newly created repository:

    - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -

    Oh noes! Where did it go? Since we created the repository as private, we need -to authenticate in order to see it. If you’re a grizzled HTTP user, you might -expect a 403 instead. Since we don’t want to leak information about private -repositories, the GitHub API returns a 404 in this case, as if to say “we can -neither confirm nor deny the existence of this repository.”

    - -

    Issues

    - -

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while -staying out of your way. With the GitHub Issues API, you can pull -data out or create issues from other tools to create a workflow that works for -your team.

    - -

    Just like github.com, the API provides a few methods to view issues for the -authenticated user. To see all your issues, call GET /issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -

    To get only the issues under one of your GitHub organizations, call GET -/orgs/<org>/issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -

    We can also get all the issues under a single repository:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -

    Pagination

    - -

    A project the size of Rails has thousands of issues. We’ll need to paginate, -making multiple API calls to get the data. Let’s repeat that last call, this -time taking note of the response headers:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -

    The Link header provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results.

    - -

    Creating an issue

    - -

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from -the API.

    - -

    To create an issue, we need to be authenticated, so we’ll pass an -OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON -body to the /issues path underneath the repository in which we want to create -the issue:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -

    The response gives us a couple of pointers to the newly created issue, both in -the Location response header and the url field of the JSON response.

    - -

    Conditional requests

    - -

    A big part of being a good API citizen is respecting rate limits by -caching information that hasn’t changed. The API supports conditional -requests and helps you do the right thing. Consider the -first call we made to get defunkt’s profile:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -

    In addition to the JSON body, take note of the HTTP status code of 200 and -the ETag header. -The ETag is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed:

    - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -

    The 304 status indicates that the resource hasn’t changed since the last time -we asked for it and the response will contain no body. As a bonus, 304 -responses don’t count against your rate limit.

    - -

    Woot! Now you know the basics of the GitHub API!

    - -
      -
    • Basic & OAuth authentication
    • -
    • Fetching and creating repositories and issues
    • -
    • Conditional requests
    • -
    - -

    Keep learning with the next API guide Basics of Authentication!

    - - -
    -
    - - - - - - - -;T; I"L -# Getting Started - -* TOC -{:toc} - -Let's walk through core API concepts as we tackle some everyday use cases. - -## Overview - -Most applications will use an existing [wrapper library][wrappers] in the language -of your choice, but it's important to familiarize yourself with the underlying API -HTTP methods first. - -There's no easier way to kick the tires than through [cURL][curl]. - -### Hello World - -Let's start by testing our setup. Open up a command prompt and enter the -following command (without the `$`): - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -The response will be a random selection from our design philosophies. - -Next, let's `GET` [Chris Wanstrath's][defunkt github] [GitHub profile][users api]: - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -Mmmmm, tastes like [JSON][json]. Let's add the `-i` flag to include headers: - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -There are a few interesting bits in the response headers. As expected, the -`Content-Type` is `application/json`. - -Any headers beginning with `X-` are custom headers, and are not included in the -HTTP spec. Let's take a look at a few of them: - -* `X-GitHub-Media-Type` has a value of `github.v3`. This lets us know the [media type][media types] -for the response. Media types have helped us version our output in API v3. We'll -talk more about that later. -* Take note of the `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers. This -pair of headers indicate [how many requests a client can make][rate limiting] in -a rolling time period (typically an hour) and how many of those requests the -client has already spent. - -## Authentication - -Unauthenticated clients can make 60 requests per hour. To get more, we'll need to -_authenticate_. In fact, doing anything interesting with the GitHub API requires -[authentication][authentication]. - -### Basic - -The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication. - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -The `-u` flag sets the username, and cURL will prompt you for the password. You -can use `-u "username:password"` to avoid the prompt, but this leaves your -password in shell history and isn't recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -`X-RateLimit-Limit` header. - -In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API. - -### Two-factor authentication - -If you have [two-factor authentication][2fa] enabled, the API will return a -`401 Unauthorized` error code for the above request (and every other API request): - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -[OAuth section][oauth section] below for more information. - -### Get your own user profile - -When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -[your own user profile][auth user api]: - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -This time, in addition to the same set of public information we -retrieved for [@defunkt][defunkt github] earlier, you should also see the non-public -information for your user profile. For example, you'll see a `plan` object -in the response which gives details about the GitHub plan for the account. - -### OAuth - -While convenient, Basic Authentication isn't ideal because you shouldn't give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use [OAuth][oauth]. - -Instead of usernames and passwords, OAuth uses _tokens_. Tokens provide two big -features: - -* **Revokable access**: users can revoke authorization to third party apps at any time -* **Limited access**: users can review the specific access that a token - will provide before authorizing a third party app - -Normally, tokens are created via a [web flow][webflow]. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it's authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application: - -![GitHub's OAuth Prompt](/images/oauth_prompt.png) - -However, you don't need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to [create a **personal access token**][personal token] via your -[Personal access tokens settings page][tokens settings]: - -![Personal Token selection](/images/personal_token.png) - -Also, the [**Authorizations API**][authorizations api] makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command: - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -There's a lot going on in this one little call, so let's break it down. First, -the `-d` flag indicates we're doing a `POST`, using the -`application/x-www-form-urlencoded` content type (as opposed to `GET`). All `POST` -requests to the GitHub API should be in JSON. - -Next, let's look at the `scopes` we're sending over in this call. When creating -a new token, we include an optional array of [_scopes_][scopes], or access -levels, that indicate what information this token can access. In this case, -we're setting up the token with _repo_ access, which grants access to read and -write to public and private repositories, and _user_ scope, which grants read -and write access to public and private user profile data. See -[the scopes docs][scopes] for a full list of -scopes. You should **only** request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The `201` -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token. - -If you have [two-factor authentication][2fa] enabled, the API will -return the [previously described `401 Unauthorized` error code][2fa section] -for the above request. You can get around that error by providing a 2FA OTP code -in the [X-GitHub-OTP request header][2fa header]: - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you'll receive an SMS with your OTP code after making a request to -this endpoint. - -Now, we can use the forty character `token` instead of a username and password -in the rest of our examples. Let's grab our own user info again, using OAuth this time: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -**Treat OAuth tokens like passwords!** Don't share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent. - -Now that we've got the hang of making authenticated calls, let's move along to -the [Repositories API][repos-api]. - -## Repositories - -Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can [`GET` repository details][get repo] in the same way we fetched user -details earlier: - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -In the same way, we can [view repositories for the authenticated user][user repos api]: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -Or, we can [list repositories for another user][other user repos api]: - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -Or, we can [list repositories for an organization][org repos api]: - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -The information returned from these calls will depend on how we authenticate: - -* Using Basic Authentication, the response includes all repositories the - the user has access to see on github.com. -* Using OAuth, private repositories are only returned if the OAuth token - contains the `repo` [scope][scopes]. - -As the [docs][repos-api] indicate, these methods take a `type` parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team. - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string. - -### Create a repository - -Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To [create a repository][create repo], -we need to `POST` some JSON containing the details and configuration options. - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -In this minimal example, we create a new repository for our blog (to be served -on [GitHub Pages][pages], perhaps). Though the blog will be public, we've made -the repository private. In this single step, we'll also initialize it with -a README and a [nanoc][nanoc]-flavored [.gitignore template][gitignore -templates]. - -The resulting repository will be found at `https://github.com//blog`. -To create a repository under an organization for which you're -an owner, just change the API method from `/user/repos` to `/orgs//repos`. - -Next, let's fetch our newly created repository: - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -Oh noes! Where did it go? Since we created the repository as _private_, we need -to authenticate in order to see it. If you're a grizzled HTTP user, you might -expect a `403` instead. Since we don't want to leak information about private -repositories, the GitHub API returns a `404` in this case, as if to say "we can -neither confirm nor deny the existence of this repository." - -## Issues - -The UI for Issues on GitHub aims to provide 'just enough' workflow while -staying out of your way. With the GitHub [Issues API][issues-api], you can pull -data out or create issues from other tools to create a workflow that works for -your team. - -Just like github.com, the API provides a few methods to view issues for the -authenticated user. To [see all your issues][get issues api], call `GET /issues`: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -To get only the [issues under one of your GitHub organizations][get issues api], call `GET -/orgs//issues`: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -We can also get [all the issues under a single repository][repo issues api]: - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -### Pagination - -A project the size of Rails has thousands of issues. We'll need to [paginate][pagination], -making multiple API calls to get the data. Let's repeat that last call, this -time taking note of the response headers: - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -The [`Link` header][link-header] provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results. - -### Creating an issue - -Now that we've seen how to paginate lists of issues, let's [create an issue][create issue] from -the API. - -To create an issue, we need to be authenticated, so we'll pass an -OAuth token in the header. Also, we'll pass the title, body, and labels in the JSON -body to the `/issues` path underneath the repository in which we want to create -the issue: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -The response gives us a couple of pointers to the newly created issue, both in -the `Location` response header and the `url` field of the JSON response. - -## Conditional requests - -A big part of being a good API citizen is respecting rate limits by -caching information that hasn't changed. The API supports [conditional -requests][conditional-requests] and helps you do the right thing. Consider the -first call we made to get defunkt's profile: - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -In addition to the JSON body, take note of the HTTP status code of `200` and -the `ETag` header. -The [ETag][etag] is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed: - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -The `304` status indicates that the resource hasn't changed since the last time -we asked for it and the response will contain no body. As a bonus, `304` -responses don't count against your [rate limit][rate-limiting]. - -Woot! Now you know the basics of the GitHub API! - -* Basic & OAuth authentication -* Fetching and creating repositories and issues -* Conditional requests - -Keep learning with the next API guide [Basics of Authentication][auth guide]! - - -[wrappers]: /libraries/ -[curl]: http://curl.haxx.se/ -[media types]: /v3/media/ -[oauth]: /v3/oauth/ -[webflow]: /v3/oauth/#web-application-flow -[authorizations api]: /v3/oauth_authorizations/#create-a-new-authorization -[scopes]: /v3/oauth/#scopes -[repos-api]: /v3/repos/ -[pages]: http://pages.github.com -[nanoc]: http://nanoc.ws/ -[gitignore templates]: https://github.com/github/gitignore -[issues-api]: /v3/issues/ -[link-header]: http://www.w3.org/wiki/LinkHeader/ -[conditional-requests]: /v3/#conditional-requests -[rate-limiting]: /v3/#rate-limiting -[users api]: /v3/users/#get-a-single-user -[auth user api]: /v3/users/#get-the-authenticated-user -[defunkt github]: https://github.com/defunkt -[json]: http://en.wikipedia.org/wiki/JSON -[rate limiting]: /v3/#rate-limiting -[authentication]: /v3/#authentication -[2fa]: https://help.github.com/articles/about-two-factor-authentication -[2fa header]: /v3/auth/#working-with-two-factor-authentication -[oauth section]: /guides/getting-started/#oauth -[personal token]: https://help.github.com/articles/creating-an-access-token-for-command-line-use -[tokens settings]: https://github.com/settings/tokens -[pagination]: /v3/#pagination -[get repo]: /v3/repos/#get -[create repo]: /v3/repos/#create -[create issue]: /v3/issues/#create-an-issue -[auth guide]: /guides/basics-of-authentication -[user repos api]: /v3/repos/#list-your-repositories -[other user repos api]: /v3/repos/#list-user-repositories -[org repos api]: /v3/repos/#list-organization-repositories -[get issues api]: /v3/issues/#list-issues -[repo issues api]: /v3/issues/#list-issues-for-a-repository -[etag]: http://en.wikipedia.org/wiki/HTTP_ETag -[2fa section]: /guides/getting-started/#two-factor-authentication -;T; -I"=S -

    Getting Started

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Overview

    - -

    Most applications will use an existing wrapper library in the language -of your choice, but it’s important to familiarize yourself with the underlying API -HTTP methods first.

    - -

    There’s no easier way to kick the tires than through cURL.

    - -

    Hello World

    - -

    Let’s start by testing our setup. Open up a command prompt and enter the -following command (without the $):

    - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -

    The response will be a random selection from our design philosophies.

    - -

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    There are a few interesting bits in the response headers. As expected, the -Content-Type is application/json.

    - -

    Any headers beginning with X- are custom headers, and are not included in the -HTTP spec. Let’s take a look at a few of them:

    - -
      -
    • -X-GitHub-Media-Type has a value of github.v3. This lets us know the media type -for the response. Media types have helped us version our output in API v3. We’ll -talk more about that later.
    • -
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This -pair of headers indicate how many requests a client can make in -a rolling time period (typically an hour) and how many of those requests the -client has already spent.
    • -
    - -

    Authentication

    - -

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to -authenticate. In fact, doing anything interesting with the GitHub API requires -authentication.

    - -

    Basic

    - -

    The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication.

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -

    The -u flag sets the username, and cURL will prompt you for the password. You -can use -u "username:password" to avoid the prompt, but this leaves your -password in shell history and isn’t recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -X-RateLimit-Limit header.

    - -

    In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API.

    - -

    Two-factor authentication

    - -

    If you have two-factor authentication enabled, the API will return a -401 Unauthorized error code for the above request (and every other API request):

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -

    The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -OAuth section below for more information.

    - -

    Get your own user profile

    - -

    When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -your own user profile:

    - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -

    This time, in addition to the same set of public information we -retrieved for @defunkt earlier, you should also see the non-public -information for your user profile. For example, you’ll see a plan object -in the response which gives details about the GitHub plan for the account.

    - -

    OAuth

    - -

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use OAuth.

    - -

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big -features:

    - -
      -
    • -Revokable access: users can revoke authorization to third party apps at any time
    • -
    • -Limited access: users can review the specific access that a token -will provide before authorizing a third party app
    • -
    - -

    Normally, tokens are created via a web flow. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it’s authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application:

    - -

    GitHub's OAuth Prompt

    - -

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to create a personal access token via your -Personal access tokens settings page:

    - -

    Personal Token selection

    - -

    Also, the Authorizations API makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command:

    - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -

    There’s a lot going on in this one little call, so let’s break it down. First, -the -d flag indicates we’re doing a POST, using the -application/x-www-form-urlencoded content type (as opposed to GET). All POST -requests to the GitHub API should be in JSON.

    - -

    Next, let’s look at the scopes we’re sending over in this call. When creating -a new token, we include an optional array of scopes, or access -levels, that indicate what information this token can access. In this case, -we’re setting up the token with repo access, which grants access to read and -write to public and private repositories, and user scope, which grants read -and write access to public and private user profile data. See -the scopes docs for a full list of -scopes. You should only request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The 201 -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token.

    - -

    If you have two-factor authentication enabled, the API will -return the previously described 401 Unauthorized error code -for the above request. You can get around that error by providing a 2FA OTP code -in the X-GitHub-OTP request header:

    - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you’ll receive an SMS with your OTP code after making a request to -this endpoint.

    - -

    Now, we can use the forty character token instead of a username and password -in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -

    Treat OAuth tokens like passwords! Don’t share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent.

    - -

    Now that we’ve got the hang of making authenticated calls, let’s move along to -the Repositories API.

    - -

    Repositories

    - -

    Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can GET repository details in the same way we fetched user -details earlier:

    - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -

    In the same way, we can view repositories for the authenticated user:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -

    Or, we can list repositories for another user:

    - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -

    Or, we can list repositories for an organization:

    - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -

    The information returned from these calls will depend on how we authenticate:

    - -
      -
    • Using Basic Authentication, the response includes all repositories the -the user has access to see on github.com.
    • -
    • Using OAuth, private repositories are only returned if the OAuth token -contains the repo scope.
    • -
    - -

    As the docs indicate, these methods take a type parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team.

    - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -

    In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string.

    - -

    Create a repository

    - -

    Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To create a repository, -we need to POST some JSON containing the details and configuration options.

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -

    In this minimal example, we create a new repository for our blog (to be served -on GitHub Pages, perhaps). Though the blog will be public, we’ve made -the repository private. In this single step, we’ll also initialize it with -a README and a nanoc-flavored .gitignore template.

    - -

    The resulting repository will be found at https://github.com/<your_username>/blog. -To create a repository under an organization for which you’re -an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    - -

    Next, let’s fetch our newly created repository:

    - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -

    Oh noes! Where did it go? Since we created the repository as private, we need -to authenticate in order to see it. If you’re a grizzled HTTP user, you might -expect a 403 instead. Since we don’t want to leak information about private -repositories, the GitHub API returns a 404 in this case, as if to say “we can -neither confirm nor deny the existence of this repository.”

    - -

    Issues

    - -

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while -staying out of your way. With the GitHub Issues API, you can pull -data out or create issues from other tools to create a workflow that works for -your team.

    - -

    Just like github.com, the API provides a few methods to view issues for the -authenticated user. To see all your issues, call GET /issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -

    To get only the issues under one of your GitHub organizations, call GET -/orgs/<org>/issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -

    We can also get all the issues under a single repository:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -

    Pagination

    - -

    A project the size of Rails has thousands of issues. We’ll need to paginate, -making multiple API calls to get the data. Let’s repeat that last call, this -time taking note of the response headers:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -

    The Link header provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results.

    - -

    Creating an issue

    - -

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from -the API.

    - -

    To create an issue, we need to be authenticated, so we’ll pass an -OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON -body to the /issues path underneath the repository in which we want to create -the issue:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -

    The response gives us a couple of pointers to the newly created issue, both in -the Location response header and the url field of the JSON response.

    - -

    Conditional requests

    - -

    A big part of being a good API citizen is respecting rate limits by -caching information that hasn’t changed. The API supports conditional -requests and helps you do the right thing. Consider the -first call we made to get defunkt’s profile:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -

    In addition to the JSON body, take note of the HTTP status code of 200 and -the ETag header. -The ETag is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed:

    - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -

    The 304 status indicates that the resource hasn’t changed since the last time -we asked for it and the response will contain no body. As a bonus, 304 -responses don’t count against your rate limit.

    - -

    Woot! Now you know the basics of the GitHub API!

    - -
      -
    • Basic & OAuth authentication
    • -
    • Fetching and creating repositories and issues
    • -
    • Conditional requests
    • -
    - -

    Keep learning with the next API guide Basics of Authentication!

    - -;T; @UI"&/coins/guides/create-simple-coin/;T{;{ ;I"_ - - - - - - - Create simple coin | Forknote - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Getting Started

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Overview

    - -

    Most applications will use an existing wrapper library in the language -of your choice, but it’s important to familiarize yourself with the underlying API -HTTP methods first.

    - -

    There’s no easier way to kick the tires than through cURL.

    - -

    Hello World

    - -

    Let’s start by testing our setup. Open up a command prompt and enter the -following command (without the $):

    - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -

    The response will be a random selection from our design philosophies.

    - -

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    There are a few interesting bits in the response headers. As expected, the -Content-Type is application/json.

    - -

    Any headers beginning with X- are custom headers, and are not included in the -HTTP spec. Let’s take a look at a few of them:

    - -
      -
    • -X-GitHub-Media-Type has a value of github.v3. This lets us know the media type -for the response. Media types have helped us version our output in API v3. We’ll -talk more about that later.
    • -
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This -pair of headers indicate how many requests a client can make in -a rolling time period (typically an hour) and how many of those requests the -client has already spent.
    • -
    - -

    Authentication

    - -

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to -authenticate. In fact, doing anything interesting with the GitHub API requires -authentication.

    - -

    Basic

    - -

    The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication.

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -

    The -u flag sets the username, and cURL will prompt you for the password. You -can use -u "username:password" to avoid the prompt, but this leaves your -password in shell history and isn’t recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -X-RateLimit-Limit header.

    - -

    In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API.

    - -

    Two-factor authentication

    - -

    If you have two-factor authentication enabled, the API will return a -401 Unauthorized error code for the above request (and every other API request):

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -

    The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -OAuth section below for more information.

    - -

    Get your own user profile

    - -

    When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -your own user profile:

    - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -

    This time, in addition to the same set of public information we -retrieved for @defunkt earlier, you should also see the non-public -information for your user profile. For example, you’ll see a plan object -in the response which gives details about the GitHub plan for the account.

    - -

    OAuth

    - -

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use OAuth.

    - -

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big -features:

    - -
      -
    • -Revokable access: users can revoke authorization to third party apps at any time
    • -
    • -Limited access: users can review the specific access that a token -will provide before authorizing a third party app
    • -
    - -

    Normally, tokens are created via a web flow. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it’s authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application:

    - -

    GitHub's OAuth Prompt

    - -

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to create a personal access token via your -Personal access tokens settings page:

    - -

    Personal Token selection

    - -

    Also, the Authorizations API makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command:

    - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -

    There’s a lot going on in this one little call, so let’s break it down. First, -the -d flag indicates we’re doing a POST, using the -application/x-www-form-urlencoded content type (as opposed to GET). All POST -requests to the GitHub API should be in JSON.

    - -

    Next, let’s look at the scopes we’re sending over in this call. When creating -a new token, we include an optional array of scopes, or access -levels, that indicate what information this token can access. In this case, -we’re setting up the token with repo access, which grants access to read and -write to public and private repositories, and user scope, which grants read -and write access to public and private user profile data. See -the scopes docs for a full list of -scopes. You should only request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The 201 -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token.

    - -

    If you have two-factor authentication enabled, the API will -return the previously described 401 Unauthorized error code -for the above request. You can get around that error by providing a 2FA OTP code -in the X-GitHub-OTP request header:

    - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you’ll receive an SMS with your OTP code after making a request to -this endpoint.

    - -

    Now, we can use the forty character token instead of a username and password -in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -

    Treat OAuth tokens like passwords! Don’t share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent.

    - -

    Now that we’ve got the hang of making authenticated calls, let’s move along to -the Repositories API.

    - -

    Repositories

    - -

    Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can GET repository details in the same way we fetched user -details earlier:

    - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -

    In the same way, we can view repositories for the authenticated user:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -

    Or, we can list repositories for another user:

    - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -

    Or, we can list repositories for an organization:

    - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -

    The information returned from these calls will depend on how we authenticate:

    - -
      -
    • Using Basic Authentication, the response includes all repositories the -the user has access to see on github.com.
    • -
    • Using OAuth, private repositories are only returned if the OAuth token -contains the repo scope.
    • -
    - -

    As the docs indicate, these methods take a type parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team.

    - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -

    In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string.

    - -

    Create a repository

    - -

    Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To create a repository, -we need to POST some JSON containing the details and configuration options.

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -

    In this minimal example, we create a new repository for our blog (to be served -on GitHub Pages, perhaps). Though the blog will be public, we’ve made -the repository private. In this single step, we’ll also initialize it with -a README and a nanoc-flavored .gitignore template.

    - -

    The resulting repository will be found at https://github.com/<your_username>/blog. -To create a repository under an organization for which you’re -an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    - -

    Next, let’s fetch our newly created repository:

    - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -

    Oh noes! Where did it go? Since we created the repository as private, we need -to authenticate in order to see it. If you’re a grizzled HTTP user, you might -expect a 403 instead. Since we don’t want to leak information about private -repositories, the GitHub API returns a 404 in this case, as if to say “we can -neither confirm nor deny the existence of this repository.”

    - -

    Issues

    - -

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while -staying out of your way. With the GitHub Issues API, you can pull -data out or create issues from other tools to create a workflow that works for -your team.

    - -

    Just like github.com, the API provides a few methods to view issues for the -authenticated user. To see all your issues, call GET /issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -

    To get only the issues under one of your GitHub organizations, call GET -/orgs/<org>/issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -

    We can also get all the issues under a single repository:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -

    Pagination

    - -

    A project the size of Rails has thousands of issues. We’ll need to paginate, -making multiple API calls to get the data. Let’s repeat that last call, this -time taking note of the response headers:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -

    The Link header provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results.

    - -

    Creating an issue

    - -

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from -the API.

    - -

    To create an issue, we need to be authenticated, so we’ll pass an -OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON -body to the /issues path underneath the repository in which we want to create -the issue:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -

    The response gives us a couple of pointers to the newly created issue, both in -the Location response header and the url field of the JSON response.

    - -

    Conditional requests

    - -

    A big part of being a good API citizen is respecting rate limits by -caching information that hasn’t changed. The API supports conditional -requests and helps you do the right thing. Consider the -first call we made to get defunkt’s profile:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -

    In addition to the JSON body, take note of the HTTP status code of 200 and -the ETag header. -The ETag is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed:

    - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -

    The 304 status indicates that the resource hasn’t changed since the last time -we asked for it and the response will contain no body. As a bonus, 304 -responses don’t count against your rate limit.

    - -

    Woot! Now you know the basics of the GitHub API!

    - -
      -
    • Basic & OAuth authentication
    • -
    • Fetching and creating repositories and issues
    • -
    • Conditional requests
    • -
    - -

    Keep learning with the next API guide Basics of Authentication!

    - - -
    -
    - - - - - - - -;T; I"L -# Getting Started - -* TOC -{:toc} - -Let's walk through core API concepts as we tackle some everyday use cases. - -## Overview - -Most applications will use an existing [wrapper library][wrappers] in the language -of your choice, but it's important to familiarize yourself with the underlying API -HTTP methods first. - -There's no easier way to kick the tires than through [cURL][curl]. - -### Hello World - -Let's start by testing our setup. Open up a command prompt and enter the -following command (without the `$`): - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -The response will be a random selection from our design philosophies. - -Next, let's `GET` [Chris Wanstrath's][defunkt github] [GitHub profile][users api]: - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -Mmmmm, tastes like [JSON][json]. Let's add the `-i` flag to include headers: - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -There are a few interesting bits in the response headers. As expected, the -`Content-Type` is `application/json`. - -Any headers beginning with `X-` are custom headers, and are not included in the -HTTP spec. Let's take a look at a few of them: - -* `X-GitHub-Media-Type` has a value of `github.v3`. This lets us know the [media type][media types] -for the response. Media types have helped us version our output in API v3. We'll -talk more about that later. -* Take note of the `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers. This -pair of headers indicate [how many requests a client can make][rate limiting] in -a rolling time period (typically an hour) and how many of those requests the -client has already spent. - -## Authentication - -Unauthenticated clients can make 60 requests per hour. To get more, we'll need to -_authenticate_. In fact, doing anything interesting with the GitHub API requires -[authentication][authentication]. - -### Basic - -The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication. - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -The `-u` flag sets the username, and cURL will prompt you for the password. You -can use `-u "username:password"` to avoid the prompt, but this leaves your -password in shell history and isn't recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -`X-RateLimit-Limit` header. - -In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API. - -### Two-factor authentication - -If you have [two-factor authentication][2fa] enabled, the API will return a -`401 Unauthorized` error code for the above request (and every other API request): - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -[OAuth section][oauth section] below for more information. - -### Get your own user profile - -When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -[your own user profile][auth user api]: - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -This time, in addition to the same set of public information we -retrieved for [@defunkt][defunkt github] earlier, you should also see the non-public -information for your user profile. For example, you'll see a `plan` object -in the response which gives details about the GitHub plan for the account. - -### OAuth - -While convenient, Basic Authentication isn't ideal because you shouldn't give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use [OAuth][oauth]. - -Instead of usernames and passwords, OAuth uses _tokens_. Tokens provide two big -features: - -* **Revokable access**: users can revoke authorization to third party apps at any time -* **Limited access**: users can review the specific access that a token - will provide before authorizing a third party app - -Normally, tokens are created via a [web flow][webflow]. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it's authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application: - -![GitHub's OAuth Prompt](/images/oauth_prompt.png) - -However, you don't need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to [create a **personal access token**][personal token] via your -[Personal access tokens settings page][tokens settings]: - -![Personal Token selection](/images/personal_token.png) - -Also, the [**Authorizations API**][authorizations api] makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command: - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -There's a lot going on in this one little call, so let's break it down. First, -the `-d` flag indicates we're doing a `POST`, using the -`application/x-www-form-urlencoded` content type (as opposed to `GET`). All `POST` -requests to the GitHub API should be in JSON. - -Next, let's look at the `scopes` we're sending over in this call. When creating -a new token, we include an optional array of [_scopes_][scopes], or access -levels, that indicate what information this token can access. In this case, -we're setting up the token with _repo_ access, which grants access to read and -write to public and private repositories, and _user_ scope, which grants read -and write access to public and private user profile data. See -[the scopes docs][scopes] for a full list of -scopes. You should **only** request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The `201` -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token. - -If you have [two-factor authentication][2fa] enabled, the API will -return the [previously described `401 Unauthorized` error code][2fa section] -for the above request. You can get around that error by providing a 2FA OTP code -in the [X-GitHub-OTP request header][2fa header]: - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you'll receive an SMS with your OTP code after making a request to -this endpoint. - -Now, we can use the forty character `token` instead of a username and password -in the rest of our examples. Let's grab our own user info again, using OAuth this time: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -**Treat OAuth tokens like passwords!** Don't share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent. - -Now that we've got the hang of making authenticated calls, let's move along to -the [Repositories API][repos-api]. - -## Repositories - -Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can [`GET` repository details][get repo] in the same way we fetched user -details earlier: - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -In the same way, we can [view repositories for the authenticated user][user repos api]: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -Or, we can [list repositories for another user][other user repos api]: - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -Or, we can [list repositories for an organization][org repos api]: - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -The information returned from these calls will depend on how we authenticate: - -* Using Basic Authentication, the response includes all repositories the - the user has access to see on github.com. -* Using OAuth, private repositories are only returned if the OAuth token - contains the `repo` [scope][scopes]. - -As the [docs][repos-api] indicate, these methods take a `type` parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team. - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string. - -### Create a repository - -Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To [create a repository][create repo], -we need to `POST` some JSON containing the details and configuration options. - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -In this minimal example, we create a new repository for our blog (to be served -on [GitHub Pages][pages], perhaps). Though the blog will be public, we've made -the repository private. In this single step, we'll also initialize it with -a README and a [nanoc][nanoc]-flavored [.gitignore template][gitignore -templates]. - -The resulting repository will be found at `https://github.com//blog`. -To create a repository under an organization for which you're -an owner, just change the API method from `/user/repos` to `/orgs//repos`. - -Next, let's fetch our newly created repository: - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -Oh noes! Where did it go? Since we created the repository as _private_, we need -to authenticate in order to see it. If you're a grizzled HTTP user, you might -expect a `403` instead. Since we don't want to leak information about private -repositories, the GitHub API returns a `404` in this case, as if to say "we can -neither confirm nor deny the existence of this repository." - -## Issues - -The UI for Issues on GitHub aims to provide 'just enough' workflow while -staying out of your way. With the GitHub [Issues API][issues-api], you can pull -data out or create issues from other tools to create a workflow that works for -your team. - -Just like github.com, the API provides a few methods to view issues for the -authenticated user. To [see all your issues][get issues api], call `GET /issues`: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -To get only the [issues under one of your GitHub organizations][get issues api], call `GET -/orgs//issues`: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -We can also get [all the issues under a single repository][repo issues api]: - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -### Pagination - -A project the size of Rails has thousands of issues. We'll need to [paginate][pagination], -making multiple API calls to get the data. Let's repeat that last call, this -time taking note of the response headers: - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -The [`Link` header][link-header] provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results. - -### Creating an issue - -Now that we've seen how to paginate lists of issues, let's [create an issue][create issue] from -the API. - -To create an issue, we need to be authenticated, so we'll pass an -OAuth token in the header. Also, we'll pass the title, body, and labels in the JSON -body to the `/issues` path underneath the repository in which we want to create -the issue: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -The response gives us a couple of pointers to the newly created issue, both in -the `Location` response header and the `url` field of the JSON response. - -## Conditional requests - -A big part of being a good API citizen is respecting rate limits by -caching information that hasn't changed. The API supports [conditional -requests][conditional-requests] and helps you do the right thing. Consider the -first call we made to get defunkt's profile: - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -In addition to the JSON body, take note of the HTTP status code of `200` and -the `ETag` header. -The [ETag][etag] is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed: - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -The `304` status indicates that the resource hasn't changed since the last time -we asked for it and the response will contain no body. As a bonus, `304` -responses don't count against your [rate limit][rate-limiting]. - -Woot! Now you know the basics of the GitHub API! - -* Basic & OAuth authentication -* Fetching and creating repositories and issues -* Conditional requests - -Keep learning with the next API guide [Basics of Authentication][auth guide]! - - -[wrappers]: /libraries/ -[curl]: http://curl.haxx.se/ -[media types]: /v3/media/ -[oauth]: /v3/oauth/ -[webflow]: /v3/oauth/#web-application-flow -[authorizations api]: /v3/oauth_authorizations/#create-a-new-authorization -[scopes]: /v3/oauth/#scopes -[repos-api]: /v3/repos/ -[pages]: http://pages.github.com -[nanoc]: http://nanoc.ws/ -[gitignore templates]: https://github.com/github/gitignore -[issues-api]: /v3/issues/ -[link-header]: http://www.w3.org/wiki/LinkHeader/ -[conditional-requests]: /v3/#conditional-requests -[rate-limiting]: /v3/#rate-limiting -[users api]: /v3/users/#get-a-single-user -[auth user api]: /v3/users/#get-the-authenticated-user -[defunkt github]: https://github.com/defunkt -[json]: http://en.wikipedia.org/wiki/JSON -[rate limiting]: /v3/#rate-limiting -[authentication]: /v3/#authentication -[2fa]: https://help.github.com/articles/about-two-factor-authentication -[2fa header]: /v3/auth/#working-with-two-factor-authentication -[oauth section]: /guides/getting-started/#oauth -[personal token]: https://help.github.com/articles/creating-an-access-token-for-command-line-use -[tokens settings]: https://github.com/settings/tokens -[pagination]: /v3/#pagination -[get repo]: /v3/repos/#get -[create repo]: /v3/repos/#create -[create issue]: /v3/issues/#create-an-issue -[auth guide]: /guides/basics-of-authentication -[user repos api]: /v3/repos/#list-your-repositories -[other user repos api]: /v3/repos/#list-user-repositories -[org repos api]: /v3/repos/#list-organization-repositories -[get issues api]: /v3/issues/#list-issues -[repo issues api]: /v3/issues/#list-issues-for-a-repository -[etag]: http://en.wikipedia.org/wiki/HTTP_ETag -[2fa section]: /guides/getting-started/#two-factor-authentication -;T; -I"=S -

    Getting Started

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Overview

    - -

    Most applications will use an existing wrapper library in the language -of your choice, but it’s important to familiarize yourself with the underlying API -HTTP methods first.

    - -

    There’s no easier way to kick the tires than through cURL.

    - -

    Hello World

    - -

    Let’s start by testing our setup. Open up a command prompt and enter the -following command (without the $):

    - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -

    The response will be a random selection from our design philosophies.

    - -

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    There are a few interesting bits in the response headers. As expected, the -Content-Type is application/json.

    - -

    Any headers beginning with X- are custom headers, and are not included in the -HTTP spec. Let’s take a look at a few of them:

    - -
      -
    • -X-GitHub-Media-Type has a value of github.v3. This lets us know the media type -for the response. Media types have helped us version our output in API v3. We’ll -talk more about that later.
    • -
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This -pair of headers indicate how many requests a client can make in -a rolling time period (typically an hour) and how many of those requests the -client has already spent.
    • -
    - -

    Authentication

    - -

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to -authenticate. In fact, doing anything interesting with the GitHub API requires -authentication.

    - -

    Basic

    - -

    The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication.

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -

    The -u flag sets the username, and cURL will prompt you for the password. You -can use -u "username:password" to avoid the prompt, but this leaves your -password in shell history and isn’t recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -X-RateLimit-Limit header.

    - -

    In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API.

    - -

    Two-factor authentication

    - -

    If you have two-factor authentication enabled, the API will return a -401 Unauthorized error code for the above request (and every other API request):

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -

    The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -OAuth section below for more information.

    - -

    Get your own user profile

    - -

    When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -your own user profile:

    - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -

    This time, in addition to the same set of public information we -retrieved for @defunkt earlier, you should also see the non-public -information for your user profile. For example, you’ll see a plan object -in the response which gives details about the GitHub plan for the account.

    - -

    OAuth

    - -

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use OAuth.

    - -

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big -features:

    - -
      -
    • -Revokable access: users can revoke authorization to third party apps at any time
    • -
    • -Limited access: users can review the specific access that a token -will provide before authorizing a third party app
    • -
    - -

    Normally, tokens are created via a web flow. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it’s authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application:

    - -

    GitHub's OAuth Prompt

    - -

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to create a personal access token via your -Personal access tokens settings page:

    - -

    Personal Token selection

    - -

    Also, the Authorizations API makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command:

    - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -

    There’s a lot going on in this one little call, so let’s break it down. First, -the -d flag indicates we’re doing a POST, using the -application/x-www-form-urlencoded content type (as opposed to GET). All POST -requests to the GitHub API should be in JSON.

    - -

    Next, let’s look at the scopes we’re sending over in this call. When creating -a new token, we include an optional array of scopes, or access -levels, that indicate what information this token can access. In this case, -we’re setting up the token with repo access, which grants access to read and -write to public and private repositories, and user scope, which grants read -and write access to public and private user profile data. See -the scopes docs for a full list of -scopes. You should only request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The 201 -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token.

    - -

    If you have two-factor authentication enabled, the API will -return the previously described 401 Unauthorized error code -for the above request. You can get around that error by providing a 2FA OTP code -in the X-GitHub-OTP request header:

    - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you’ll receive an SMS with your OTP code after making a request to -this endpoint.

    - -

    Now, we can use the forty character token instead of a username and password -in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -

    Treat OAuth tokens like passwords! Don’t share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent.

    - -

    Now that we’ve got the hang of making authenticated calls, let’s move along to -the Repositories API.

    - -

    Repositories

    - -

    Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can GET repository details in the same way we fetched user -details earlier:

    - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -

    In the same way, we can view repositories for the authenticated user:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -

    Or, we can list repositories for another user:

    - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -

    Or, we can list repositories for an organization:

    - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -

    The information returned from these calls will depend on how we authenticate:

    - -
      -
    • Using Basic Authentication, the response includes all repositories the -the user has access to see on github.com.
    • -
    • Using OAuth, private repositories are only returned if the OAuth token -contains the repo scope.
    • -
    - -

    As the docs indicate, these methods take a type parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team.

    - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -

    In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string.

    - -

    Create a repository

    - -

    Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To create a repository, -we need to POST some JSON containing the details and configuration options.

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -

    In this minimal example, we create a new repository for our blog (to be served -on GitHub Pages, perhaps). Though the blog will be public, we’ve made -the repository private. In this single step, we’ll also initialize it with -a README and a nanoc-flavored .gitignore template.

    - -

    The resulting repository will be found at https://github.com/<your_username>/blog. -To create a repository under an organization for which you’re -an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    - -

    Next, let’s fetch our newly created repository:

    - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -

    Oh noes! Where did it go? Since we created the repository as private, we need -to authenticate in order to see it. If you’re a grizzled HTTP user, you might -expect a 403 instead. Since we don’t want to leak information about private -repositories, the GitHub API returns a 404 in this case, as if to say “we can -neither confirm nor deny the existence of this repository.”

    - -

    Issues

    - -

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while -staying out of your way. With the GitHub Issues API, you can pull -data out or create issues from other tools to create a workflow that works for -your team.

    - -

    Just like github.com, the API provides a few methods to view issues for the -authenticated user. To see all your issues, call GET /issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -

    To get only the issues under one of your GitHub organizations, call GET -/orgs/<org>/issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -

    We can also get all the issues under a single repository:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -

    Pagination

    - -

    A project the size of Rails has thousands of issues. We’ll need to paginate, -making multiple API calls to get the data. Let’s repeat that last call, this -time taking note of the response headers:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -

    The Link header provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results.

    - -

    Creating an issue

    - -

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from -the API.

    - -

    To create an issue, we need to be authenticated, so we’ll pass an -OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON -body to the /issues path underneath the repository in which we want to create -the issue:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -

    The response gives us a couple of pointers to the newly created issue, both in -the Location response header and the url field of the JSON response.

    - -

    Conditional requests

    - -

    A big part of being a good API citizen is respecting rate limits by -caching information that hasn’t changed. The API supports conditional -requests and helps you do the right thing. Consider the -first call we made to get defunkt’s profile:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -

    In addition to the JSON body, take note of the HTTP status code of 200 and -the ETag header. -The ETag is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed:

    - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -

    The 304 status indicates that the resource hasn’t changed since the last time -we asked for it and the response will contain no body. As a bonus, 304 -responses don’t count against your rate limit.

    - -

    Woot! Now you know the basics of the GitHub API!

    - -
      -
    • Basic & OAuth authentication
    • -
    • Fetching and creating repositories and issues
    • -
    • Conditional requests
    • -
    - -

    Keep learning with the next API guide Basics of Authentication!

    - -;T; @[I"#/coins/guides/getting-started/;T{;{ ;I" - - - - - - - Getting Started | Forknote - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Getting Started

    - - - -

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    - -

    Overview

    - -

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    - -

    Starting the daemon for preconfigured networks

    - -

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    - -

    Connecting to Dashcoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    - -

    Connecting to Bytecoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted --config-file configs/bytecoin.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Starting the daemon for custom networks

    - -

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    - -

    Next, let’s start the daemon itself:

    - -
    -$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    - -

    Starting simplewallet

    - -

    Simplewallet uses the same configuration file as the daemon.

    - -

    To start simplewallet:

    - -
    -$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -forknote wallet v1.0.8.608()
    -Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    -What do you want to do?
    -[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    -
    - -

    Press g to create new wallet and type your wallet’s name and password.

    - -

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    -For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    - -

    Don’t forget to backup your wallet.

    - - -
    -
    - - - - - - - -;T; I" -# Getting Started - -* TOC -{:toc} - -Let's walk through core Forknote concepts as we tackle a simple use case. - -## Overview - -Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must [download][download] the latest version of Forknote. - -## Starting the daemon for preconfigured networks - -Forknote comes preconfigured with 2 networks - Dashcoin and [Bytecoin][bytecoin]. - -### Connecting to Dashcoin - -To connect to Dashcoin open up a command prompt and enter the -following command (without the `$`): - -
    -$ ./forknoted
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -By default, Forknote will load the Dashcoin configuration file (`configs/-.conf`), if no configuration file is passed as option. - -### Connecting to Bytecoin - -To connect to Dashcoin open up a command prompt and enter the -following command (without the `$`): - -
    -$ ./forknoted --config-file configs/bytecoin.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -## Starting the daemon for custom networks - -To connect to custom networks, you must save the configuraton file in the `configs` subfolder of Forknote. - -Next, let's start the daemon itself: - -
    -$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -Please note you have to change `CUSTOM_NETWORK` with appropriate file name. - -## Starting simplewallet - -Simplewallet uses the same configuration file as the daemon. - -To start simplewallet: - -
    -$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -forknote wallet v1.0.8.608()
    -Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    -What do you want to do?
    -[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    -
    - -Press `g` to create new wallet and type your wallet's name and password. - -A good practice for naming your wallet is to add `NETWORK.` prefix to your name.
    -For example, for Dashcoin wallet use the `dashcoin.` prefix - `dashcoin.example_wallet` - -Don't forget to backup your wallet. - - -[download]: /download/ -[bytecoin]: https://bytecoin.org/;T; -I" -

    Getting Started

    - - - -

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    - -

    Overview

    - -

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    - -

    Starting the daemon for preconfigured networks

    - -

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    - -

    Connecting to Dashcoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    - -

    Connecting to Bytecoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted --config-file configs/bytecoin.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Starting the daemon for custom networks

    - -

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    - -

    Next, let’s start the daemon itself:

    - -
    -$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    - -

    Starting simplewallet

    - -

    Simplewallet uses the same configuration file as the daemon.

    - -

    To start simplewallet:

    - -
    -$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -forknote wallet v1.0.8.608()
    -Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    -What do you want to do?
    -[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    -
    - -

    Press g to create new wallet and type your wallet’s name and password.

    - -

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    -For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    - -

    Don’t forget to backup your wallet.

    - -;T; @aI"/coins/guides/;T{;{ ;I" - - - - - - - Development Guides | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - - -
    - - -
    - - - - - - - -;T; I" -# Development Guides - -This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes. - - -;T; -I"' -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - -;T; @gI"#/coins/guides/troubleshooting/;T{;{ ;I"_ - - - - - - - Getting Started | GitHub API - - - - - - - - - - - -
    - -
    - - -
    -
    - -

    Getting Started

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Overview

    - -

    Most applications will use an existing wrapper library in the language -of your choice, but it’s important to familiarize yourself with the underlying API -HTTP methods first.

    - -

    There’s no easier way to kick the tires than through cURL.

    - -

    Hello World

    - -

    Let’s start by testing our setup. Open up a command prompt and enter the -following command (without the $):

    - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -

    The response will be a random selection from our design philosophies.

    - -

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    There are a few interesting bits in the response headers. As expected, the -Content-Type is application/json.

    - -

    Any headers beginning with X- are custom headers, and are not included in the -HTTP spec. Let’s take a look at a few of them:

    - -
      -
    • -X-GitHub-Media-Type has a value of github.v3. This lets us know the media type -for the response. Media types have helped us version our output in API v3. We’ll -talk more about that later.
    • -
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This -pair of headers indicate how many requests a client can make in -a rolling time period (typically an hour) and how many of those requests the -client has already spent.
    • -
    - -

    Authentication

    - -

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to -authenticate. In fact, doing anything interesting with the GitHub API requires -authentication.

    - -

    Basic

    - -

    The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication.

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -

    The -u flag sets the username, and cURL will prompt you for the password. You -can use -u "username:password" to avoid the prompt, but this leaves your -password in shell history and isn’t recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -X-RateLimit-Limit header.

    - -

    In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API.

    - -

    Two-factor authentication

    - -

    If you have two-factor authentication enabled, the API will return a -401 Unauthorized error code for the above request (and every other API request):

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -

    The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -OAuth section below for more information.

    - -

    Get your own user profile

    - -

    When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -your own user profile:

    - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -

    This time, in addition to the same set of public information we -retrieved for @defunkt earlier, you should also see the non-public -information for your user profile. For example, you’ll see a plan object -in the response which gives details about the GitHub plan for the account.

    - -

    OAuth

    - -

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use OAuth.

    - -

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big -features:

    - -
      -
    • -Revokable access: users can revoke authorization to third party apps at any time
    • -
    • -Limited access: users can review the specific access that a token -will provide before authorizing a third party app
    • -
    - -

    Normally, tokens are created via a web flow. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it’s authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application:

    - -

    GitHub's OAuth Prompt

    - -

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to create a personal access token via your -Personal access tokens settings page:

    - -

    Personal Token selection

    - -

    Also, the Authorizations API makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command:

    - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -

    There’s a lot going on in this one little call, so let’s break it down. First, -the -d flag indicates we’re doing a POST, using the -application/x-www-form-urlencoded content type (as opposed to GET). All POST -requests to the GitHub API should be in JSON.

    - -

    Next, let’s look at the scopes we’re sending over in this call. When creating -a new token, we include an optional array of scopes, or access -levels, that indicate what information this token can access. In this case, -we’re setting up the token with repo access, which grants access to read and -write to public and private repositories, and user scope, which grants read -and write access to public and private user profile data. See -the scopes docs for a full list of -scopes. You should only request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The 201 -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token.

    - -

    If you have two-factor authentication enabled, the API will -return the previously described 401 Unauthorized error code -for the above request. You can get around that error by providing a 2FA OTP code -in the X-GitHub-OTP request header:

    - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you’ll receive an SMS with your OTP code after making a request to -this endpoint.

    - -

    Now, we can use the forty character token instead of a username and password -in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -

    Treat OAuth tokens like passwords! Don’t share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent.

    - -

    Now that we’ve got the hang of making authenticated calls, let’s move along to -the Repositories API.

    - -

    Repositories

    - -

    Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can GET repository details in the same way we fetched user -details earlier:

    - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -

    In the same way, we can view repositories for the authenticated user:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -

    Or, we can list repositories for another user:

    - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -

    Or, we can list repositories for an organization:

    - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -

    The information returned from these calls will depend on how we authenticate:

    - -
      -
    • Using Basic Authentication, the response includes all repositories the -the user has access to see on github.com.
    • -
    • Using OAuth, private repositories are only returned if the OAuth token -contains the repo scope.
    • -
    - -

    As the docs indicate, these methods take a type parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team.

    - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -

    In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string.

    - -

    Create a repository

    - -

    Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To create a repository, -we need to POST some JSON containing the details and configuration options.

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -

    In this minimal example, we create a new repository for our blog (to be served -on GitHub Pages, perhaps). Though the blog will be public, we’ve made -the repository private. In this single step, we’ll also initialize it with -a README and a nanoc-flavored .gitignore template.

    - -

    The resulting repository will be found at https://github.com/<your_username>/blog. -To create a repository under an organization for which you’re -an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    - -

    Next, let’s fetch our newly created repository:

    - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -

    Oh noes! Where did it go? Since we created the repository as private, we need -to authenticate in order to see it. If you’re a grizzled HTTP user, you might -expect a 403 instead. Since we don’t want to leak information about private -repositories, the GitHub API returns a 404 in this case, as if to say “we can -neither confirm nor deny the existence of this repository.”

    - -

    Issues

    - -

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while -staying out of your way. With the GitHub Issues API, you can pull -data out or create issues from other tools to create a workflow that works for -your team.

    - -

    Just like github.com, the API provides a few methods to view issues for the -authenticated user. To see all your issues, call GET /issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -

    To get only the issues under one of your GitHub organizations, call GET -/orgs/<org>/issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -

    We can also get all the issues under a single repository:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -

    Pagination

    - -

    A project the size of Rails has thousands of issues. We’ll need to paginate, -making multiple API calls to get the data. Let’s repeat that last call, this -time taking note of the response headers:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -

    The Link header provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results.

    - -

    Creating an issue

    - -

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from -the API.

    - -

    To create an issue, we need to be authenticated, so we’ll pass an -OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON -body to the /issues path underneath the repository in which we want to create -the issue:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -

    The response gives us a couple of pointers to the newly created issue, both in -the Location response header and the url field of the JSON response.

    - -

    Conditional requests

    - -

    A big part of being a good API citizen is respecting rate limits by -caching information that hasn’t changed. The API supports conditional -requests and helps you do the right thing. Consider the -first call we made to get defunkt’s profile:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -

    In addition to the JSON body, take note of the HTTP status code of 200 and -the ETag header. -The ETag is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed:

    - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -

    The 304 status indicates that the resource hasn’t changed since the last time -we asked for it and the response will contain no body. As a bonus, 304 -responses don’t count against your rate limit.

    - -

    Woot! Now you know the basics of the GitHub API!

    - -
      -
    • Basic & OAuth authentication
    • -
    • Fetching and creating repositories and issues
    • -
    • Conditional requests
    • -
    - -

    Keep learning with the next API guide Basics of Authentication!

    - - -
    -
    - - - - - - - -;T; I"L -# Getting Started - -* TOC -{:toc} - -Let's walk through core API concepts as we tackle some everyday use cases. - -## Overview - -Most applications will use an existing [wrapper library][wrappers] in the language -of your choice, but it's important to familiarize yourself with the underlying API -HTTP methods first. - -There's no easier way to kick the tires than through [cURL][curl]. - -### Hello World - -Let's start by testing our setup. Open up a command prompt and enter the -following command (without the `$`): - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -The response will be a random selection from our design philosophies. - -Next, let's `GET` [Chris Wanstrath's][defunkt github] [GitHub profile][users api]: - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -Mmmmm, tastes like [JSON][json]. Let's add the `-i` flag to include headers: - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -There are a few interesting bits in the response headers. As expected, the -`Content-Type` is `application/json`. - -Any headers beginning with `X-` are custom headers, and are not included in the -HTTP spec. Let's take a look at a few of them: - -* `X-GitHub-Media-Type` has a value of `github.v3`. This lets us know the [media type][media types] -for the response. Media types have helped us version our output in API v3. We'll -talk more about that later. -* Take note of the `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers. This -pair of headers indicate [how many requests a client can make][rate limiting] in -a rolling time period (typically an hour) and how many of those requests the -client has already spent. - -## Authentication - -Unauthenticated clients can make 60 requests per hour. To get more, we'll need to -_authenticate_. In fact, doing anything interesting with the GitHub API requires -[authentication][authentication]. - -### Basic - -The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication. - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -The `-u` flag sets the username, and cURL will prompt you for the password. You -can use `-u "username:password"` to avoid the prompt, but this leaves your -password in shell history and isn't recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -`X-RateLimit-Limit` header. - -In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API. - -### Two-factor authentication - -If you have [two-factor authentication][2fa] enabled, the API will return a -`401 Unauthorized` error code for the above request (and every other API request): - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -[OAuth section][oauth section] below for more information. - -### Get your own user profile - -When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -[your own user profile][auth user api]: - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -This time, in addition to the same set of public information we -retrieved for [@defunkt][defunkt github] earlier, you should also see the non-public -information for your user profile. For example, you'll see a `plan` object -in the response which gives details about the GitHub plan for the account. - -### OAuth - -While convenient, Basic Authentication isn't ideal because you shouldn't give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use [OAuth][oauth]. - -Instead of usernames and passwords, OAuth uses _tokens_. Tokens provide two big -features: - -* **Revokable access**: users can revoke authorization to third party apps at any time -* **Limited access**: users can review the specific access that a token - will provide before authorizing a third party app - -Normally, tokens are created via a [web flow][webflow]. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it's authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application: - -![GitHub's OAuth Prompt](/images/oauth_prompt.png) - -However, you don't need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to [create a **personal access token**][personal token] via your -[Personal access tokens settings page][tokens settings]: - -![Personal Token selection](/images/personal_token.png) - -Also, the [**Authorizations API**][authorizations api] makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command: - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -There's a lot going on in this one little call, so let's break it down. First, -the `-d` flag indicates we're doing a `POST`, using the -`application/x-www-form-urlencoded` content type (as opposed to `GET`). All `POST` -requests to the GitHub API should be in JSON. - -Next, let's look at the `scopes` we're sending over in this call. When creating -a new token, we include an optional array of [_scopes_][scopes], or access -levels, that indicate what information this token can access. In this case, -we're setting up the token with _repo_ access, which grants access to read and -write to public and private repositories, and _user_ scope, which grants read -and write access to public and private user profile data. See -[the scopes docs][scopes] for a full list of -scopes. You should **only** request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The `201` -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token. - -If you have [two-factor authentication][2fa] enabled, the API will -return the [previously described `401 Unauthorized` error code][2fa section] -for the above request. You can get around that error by providing a 2FA OTP code -in the [X-GitHub-OTP request header][2fa header]: - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you'll receive an SMS with your OTP code after making a request to -this endpoint. - -Now, we can use the forty character `token` instead of a username and password -in the rest of our examples. Let's grab our own user info again, using OAuth this time: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -**Treat OAuth tokens like passwords!** Don't share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent. - -Now that we've got the hang of making authenticated calls, let's move along to -the [Repositories API][repos-api]. - -## Repositories - -Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can [`GET` repository details][get repo] in the same way we fetched user -details earlier: - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -In the same way, we can [view repositories for the authenticated user][user repos api]: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -Or, we can [list repositories for another user][other user repos api]: - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -Or, we can [list repositories for an organization][org repos api]: - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -The information returned from these calls will depend on how we authenticate: - -* Using Basic Authentication, the response includes all repositories the - the user has access to see on github.com. -* Using OAuth, private repositories are only returned if the OAuth token - contains the `repo` [scope][scopes]. - -As the [docs][repos-api] indicate, these methods take a `type` parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team. - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string. - -### Create a repository - -Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To [create a repository][create repo], -we need to `POST` some JSON containing the details and configuration options. - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -In this minimal example, we create a new repository for our blog (to be served -on [GitHub Pages][pages], perhaps). Though the blog will be public, we've made -the repository private. In this single step, we'll also initialize it with -a README and a [nanoc][nanoc]-flavored [.gitignore template][gitignore -templates]. - -The resulting repository will be found at `https://github.com//blog`. -To create a repository under an organization for which you're -an owner, just change the API method from `/user/repos` to `/orgs//repos`. - -Next, let's fetch our newly created repository: - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -Oh noes! Where did it go? Since we created the repository as _private_, we need -to authenticate in order to see it. If you're a grizzled HTTP user, you might -expect a `403` instead. Since we don't want to leak information about private -repositories, the GitHub API returns a `404` in this case, as if to say "we can -neither confirm nor deny the existence of this repository." - -## Issues - -The UI for Issues on GitHub aims to provide 'just enough' workflow while -staying out of your way. With the GitHub [Issues API][issues-api], you can pull -data out or create issues from other tools to create a workflow that works for -your team. - -Just like github.com, the API provides a few methods to view issues for the -authenticated user. To [see all your issues][get issues api], call `GET /issues`: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -To get only the [issues under one of your GitHub organizations][get issues api], call `GET -/orgs//issues`: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -We can also get [all the issues under a single repository][repo issues api]: - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -### Pagination - -A project the size of Rails has thousands of issues. We'll need to [paginate][pagination], -making multiple API calls to get the data. Let's repeat that last call, this -time taking note of the response headers: - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -The [`Link` header][link-header] provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results. - -### Creating an issue - -Now that we've seen how to paginate lists of issues, let's [create an issue][create issue] from -the API. - -To create an issue, we need to be authenticated, so we'll pass an -OAuth token in the header. Also, we'll pass the title, body, and labels in the JSON -body to the `/issues` path underneath the repository in which we want to create -the issue: - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -The response gives us a couple of pointers to the newly created issue, both in -the `Location` response header and the `url` field of the JSON response. - -## Conditional requests - -A big part of being a good API citizen is respecting rate limits by -caching information that hasn't changed. The API supports [conditional -requests][conditional-requests] and helps you do the right thing. Consider the -first call we made to get defunkt's profile: - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -In addition to the JSON body, take note of the HTTP status code of `200` and -the `ETag` header. -The [ETag][etag] is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed: - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -The `304` status indicates that the resource hasn't changed since the last time -we asked for it and the response will contain no body. As a bonus, `304` -responses don't count against your [rate limit][rate-limiting]. - -Woot! Now you know the basics of the GitHub API! - -* Basic & OAuth authentication -* Fetching and creating repositories and issues -* Conditional requests - -Keep learning with the next API guide [Basics of Authentication][auth guide]! - - -[wrappers]: /libraries/ -[curl]: http://curl.haxx.se/ -[media types]: /v3/media/ -[oauth]: /v3/oauth/ -[webflow]: /v3/oauth/#web-application-flow -[authorizations api]: /v3/oauth_authorizations/#create-a-new-authorization -[scopes]: /v3/oauth/#scopes -[repos-api]: /v3/repos/ -[pages]: http://pages.github.com -[nanoc]: http://nanoc.ws/ -[gitignore templates]: https://github.com/github/gitignore -[issues-api]: /v3/issues/ -[link-header]: http://www.w3.org/wiki/LinkHeader/ -[conditional-requests]: /v3/#conditional-requests -[rate-limiting]: /v3/#rate-limiting -[users api]: /v3/users/#get-a-single-user -[auth user api]: /v3/users/#get-the-authenticated-user -[defunkt github]: https://github.com/defunkt -[json]: http://en.wikipedia.org/wiki/JSON -[rate limiting]: /v3/#rate-limiting -[authentication]: /v3/#authentication -[2fa]: https://help.github.com/articles/about-two-factor-authentication -[2fa header]: /v3/auth/#working-with-two-factor-authentication -[oauth section]: /guides/getting-started/#oauth -[personal token]: https://help.github.com/articles/creating-an-access-token-for-command-line-use -[tokens settings]: https://github.com/settings/tokens -[pagination]: /v3/#pagination -[get repo]: /v3/repos/#get -[create repo]: /v3/repos/#create -[create issue]: /v3/issues/#create-an-issue -[auth guide]: /guides/basics-of-authentication -[user repos api]: /v3/repos/#list-your-repositories -[other user repos api]: /v3/repos/#list-user-repositories -[org repos api]: /v3/repos/#list-organization-repositories -[get issues api]: /v3/issues/#list-issues -[repo issues api]: /v3/issues/#list-issues-for-a-repository -[etag]: http://en.wikipedia.org/wiki/HTTP_ETag -[2fa section]: /guides/getting-started/#two-factor-authentication -;T; -I"=S -

    Getting Started

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Overview

    - -

    Most applications will use an existing wrapper library in the language -of your choice, but it’s important to familiarize yourself with the underlying API -HTTP methods first.

    - -

    There’s no easier way to kick the tires than through cURL.

    - -

    Hello World

    - -

    Let’s start by testing our setup. Open up a command prompt and enter the -following command (without the $):

    - -
    -$ curl https://api.github.com/zen
    -
    -Keep it logically awesome.
    -
    - -

    The response will be a random selection from our design philosophies.

    - -

    Next, let’s GET Chris Wanstrath’s GitHub profile:

    - -
    -# GET /users/defunkt
    -$ curl https://api.github.com/users/defunkt
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    Mmmmm, tastes like JSON. Let’s add the -i flag to include headers:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -Server: GitHub.com
    -Date: Sun, 11 Nov 2012 18:43:28 GMT
    -Content-Type: application/json; charset=utf-8
    -Connection: keep-alive
    -Status: 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -X-RateLimit-Limit: 60
    -X-RateLimit-Remaining: 57
    -X-RateLimit-Reset: 1352660008
    -X-GitHub-Media-Type: github.v3
    -Vary: Accept
    -Cache-Control: public, max-age=60, s-maxage=60
    -X-Content-Type-Options: nosniff
    -Content-Length: 692
    -Last-Modified: Tue, 30 Oct 2012 18:58:42 GMT
    -
    -{
    -  "login": "defunkt",
    -  "id": 2,
    -  "url": "https://api.github.com/users/defunkt",
    -  "html_url": "https://github.com/defunkt",
    -  ...
    -}
    -
    - -

    There are a few interesting bits in the response headers. As expected, the -Content-Type is application/json.

    - -

    Any headers beginning with X- are custom headers, and are not included in the -HTTP spec. Let’s take a look at a few of them:

    - -
      -
    • -X-GitHub-Media-Type has a value of github.v3. This lets us know the media type -for the response. Media types have helped us version our output in API v3. We’ll -talk more about that later.
    • -
    • Take note of the X-RateLimit-Limit and X-RateLimit-Remaining headers. This -pair of headers indicate how many requests a client can make in -a rolling time period (typically an hour) and how many of those requests the -client has already spent.
    • -
    - -

    Authentication

    - -

    Unauthenticated clients can make 60 requests per hour. To get more, we’ll need to -authenticate. In fact, doing anything interesting with the GitHub API requires -authentication.

    - -

    Basic

    - -

    The easiest way to authenticate with the GitHub API is by simply using your GitHub -username and password via Basic Authentication.

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    - -

    The -u flag sets the username, and cURL will prompt you for the password. You -can use -u "username:password" to avoid the prompt, but this leaves your -password in shell history and isn’t recommended. When authenticating, you -should see your rate limit bumped to 5,000 requests an hour, as indicated in the -X-RateLimit-Limit header.

    - -

    In addition to just getting more calls per hour, authentication is the key to -reading and writing private information via the API.

    - -

    Two-factor authentication

    - -

    If you have two-factor authentication enabled, the API will return a -401 Unauthorized error code for the above request (and every other API request):

    - -
    -$ curl -i -u <your_username> https://api.github.com/users/defunkt
    -
    -Enter host password for user '<your_username>':
    -
    -HTTP/1.1 401 Unauthorized
    -X-GitHub-OTP: required; :2fa-type
    -
    -{
    -  "message": "Must specify two-factor authentication OTP code.",
    -  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
    -}
    -
    - -

    The easiest way to get around that error is to create an OAuth token and use -OAuth authentication instead of Basic Authentication. See the -OAuth section below for more information.

    - -

    Get your own user profile

    - -

    When properly authenticated, you can take advantage of the permissions -associated with your GitHub account. For example, try getting -your own user profile:

    - -
    -$ curl -i -u <your_username> https://api.github.com/user
    -
    -{
    -  ...
    -  "plan": {
    -    "space": 2516582,
    -    "collaborators": 10,
    -    "private_repos": 20,
    -    "name": "medium"
    -  }
    -  ...
    -}
    -
    - -

    This time, in addition to the same set of public information we -retrieved for @defunkt earlier, you should also see the non-public -information for your user profile. For example, you’ll see a plan object -in the response which gives details about the GitHub plan for the account.

    - -

    OAuth

    - -

    While convenient, Basic Authentication isn’t ideal because you shouldn’t give your GitHub -username and password to anyone. Applications that need to read or write -private information using the API on behalf of another user should use OAuth.

    - -

    Instead of usernames and passwords, OAuth uses tokens. Tokens provide two big -features:

    - -
      -
    • -Revokable access: users can revoke authorization to third party apps at any time
    • -
    • -Limited access: users can review the specific access that a token -will provide before authorizing a third party app
    • -
    - -

    Normally, tokens are created via a web flow. An application -sends users to GitHub to log in. GitHub then presents a dialog -indicating the name of the app, as well as the level of access the app -has once it’s authorized by the user. After a user authorizes access, GitHub -redirects the user back to the application:

    - -

    GitHub's OAuth Prompt

    - -

    However, you don’t need to set up the entire web flow to begin working with OAuth tokens. -An easier way to get a token is to create a personal access token via your -Personal access tokens settings page:

    - -

    Personal Token selection

    - -

    Also, the Authorizations API makes it simple to use Basic Authentication -to create an OAuth token. Try pasting and running the following command:

    - -
    -$ curl -i -u <your_username> -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/authorizations/2
    -Content-Length: 384
    -
    -{
    -  "scopes": [
    -    "repo",
    -    "user"
    -  ],
    -  "token": "5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4",
    -  "updated_at": "2012-11-14T14:04:24Z",
    -  "url": "https://api.github.com/authorizations/2",
    -  "app": {
    -    "url": "https://developer.github.com/v3/oauth/#oauth-authorizations-api",
    -    "name": "GitHub API"
    -  },
    -  "created_at": "2012-11-14T14:04:24Z",
    -  "note_url": null,
    -  "id": 2,
    -  "note": "getting-started"
    -}
    -
    - -

    There’s a lot going on in this one little call, so let’s break it down. First, -the -d flag indicates we’re doing a POST, using the -application/x-www-form-urlencoded content type (as opposed to GET). All POST -requests to the GitHub API should be in JSON.

    - -

    Next, let’s look at the scopes we’re sending over in this call. When creating -a new token, we include an optional array of scopes, or access -levels, that indicate what information this token can access. In this case, -we’re setting up the token with repo access, which grants access to read and -write to public and private repositories, and user scope, which grants read -and write access to public and private user profile data. See -the scopes docs for a full list of -scopes. You should only request scopes that your application actually needs, -in order to not frighten users with potentially invasive actions. The 201 -status code tells us that the call was successful, and the JSON returned -contains the details of our new OAuth token.

    - -

    If you have two-factor authentication enabled, the API will -return the previously described 401 Unauthorized error code -for the above request. You can get around that error by providing a 2FA OTP code -in the X-GitHub-OTP request header:

    - -
    -$ curl -i -u <your_username> -H "X-GitHub-OTP: <your_2fa_OTP_code>" \
    -    -d '{"scopes": ["repo", "user"], "note": "getting-started"}' \
    -    https://api.github.com/authorizations
    -
    - -

    If you enabled 2FA with a mobile application, go ahead and get an OTP code from -your one-time password application on your phone. If you enabled 2FA with text -messages, you’ll receive an SMS with your OTP code after making a request to -this endpoint.

    - -

    Now, we can use the forty character token instead of a username and password -in the rest of our examples. Let’s grab our own user info again, using OAuth this time:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user
    -
    - -

    Treat OAuth tokens like passwords! Don’t share them with other users or store -them in insecure places. The tokens in these examples are fake and the names have -been changed to protect the innocent.

    - -

    Now that we’ve got the hang of making authenticated calls, let’s move along to -the Repositories API.

    - -

    Repositories

    - -

    Almost any meaningful use of the GitHub API will involve some level of Repository -information. We can GET repository details in the same way we fetched user -details earlier:

    - -
    -$ curl -i https://api.github.com/repos/twbs/bootstrap
    -
    - -

    In the same way, we can view repositories for the authenticated user:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/user/repos
    -
    - -

    Or, we can list repositories for another user:

    - -
    -$ curl -i https://api.github.com/users/technoweenie/repos
    -
    - -

    Or, we can list repositories for an organization:

    - -
    -$ curl -i https://api.github.com/orgs/mozilla/repos
    -
    - -

    The information returned from these calls will depend on how we authenticate:

    - -
      -
    • Using Basic Authentication, the response includes all repositories the -the user has access to see on github.com.
    • -
    • Using OAuth, private repositories are only returned if the OAuth token -contains the repo scope.
    • -
    - -

    As the docs indicate, these methods take a type parameter that -can filter the repositories returned based on what type of access the user has -for the repository. In this way, we can fetch only directly-owned repositories, -organization repositories, or repositories the user collaborates on via a team.

    - -
    -$ curl -i "https://api.github.com/users/technoweenie/repos?type=owner"
    -
    - -

    In this example, we grab only those repositories that technoweenie owns, not the -ones on which he collaborates. Note the quoted URL above. Depending on your -shell setup, cURL sometimes requires a quoted URL or else it ignores the -query string.

    - -

    Create a repository

    - -

    Fetching information for existing repositories is a common use case, but the -GitHub API supports creating new repositories as well. To create a repository, -we need to POST some JSON containing the details and configuration options.

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -        "name": "blog", \
    -        "auto_init": true, \
    -        "private": true, \
    -        "gitignore_template": "nanoc" \
    -      }' \
    -    https://api.github.com/user/repos
    -
    - -

    In this minimal example, we create a new repository for our blog (to be served -on GitHub Pages, perhaps). Though the blog will be public, we’ve made -the repository private. In this single step, we’ll also initialize it with -a README and a nanoc-flavored .gitignore template.

    - -

    The resulting repository will be found at https://github.com/<your_username>/blog. -To create a repository under an organization for which you’re -an owner, just change the API method from /user/repos to /orgs/<org_name>/repos.

    - -

    Next, let’s fetch our newly created repository:

    - -
    -$ curl -i https://api.github.com/repos/pengwynn/blog
    -
    -HTTP/1.1 404 Not Found
    -
    -{
    -    "message": "Not Found"
    -}
    -
    - -

    Oh noes! Where did it go? Since we created the repository as private, we need -to authenticate in order to see it. If you’re a grizzled HTTP user, you might -expect a 403 instead. Since we don’t want to leak information about private -repositories, the GitHub API returns a 404 in this case, as if to say “we can -neither confirm nor deny the existence of this repository.”

    - -

    Issues

    - -

    The UI for Issues on GitHub aims to provide ‘just enough’ workflow while -staying out of your way. With the GitHub Issues API, you can pull -data out or create issues from other tools to create a workflow that works for -your team.

    - -

    Just like github.com, the API provides a few methods to view issues for the -authenticated user. To see all your issues, call GET /issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/issues
    -
    - -

    To get only the issues under one of your GitHub organizations, call GET -/orgs/<org>/issues:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    https://api.github.com/orgs/rails/issues
    -
    - -

    We can also get all the issues under a single repository:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    - -

    Pagination

    - -

    A project the size of Rails has thousands of issues. We’ll need to paginate, -making multiple API calls to get the data. Let’s repeat that last call, this -time taking note of the response headers:

    - -
    -$ curl -i https://api.github.com/repos/rails/rails/issues
    -
    -HTTP/1.1 200 OK
    -
    -Link: <https://api.github.com/repos/rails/rails/issues?page=2>; rel="next",
    -<https://api.github.com/repos/rails/rails/issues?page=14>; rel="last"
    -
    - -

    The Link header provides a way for a response to link to -external resources, in this case additional pages of data. Since our call found -more than thirty issues (the default page size), the API tells us where we can -find the next page and the last page of results.

    - -

    Creating an issue

    - -

    Now that we’ve seen how to paginate lists of issues, let’s create an issue from -the API.

    - -

    To create an issue, we need to be authenticated, so we’ll pass an -OAuth token in the header. Also, we’ll pass the title, body, and labels in the JSON -body to the /issues path underneath the repository in which we want to create -the issue:

    - -
    -$ curl -i -H 'Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4' \
    -    -d '{ \
    -         "title": "New logo", \
    -         "body": "We should have one", \
    -         "labels": ["design"] \
    -       }' \
    -    https://api.github.com/repos/pengwynn/api-sandbox/issues
    -
    -HTTP/1.1 201 Created
    -Location: https://api.github.com/repos/pengwynn/api-sandbox/issues/17
    -X-RateLimit-Limit: 5000
    -
    -{
    -  "pull_request": {
    -    "patch_url": null,
    -    "html_url": null,
    -    "diff_url": null
    -  },
    -  "created_at": "2012-11-14T15:25:33Z",
    -  "comments": 0,
    -  "milestone": null,
    -  "title": "New logo",
    -  "body": "We should have one",
    -  "user": {
    -    "login": "pengwynn",
    -    "gravatar_id": "7e19cd5486b5d6dc1ef90e671ba52ae0",
    -    "avatar_url": "https://secure.gravatar.com/avatar/7e19cd5486b5d6dc1ef90e671ba52ae0?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    -    "id": 865,
    -    "url": "https://api.github.com/users/pengwynn"
    -  },
    -  "closed_at": null,
    -  "updated_at": "2012-11-14T15:25:33Z",
    -  "number": 17,
    -  "closed_by": null,
    -  "html_url": "https://github.com/pengwynn/api-sandbox/issues/17",
    -  "labels": [
    -    {
    -      "color": "ededed",
    -      "name": "design",
    -      "url": "https://api.github.com/repos/pengwynn/api-sandbox/labels/design"
    -    }
    -  ],
    -  "id": 8356941,
    -  "assignee": null,
    -  "state": "open",
    -  "url": "https://api.github.com/repos/pengwynn/api-sandbox/issues/17"
    -}
    -
    - -

    The response gives us a couple of pointers to the newly created issue, both in -the Location response header and the url field of the JSON response.

    - -

    Conditional requests

    - -

    A big part of being a good API citizen is respecting rate limits by -caching information that hasn’t changed. The API supports conditional -requests and helps you do the right thing. Consider the -first call we made to get defunkt’s profile:

    - -
    -$ curl -i https://api.github.com/users/defunkt
    -
    -HTTP/1.1 200 OK
    -ETag: "bfd85cbf23ac0b0c8a29bee02e7117c6"
    -
    - -

    In addition to the JSON body, take note of the HTTP status code of 200 and -the ETag header. -The ETag is a fingerprint of the response. If we pass that on subsequent calls, -we can tell the API to give us the resource again, only if it has changed:

    - -
    -$ curl -i -H 'If-None-Match: "bfd85cbf23ac0b0c8a29bee02e7117c6"' \
    -    https://api.github.com/users/defunkt
    -
    -HTTP/1.1 304 Not Modified
    -
    - -

    The 304 status indicates that the resource hasn’t changed since the last time -we asked for it and the response will contain no body. As a bonus, 304 -responses don’t count against your rate limit.

    - -

    Woot! Now you know the basics of the GitHub API!

    - -
      -
    • Basic & OAuth authentication
    • -
    • Fetching and creating repositories and issues
    • -
    • Conditional requests
    • -
    - -

    Keep learning with the next API guide Basics of Authentication!

    - -;T; @mI"&/guides/create-coin-with-premine/;T{;{ ;I"p - - - - - - - Create coin with premine | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Create coin with premine

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Creating config file

    - -

    Create a configuration file of your coin by using our configuration form.

    - -

    Once you see the configuration file, save it in your machine.

    - -

    For example on Linux/Mac:

    - -

    If you want to dig deeper you can checkout the supported parameters of the configuration file.

    - -

    Creating simplewallet addresses

    - -

    This step is only required if your coin has premine

    - -

    Caution: Don’t forget to backup the wallets

    - -

    Genesis coinbase transaction creation

    - -

    Adding seed nodes

    - -

    You can create

    - - -
    - - -
    - - - - - - - -;T; I" -# Create coin with premine - -* TOC -{:toc} - - -Let's walk through core API concepts as we tackle some everyday use cases. - - -## Creating config file - -Create a configuration file of your coin by using our [configuration form][create]. - -Once you see the configuration file, save it in your machine. - -For example on Linux/Mac: - - - - -If you want to dig deeper you can checkout the [supported parameters][supported-parameters] of the configuration file. - - -## Creating simplewallet addresses - -This step is only required if your coin has premine - - - -*Caution: Don't forget to backup the wallets* - - -## Genesis coinbase transaction creation - - -## Adding seed nodes - -You can create - - - -[supported-parameters]: /create/ -[create]: /create/;T; -I" -

    Create coin with premine

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Creating config file

    - -

    Create a configuration file of your coin by using our configuration form.

    - -

    Once you see the configuration file, save it in your machine.

    - -

    For example on Linux/Mac:

    - -

    If you want to dig deeper you can checkout the supported parameters of the configuration file.

    - -

    Creating simplewallet addresses

    - -

    This step is only required if your coin has premine

    - -

    Caution: Don’t forget to backup the wallets

    - -

    Genesis coinbase transaction creation

    - -

    Adding seed nodes

    - -

    You can create

    - -;T; @sI" /guides/create-simple-coin/;T{;{ ;I" - - - - - - - Create simple coin | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Create simple coin

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Creating config file

    - -

    configuration create

    - -

    Genesis coinbase transaction creation

    - -

    To create the

    - -

    Adding seed nodes

    - -

    You can create

    - - -
    - - -
    - - - - - - - -;T; I" -# Create simple coin - -* TOC -{:toc} - - -Let's walk through core API concepts as we tackle some everyday use cases. - -## Creating config file - - [configuration create][create] - -## Genesis coinbase transaction creation - -To create the - - -## Adding seed nodes - -You can create - - -[create]: /create/;T; -I"< -

    Create simple coin

    - - - -

    Let’s walk through core API concepts as we tackle some everyday use cases.

    - -

    Creating config file

    - -

    configuration create

    - -

    Genesis coinbase transaction creation

    - -

    To create the

    - -

    Adding seed nodes

    - -

    You can create

    - -;T; @yI"/guides/getting-started/;T{;{ ;I"R - - - - - - - Getting Started | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Getting Started

    - - - -

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    - -

    Overview

    - -

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    - -

    Starting the daemon for preconfigured networks

    - -

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    - -

    Connecting to Dashcoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    - -

    Connecting to Bytecoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted --config-file configs/bytecoin.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Starting the daemon for custom networks

    - -

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    - -

    Next, let’s start the daemon itself:

    - -
    -$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    - -

    Starting simplewallet

    - -

    Simplewallet uses the same configuration file as the daemon.

    - -

    To start simplewallet:

    - -
    -$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -forknote wallet v1.0.8.608()
    -Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    -What do you want to do?
    -[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    -
    - -

    Press g to create new wallet and type your wallet’s name and password.

    - -

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    -For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    - -

    Don’t forget to backup your wallet.

    - - -
    - - -
    - - - - - - - -;T; I" -# Getting Started - -* TOC -{:toc} - -Let's walk through core Forknote concepts as we tackle a simple use case. - -## Overview - -Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must [download][download] the latest version of Forknote. - -## Starting the daemon for preconfigured networks - -Forknote comes preconfigured with 2 networks - Dashcoin and [Bytecoin][bytecoin]. - -### Connecting to Dashcoin - -To connect to Dashcoin open up a command prompt and enter the -following command (without the `$`): - -
    -$ ./forknoted
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -By default, Forknote will load the Dashcoin configuration file (`configs/-.conf`), if no configuration file is passed as option. - -### Connecting to Bytecoin - -To connect to Dashcoin open up a command prompt and enter the -following command (without the `$`): - -
    -$ ./forknoted --config-file configs/bytecoin.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -## Starting the daemon for custom networks - -To connect to custom networks, you must save the configuraton file in the `configs` subfolder of Forknote. - -Next, let's start the daemon itself: - -
    -$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -Please note you have to change `CUSTOM_NETWORK` with appropriate file name. - -## Starting simplewallet - -Simplewallet uses the same configuration file as the daemon. - -To start simplewallet: - -
    -$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -forknote wallet v1.0.8.608()
    -Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    -What do you want to do?
    -[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    -
    - -Press `g` to create new wallet and type your wallet's name and password. - -A good practice for naming your wallet is to add `NETWORK.` prefix to your name.
    -For example, for Dashcoin wallet use the `dashcoin.` prefix - `dashcoin.example_wallet` - -Don't forget to backup your wallet. - - -[download]: /download/ -[bytecoin]: https://bytecoin.org/;T; -I" -

    Getting Started

    - - - -

    Let’s walk through core Forknote concepts as we tackle a simple use case.

    - -

    Overview

    - -

    Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must download the latest version of Forknote.

    - -

    Starting the daemon for preconfigured networks

    - -

    Forknote comes preconfigured with 2 networks - Dashcoin and Bytecoin.

    - -

    Connecting to Dashcoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    By default, Forknote will load the Dashcoin configuration file (configs/-.conf), if no configuration file is passed as option.

    - -

    Connecting to Bytecoin

    - -

    To connect to Dashcoin open up a command prompt and enter the -following command (without the $):

    - -
    -$ ./forknoted --config-file configs/bytecoin.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Starting the daemon for custom networks

    - -

    To connect to custom networks, you must save the configuraton file in the configs subfolder of Forknote.

    - -

    Next, let’s start the daemon itself:

    - -
    -$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -

    Please note you have to change CUSTOM_NETWORK with appropriate file name.

    - -

    Starting simplewallet

    - -

    Simplewallet uses the same configuration file as the daemon.

    - -

    To start simplewallet:

    - -
    -$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -forknote wallet v1.0.8.608()
    -Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    -What do you want to do?
    -[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    -
    - -

    Press g to create new wallet and type your wallet’s name and password.

    - -

    A good practice for naming your wallet is to add NETWORK. prefix to your name.
    -For example, for Dashcoin wallet use the dashcoin. prefix - dashcoin.example_wallet

    - -

    Don’t forget to backup your wallet.

    - -;T; @I" /guides/;T{;{ ;I" - - - - - - - Guides | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - - -
    - - -
    - - - - - - - -;T; I" -# Development Guides - -This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes. - - -;T; -I"' -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - -;T; @I"/guides/troubleshooting/;T{;{ ;I" - - - - - - - Troutbleshooting | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Troubleshooting

    - - - -

    A list of problems you may encounter on the way.

    - -

    An existing connection was forcibly closed by the remote host

    - -

    Symptom

    - -

    Nobody can connect to the seed node. forknoted on the seed node prints the following WARNING

    - -
    -2015-Sep-22 22:51:12.627019 WARNING [node_server] [127.0.0.1:55741 INC] Exception in 
    -connectionHandler: TcpConnection::read, WSAGetOverlappedResult failed, result=10054, 
    -An existing connection was forcibly closed by the remote host.
    -
    - -

    Solution

    - -
      -
    • Add the P2P port in “Inbound Rules” in the Windows Firewall on the seed node
    • -
    • If you are behind NAT added --p2p-external-port <PORT> param to forknoted.
    • -
    - -

    Coinbase transaction doesn’t use full amount of block reward

    - -

    Symptom

    - -

    forknoted cannot start and prints the following ERROR

    - -
    -20:41:36.303639 ERROR Coinbase transaction doesn't use full amount of block reward: spent 70.368744177663, block reward is 1844674.407370955160
    -20:41:36.303736 INFO Block <5668876f735d91e7a4b7230dedddfeead0004e83a913eb1d8782101c5f8fc13a> has invalid miner transaction
    -20:41:36.303830 ERROR Failed to add genesis block to blockchain
    -20:41:36.303898 ERROR Failed to initialize blockchain storage
    -20:41:36.303960 ERROR Failed to initialize core
    -
    - -

    This error occurs when the loaded blockchain has different parameters than the configuration file.

    - -

    Solution

    - -

    Delete the blockchain folder.

    - -

    On Windows delete this folder:

    - -
    C:\Users\%user_name%\AppData\Roaming\%yourcoin%\
    - -

    On Linux/OSX:

    - -
    $ rm -rf ~/.YOURCOIN/
    - -
    - - -
    - - - - - - - -;T; I"` -# Troubleshooting - -* TOC -{:toc} - -A list of problems you may encounter on the way. - -##An existing connection was forcibly closed by the remote host - -###Symptom - -Nobody can connect to the seed node. `forknoted` on the seed node prints the following `WARNING` - -
    -2015-Sep-22 22:51:12.627019 WARNING [node_server] [127.0.0.1:55741 INC] Exception in 
    -connectionHandler: TcpConnection::read, WSAGetOverlappedResult failed, result=10054, 
    -An existing connection was forcibly closed by the remote host.
    -
    - -###Solution - -* Add the P2P port in "Inbound Rules" in the Windows Firewall on the seed node -* If you are behind NAT added `--p2p-external-port ` param to forknoted. - - -##Coinbase transaction doesn't use full amount of block reward - -###Symptom - -`forknoted` cannot start and prints the following `ERROR` - -
    -20:41:36.303639 ERROR Coinbase transaction doesn't use full amount of block reward: spent 70.368744177663, block reward is 1844674.407370955160
    -20:41:36.303736 INFO Block <5668876f735d91e7a4b7230dedddfeead0004e83a913eb1d8782101c5f8fc13a> has invalid miner transaction
    -20:41:36.303830 ERROR Failed to add genesis block to blockchain
    -20:41:36.303898 ERROR Failed to initialize blockchain storage
    -20:41:36.303960 ERROR Failed to initialize core
    -
    - -This error occurs when the loaded blockchain has different parameters than the configuration file. - -###Solution - -Delete the blockchain folder. - -On Windows delete this folder: - -
    C:\Users\%user_name%\AppData\Roaming\%yourcoin%\
    - -On Linux/OSX: - -
    $ rm -rf ~/.YOURCOIN/
    -;T; -I" -

    Troubleshooting

    - - - -

    A list of problems you may encounter on the way.

    - -

    An existing connection was forcibly closed by the remote host

    - -

    Symptom

    - -

    Nobody can connect to the seed node. forknoted on the seed node prints the following WARNING

    - -
    -2015-Sep-22 22:51:12.627019 WARNING [node_server] [127.0.0.1:55741 INC] Exception in 
    -connectionHandler: TcpConnection::read, WSAGetOverlappedResult failed, result=10054, 
    -An existing connection was forcibly closed by the remote host.
    -
    - -

    Solution

    - -
      -
    • Add the P2P port in “Inbound Rules” in the Windows Firewall on the seed node
    • -
    • If you are behind NAT added --p2p-external-port <PORT> param to forknoted.
    • -
    - -

    Coinbase transaction doesn’t use full amount of block reward

    - -

    Symptom

    - -

    forknoted cannot start and prints the following ERROR

    - -
    -20:41:36.303639 ERROR Coinbase transaction doesn't use full amount of block reward: spent 70.368744177663, block reward is 1844674.407370955160
    -20:41:36.303736 INFO Block <5668876f735d91e7a4b7230dedddfeead0004e83a913eb1d8782101c5f8fc13a> has invalid miner transaction
    -20:41:36.303830 ERROR Failed to add genesis block to blockchain
    -20:41:36.303898 ERROR Failed to initialize blockchain storage
    -20:41:36.303960 ERROR Failed to initialize core
    -
    - -

    This error occurs when the loaded blockchain has different parameters than the configuration file.

    - -

    Solution

    - -

    Delete the blockchain folder.

    - -

    On Windows delete this folder:

    - -
    C:\Users\%user_name%\AppData\Roaming\%yourcoin%\
    - -

    On Linux/OSX:

    - -
    $ rm -rf ~/.YOURCOIN/
    -;T; @I" /guides/starting-seed-node/;T{;{ ;I" - - - - - - - Getting Started | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Starting seed node

    - - - -

    This guide will walk you through the process of starting a Forknote seed node on a Ubuntu 14.04 VPS.

    - -

    Getting a VPS

    - -

    Run forknoted on a VPS is the cheapest way to get your network started.
    -You can get a VPS at Digital Ocean or Vultr. The 5$ option is what most coins need.

    - -

    Vultr recommended VPS

    - -

    Adding nodes to config file

    - -

    Once you have your VPS, you can see its IP.

    - -

    Vultr IP VPS

    - -

    Add its IP to the seed nodes.

    - -

    Create cryptonote coin form - seed

    - -

    Installing Forknote

    - -

    Once you connect to the VPS, create and log into user fork.

    - -
    $ useradd -m fork
    -$ su fork
    -$ cd ~
    -
    - -

    Now you can download Forknote.

    - -
    $ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
    -
    ---2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
    -Resolving github.com (github.com)... 192.30.252.32
    -
    -
    - -

    Unarchive the downloaded file.

    - -
    $ tar -zxvf forknote-linux.tar.gz 
    -
    -forknote-linux/
    -forknote-linux/configs/
    -forknote-linux/forknoted
    -forknote-linux/simplewallet
    -forknote-linux/walletd
    -forknote-linux/configs/-.conf
    -forknote-linux/configs/bytecoin.conf
    -
    - -

    Saving the configuration file

    - -

    Log into the forknote directory

    - -
    $ cd forknote-linux
    - -

    Write your configuration file

    - -
    $ cat >configs/testcoin.conf 
    -
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=13539
    -rpc-bind-port=13540
    -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    -CRYPTONOTE_NAME=testcoin
    -UPGRADE_HEIGHT=1
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    -seed-node=45.32.238.88:13539
    -
    -
    - -

    Starting in upstart

    - -

    Log with root user and change the directory to /etc/init/.

    - -
    $ cd /etc/init
    -
    - -

    Create the upstart config file.

    - -
    $ cat >forknote-testcoin-daemon.conf 
    -
    -description "testcoin daemon"
    -
    -start on runlevel [23]
    -stop on shutdown
    -
    -exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
    -
    -post-stop exec sleep 30
    -
    -respawn
    -respawn limit 5 30
    -
    -
    - -

    Start the service.

    - -
    $ start forknote-testcoin-daemon 
    -
    - -

    You now have your seed node up and running. It will automatically restart if something goes wrong.

    - - -
    - - -
    - - - - - - - -;T; I" -# Starting seed node - -* TOC -{:toc} - -This guide will walk you through the process of starting a Forknote seed node on a **Ubuntu 14.04** VPS. - -## Getting a VPS - -Run forknoted on a VPS is the cheapest way to get your network started.
    -You can get a VPS at [Digital Ocean][ditital-ocean] or [Vultr][vultr]. The 5$ option is what most coins need. - -[![Vultr recommended VPS](/images/documentation/vps-vultr-recommended.png)][vultr] - - -## Adding nodes to config file - -Once you have your VPS, you can see its IP. - -![Vultr IP VPS](/images/documentation/vps-vultr-ip.png) - -Add its IP to the seed nodes. - -![Create cryptonote coin form - seed](/images/documentation/create-form-seed.png) - - -## Installing Forknote - -Once you connect to the VPS, create and log into user `fork`. - -
    $ useradd -m fork
    -$ su fork
    -$ cd ~
    -
    - -Now you can download Forknote. - -
    $ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
    -
    ---2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
    -Resolving github.com (github.com)... 192.30.252.32
    -
    -
    - -Unarchive the downloaded file. - -
    $ tar -zxvf forknote-linux.tar.gz 
    -
    -forknote-linux/
    -forknote-linux/configs/
    -forknote-linux/forknoted
    -forknote-linux/simplewallet
    -forknote-linux/walletd
    -forknote-linux/configs/-.conf
    -forknote-linux/configs/bytecoin.conf
    -
    - - -## Saving the configuration file - -Log into the forknote directory - -
    $ cd forknote-linux
    - -Write your configuration file - -
    $ cat >configs/testcoin.conf 
    -
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=13539
    -rpc-bind-port=13540
    -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    -CRYPTONOTE_NAME=testcoin
    -UPGRADE_HEIGHT=1
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    -seed-node=45.32.238.88:13539
    -
    -
    - - -## Starting in upstart - -Log with `root` user and change the directory to `/etc/init/`. - -
    $ cd /etc/init
    -
    - -Create the upstart config file. - -
    $ cat >forknote-testcoin-daemon.conf 
    -
    -description "testcoin daemon"
    -
    -start on runlevel [23]
    -stop on shutdown
    -
    -exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
    -
    -post-stop exec sleep 30
    -
    -respawn
    -respawn limit 5 30
    -
    -
    - -Start the service. - -
    $ start forknote-testcoin-daemon 
    -
    - -You now have your seed node up and running. It will automatically restart if something goes wrong. - -[ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 -[vultr]: http://www.vultr.com/?ref=6832621;T; -I" -

    Starting seed node

    - - - -

    This guide will walk you through the process of starting a Forknote seed node on a Ubuntu 14.04 VPS.

    - -

    Getting a VPS

    - -

    Run forknoted on a VPS is the cheapest way to get your network started.
    -You can get a VPS at Digital Ocean or Vultr. The 5$ option is what most coins need.

    - -

    Vultr recommended VPS

    - -

    Adding nodes to config file

    - -

    Once you have your VPS, you can see its IP.

    - -

    Vultr IP VPS

    - -

    Add its IP to the seed nodes.

    - -

    Create cryptonote coin form - seed

    - -

    Installing Forknote

    - -

    Once you connect to the VPS, create and log into user fork.

    - -
    $ useradd -m fork
    -$ su fork
    -$ cd ~
    -
    - -

    Now you can download Forknote.

    - -
    $ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
    -
    ---2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
    -Resolving github.com (github.com)... 192.30.252.32
    -
    -
    - -

    Unarchive the downloaded file.

    - -
    $ tar -zxvf forknote-linux.tar.gz 
    -
    -forknote-linux/
    -forknote-linux/configs/
    -forknote-linux/forknoted
    -forknote-linux/simplewallet
    -forknote-linux/walletd
    -forknote-linux/configs/-.conf
    -forknote-linux/configs/bytecoin.conf
    -
    - -

    Saving the configuration file

    - -

    Log into the forknote directory

    - -
    $ cd forknote-linux
    - -

    Write your configuration file

    - -
    $ cat >configs/testcoin.conf 
    -
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=13539
    -rpc-bind-port=13540
    -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    -CRYPTONOTE_NAME=testcoin
    -UPGRADE_HEIGHT=1
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    -seed-node=45.32.238.88:13539
    -
    -
    - -

    Starting in upstart

    - -

    Log with root user and change the directory to /etc/init/.

    - -
    $ cd /etc/init
    -
    - -

    Create the upstart config file.

    - -
    $ cat >forknote-testcoin-daemon.conf 
    -
    -description "testcoin daemon"
    -
    -start on runlevel [23]
    -stop on shutdown
    -
    -exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
    -
    -post-stop exec sleep 30
    -
    -respawn
    -respawn limit 5 30
    -
    -
    - -

    Start the service.

    - -
    $ start forknote-testcoin-daemon 
    -
    - -

    You now have your seed node up and running. It will automatically restart if something goes wrong.

    - -;T; @I"/documentation/;T{;{ ;I"! - - - - - - - Documentation | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Forknote command line client overview

    - -

    Forknote works through 2 separate binary files operated through command line:

    - -
      -
    • -

      forknoted – daemon to synchronize the block chain and mine cryptonote tokens.

      -
    • -
    • -

      simplewallet – wallet to receive and send funds.

      -
    • -
    - -

    Install Forknote

    - -
      -
    1. Unzip the archive to one separate folder
    2. -
    - -

    Launch Forknote

    - -
      -
    1. Open forknoted. For downloadable Linux archive use: -
      -  ./forknoted --config-file <path_to_config_file>
      - 
      -
    2. -
    3. -

      Wait until forknoted is synchronized. You will be notified with several green “SYNCHRONIZED OK” messages.

      -
    4. -
    5. Open simplewallet. For downloadable Linux archive use: -
      -  ./simplewallet --config-file <path_to_config_file>
      - 
      -
    6. -
    - -

    Daemon: synchronization & mining

    - -

    Main article: Daemon configuration and commands

    - -

    After forknoted is launched you will have to wait until it is synchronized with the network. You will be notified with several green “SYNCHRONIZED OK” messages. Here are the most important daemon commands:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescription
    start_mining <wallet_address> [threads=1]Start mining in several threads to a given wallet address
    stop_miningStop mining
    show_hrShow current mining hashrate
    hide_hrStop showing current mining hashrate
    helpShow all daemon commands
    exitExit forknoted
    - -

    Wallet: send and receive payments

    - -

    Main article: Simplewallet configuration and commands

    - -

    Simplewallet can only be used after the daemon is launched and synchronized. Simlewallet automatically synchronizes with forknoted. Here are the most important wallet commands:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescription
    addressShow your wallet address
    balanceShow current wallet balance
    transfer <mixin_count> <address> <amount>Send money to <address> with a mixing degree of <mixin_count>
    start_mining <threads>Start mining in daemon with several threads to the current wallet address
    stop_miningStop mining in daemon
    helpShow all wallet commands
    exitExit simplewallet
    - - -
    - - -
    - - - - - - - -;T; I" -# Forknote command line client overview - -Forknote works through 2 separate binary files operated through command line: - -* **forknoted** – daemon to synchronize the block chain and mine cryptonote tokens. - -* **simplewallet** – wallet to receive and send funds. - - -## Install Forknote - -1. Unzip the archive to one separate folder - - -## Launch Forknote - -1. Open forknoted. For downloadable Linux archive use: -
    -     ./forknoted --config-file <path_to_config_file>
    -    
    - -2. Wait until forknoted is synchronized. You will be notified with several green "SYNCHRONIZED OK" messages. - -3. Open simplewallet. For downloadable Linux archive use: -
    -     ./simplewallet --config-file <path_to_config_file>
    -    
    - -## Daemon: synchronization & mining - -*Main article: [Daemon configuration and commands][daemon_commands]* - -After forknoted is launched you will have to wait until it is synchronized with the network. You will be notified with several green "SYNCHRONIZED OK" messages. Here are the most important daemon commands: - - -Command | Description ------------|-----------| -start_mining <wallet_address> [threads=1] | Start mining in several threads to a given wallet address -stop_mining | Stop mining -show_hr | Show current mining hashrate -hide_hr | Stop showing current mining hashrate -help | Show all daemon commands -exit | Exit forknoted - - -## Wallet: send and receive payments - -*Main article: [Simplewallet configuration and commands][simplewallet_commands]* - -Simplewallet can only be used after the daemon is launched and synchronized. Simlewallet automatically synchronizes with forknoted. Here are the most important wallet commands: - - -Command | Description ------------|-----------| -address | Show your wallet address -balance | Show current wallet balance -transfer <mixin_count> <address> <amount> | Send money to <address> with a mixing degree of <mixin_count> -start_mining <threads> | Start mining in daemon with several threads to the current wallet address -stop_mining | Stop mining in daemon -help | Show all wallet commands -exit | Exit simplewallet - - -[daemon_commands]: /documentation/daemon/ -[simplewallet_commands]: /documentation/simplewallet/;T; -I") -

    Forknote command line client overview

    - -

    Forknote works through 2 separate binary files operated through command line:

    - -
      -
    • -

      forknoted – daemon to synchronize the block chain and mine cryptonote tokens.

      -
    • -
    • -

      simplewallet – wallet to receive and send funds.

      -
    • -
    - -

    Install Forknote

    - -
      -
    1. Unzip the archive to one separate folder
    2. -
    - -

    Launch Forknote

    - -
      -
    1. Open forknoted. For downloadable Linux archive use: -
      -  ./forknoted --config-file <path_to_config_file>
      - 
      -
    2. -
    3. -

      Wait until forknoted is synchronized. You will be notified with several green “SYNCHRONIZED OK” messages.

      -
    4. -
    5. Open simplewallet. For downloadable Linux archive use: -
      -  ./simplewallet --config-file <path_to_config_file>
      - 
      -
    6. -
    - -

    Daemon: synchronization & mining

    - -

    Main article: Daemon configuration and commands

    - -

    After forknoted is launched you will have to wait until it is synchronized with the network. You will be notified with several green “SYNCHRONIZED OK” messages. Here are the most important daemon commands:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescription
    start_mining <wallet_address> [threads=1]Start mining in several threads to a given wallet address
    stop_miningStop mining
    show_hrShow current mining hashrate
    hide_hrStop showing current mining hashrate
    helpShow all daemon commands
    exitExit forknoted
    - -

    Wallet: send and receive payments

    - -

    Main article: Simplewallet configuration and commands

    - -

    Simplewallet can only be used after the daemon is launched and synchronized. Simlewallet automatically synchronizes with forknoted. Here are the most important wallet commands:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescription
    addressShow your wallet address
    balanceShow current wallet balance
    transfer <mixin_count> <address> <amount>Send money to <address> with a mixing degree of <mixin_count>
    start_mining <threads>Start mining in daemon with several threads to the current wallet address
    stop_miningStop mining in daemon
    helpShow all wallet commands
    exitExit simplewallet
    - -;T; @I")/documentation/cryptonote_generator/;T{;{ ;I"P - - - - - - - Cryptonote generator overview | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Cryptonote generator overview

    - -

    This section describes the purpose of the Cryptonote Generator. The Cryptonote Generator is used for source code creation, based on the latest version of Bytecoin. It eases the creation and . The generated code is fully compatible with Forknote

    - -

    Dependencies

    - -

    Configuration parameters

    - -

    The core parameters of the Cryptonote Generator are the same as the currency defining parameters of Forknote

    - -

    Example configuration

    - -

    Source creating and building

    - - -
    - - -
    - - - - - - - -;T; I" -# Cryptonote generator overview - -This section describes the purpose of the Cryptonote Generator. The Cryptonote Generator is used for source code creation, based on the latest version of Bytecoin. It eases the creation and . The generated code is fully compatible with Forknote - -## Dependencies - - -## Configuration parameters - -The core parameters of the Cryptonote Generator are the same as the currency defining parameters of Forknote - - -## Example configuration - - -## Source creating and building - - -;T; -I" -

    Cryptonote generator overview

    - -

    This section describes the purpose of the Cryptonote Generator. The Cryptonote Generator is used for source code creation, based on the latest version of Bytecoin. It eases the creation and . The generated code is fully compatible with Forknote

    - -

    Dependencies

    - -

    Configuration parameters

    - -

    The core parameters of the Cryptonote Generator are the same as the currency defining parameters of Forknote

    - -

    Example configuration

    - -

    Source creating and building

    - -;T; @I"/documentation/daemon/;T{;{ ;I"G - - - - - - - Daemon configuration and commands| Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Daemon configuration and commands

    - - - -

    Command line options

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -  --os-version 
    -  --data-dir arg (=/Users/USER/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -
    - -

    Command line options and settings options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    - -

    Example of a config file

    - -
    $ cat ./notrealcoin.conf 
    -
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -
    - -

    Daemon commands

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    - -
    - - -
    - - - - - - - -;T; I"y -# Daemon configuration and commands - -* TOC -{:toc} - -##Command line options - - --help Produce help message - --version Output version information - --os-version - --data-dir arg (=/Users/USER/.forknote) - Specify data directory - --config-file arg (=./configs/-.conf) Specify configuration file - - -##Command line options and settings options: - - -Option | Description |   Config Example   |   Console Example   ------------|-----------|-----------|-----------| -log-file | A name of log file that you want to use for logging. | log-file = mylog.log | --log-file mylog.log -log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 -no-console | Disable daemon console commands | no-console | --no-console -testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet | --testnet -rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 | --rpc-bind-ip 127.0.0.1 -rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 | --rpc-bind-port 29081 -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 -allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port -P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 -extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt | --extra-messages-file message.txt -start-mining | Specify wallet address to mining for | start-mining = FPM...yR | --start-mining FPM...yR -mining-threads | Specify mining threads count | mining-threads = 1 | --mining-threads 1 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin | --CRYPTONOTE_NAME dashcoin -CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 | --CHECKPOINT 10:70d..f8 -print-genesis-tx | Prints genesis block transaction hex and exits | | --print-genesis-tx -PREMINED_PERCENT | Percent of premined coins from all coins coming into existence | PREMINED_PERCENT = 10 | --PREMINED_PERCENT 10 -genesis-block-reward-address | The premined coins will be sent to this address. Multiple addresses can be used | | --genesis-block-reward-address FPM...yR - - -##Example of a config file - -
    $ cat ./notrealcoin.conf 
    -
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -
    - -##Daemon commands - -Command | Description | Arg 1 | Arg 2 ------------|-----------|-----------|-----------| -help | print forknoted commands | - | - -start_mining | Start mining in several threads to a given wallet address | [string] wallet_address | [uint] threads -stop_mining | Stop mining | - | - -show_hr | Show current mining hashrate | - | - -hide_hr | Stop showing current mining hashrate | - | - -exit | Exit forknoted | - | - -print_bc | Print blockchain info in a given blocks range | [uint] begin_height | [uint] end_height (optional) -print_block | Print block | [string] block_hash or [uint] block_height | - -print_cn | Print connections | - | - -print_pl | Print peer list | - | - -print_pool | Print transaction pool (long format) | - | - -print_pool_sh | Print transaction pool (short format) | - | - -set_log | Change current log detailization level | [uint] log level (0 - 4) | - -print_tx | Print transaction | [string] transaction_hash | - -;T; -I"*3 -

    Daemon configuration and commands

    - - - -

    Command line options

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -  --os-version 
    -  --data-dir arg (=/Users/USER/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -
    - -

    Command line options and settings options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    - -

    Example of a config file

    - -
    $ cat ./notrealcoin.conf 
    -
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -
    - -

    Daemon commands

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    -;T; @I"$/documentation/payment_gateway/;T{;{ ;I"a - - - - - - - Payment gateway overview and configuration | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Payment gateway overview and configuration

    - - - -

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    - -

    Configure Forknote RPC Wallet

    - -

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf
    -
    - -

    To get help on available options run:

    - -
     $ ./walletd -h
    -
    - -

    Please note, Forknote RPC Wallet config file may consist only of these options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    - -

    Example of a config file

    - -
    $ cat ./notrealcoin.conf 
    -
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -wallet-file = mywallet
    -wallet-password = mypassword
    -daemon-port = 17100
    -bind-port = 9090
    -
    -
    - -

    Note: config file’s path is relative to current working directory, not server root.

    - -

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    - -

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    - -

    Generate a new wallet

    - -

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    - -

    To generate a new wallet you should run the following command:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    -
    - -

    where:

    - -
      -
    • -<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • -
    • -<mypass> is a secret password for the new wallet file. Whichever you like;
    • -
    • -–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • -
    - -

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    - -

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    - -

    Start Forknote RPC Wallet

    - -

    There are two ways to start Forknote RPC Wallet:

    - -

    Start with a remote connection to the Daemon

    - -

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    - -
      -
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • -
    • For remote daemons specify the remote daemon’s IP address.
    • -
    - -

    Default Forknote daemon ports are 8080 and 8081.

    - -

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    - -
    daemon-address=<remote_ip>
    -daemon-port=8080
    -
    - -

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    - -

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    - -

    Start as in-process node

    - -

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    - -

    Use the following command to start Forknote RPC Wallet with an in-process node

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    -
    - -

    Run Forknote RPC Wallet

    - -

    Forknote RPC wallet can be started in both daemon and console modes.

    - -
      -
    • -

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      -
    • -
    • -

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      -
    • -
    - -

    Forknote RPC wallet starts in console mode by default.

    - -

    Start as daemon (UNIX only)

    - -

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    - -
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    -
    - -

    Note: it’s a common practice for daemons to set server root directory.

    - -

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    - -

    Start as service (Windows only)

    - -

    To run RPC wallet as a service on Windows you have to do the following:

    - -
      -
    1. -

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      - -

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      -
    2. -
    3. -

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      - -
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      -
      -
    4. -
    5. -

      After you see message about successful service registration you can run it in your Services panel.

      -
    6. -
    - -

    Uninstall service (Windows only)

    - -

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    - -
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    -
    - -

    Forknote RPC Wallet JSON RPC API

    - -

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    - -
      -
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. -
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. -
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. -
    7. Fund these amounts to the corresponding user accounts.
    8. -
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. -
    - -

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    - - -
    - - -
    - - - - - - - -;T; I"q7 -# Payment gateway overview and configuration - -* TOC -{:toc} - -This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] and much more. [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] page contains detailed description of every method. - - -##Configure Forknote RPC Wallet - -To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use "--config" option further. The command below launches Forknote RPC Wallet with a specific config file: - - $ ./walletd --config /home/Downloads/myconfig.conf - -To get help on available options run: - - $ ./walletd -h - -Please note, Forknote RPC Wallet config file may consist only of these options: - -Option | Description | Config Example | Console Example ------------|-----------|-----------|-----------| -bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 | --bind-address 127.0.0.1 -bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 | --bind-port 8071 -daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 | --daemon-address 127.0.0.1 -daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 | --daemon-port 8080 -wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet | --wallet-file mywallet -wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword | --wallet-password mypassword -generate-wallet | Generate new wallet | | --generate-wallet -log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log | --log-file mylog.log -server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet | --server-root /home/Downloads/RPCWallet -log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 -testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no | --testnet no -local | Option that allows you to start Forknote RPC Wallet as an in-process node | local | --local -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 -allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port -P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 - - -##Example of a config file - -
    $ cat ./notrealcoin.conf 
    -
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -wallet-file = mywallet
    -wallet-password = mypassword
    -daemon-port = 17100
    -bind-port = 9090
    -
    -
    - -Note: config file's path is relative to current working directory, not server root. - -Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode). - -Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory. - - -##Generate a new wallet - -To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly. - -To generate a new wallet you should run the following command: - - $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet - -where: - -* **<mywallet>** is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet's name will result in new *.wallet file located in the same folder as RPC Wallet -* **<mypass>** is a secret password for the new wallet file. Whichever you like; -* **--generate-wallet** option tells RPC wallet to generate wallet file and exit. - -Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name. - -If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down. - - -##Start Forknote RPC Wallet - -There are two ways to start Forknote RPC Wallet: - -###Start with a remote connection to the Daemon - -Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server. - -* For local daemons use localhost or 127.0.0.1 as an IP address. -* For remote daemons specify the remote daemon's IP address. - -Default Forknote daemon ports are 8080 and 8081. - -Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection: - - daemon-address= - daemon-port=8080 - -Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode. - -Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users. - -###Start as in-process node - -You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don't have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance. - -Use the following command to start Forknote RPC Wallet with an in-process node - - $ ./walletd --config /home/Downloads/myconfig.conf --local - -##Run Forknote RPC Wallet - -Forknote RPC wallet can be started in both daemon and console modes. - -* **Daemon mode** - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window. - -* **Console mode** - Forknote RPC Wallet is launched and prints log messages on the screen. - -Forknote RPC wallet starts in console mode by default. - -###Start as daemon (UNIX only) - -To start RPC wallet as daemon just set "--daemon" (or short "-d") option. - - ./walletd --config /home/Downloads/myconfig.conf --daemon - -Note: it's a common practice for daemons to set server root directory. - -Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory. - -###Start as service (Windows only) - -To run RPC wallet as a service on Windows you have to do the following: - -1. Create a config file and place it in the same directory as your RPC wallet's executable resides in. - - A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root); - -2. Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR: - - walletd.exe --config /home/Downloads/myconfig.conf --register-service - -3. After you see message about successful service registration you can run it in your Services panel. - - -###Uninstall service (Windows only) - -If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR: - - walletd.exe --config /home/Downloads/myconfig.conf --unregister-service - -##Forknote RPC Wallet JSON RPC API - -Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme: - -1. Create a unique address for each user to identify his particular deposits with **create_address()** method. -2. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run **get_transaction_count()** method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed. -3. Run **get_transaction()** method to receive amounts and addresses of new incoming transactions. -4. Fund these amounts to the corresponding user accounts. -5. Withdraw with **send_transaction()** method that allows you to send transaction to one or several addresses. - -Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] - - -[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment_gateway/json_rpc_api/ -;T; -I"*K -

    Payment gateway overview and configuration

    - - - -

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    - -

    Configure Forknote RPC Wallet

    - -

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf
    -
    - -

    To get help on available options run:

    - -
     $ ./walletd -h
    -
    - -

    Please note, Forknote RPC Wallet config file may consist only of these options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    - -

    Example of a config file

    - -
    $ cat ./notrealcoin.conf 
    -
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -wallet-file = mywallet
    -wallet-password = mypassword
    -daemon-port = 17100
    -bind-port = 9090
    -
    -
    - -

    Note: config file’s path is relative to current working directory, not server root.

    - -

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    - -

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    - -

    Generate a new wallet

    - -

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    - -

    To generate a new wallet you should run the following command:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    -
    - -

    where:

    - -
      -
    • -<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • -
    • -<mypass> is a secret password for the new wallet file. Whichever you like;
    • -
    • -–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • -
    - -

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    - -

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    - -

    Start Forknote RPC Wallet

    - -

    There are two ways to start Forknote RPC Wallet:

    - -

    Start with a remote connection to the Daemon

    - -

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    - -
      -
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • -
    • For remote daemons specify the remote daemon’s IP address.
    • -
    - -

    Default Forknote daemon ports are 8080 and 8081.

    - -

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    - -
    daemon-address=<remote_ip>
    -daemon-port=8080
    -
    - -

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    - -

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    - -

    Start as in-process node

    - -

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    - -

    Use the following command to start Forknote RPC Wallet with an in-process node

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    -
    - -

    Run Forknote RPC Wallet

    - -

    Forknote RPC wallet can be started in both daemon and console modes.

    - -
      -
    • -

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      -
    • -
    • -

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      -
    • -
    - -

    Forknote RPC wallet starts in console mode by default.

    - -

    Start as daemon (UNIX only)

    - -

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    - -
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    -
    - -

    Note: it’s a common practice for daemons to set server root directory.

    - -

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    - -

    Start as service (Windows only)

    - -

    To run RPC wallet as a service on Windows you have to do the following:

    - -
      -
    1. -

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      - -

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      -
    2. -
    3. -

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      - -
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      -
      -
    4. -
    5. -

      After you see message about successful service registration you can run it in your Services panel.

      -
    6. -
    - -

    Uninstall service (Windows only)

    - -

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    - -
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    -
    - -

    Forknote RPC Wallet JSON RPC API

    - -

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    - -
      -
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. -
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. -
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. -
    7. Fund these amounts to the corresponding user accounts.
    8. -
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. -
    - -

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    - -;T; @I"!/documentation/simplewallet/;T{;{ ;I"A - - - - - - - Simplewallet configuration and commands | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Simplewallet configuration and commands

    - - - -

    General options

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -  --data-dir arg (=/Users/USER/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -  --command arg                         Specify command
    -
    - -

    Wallet options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescriptionConfig ExampleConsole Example
    wallet-fileUse wallet <arg>wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet
    –wallet-file /home/USERNAME/
    forknote-linux/dashcoin.wallet
    generate-new-walletGenerate new wallet and save it to <arg> –generate-new-wallet /home/USERNAME/
    forknote-linux/dashcoin.wallet
    passwordWallet passwordpassword = PASSWORD–password PASSWORD
    daemon-addressUse daemon instance at <host>:<port>daemon-address = 127.0.0.1:29081–daemon-address 127.0.0.1:29081
    daemon-hostUse daemon instance at host <arg> instead of localhostdaemon-host = 127.0.0.1–daemon-host 127.0.0.1
    daemon-portUse daemon instance at port <arg> instead of 8081daemon-port = 29081–daemon-port 29081
    set_logLevel of logging. Default is 1.set_log = 4–set_log 4
    testnetUsed to deploy test nets. The daemon must be launched with –testnet flag –testnet
    wallet-rpc-bind-ipSpecify ip to bind rpc serverwallet-rpc-bind-ip = 127.0.0.1–wallet-rpc-bind-ip 127.0.0.1
    wallet-rpc-bind-portStarts wallet as rpc server for wallet operations, sets bind port for serverwallet-rpc-bind-port = 29082–wallet-rpc-bind-port 29082
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    DEFAULT_FEEDefault fee of the transactions sent through simplewalletDEFAULT_FEE–DEFAULT_FEE 1000000000
    SYNC_FROM_ZEROSync from block 0. Use for premine wallet or brainwalletSYNC_FROM_ZERO–SYNC_FROM_ZERO
    - -

    Example of a config file

    - -

    You can use the same configuration file as the daemon

    - -
    $ cat ./notrealcoin.conf 
    -
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -
    -wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
    -password=FAKE_PASSWORD
    -wallet-rpc-bind-port=17102
    -
    - -

    Wallet commands

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    - - -
    - - -
    - - - - - - - -;T; I"x -# Simplewallet configuration and commands - -* TOC -{:toc} - -##General options - - --help Produce help message - --version Output version information - --data-dir arg (=/Users/USER/.forknote) - Specify data directory - --config-file arg (=./configs/-.conf) Specify configuration file - --command arg Specify command - - -##Wallet options - -Option | Description | Config Example | Console Example ------------|-----------|-----------|-----------| -wallet-file | Use wallet <arg> | wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet | --wallet-file /home/USERNAME/
    forknote-linux/dashcoin.wallet -generate-new-wallet | Generate new wallet and save it to <arg> | | --generate-new-wallet /home/USERNAME/
    forknote-linux/dashcoin.wallet -password | Wallet password | password = PASSWORD | --password PASSWORD -daemon-address | Use daemon instance at <host>:<port> | daemon-address = 127.0.0.1:29081 | --daemon-address 127.0.0.1:29081 -daemon-host | Use daemon instance at host <arg> instead of localhost | daemon-host = 127.0.0.1 | --daemon-host 127.0.0.1 -daemon-port | Use daemon instance at port <arg> instead of 8081 | daemon-port = 29081 | --daemon-port 29081 -set_log | Level of logging. Default is 1. | set_log = 4 | --set_log 4 -testnet | Used to deploy test nets. The daemon must be launched with --testnet flag | | --testnet -wallet-rpc-bind-ip | Specify ip to bind rpc server | wallet-rpc-bind-ip = 127.0.0.1 | --wallet-rpc-bind-ip 127.0.0.1 -wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server | wallet-rpc-bind-port = 29082 | --wallet-rpc-bind-port 29082 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 -DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE | --DEFAULT_FEE 1000000000 -SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet | SYNC_FROM_ZERO | --SYNC_FROM_ZERO - - -##Example of a config file - -You can use the same configuration file as the daemon - -
    $ cat ./notrealcoin.conf 
    -
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -
    -wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
    -password=FAKE_PASSWORD
    -wallet-rpc-bind-port=17102
    -
    - - -##Wallet commands - -Command | Description | Arg 1 | Arg 2 | Arg 3 | Arg 4 | Arg 5 ------------|-----------|-----------|-----------|-----------|-----------|-----------| -address | Show current wallet public address | - | - | - | - | - -balance | Show current wallet balance | - | - | - | - | - -bc_height | Show blockchain height | - | - | - | - | - -help | Print help on wallet commands | - | - | - | - | - -incoming_transfers | Show incoming transfers | - | - | - | - | - -list_transfers | Show all known transfers | - | - | - | - | - -payments | Show payments with the corresponding payment_id's. You may indicate more than one payment_id. | [string] payment_id | - | - | - | - -reset | Discard cache data and start synchronizing from scratch | - | - | - | - | - -save | Save wallet synchronized data | - | - | - | - | - -set_log | Change current log detailization level | [uint] log level (0 - 4) | - | - | - | - -start_mining | Start mining in daemon | - | - | - | - | - -stop_mining | Stop mining in daemon | - | - | - | - | - -transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count | [string] address | [double] amount | [string] -p payment_id | [double] -f fee - -;T; -I"- -

    Simplewallet configuration and commands

    - - - -

    General options

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -  --data-dir arg (=/Users/USER/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -  --command arg                         Specify command
    -
    - -

    Wallet options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescriptionConfig ExampleConsole Example
    wallet-fileUse wallet <arg>wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet
    –wallet-file /home/USERNAME/
    forknote-linux/dashcoin.wallet
    generate-new-walletGenerate new wallet and save it to <arg> –generate-new-wallet /home/USERNAME/
    forknote-linux/dashcoin.wallet
    passwordWallet passwordpassword = PASSWORD–password PASSWORD
    daemon-addressUse daemon instance at <host>:<port>daemon-address = 127.0.0.1:29081–daemon-address 127.0.0.1:29081
    daemon-hostUse daemon instance at host <arg> instead of localhostdaemon-host = 127.0.0.1–daemon-host 127.0.0.1
    daemon-portUse daemon instance at port <arg> instead of 8081daemon-port = 29081–daemon-port 29081
    set_logLevel of logging. Default is 1.set_log = 4–set_log 4
    testnetUsed to deploy test nets. The daemon must be launched with –testnet flag –testnet
    wallet-rpc-bind-ipSpecify ip to bind rpc serverwallet-rpc-bind-ip = 127.0.0.1–wallet-rpc-bind-ip 127.0.0.1
    wallet-rpc-bind-portStarts wallet as rpc server for wallet operations, sets bind port for serverwallet-rpc-bind-port = 29082–wallet-rpc-bind-port 29082
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    DEFAULT_FEEDefault fee of the transactions sent through simplewalletDEFAULT_FEE–DEFAULT_FEE 1000000000
    SYNC_FROM_ZEROSync from block 0. Use for premine wallet or brainwalletSYNC_FROM_ZERO–SYNC_FROM_ZERO
    - -

    Example of a config file

    - -

    You can use the same configuration file as the daemon

    - -
    $ cat ./notrealcoin.conf 
    -
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -
    -wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
    -password=FAKE_PASSWORD
    -wallet-rpc-bind-port=17102
    -
    - -

    Wallet commands

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    - -;T; @I"$/documentation/daemon/commands/;T{;{ ;I"lM - - - - - - - Daemon command line arguments and commands | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Daemon command line arguments and commands

    - - - -

    Command line options

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -  --os-version 
    -  --data-dir arg (=/Users/USER/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -
    - -

    Command line options and settings options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    - -

    Example of a config file

    -
    $ cat ./-.conf 
    -
    -CRYPTONOTE_NAME=dashcoin
    -seed-node=108.61.188.93:7610
    -seed-node=128.199.146.243:29080
    -seed-node=195.154.181.121:7280
    -seed-node=93.77.229.33:29080
    -seed-node=144.76.59.211:29080
    -seed-node=176.9.147.178:7280
    -seed-node=176.9.47.243:7280
    -seed-node=84.200.76.33:29080
    -seed-node=98.115.76.178:29080
    -seed-node=195.154.181.121:7280
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=29080
    -rpc-bind-port=29081
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    -BYTECOIN_NETWORK=12112111-1110-4101-1311-001212110110
    -CHECKPOINT=28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -CHECKPOINT=55000:5289fe9f2dce8f51441019b9fbc85c70ad85ff49a666ef0109f3269890c6af6d
    -CHECKPOINT=70000:193e335f34b8b8f1fab3857111cb668c2720340e80176a25155071e573481acb
    -CHECKPOINT=87500:cce8a035f34457ec1098ab41e5949cac3db00ebff3503e26f36bfa057543095a
    -CHECKPOINT=200000:bb5b339991347c3b06431b233d3dbf9201e9176ddf4349ee46c60473725d5c98
    -CHECKPOINT=250000:c5b6064258237e911300cdcb6f937b37a6c17932e2bfdcba0ff12a48694709e0
    -CHECKPOINT=298000:5b1f21234c911eb755abce6fa66358558b380526f606222d042eb8b7ce993ae8
    -P2P_STAT_TRUSTED_PUB_KEY=4d26c4df7f4ca7037950ad026f9ab36dd05d881952662992f2e4dcfcafbe57eb
    -UPGRADE_HEIGHT=91452
    -MAX_BLOCK_SIZE_INITIAL=25600
    -DEFAULT_FEE=1000000000
    -MAX_TRANSACTION_SIZE_LIMIT=19400
    -
    - -

    Daemon commands

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    - -
    - - -
    - - - - - - - -;T; I"# -# Daemon command line arguments and commands - -* TOC -{:toc} - -##Command line options - - --help Produce help message - --version Output version information - --os-version - --data-dir arg (=/Users/USER/.forknote) - Specify data directory - --config-file arg (=./configs/-.conf) Specify configuration file - - -##Command line options and settings options: - - -Option | Description |   Config Example   |   Console Example   ------------|-----------|-----------|-----------| -log-file | A name of log file that you want to use for logging. | log-file = mylog.log | --log-file mylog.log -log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 -no-console | Disable daemon console commands | no-console | --no-console -testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet | --testnet -rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 | --rpc-bind-ip 127.0.0.1 -rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 | --rpc-bind-port 29081 -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 -allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port -P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 -extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt | --extra-messages-file message.txt -start-mining | Specify wallet address to mining for | start-mining = FPM...yR | --start-mining FPM...yR -mining-threads | Specify mining threads count | mining-threads = 1 | --mining-threads 1 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin | --CRYPTONOTE_NAME dashcoin -CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 | --CHECKPOINT 10:70d..f8 -print-genesis-tx | Prints genesis block transaction hex and exits | | --print-genesis-tx -PREMINED_PERCENT | Percent of premined coins from all coins coming into existence | PREMINED_PERCENT = 10 | --PREMINED_PERCENT 10 -genesis-block-reward-address | The premined coins will be sent to this address. Multiple addresses can be used | | --genesis-block-reward-address FPM...yR - - -##Example of a config file -
    $ cat ./-.conf 
    -
    -CRYPTONOTE_NAME=dashcoin
    -seed-node=108.61.188.93:7610
    -seed-node=128.199.146.243:29080
    -seed-node=195.154.181.121:7280
    -seed-node=93.77.229.33:29080
    -seed-node=144.76.59.211:29080
    -seed-node=176.9.147.178:7280
    -seed-node=176.9.47.243:7280
    -seed-node=84.200.76.33:29080
    -seed-node=98.115.76.178:29080
    -seed-node=195.154.181.121:7280
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=29080
    -rpc-bind-port=29081
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    -BYTECOIN_NETWORK=12112111-1110-4101-1311-001212110110
    -CHECKPOINT=28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -CHECKPOINT=55000:5289fe9f2dce8f51441019b9fbc85c70ad85ff49a666ef0109f3269890c6af6d
    -CHECKPOINT=70000:193e335f34b8b8f1fab3857111cb668c2720340e80176a25155071e573481acb
    -CHECKPOINT=87500:cce8a035f34457ec1098ab41e5949cac3db00ebff3503e26f36bfa057543095a
    -CHECKPOINT=200000:bb5b339991347c3b06431b233d3dbf9201e9176ddf4349ee46c60473725d5c98
    -CHECKPOINT=250000:c5b6064258237e911300cdcb6f937b37a6c17932e2bfdcba0ff12a48694709e0
    -CHECKPOINT=298000:5b1f21234c911eb755abce6fa66358558b380526f606222d042eb8b7ce993ae8
    -P2P_STAT_TRUSTED_PUB_KEY=4d26c4df7f4ca7037950ad026f9ab36dd05d881952662992f2e4dcfcafbe57eb
    -UPGRADE_HEIGHT=91452
    -MAX_BLOCK_SIZE_INITIAL=25600
    -DEFAULT_FEE=1000000000
    -MAX_TRANSACTION_SIZE_LIMIT=19400
    -
    - -##Daemon commands - -Command | Description | Arg 1 | Arg 2 ------------|-----------|-----------|-----------| -help | print forknoted commands | - | - -start_mining | Start mining in several threads to a given wallet address | [string] wallet_address | [uint] threads -stop_mining | Stop mining | - | - -show_hr | Show current mining hashrate | - | - -hide_hr | Stop showing current mining hashrate | - | - -exit | Exit forknoted | - | - -print_bc | Print blockchain info in a given blocks range | [uint] begin_height | [uint] end_height (optional) -print_block | Print block | [string] block_hash or [uint] block_height | - -print_cn | Print connections | - | - -print_pl | Print peer list | - | - -print_pool | Print transaction pool (long format) | - | - -print_pool_sh | Print transaction pool (short format) | - | - -set_log | Change current log detailization level | [uint] log level (0 - 4) | - -print_tx | Print transaction | [string] transaction_hash | - -;T; -I"O6 -

    Daemon command line arguments and commands

    - - - -

    Command line options

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -  --os-version 
    -  --data-dir arg (=/Users/USER/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -
    - -

    Command line options and settings options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescription  Config Example    Console Example  
    log-fileA name of log file that you want to use for logging.log-file = mylog.log–log-file mylog.log
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    no-consoleDisable daemon console commandsno-console–no-console
    testnetUsed to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is –data-dir flag. The wallet must be launched with –testnet flag.testnet–testnet
    rpc-bind-ipSpecify ip to bind rpc serverrpc-bind-ip = 127.0.0.1–rpc-bind-ip 127.0.0.1
    rpc-bind-portSpecify port to bind rpc serverrpc-bind-port = 29081–rpc-bind-port 29081
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    extra-messages-fileSpecify file for extra messages to include into coinbase transactionsextra-messages-file = message.txt–extra-messages-file message.txt
    start-miningSpecify wallet address to mining forstart-mining = FPM…yR–start-mining FPM…yR
    mining-threadsSpecify mining threads countmining-threads = 1–mining-threads 1
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    CRYPTONOTE_NAMECryptonote name. Used for storage directoryCRYPTONOTE_NAME = dashcoin–CRYPTONOTE_NAME dashcoin
    CHECKPOINTCheckpoints. Format: HEIGHT:HASHCHECKPOINT = 10:70d..f8–CHECKPOINT 10:70d..f8
    print-genesis-txPrints genesis block transaction hex and exits –print-genesis-tx
    PREMINED_PERCENTPercent of premined coins from all coins coming into existencePREMINED_PERCENT = 10–PREMINED_PERCENT 10
    genesis-block-reward-addressThe premined coins will be sent to this address. Multiple addresses can be used –genesis-block-reward-address FPM…yR
    - -

    Example of a config file

    -
    $ cat ./-.conf 
    -
    -CRYPTONOTE_NAME=dashcoin
    -seed-node=108.61.188.93:7610
    -seed-node=128.199.146.243:29080
    -seed-node=195.154.181.121:7280
    -seed-node=93.77.229.33:29080
    -seed-node=144.76.59.211:29080
    -seed-node=176.9.147.178:7280
    -seed-node=176.9.47.243:7280
    -seed-node=84.200.76.33:29080
    -seed-node=98.115.76.178:29080
    -seed-node=195.154.181.121:7280
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=29080
    -rpc-bind-port=29081
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    -BYTECOIN_NETWORK=12112111-1110-4101-1311-001212110110
    -CHECKPOINT=28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -CHECKPOINT=55000:5289fe9f2dce8f51441019b9fbc85c70ad85ff49a666ef0109f3269890c6af6d
    -CHECKPOINT=70000:193e335f34b8b8f1fab3857111cb668c2720340e80176a25155071e573481acb
    -CHECKPOINT=87500:cce8a035f34457ec1098ab41e5949cac3db00ebff3503e26f36bfa057543095a
    -CHECKPOINT=200000:bb5b339991347c3b06431b233d3dbf9201e9176ddf4349ee46c60473725d5c98
    -CHECKPOINT=250000:c5b6064258237e911300cdcb6f937b37a6c17932e2bfdcba0ff12a48694709e0
    -CHECKPOINT=298000:5b1f21234c911eb755abce6fa66358558b380526f606222d042eb8b7ce993ae8
    -P2P_STAT_TRUSTED_PUB_KEY=4d26c4df7f4ca7037950ad026f9ab36dd05d881952662992f2e4dcfcafbe57eb
    -UPGRADE_HEIGHT=91452
    -MAX_BLOCK_SIZE_INITIAL=25600
    -DEFAULT_FEE=1000000000
    -MAX_TRANSACTION_SIZE_LIMIT=19400
    -
    - -

    Daemon commands

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2
    helpprint forknoted commands--
    start_miningStart mining in several threads to a given wallet address[string] wallet_address[uint] threads
    stop_miningStop mining--
    show_hrShow current mining hashrate--
    hide_hrStop showing current mining hashrate--
    exitExit forknoted--
    print_bcPrint blockchain info in a given blocks range[uint] begin_height[uint] end_height (optional)
    print_blockPrint block[string] block_hash or [uint] block_height-
    print_cnPrint connections--
    print_plPrint peer list--
    print_poolPrint transaction pool (long format)--
    print_pool_shPrint transaction pool (short format)--
    set_logChange current log detailization level[uint] log level (0 - 4)-
    print_txPrint transaction[string] transaction_hash-
    -;T; @I"*/documentation/simplewallet/commands/;T{;{ ;I"/ - - - - - - - Simplewallet command line arguments and commands | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Simplewallet command line arguments and commands

    - -

    General options:

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -
    - -

    Wallet options:

    - -
      --wallet-file arg                     Use wallet <arg>
    -  --generate-new-wallet arg             Generate new wallet and save it to 
    -                                        <arg>
    -  --password arg                        Wallet password
    -  --daemon-address arg                  Use daemon instance at <host>:<port>
    -  --daemon-host arg                     Use daemon instance at host <arg> 
    -                                        instead of localhost
    -  --daemon-port arg (=0)                Use daemon instance at port <arg> 
    -                                        instead of 8081
    -  --command arg
    -  --set_log arg
    -  --testnet                             Used to deploy test nets. The daemon 
    -                                        must be launched with --testnet flag
    -  --wallet-rpc-bind-ip arg (=127.0.0.1) Specify ip to bind rpc server
    -  --wallet-rpc-bind-port arg            Starts wallet as rpc server for wallet 
    -                                        operations, sets bind port for server
    -  --MAX_TRANSACTION_SIZE_LIMIT arg (=24400)
    -                                        Max transaction limit size
    -  --data-dir arg (=/Users/pmitchev/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -  --GENESIS_COINBASE_TX_HEX arg (=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a)
    -                                        Genesis transaction hex
    -  --CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX arg (=6)
    -                                        uint64_t
    -  --MONEY_SUPPLY arg (=18446744073709551615)
    -                                        uint64_t
    -  --EMISSION_SPEED_FACTOR arg (=18)     unsigned int
    -  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE arg (=20000)
    -                                        uint64_t
    -  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 arg (=10000)
    -                                        uint64_t
    -  --CRYPTONOTE_DISPLAY_DECIMAL_POINT arg (=8)
    -                                        size_t
    -  --MINIMUM_FEE arg (=1000000)          uint64_t
    -  --DEFAULT_DUST_THRESHOLD arg (=1000000)
    -                                        uint64_t
    -  --DIFFICULTY_TARGET arg (=120)        uint64_t
    -  --CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW arg (=10)
    -                                        size_t
    -  --MAX_BLOCK_SIZE_INITIAL arg (=20480) uint64_t
    -  --EXPECTED_NUMBER_OF_BLOCKS_PER_DAY arg (=0)
    -                                        uint64_t
    -  --UPGRADE_HEIGHT arg (=0)             uint64_t
    -  --DIFFICULTY_CUT arg (=60)            uint64_t
    -  --DIFFICULTY_LAG arg (=15)            uint64_t
    -  --rpc-bind-port arg (=8081)
    -  --SYNC_FROM_ZERO                      Sync from block 0. Use for premine 
    -                                        wallet or brainwallet
    -  --DEFAULT_FEE arg (=1000000)          Default fee
    -
    - -

    Wallet commands:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    - - -
    - - -
    - - - - - - - -;T; I" -# Simplewallet command line arguments and commands - -**General options:** - - --help Produce help message - --version Output version information - - -**Wallet options:** - - --wallet-file arg Use wallet - --generate-new-wallet arg Generate new wallet and save it to - - --password arg Wallet password - --daemon-address arg Use daemon instance at : - --daemon-host arg Use daemon instance at host - instead of localhost - --daemon-port arg (=0) Use daemon instance at port - instead of 8081 - --command arg - --set_log arg - --testnet Used to deploy test nets. The daemon - must be launched with --testnet flag - --wallet-rpc-bind-ip arg (=127.0.0.1) Specify ip to bind rpc server - --wallet-rpc-bind-port arg Starts wallet as rpc server for wallet - operations, sets bind port for server - --MAX_TRANSACTION_SIZE_LIMIT arg (=24400) - Max transaction limit size - --data-dir arg (=/Users/pmitchev/.forknote) - Specify data directory - --config-file arg (=./configs/-.conf) Specify configuration file - --GENESIS_COINBASE_TX_HEX arg (=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a) - Genesis transaction hex - --CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX arg (=6) - uint64_t - --MONEY_SUPPLY arg (=18446744073709551615) - uint64_t - --EMISSION_SPEED_FACTOR arg (=18) unsigned int - --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE arg (=20000) - uint64_t - --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 arg (=10000) - uint64_t - --CRYPTONOTE_DISPLAY_DECIMAL_POINT arg (=8) - size_t - --MINIMUM_FEE arg (=1000000) uint64_t - --DEFAULT_DUST_THRESHOLD arg (=1000000) - uint64_t - --DIFFICULTY_TARGET arg (=120) uint64_t - --CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW arg (=10) - size_t - --MAX_BLOCK_SIZE_INITIAL arg (=20480) uint64_t - --EXPECTED_NUMBER_OF_BLOCKS_PER_DAY arg (=0) - uint64_t - --UPGRADE_HEIGHT arg (=0) uint64_t - --DIFFICULTY_CUT arg (=60) uint64_t - --DIFFICULTY_LAG arg (=15) uint64_t - --rpc-bind-port arg (=8081) - --SYNC_FROM_ZERO Sync from block 0. Use for premine - wallet or brainwallet - --DEFAULT_FEE arg (=1000000) Default fee - - -**Wallet commands:** - -Command | Description | Arg 1 | Arg 2 | Arg 3 | Arg 4 | Arg 5 ------------|-----------|-----------|-----------|-----------|-----------|-----------| -address | Show current wallet public address | - | - | - | - | - -balance | Show current wallet balance | - | - | - | - | - -bc_height | Show blockchain height | - | - | - | - | - -help | Print help on wallet commands | - | - | - | - | - -incoming_transfers | Show incoming transfers | - | - | - | - | - -list_transfers | Show all known transfers | - | - | - | - | - -payments | Show payments with the corresponding payment_id's. You may indicate more than one payment_id. | [string] payment_id | - | - | - | - -reset | Discard cache data and start synchronizing from scratch | - | - | - | - | - -save | Save wallet synchronized data | - | - | - | - | - -set_log | Change current log detailization level | [uint] log level (0 - 4) | - | - | - | - -start_mining | Start mining in daemon | - | - | - | - | - -stop_mining | Stop mining in daemon | - | - | - | - | - -transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count | [string] address | [double] amount | [string] -p payment_id | [double] -f fee - -;T; -I" -

    Simplewallet command line arguments and commands

    - -

    General options:

    - -
      --help                                Produce help message
    -  --version                             Output version information
    -
    - -

    Wallet options:

    - -
      --wallet-file arg                     Use wallet <arg>
    -  --generate-new-wallet arg             Generate new wallet and save it to 
    -                                        <arg>
    -  --password arg                        Wallet password
    -  --daemon-address arg                  Use daemon instance at <host>:<port>
    -  --daemon-host arg                     Use daemon instance at host <arg> 
    -                                        instead of localhost
    -  --daemon-port arg (=0)                Use daemon instance at port <arg> 
    -                                        instead of 8081
    -  --command arg
    -  --set_log arg
    -  --testnet                             Used to deploy test nets. The daemon 
    -                                        must be launched with --testnet flag
    -  --wallet-rpc-bind-ip arg (=127.0.0.1) Specify ip to bind rpc server
    -  --wallet-rpc-bind-port arg            Starts wallet as rpc server for wallet 
    -                                        operations, sets bind port for server
    -  --MAX_TRANSACTION_SIZE_LIMIT arg (=24400)
    -                                        Max transaction limit size
    -  --data-dir arg (=/Users/pmitchev/.forknote)
    -                                        Specify data directory
    -  --config-file arg (=./configs/-.conf) Specify configuration file
    -  --GENESIS_COINBASE_TX_HEX arg (=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a)
    -                                        Genesis transaction hex
    -  --CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX arg (=6)
    -                                        uint64_t
    -  --MONEY_SUPPLY arg (=18446744073709551615)
    -                                        uint64_t
    -  --EMISSION_SPEED_FACTOR arg (=18)     unsigned int
    -  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE arg (=20000)
    -                                        uint64_t
    -  --CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 arg (=10000)
    -                                        uint64_t
    -  --CRYPTONOTE_DISPLAY_DECIMAL_POINT arg (=8)
    -                                        size_t
    -  --MINIMUM_FEE arg (=1000000)          uint64_t
    -  --DEFAULT_DUST_THRESHOLD arg (=1000000)
    -                                        uint64_t
    -  --DIFFICULTY_TARGET arg (=120)        uint64_t
    -  --CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW arg (=10)
    -                                        size_t
    -  --MAX_BLOCK_SIZE_INITIAL arg (=20480) uint64_t
    -  --EXPECTED_NUMBER_OF_BLOCKS_PER_DAY arg (=0)
    -                                        uint64_t
    -  --UPGRADE_HEIGHT arg (=0)             uint64_t
    -  --DIFFICULTY_CUT arg (=60)            uint64_t
    -  --DIFFICULTY_LAG arg (=15)            uint64_t
    -  --rpc-bind-port arg (=8081)
    -  --SYNC_FROM_ZERO                      Sync from block 0. Use for premine 
    -                                        wallet or brainwallet
    -  --DEFAULT_FEE arg (=1000000)          Default fee
    -
    - -

    Wallet commands:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CommandDescriptionArg 1Arg 2Arg 3Arg 4Arg 5
    addressShow current wallet public address-----
    balanceShow current wallet balance-----
    bc_heightShow blockchain height-----
    helpPrint help on wallet commands-----
    incoming_transfersShow incoming transfers-----
    list_transfersShow all known transfers-----
    paymentsShow payments with the corresponding payment_id’s. You may indicate more than one payment_id.[string] payment_id----
    resetDiscard cache data and start synchronizing from scratch-----
    saveSave wallet synchronized data-----
    set_logChange current log detailization level[uint] log level (0 - 4)----
    start_miningStart mining in daemon-----
    stop_miningStop mining in daemon-----
    transferTransfer amount to address with mixin_count (number of transactions yours is indistinguishable from)[uint] mixin_count[string] address[double] amount[string] -p payment_id[double] -f fee
    - -;T; @I"(/documentation/daemon/html_rpc_api/;T{;{ ;I" - - - - - - - Daemon HTTP RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Daemon HTTP RPC API

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    - -
    - - -
    - - - - - - - -;T; I" -# Daemon HTTP RPC API - -URL | Description | Format | Arg 1 | Arg 2 | Return value ------------|-----------|-----------|-----------|-----------|-----------| -/getheight | Returns current chain height | JSON | - | - | [int] height -/getknownblockids | Returns list of known block ids | JSON | - | - | [list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids -/start_mine | Starts mining threads | JSON | [string] wallet address | [int] number of threads | [string] status -/stop_mine | Stops mining threads | JSON | - | - | [string] status -/gettransactions | Returns transactions as serialized blobs | JSON | [list] tx ids | - | [list] transactions as hex
    [list] missing tx ids
    [string] status -/sendrawtransactions | Send transaction to the network | JSON | [string] serialized transaction in hex form | - | [string] status -/getblocks.bin | Returns blocks in binary form | BIN | [list] block ids | - | [list] blocks
    [int] start height
    [int] current height
    [string] status -/get_o_indexes.bin |Get global output indicies | BIN | [hash] transaction id | - | [vector] output indicies
    [string] status -/getrandom_outs.bin | Get random output indicies
    for a given amount
    (purpose: for ring signatures) | BIN | [list] amounts | [int] count | [vector]
    { [int] amount; [list] outs }
    output entries -;T; -I"b -

    Daemon HTTP RPC API

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    -;T; @I"(/documentation/daemon/json_rpc_api/;T{;{ ;I"X - - - - - - - Daemon JSON RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Daemon JSON RPC API

    - - - -

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit rpc-bind-port in your configuration file

    - -
    rpc-bind-port=29081
    -
    - -

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit your configuration file

    - -
    rpc-bind-port=29081
    -rpc-bind-ip=0.0.0.0
    -
    - -

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29081/json_rpc
    - http://localhost:29081/json_rpc
    -
    - -

    getblockcount

    - -

    Returns current chain height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "count" : {
    -                    "type" : "integer",
    -                    "minimum": 0,
    -                    "description": ""
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -        "required": ["count", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockcount)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockcount"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "count": 123456,
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockhash

    - -

    Returns block hash by its height

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "string",
    -            "description": ""
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id": "test",
    -    "method": "on_getblockhash",
    -    "params": {
    -        "height": 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": "a7428..."
    - }
    -
    - -

    getblocktemplate

    - -

    Returns blocktemplate with an empty “hole” for nonce.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "reserve_size" : {
    -            "type" : "integer"
    -        },
    -        "wallet_address" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    - }
    -
    - -

    Return value schema

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "result" : {
    -            "difficulty" : {
    -                "type" : "integer"
    -            },
    -            "height" : {
    -                "type" :"integer"
    -            },
    -            "reserved_offset" : {
    -                "type" : "integer"
    -            },
    -            "blocktemplate_blob" : {
    -                "type" : "string"
    -            },
    -            "status" : {
    -                "type" : "string"
    -            }
    -        },
    -    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    -    }
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblocktemplate)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblocktemplate",
    -    "params": {
    -        "reserve_size": 200,
    -        "wallet_address": "28j5g2Hbe1..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "blocktemplate_blob": "0100de...",
    -        "difficulty": 65563,
    -        "height": 123456,
    -        "reserved_offset": 395,
    -        "status": ""
    -    }
    - }
    -
    - -

    submitblock

    - -

    Submits mined block.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "block" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "block"]
    - } 
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "status" : {
    -                "type" : "string",
    -                "description": ""
    -            },
    -            "required": ["status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (submitblock)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "submitblock",
    -    "params": ["0100b...."]
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "status" : "OK"
    -    }
    - }
    -
    - -

    getlastblockheader

    - -

    Returns last block header.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "block_header : {
    -                    "type" : "object",
    -                    "properties" : {
    -                        "major_version" :    {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "minor_version" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                            },
    -                        "timestamp" : {
    -                            "type" : "integer",
    -                            "description" : "UNIX timestamp"
    -                        },
    -                        "prev_hash" : {
    -                            "type" : "string",
    -                            "description" : "previous block's hash"
    -                        },
    -                        "nonce" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "orphan_status" : {
    -                            "type" : "boolean",
    -                            "description" : "True if the block was marked as orphaned"
    -                        },
    -                        "height" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "depth" : {
    -                            "type" : "integer",
    -                            "description" : "last_block_height - this_block_height"
    -                        },
    -                        "hash" : {
    -                            "type" : "string",
    -                            "description" : ""
    -                        },
    -                        "difficulty" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "reward" : {
    -                            "type" : "integer",
    -                            "description" : "Reward for the block in atomic units"
    -                        }
    -                    },
    -                    "required": [
    -                        "major_version", 
    -                        "minor_version", 
    -                        "timestamp", 
    -                        "prev_hash", 
    -                        "nonce",
    -                        "orphan_status",
    -                        "height",
    -                        "depth",
    -                        "hash",
    -                        "difficulty",
    -                        "reward"
    -                    ]
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "required": ["block_header", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getlastblockheader)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getlastblockheader"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyhash

    - -

    Returns last block header by given hash.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "hash" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "hash"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyhash",
    -    "params": {
    -        "hash" : "9a8be8..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyheight

    - -

    Returns block header by given block height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyheight)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyheight",
    -    "params": {
    -        "height" : 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -            },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getcurrencyId

    - -

    Returns unique currency identifier.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "currency_id_blob" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (getcurrencyId)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getcurrencyid"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "currency_id_blob" : "a7..."
    -    }
    - }
    -
    - -
    - - -
    - - - - - - - -;T; I"> -# Daemon JSON RPC API - -* TOC -{:toc} - -To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon's arguments). You can choose any free port. To do that execute the following command from the command line: - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    -
    - -Atlernatively, you can edit *rpc-bind-port* in your configuration file - - rpc-bind-port=29081 - - -If you want Daemon to be accessed from other computer not only yours you should also use a --rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line: - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    -
    - -Atlernatively, you can edit your configuration file - - rpc-bind-port=29081 - rpc-bind-ip=0.0.0.0 - -Having done that you're ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100): - - http://126.0.1.100:29081/json_rpc - http://localhost:29081/json_rpc - - -## getblockcount - -Returns current chain height. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "object", - "properties" : { - "count" : { - "type" : "integer", - "minimum": 0, - "description": "" - }, - "status" : { - "type" : "string" - } - }, - "required": ["count", "status"] - } - }, - "required": ["result"] - } - -### Example (getblockcount) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockcount" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "count": 123456, - "status": "OK" - } - } - - -##getblockhash - -Returns block hash by its height - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "height" : { - "type" : "integer" - } - }, - "required" : ["jsonrpc", "method", "height"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "string", - "description": "" - } - }, - "required": ["result"] - } - -###Example (getblockhash) - -Input: - - { - "jsonrpc": "2.0", - "id": "test", - "method": "on_getblockhash", - "params": { - "height": 123456 - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": "a7428..." - } - - -##getblocktemplate - -Returns blocktemplate with an empty “hole” for nonce. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "reserve_size" : { - "type" : "integer" - }, - "wallet_address" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] - } - -Return value schema - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "difficulty" : { - "type" : "integer" - }, - "height" : { - "type" :"integer" - }, - "reserved_offset" : { - "type" : "integer" - }, - "blocktemplate_blob" : { - "type" : "string" - }, - "status" : { - "type" : "string" - } - }, - "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"] - } - "required": ["result"] - } - -###Example (getblocktemplate) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblocktemplate", - "params": { - "reserve_size": 200, - "wallet_address": "28j5g2Hbe1..." - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "blocktemplate_blob": "0100de...", - "difficulty": 65563, - "height": 123456, - "reserved_offset": 395, - "status": "" - } - } - - -##submitblock - -Submits mined block. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "block" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "block"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "status" : { - "type" : "string", - "description": "" - }, - "required": ["status"] - } - }, - "required": ["result"] - } - -### Example (submitblock) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "submitblock", - "params": ["0100b...."] - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "status" : "OK" - } - } - - -##getlastblockheader - -Returns last block header. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "object", - "properties" : { - "block_header : { - "type" : "object", - "properties" : { - "major_version" : { - "type" : "integer", - "description" : "" - }, - "minor_version" : { - "type" : "integer", - "description" : "" - }, - "timestamp" : { - "type" : "integer", - "description" : "UNIX timestamp" - }, - "prev_hash" : { - "type" : "string", - "description" : "previous block's hash" - }, - "nonce" : { - "type" : "integer", - "description" : "" - }, - "orphan_status" : { - "type" : "boolean", - "description" : "True if the block was marked as orphaned" - }, - "height" : { - "type" : "integer", - "description" : "" - }, - "depth" : { - "type" : "integer", - "description" : "last_block_height - this_block_height" - }, - "hash" : { - "type" : "string", - "description" : "" - }, - "difficulty" : { - "type" : "integer", - "description" : "" - }, - "reward" : { - "type" : "integer", - "description" : "Reward for the block in atomic units" - } - }, - "required": [ - "major_version", - "minor_version", - "timestamp", - "prev_hash", - "nonce", - "orphan_status", - "height", - "depth", - "hash", - "difficulty", - "reward" - ] - }, - "status" : { - "type" : "string" - } - }, - "required": ["block_header", "status"] - } - }, - "required": ["result"] - } - -### Example (getlastblockheader) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getlastblockheader" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getblockheaderbyhash - -Returns last block header by given hash. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "hash" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "hash"] - } - -Return value schema: - -*See [getlastblockheader](#getlastblockheader) above* - -### Example (getblockheaderbyhash) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockheaderbyhash", - "params": { - "hash" : "9a8be8..." - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getblockheaderbyheight - -Returns block header by given block height. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "height" : { - "type" : "integer" - } - }, - "required" : ["jsonrpc", "method", "height"] - } - -Return value schema: - -*See [getlastblockheader](#getlastblockheader) above* - -### Example (getblockheaderbyheight) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockheaderbyheight", - "params": { - "height" : 123456 - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getcurrencyId - -Returns unique currency identifier. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "currency_id_blob" : { - "type" : "string" - } - } - } - -### Example (getcurrencyId) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getcurrencyid" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "currency_id_blob" : "a7..." - } - } -;T; -I"A -

    Daemon JSON RPC API

    - - - -

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit rpc-bind-port in your configuration file

    - -
    rpc-bind-port=29081
    -
    - -

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit your configuration file

    - -
    rpc-bind-port=29081
    -rpc-bind-ip=0.0.0.0
    -
    - -

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29081/json_rpc
    - http://localhost:29081/json_rpc
    -
    - -

    getblockcount

    - -

    Returns current chain height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "count" : {
    -                    "type" : "integer",
    -                    "minimum": 0,
    -                    "description": ""
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -        "required": ["count", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockcount)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockcount"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "count": 123456,
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockhash

    - -

    Returns block hash by its height

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "string",
    -            "description": ""
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id": "test",
    -    "method": "on_getblockhash",
    -    "params": {
    -        "height": 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": "a7428..."
    - }
    -
    - -

    getblocktemplate

    - -

    Returns blocktemplate with an empty “hole” for nonce.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "reserve_size" : {
    -            "type" : "integer"
    -        },
    -        "wallet_address" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    - }
    -
    - -

    Return value schema

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "result" : {
    -            "difficulty" : {
    -                "type" : "integer"
    -            },
    -            "height" : {
    -                "type" :"integer"
    -            },
    -            "reserved_offset" : {
    -                "type" : "integer"
    -            },
    -            "blocktemplate_blob" : {
    -                "type" : "string"
    -            },
    -            "status" : {
    -                "type" : "string"
    -            }
    -        },
    -    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    -    }
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblocktemplate)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblocktemplate",
    -    "params": {
    -        "reserve_size": 200,
    -        "wallet_address": "28j5g2Hbe1..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "blocktemplate_blob": "0100de...",
    -        "difficulty": 65563,
    -        "height": 123456,
    -        "reserved_offset": 395,
    -        "status": ""
    -    }
    - }
    -
    - -

    submitblock

    - -

    Submits mined block.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "block" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "block"]
    - } 
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "status" : {
    -                "type" : "string",
    -                "description": ""
    -            },
    -            "required": ["status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (submitblock)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "submitblock",
    -    "params": ["0100b...."]
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "status" : "OK"
    -    }
    - }
    -
    - -

    getlastblockheader

    - -

    Returns last block header.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "block_header : {
    -                    "type" : "object",
    -                    "properties" : {
    -                        "major_version" :    {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "minor_version" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                            },
    -                        "timestamp" : {
    -                            "type" : "integer",
    -                            "description" : "UNIX timestamp"
    -                        },
    -                        "prev_hash" : {
    -                            "type" : "string",
    -                            "description" : "previous block's hash"
    -                        },
    -                        "nonce" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "orphan_status" : {
    -                            "type" : "boolean",
    -                            "description" : "True if the block was marked as orphaned"
    -                        },
    -                        "height" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "depth" : {
    -                            "type" : "integer",
    -                            "description" : "last_block_height - this_block_height"
    -                        },
    -                        "hash" : {
    -                            "type" : "string",
    -                            "description" : ""
    -                        },
    -                        "difficulty" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "reward" : {
    -                            "type" : "integer",
    -                            "description" : "Reward for the block in atomic units"
    -                        }
    -                    },
    -                    "required": [
    -                        "major_version", 
    -                        "minor_version", 
    -                        "timestamp", 
    -                        "prev_hash", 
    -                        "nonce",
    -                        "orphan_status",
    -                        "height",
    -                        "depth",
    -                        "hash",
    -                        "difficulty",
    -                        "reward"
    -                    ]
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "required": ["block_header", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getlastblockheader)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getlastblockheader"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyhash

    - -

    Returns last block header by given hash.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "hash" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "hash"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyhash",
    -    "params": {
    -        "hash" : "9a8be8..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyheight

    - -

    Returns block header by given block height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyheight)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyheight",
    -    "params": {
    -        "height" : 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -            },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getcurrencyId

    - -

    Returns unique currency identifier.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "currency_id_blob" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (getcurrencyId)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getcurrencyid"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "currency_id_blob" : "a7..."
    -    }
    - }
    -
    -;T; @I"./documentation/simplewallet/json_rpc_api/;T{;{ ;I"E - - - - - - - Simplewallet JSON RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Simplewallet JSON RPC API

    - - - -

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    -
    - -

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29082/json_rpc
    - http://localhost:29082/json_rpc
    -
    - -

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    - -

    getbalance

    - -

    Return balance.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "locked_amount" : {
    -            "type" : "integer"
    -        },
    -        "available_balance" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (getbalance)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "getbalance", 
    -    "params": {}
    - }
    -
    - -

    transfer

    - -

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    - -

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "destinations" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "address" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "minItems" : 1
    -        },
    - 
    -        "payment_id": {
    -            "type" : "string"
    -        }
    -    
    -        "fee" : {
    -            "type" : "integer"
    -        },
    -        
    -        "mixin" : {
    -            "type" : "integer"
    -        },
    -        
    -        "unlock_time" : { 
    -            "type" : "integer"
    -            "description" : "Unix timestamp"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "tx_hash" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (transfer)

    - -

    Please note, payment_id is an optional argument and can be left out.

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"transfer",
    -    "params":{
    -        "destinations":[
    -        {
    -            "amount":11111,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        },
    -        {
    -            "amount":22222,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        }
    -        ],
    -        "payment_id":"", 
    -        "fee":1000000,
    -        "mixin":0,
    -        "unlock_time":0
    -    }
    - }
    -
    - -

    store

    - -

    Store wallet data.

    - -

    URL:

    - -
      /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (store)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "store", 
    -    "params": {}
    - }
    -
    - -

    get_payments

    - -

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    - 
    -        "payment_id" :  {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "payments" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "block_height" : {
    -                    "type" : "integer"
    -                },
    -                "tx_hash" : {
    -                    "type" : "string"
    -                },
    -                "unlock_time" : {
    -                    "type" : "integer"
    -                }
    -            }
    -        }
    -    }
    - }
    -
    - -

    Example (get_payments)

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"get_payments",
    -    "params":{
    -        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    -    }
    - }
    -
    - -

    get_transfers

    - -

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input: - { - “$schema”: “http://json-schema.org/draft-04/schema#”, - “title”: “Bytecoin wallet api”, - “description”: “Schema for transfer method in Bytecoin wallet”, - “type”: “object”,

    - -
        "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "transfers"
    -            "transfers" : {
    -                "type" : "array",
    -                "items" : {
    -                    "address" : {
    -                        "type" : "string"
    -                    },
    -                    "amount" : {
    -                        "type" : "integer"
    -                    },
    -                    "blockIndex" : {
    -                        "type" : "integer"
    -                    },
    -                    "fee" : {
    -                        "type" : "integer"
    -                    },
    -                    "output" : {
    -                        "type" : "boolean"
    -                    },
    -                    "paymentId" : {
    -                        "type" : "string"
    -                    },
    -                    "time" : {
    -                        "type" : "integer"
    -                    },
    -                    "transactionHash" : {
    -                        "type" : "string"
    -                    },
    -                    "unlockTime" : {
    -                        "type" : "integer"
    -                    },
    -                }               
    -            }               
    -        }
    -    }
    - }
    -
    - -

    Example (get_transfers)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_transfers", 
    -    "params": {}
    - }
    -
    - -

    get_height

    - -

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (get_height)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_height", 
    -    "params": {}
    - }
    -
    - -

    reset

    - -

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (reset)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "reset", 
    -    "params": {}
    - }
    -
    - -
    - - -
    - - - - - - - -;T; I"p, -# Simplewallet JSON RPC API - -* TOC -{:toc} - -To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet's arguments). You can choose any free port. To do that execute the following command from the command line: - - simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082 - -Having done that you're ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100): - - http://126.0.1.100:29082/json_rpc - http://localhost:29082/json_rpc - -Please note, there is no "refresh" RPC method. RPC wallet refresh is performed automatically each 20 seconds. - - -##getbalance - -Return balance. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "locked_amount" : { - "type" : "integer" - }, - "available_balance" : { - "type" : "integer" - } - } - } - -###Example (getbalance) - - { - "jsonrpc": "2.0", - "method": "getbalance", - "params": {} - } - - -##transfer - -Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time. - -Please note: fee param is a mandatory and should not be less than 0.01 BCN - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "destinations" : { - "type" : "array", - "items" : { - "amount" : { - "type" : "integer" - }, - "address" : { - "type" : "string" - } - }, - "minItems" : 1 - }, - - "payment_id": { - "type" : "string" - } - - "fee" : { - "type" : "integer" - }, - - "mixin" : { - "type" : "integer" - }, - - "unlock_time" : { - "type" : "integer" - "description" : "Unix timestamp" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "tx_hash" : { - "type" : "string" - } - } - } - -###Example (transfer) - -Please note, payment_id is an optional argument and can be left out. - - { - "jsonrpc":"2.0", - "method":"transfer", - "params":{ - "destinations":[ - { - "amount":11111, - "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" - }, - { - "amount":22222, - "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" - } - ], - "payment_id":"", - "fee":1000000, - "mixin":0, - "unlock_time":0 - } - } - - -##store - -Store wallet data. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : {} - } - -###Example (store) - - { - "jsonrpc": "2.0", - "method": "store", - "params": {} - } - - -##get_payments - -Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - - "payment_id" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "payments" : { - "type" : "array", - "items" : { - "amount" : { - "type" : "integer" - }, - "block_height" : { - "type" : "integer" - }, - "tx_hash" : { - "type" : "string" - }, - "unlock_time" : { - "type" : "integer" - } - } - } - } - } - -###Example (get_payments) - - { - "jsonrpc":"2.0", - "method":"get_payments", - "params":{ - "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9" - } - } - - -##get_transfers - -Returns the list of all the wallet's incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change). - -URL: - - /json_rpc - -Input: - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "result" : { - "type" : "transfers" - "transfers" : { - "type" : "array", - "items" : { - "address" : { - "type" : "string" - }, - "amount" : { - "type" : "integer" - }, - "blockIndex" : { - "type" : "integer" - }, - "fee" : { - "type" : "integer" - }, - "output" : { - "type" : "boolean" - }, - "paymentId" : { - "type" : "string" - }, - "time" : { - "type" : "integer" - }, - "transactionHash" : { - "type" : "string" - }, - "unlockTime" : { - "type" : "integer" - }, - } - } - } - } - } - -###Example (get_transfers) - - { - "jsonrpc": "2.0", - "method": "get_transfers", - "params": {} - } - - -##get_height - -Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "height" : { - "type" : "integer" - } - } - } - -###Example (get_height) - - { - "jsonrpc": "2.0", - "method": "get_height", - "params": {} - } - - -##reset - -Erases simplewallet's internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : {} - } - -###Example (reset) - - { - "jsonrpc": "2.0", - "method": "reset", - "params": {} - } -;T; -I". -

    Simplewallet JSON RPC API

    - - - -

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    -
    - -

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29082/json_rpc
    - http://localhost:29082/json_rpc
    -
    - -

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    - -

    getbalance

    - -

    Return balance.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "locked_amount" : {
    -            "type" : "integer"
    -        },
    -        "available_balance" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (getbalance)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "getbalance", 
    -    "params": {}
    - }
    -
    - -

    transfer

    - -

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    - -

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "destinations" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "address" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "minItems" : 1
    -        },
    - 
    -        "payment_id": {
    -            "type" : "string"
    -        }
    -    
    -        "fee" : {
    -            "type" : "integer"
    -        },
    -        
    -        "mixin" : {
    -            "type" : "integer"
    -        },
    -        
    -        "unlock_time" : { 
    -            "type" : "integer"
    -            "description" : "Unix timestamp"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "tx_hash" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (transfer)

    - -

    Please note, payment_id is an optional argument and can be left out.

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"transfer",
    -    "params":{
    -        "destinations":[
    -        {
    -            "amount":11111,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        },
    -        {
    -            "amount":22222,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        }
    -        ],
    -        "payment_id":"", 
    -        "fee":1000000,
    -        "mixin":0,
    -        "unlock_time":0
    -    }
    - }
    -
    - -

    store

    - -

    Store wallet data.

    - -

    URL:

    - -
      /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (store)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "store", 
    -    "params": {}
    - }
    -
    - -

    get_payments

    - -

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    - 
    -        "payment_id" :  {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "payments" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "block_height" : {
    -                    "type" : "integer"
    -                },
    -                "tx_hash" : {
    -                    "type" : "string"
    -                },
    -                "unlock_time" : {
    -                    "type" : "integer"
    -                }
    -            }
    -        }
    -    }
    - }
    -
    - -

    Example (get_payments)

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"get_payments",
    -    "params":{
    -        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    -    }
    - }
    -
    - -

    get_transfers

    - -

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input: - { - “$schema”: “http://json-schema.org/draft-04/schema#”, - “title”: “Bytecoin wallet api”, - “description”: “Schema for transfer method in Bytecoin wallet”, - “type”: “object”,

    - -
        "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "transfers"
    -            "transfers" : {
    -                "type" : "array",
    -                "items" : {
    -                    "address" : {
    -                        "type" : "string"
    -                    },
    -                    "amount" : {
    -                        "type" : "integer"
    -                    },
    -                    "blockIndex" : {
    -                        "type" : "integer"
    -                    },
    -                    "fee" : {
    -                        "type" : "integer"
    -                    },
    -                    "output" : {
    -                        "type" : "boolean"
    -                    },
    -                    "paymentId" : {
    -                        "type" : "string"
    -                    },
    -                    "time" : {
    -                        "type" : "integer"
    -                    },
    -                    "transactionHash" : {
    -                        "type" : "string"
    -                    },
    -                    "unlockTime" : {
    -                        "type" : "integer"
    -                    },
    -                }               
    -            }               
    -        }
    -    }
    - }
    -
    - -

    Example (get_transfers)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_transfers", 
    -    "params": {}
    - }
    -
    - -

    get_height

    - -

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (get_height)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_height", 
    -    "params": {}
    - }
    -
    - -

    reset

    - -

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (reset)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "reset", 
    -    "params": {}
    - }
    -
    -;T; @I",/documentation/simplewallet/index copy/;T{;{ ;I"' - - - - - - - Documentation | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - - -
    - - -
    - - - - - - - -;T; I" -# Development Guides - -This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes. - - -;T; -I"' -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - -;T; @I"1/documentation/payment_gateway/json_rpc_api/;T{;{ ;I"P - - - - - - - Payment gateway JSON RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Payment gateway JSON RPC API

    - - - -

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    - -

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    - -

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    - -
    http://<service address>:<service port>/json_rpc
    -
    - -

    Where:

    - -
      -
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • -
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • -
    - -

    send_transaction

    - -

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    -
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    - -

    Input Example:

    - -
     {
    -    "params": {
    -        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    -        "fee": 1000000000, 
    -        "unlock_time": 0, 
    -        "mixin": 0, 
    -        "destinations": [ 
    -            {
    -            "amount": 10000000000, 
    -            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -            },
    -            {
    -            "amount": 500000, 
    -            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -            }
    -        ]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "send_transaction"
    - }
    -
    - -

    Return value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transaction_id":470
    -    }
    - }
    -
    - -

    get_address

    - -

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "get_address",
    -    "params": {
    -        "index": 42
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    create_address

    - -

    create_address() method creates an additional address in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input value example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "create_address",
    -    "params": {
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    get_address_count

    - -

    get_address_count() method returns a number of addresses in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_address_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "count":2
    -    }
    - }
    -
    - -

    delete_address

    - -

    delete_address() method deletes a specified address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - -

    In case of success returns an empty JSON object.

    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "delete_address"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {}
    - }
    -
    - -

    get_actual_balance

    - -

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -    { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_actual_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "actual_balance":32340960388304977
    -    }
    - }
    -
    - -

    get_pending_balance

    - -

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        },  
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_pending_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "pending_balance": 10000
    -    }
    - }
    -
    - -

    get_transactions_count

    - -

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    - -

    Input example:

    - -
     {
    -    "params": {},
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transactions_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "transactions_count":471
    -    }
    - }
    -
    - -

    get_transfers_count

    - -

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfers_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transfers_count":2
    -    }
    - }
    -
    - -

    get_transaction_id_by_transfer_id

    - -

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transaction_id_by_transfer_id"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result":{
    -        "transaction_id":469
    -    }
    - }
    -
    - -

    get_transaction

    - -

    get_transaction() method returns information about a particular transaction.

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transaction_id": 1
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": 
    -    "get_transaction"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transaction_info": { 
    -            "block_height":2,
    -            "extra":"2jh1iak...123yh1g4g",
    -            "fee":0,
    -            "first_transfer_id":103,
    -            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    -            "timestamp":1409833412,
    -            "total_amount":7036820,
    -            "transfer_count":0,
    -            "transfers": 
    -            [
    -                {
    -                    "amount": 10000000000, 
    -                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                },
    -                {
    -                    "amount": 500000, 
    -                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -                }   
    -            ]
    -        }
    -    }
    - }
    -
    - -

    get_transfer

    - -

    get_transfer() method returns a transfer that corresponds to the requested identifier

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfer"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transfer_info": {
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    -            "amount":100000
    -        }
    -    }
    - }
    -
    - -

    get_incoming_payments

    - -

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    -
    arraySee below
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_incoming_payments"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "payments": [
    -            {
    -                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    -                "payments": 
    -                [ 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    -                        "unlock_time":0
    -                    },
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    -                        "unlock_time":0
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - -

    list_transactions

    - -

    list_transactions() method returns an array of transactions starting from a particular id.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below.
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "starting_transaction_id": 100,
    -        "max_transaction_count": 50
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "list_transactions"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transactions": [
    -            { 
    -                "block_height":2,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            },
    -            { 
    -                "block_height":3,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - - -
    - - -
    - - - - - - - -;T; I"RS -# Payment gateway JSON RPC API - -* TOC -{:toc} - -On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method. - -More on how to start and operate Forknote RPC Wallet can be found here: [Forknote RPC Wallet][Forknote_RPC_Wallet] - -To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this: - - http://:/json_rpc - -Where: - -* <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost -* <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this [here][Configure_Forknote_RPC_Wallet]. - - -##send_transaction - -**send_transaction()** method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -payment_id | No | 64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service. | string | 96A3..A5BB -fee | Yes | Transaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000 | uint64 | 1000000 -unlock_time | No | Height of the block until which transaction is going to be locked for spending. | uint64 | 0 -mixin | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 -destinations | Yes | Array that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    | array | "amount": 10000000000,
    "address": "288Ck..Zv" | - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transaction_id | Identifier of the sent transaction. Identifier indicates a number of the transaction in your wallet. | uint64 | 25 - - -Input Example: - - { - "params": { - "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional - "fee": 1000000000, - "unlock_time": 0, - "mixin": 0, - "destinations": [ - { - "amount": 10000000000, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - }, - { - "amount": 500000, - "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - ] - }, - "jsonrpc": "2.0", - "id": "1", - "method": "send_transaction" - } - - -Return value example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transaction_id":470 - } - } - - -##get_address - -**get_address()** method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out "15" in the methods body. The first address created on wallet generation has id 0. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -index | No | ID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address. | uint64 | 20 - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -address | Corresponding address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw - - - -Input example: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "get_address", - "params": { - "index": 42 - } - } - -Output value example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - } - - -##create_address - -**create_address()** method creates an additional address in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -address | Created address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw - - -Input value example: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "create_address", - "params": { - } - } - -Output value example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - } - - -##get_address_count - -**get_address_count()** method returns a number of addresses in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -count | A number of addresses in your wallet | uint64 | 21 - - -Input example: - - { - "params": {}, - "jsonrpc": "2.0", - "id": "1", - "method": "get_address_count" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "count":2 - } - } - - -##delete_address - -**delete_address()** method deletes a specified address. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | An address to be deleted. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - - -Output: - -In case of success returns an empty JSON object. - - -Input example: - - { - "params": - { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - }, - "jsonrpc": "2.0", - "id": "1", - "method": "delete_address" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": {} - } - - - -##get_actual_balance - -**get_actual_balance()** method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address. - -* Actual Balance — your wallet's balance that is available for spending immediately -* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | Specify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -actual_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 - - -Input example: - - { - "params": - { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_actual_balance" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "actual_balance":32340960388304977 - } - } - - -##get_pending_balance - -**get_pending_balance()** method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address. - -* Actual Balance — your wallet's balance that is available for spending immediately -* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | Specify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -pending_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 - - -Input example: - - { - "params": - { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_pending_balance" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "pending_balance": 10000 - } - } - - -##get_transactions_count - -**get_transactions_count()** method returns a cumulative number of transactions in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactions_count | A number of transactions | uint64 | 21 - - -Input example: - - { - "params": {}, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transactions_count" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transactions_count":471 - } - } - - -##get_transfers_count - -**get_transfers_count()** method returns a cumulative number of transfers in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transfers_count | A number of transfers | uint64 | 21 - - -Input example: - - { - "params": {}, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transfers_count" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transfers_count":2 - } - } - - -##get_transaction_id_by_transfer_id - -**get_transaction_id_by_transfer_id()** method returns and id of a transaction containing this particular transfer. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transfer_id | Yes | Transfer identifier | uint64 | 20 - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transaction_id | Corresponding transaction id | uint64 | 21 - - -Input example: - - { - "params": { - "transfer_id": 0 - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transaction_id_by_transfer_id" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result":{ - "transaction_id":469 - } - } - - -##get_transaction - -**get_transaction()** method returns information about a particular transaction. - -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transaction_id | Yes | Requested transaction id | uint64 | 20 - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -found | Is found or not | bool | True / False -transaction_info | Contains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction's hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below - - -Input example: - - { - "params": { - "transaction_id": 1 - }, - "jsonrpc": "2.0", - "id": "1", - "method": - "get_transaction" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "found":true, - "transaction_info": { - "block_height":2, - "extra":"2jh1iak...123yh1g4g", - "fee":0, - "first_transfer_id":103, - "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39", - "timestamp":1409833412, - "total_amount":7036820, - "transfer_count":0, - "transfers": - [ - { - "amount": 10000000000, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - }, - { - "amount": 500000, - "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - ] - } - } - } - - -##get_transfer - -**get_transfer()** method returns a transfer that corresponds to the requested identifier - -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transfer_id | Yes | Requested transfer | uint64 | 20 - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -found | Is found or not | bool | true / false -transfer_info | Returns transfer_info object containing:
    * amount - uint64
    * address - string | object | See below - - -Input example: - - { - "params": { - "transfer_id": 0 - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transfer" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "found":true, - "transfer_info": { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw", - "amount":100000 - } - } - } - - -##get_incoming_payments - -**get_incoming_payments()** method returns payments with a requested payment_id. This method will be depreciated soon. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -payments | Yes | Contains strings of payment_id's | array | 96A3937D88E210..B1FE9C0487A5BB - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -payments | Contains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    | array | See below - - -Input example: - - { - "params": { - "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"] - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_incoming_payments" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "payments": [ - { - "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", - "payments": - [ - { - "amount":10000000000, - "block_height":728, - "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", - "unlock_time":0 - }, - { - "amount":10000000000, - "block_height":728, - "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", - "unlock_time":0 - }, - { - "amount":10000000000, - "block_height":728, - "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", - "unlock_time":0 - }, - { - "amount":10000000000, - "block_height":728, - "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", - "unlock_time":0 - } - ] - } - ] - } - } - - -##list_transactions - -**list_transactions()** method returns an array of transactions starting from a particular id. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -starting_transaction_id | Yes | Identifier of a starting transaction | uint32 | 20 -max_transaction_count | Yes | Maximum number of returned consecutive transactions | uint32 | 20 - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactions | An array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction's hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below. - - -Input example: - - { - "params": { - "starting_transaction_id": 100, - "max_transaction_count": 50 - }, - "jsonrpc": "2.0", - "id": "1", - "method": "list_transactions" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transactions": [ - { - "block_height":2, - "extra":"01e3...70f3acfc4", - "fee":0, - "first_transfer_id":-1, - "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", - "timestamp":1409833412, - "total_amount":7036820, - "transfer_count":0 - "transfers": [ - { - "amount": 102002, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - } - ] - }, - { - "block_height":3, - "extra":"01e3...70f3acfc4", - "fee":0, - "first_transfer_id":-1, - "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", - "timestamp":1409833412, - "total_amount":7036820, - "transfer_count":0 - "transfers": [ - { - "amount": 102002, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - } - ] - } - ] - } - } - - -[Forknote_RPC_Wallet]: /documentation/payment_gateway/ -[Configure_Forknote_RPC_Wallet]: /documentation/payment_gateway/#configure-forknote-rpc-wallet -;T; -I"k -

    Payment gateway JSON RPC API

    - - - -

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    - -

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    - -

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    - -
    http://<service address>:<service port>/json_rpc
    -
    - -

    Where:

    - -
      -
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • -
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • -
    - -

    send_transaction

    - -

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    -
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    - -

    Input Example:

    - -
     {
    -    "params": {
    -        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    -        "fee": 1000000000, 
    -        "unlock_time": 0, 
    -        "mixin": 0, 
    -        "destinations": [ 
    -            {
    -            "amount": 10000000000, 
    -            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -            },
    -            {
    -            "amount": 500000, 
    -            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -            }
    -        ]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "send_transaction"
    - }
    -
    - -

    Return value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transaction_id":470
    -    }
    - }
    -
    - -

    get_address

    - -

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "get_address",
    -    "params": {
    -        "index": 42
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    create_address

    - -

    create_address() method creates an additional address in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input value example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "create_address",
    -    "params": {
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    get_address_count

    - -

    get_address_count() method returns a number of addresses in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_address_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "count":2
    -    }
    - }
    -
    - -

    delete_address

    - -

    delete_address() method deletes a specified address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - -

    In case of success returns an empty JSON object.

    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "delete_address"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {}
    - }
    -
    - -

    get_actual_balance

    - -

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -    { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_actual_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "actual_balance":32340960388304977
    -    }
    - }
    -
    - -

    get_pending_balance

    - -

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        },  
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_pending_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "pending_balance": 10000
    -    }
    - }
    -
    - -

    get_transactions_count

    - -

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    - -

    Input example:

    - -
     {
    -    "params": {},
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transactions_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "transactions_count":471
    -    }
    - }
    -
    - -

    get_transfers_count

    - -

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfers_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transfers_count":2
    -    }
    - }
    -
    - -

    get_transaction_id_by_transfer_id

    - -

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transaction_id_by_transfer_id"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result":{
    -        "transaction_id":469
    -    }
    - }
    -
    - -

    get_transaction

    - -

    get_transaction() method returns information about a particular transaction.

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transaction_id": 1
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": 
    -    "get_transaction"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transaction_info": { 
    -            "block_height":2,
    -            "extra":"2jh1iak...123yh1g4g",
    -            "fee":0,
    -            "first_transfer_id":103,
    -            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    -            "timestamp":1409833412,
    -            "total_amount":7036820,
    -            "transfer_count":0,
    -            "transfers": 
    -            [
    -                {
    -                    "amount": 10000000000, 
    -                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                },
    -                {
    -                    "amount": 500000, 
    -                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -                }   
    -            ]
    -        }
    -    }
    - }
    -
    - -

    get_transfer

    - -

    get_transfer() method returns a transfer that corresponds to the requested identifier

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfer"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transfer_info": {
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    -            "amount":100000
    -        }
    -    }
    - }
    -
    - -

    get_incoming_payments

    - -

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    -
    arraySee below
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_incoming_payments"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "payments": [
    -            {
    -                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    -                "payments": 
    -                [ 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    -                        "unlock_time":0
    -                    },
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    -                        "unlock_time":0
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - -

    list_transactions

    - -

    list_transactions() method returns an array of transactions starting from a particular id.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below.
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "starting_transaction_id": 100,
    -        "max_transaction_count": 50
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "list_transactions"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transactions": [
    -            { 
    -                "block_height":2,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            },
    -            { 
    -                "block_height":3,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - -;T; @I"2/documentation/cryptonote_generator/forknote/;T{;{ ;I" - - - - - - - Documentation | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - - -
    - - -
    - - - - - - - -;T; I" -# Development Guides - -This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes. - - -;T; -I"' -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - -;T; @I"5/documentation/cryptonote_generator/simple-coin/;T{;{ ;I" - - - - - - - Documentation | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - - -
    - - -
    - - - - - - - -;T; I" -# Development Guides - -This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes. - - -;T; -I"' -

    Development Guides

    - -

    This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We’ll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes.

    - -;T; @I"#/static/css/bootstrap.min.css/;T{;{I"!/static/js/bootstrap.min.js/;T{;{I" /creat2/;T{;{ ;I"j - - - - - - - Create Cryptonote coin | Forknote - - - - - - - - - - - -
    - -
    - -
    -
    - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    - - - - - - - -;T; I"S - - -
    -
    -
    - - - - - - - - - - - - - - -;T; -I"c - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -;T; @I"#/static/partials/create2.html/;T{;{I"'/static/css/bootstrap.min.css.old/;T{;{I"%/static/js/bootstrap.min.js.old/;T{;{I")/static/css/bootstrap-theme.min.css/;T{;{I"/guides/create-coin/;T{;{ ;I"% - - - - - - - Create Cryptonote coin guide | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Create coin

    - - - -

    Let’s walk through the process of creating a configuration file for your coin.

    - -

    Creating config file

    - -

    Create the configuration file of your coin by using our configuration form.

    - -

    Create cryptonote coin form

    - -

    Save the resulted configuration in the configs folder of Forknote.

    - -

    Example on Linux/Mac:

    - -
    $ cat >testcoin.conf 
    -
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=13539
    -rpc-bind-port=13540
    -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    -CRYPTONOTE_NAME=testcoin
    -UPGRADE_HEIGHT=1
    -
    - -

    If you want to learn more you can checkout the supported parameters of the configuration file.

    - -

    Creating simplewallet addresses

    - -

    This step is only required if your coin has premine

    - -
    $ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
    -
    -config path exist
    -forknote wallet v1.0.8.1.614()
    -Sync from timestamp: 1444336575
    -Error: wallet failed to connect to daemon (http://localhost:13540).
    -Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
    -view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
    -
    -
    - -

    Caution: Don’t forget to backup the wallets

    - -

    Genesis coinbase transaction creation

    - -

    For coins without premine

    - -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
    -
    -config path exist
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    -
    -
    - -

    For coins with premine

    - -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
    - --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    - --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    -
    -config path exist
    -outs: 922337203685477580
    -outs: 922337203685477580
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    -
    -
    - -

    You have to add GENESIS_COINBASE_TX_HEX to your configuration file.

    - -

    Alternatively, you can add it into the configuration form and save the config file again.

    - -

    Create cryptonote coin form - genesis

    - -

    Using simplewallet for wallets, containing premined coins:

    - -

    You must use the SYNC_FROM_ZERO option of simplewallet to see the premined coins.

    - -
    $ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
    -
    - -

    Adding seed nodes

    - -

    After you have all set in the configuration file, you can start the seed nodes.

    - -

    We recommend you use Digital Ocean or Vultr. The 5$ or 10$ option should be enough for most of the cases. -You can use our guide about seed node creation to get started fast.

    - -

    After you know the IP of the VPS, you have to add seed-node to your configuration file.

    - -
    seed-node=1.1.1.1:40741
    -
    - -

    Alternatively, you can add it into the configuration form and save the config file again.

    - -

    Create cryptonote coin form - seed

    - - -
    - - -
    - - - - - - - -;T; I" -# Create coin - -* TOC -{:toc} - - -Let's walk through the process of creating a configuration file for your coin. - - -## Creating config file - -Create the configuration file of your coin by using our [configuration form][create]. - -[![Create cryptonote coin form](/images/documentation/create-form.png)][create] - -Save the resulted configuration in the `configs` folder of Forknote. - -###Example on Linux/Mac: - -
    $ cat >testcoin.conf 
    -
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=13539
    -rpc-bind-port=13540
    -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    -CRYPTONOTE_NAME=testcoin
    -UPGRADE_HEIGHT=1
    -
    - - -If you want to learn more you can checkout the [supported parameters][supported-parameters] of the configuration file. - - -## Creating simplewallet addresses - -*This step is only required if your coin has premine* - -
    $ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
    -
    -config path exist
    -forknote wallet v1.0.8.1.614()
    -Sync from timestamp: 1444336575
    -Error: wallet failed to connect to daemon (http://localhost:13540).
    -Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
    -view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
    -
    -
    - -**Caution: Don't forget to backup the wallets** - - -## Genesis coinbase transaction creation - -### For coins without premine - -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
    -
    -config path exist
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    -
    -
    - -###For coins with premine - -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
    - --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    - --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    -
    -config path exist
    -outs: 922337203685477580
    -outs: 922337203685477580
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    -
    -
    - -You have to add `GENESIS_COINBASE_TX_HEX` to your configuration file. - -Alternatively, you can add it into the [configuration form][create] and save the config file again. - -[![Create cryptonote coin form - genesis](/images/documentation/create-form-genesis.png)][create] - -### Using simplewallet for wallets, containing premined coins: - -You must use the `SYNC_FROM_ZERO` option of simplewallet to see the premined coins. - -
    $ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
    -
    - - -## Adding seed nodes - -After you have all set in the configuration file, you can start the seed nodes. - -We recommend you use [Digital Ocean][ditital-ocean] or [Vultr][vultr]. The 5$ or 10$ option should be enough for most of the cases. -You can use our [guide about seed node creation][seed-node-guide] to get started fast. - -After you know the IP of the VPS, you have to add `seed-node` to your configuration file. - -
    seed-node=1.1.1.1:40741
    -
    - -Alternatively, you can add it into the [configuration form][create] and save the config file again. - -[![Create cryptonote coin form - seed](/images/documentation/create-form-seed.png)][create] - - -[supported-parameters]: /documentation/daemon/#command-line-options-and-settings-options -[create]: /create/ -[seed-node-guide]: /guides/starting-seed-node/ -[ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 -[vultr]: http://www.vultr.com/?ref=6832621;T; -I" -

    Create coin

    - - - -

    Let’s walk through the process of creating a configuration file for your coin.

    - -

    Creating config file

    - -

    Create the configuration file of your coin by using our configuration form.

    - -

    Create cryptonote coin form

    - -

    Save the resulted configuration in the configs folder of Forknote.

    - -

    Example on Linux/Mac:

    - -
    $ cat >testcoin.conf 
    -
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=13539
    -rpc-bind-port=13540
    -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    -CRYPTONOTE_NAME=testcoin
    -UPGRADE_HEIGHT=1
    -
    - -

    If you want to learn more you can checkout the supported parameters of the configuration file.

    - -

    Creating simplewallet addresses

    - -

    This step is only required if your coin has premine

    - -
    $ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
    -
    -config path exist
    -forknote wallet v1.0.8.1.614()
    -Sync from timestamp: 1444336575
    -Error: wallet failed to connect to daemon (http://localhost:13540).
    -Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
    -view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
    -
    -
    - -

    Caution: Don’t forget to backup the wallets

    - -

    Genesis coinbase transaction creation

    - -

    For coins without premine

    - -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
    -
    -config path exist
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    -
    -
    - -

    For coins with premine

    - -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
    - --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    - --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    -
    -config path exist
    -outs: 922337203685477580
    -outs: 922337203685477580
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    -
    -
    - -

    You have to add GENESIS_COINBASE_TX_HEX to your configuration file.

    - -

    Alternatively, you can add it into the configuration form and save the config file again.

    - -

    Create cryptonote coin form - genesis

    - -

    Using simplewallet for wallets, containing premined coins:

    - -

    You must use the SYNC_FROM_ZERO option of simplewallet to see the premined coins.

    - -
    $ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
    -
    - -

    Adding seed nodes

    - -

    After you have all set in the configuration file, you can start the seed nodes.

    - -

    We recommend you use Digital Ocean or Vultr. The 5$ or 10$ option should be enough for most of the cases. -You can use our guide about seed node creation to get started fast.

    - -

    After you know the IP of the VPS, you have to add seed-node to your configuration file.

    - -
    seed-node=1.1.1.1:40741
    -
    - -

    Alternatively, you can add it into the configuration form and save the config file again.

    - -

    Create cryptonote coin form - seed

    - -;T; @I"9/static/images/documentation/create-form-screen.png/;T{;{I"A/static/images/documentation/create-form-genesis-screen.png/;T{;{I">/static/images/documentation/create-form-seed-screen.png/;T{;{I":/static/images/documentation/create-form-genesis.png/;T{;{I"7/static/images/documentation/create-form-seed.png/;T{;{I"2/static/images/documentation/create-form.png/;T{;{I" - - - - - - - Daemon HTTP RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Daemon HTTP RPC API

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    - -
    - - -
    - - - - - - - -;T; I" -# Daemon HTTP RPC API - -URL | Description | Format | Arg 1 | Arg 2 | Return value ------------|-----------|-----------|-----------|-----------|-----------| -/getheight | Returns current chain height | JSON | - | - | [int] height -/getknownblockids | Returns list of known block ids | JSON | - | - | [list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids -/start_mine | Starts mining threads | JSON | [string] wallet address | [int] number of threads | [string] status -/stop_mine | Stops mining threads | JSON | - | - | [string] status -/gettransactions | Returns transactions as serialized blobs | JSON | [list] tx ids | - | [list] transactions as hex
    [list] missing tx ids
    [string] status -/sendrawtransactions | Send transaction to the network | JSON | [string] serialized transaction in hex form | - | [string] status -/getblocks.bin | Returns blocks in binary form | BIN | [list] block ids | - | [list] blocks
    [int] start height
    [int] current height
    [string] status -/get_o_indexes.bin |Get global output indicies | BIN | [hash] transaction id | - | [vector] output indicies
    [string] status -/getrandom_outs.bin | Get random output indicies
    for a given amount
    (purpose: for ring signatures) | BIN | [list] amounts | [int] count | [vector]
    { [int] amount; [list] outs }
    output entries -;T; -I"b -

    Daemon HTTP RPC API

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    URLDescriptionFormatArg 1Arg 2Return value
    /getheightReturns current chain heightJSON--[int] height
    /getknownblockidsReturns list of known block idsJSON--[list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids
    /start_mineStarts mining threadsJSON[string] wallet address[int] number of threads[string] status
    /stop_mineStops mining threadsJSON--[string] status
    /gettransactionsReturns transactions as serialized blobsJSON[list] tx ids-[list] transactions as hex
    [list] missing tx ids
    [string] status
    /sendrawtransactionsSend transaction to the networkJSON[string] serialized transaction in hex form-[string] status
    /getblocks.binReturns blocks in binary formBIN[list] block ids-[list] blocks
    [int] start height
    [int] current height
    [string] status
    /get_o_indexes.binGet global output indiciesBIN[hash] transaction id-[vector] output indicies
    [string] status
    /getrandom_outs.binGet random output indicies
    for a given amount
    (purpose: for ring signatures)
    BIN[list] amounts[int] count[vector]
    { [int] amount; [list] outs }
    output entries
    -;T; @!I"(/documentation/daemon/json-rpc-api/;T{;{ ;I"pV - - - - - - - Daemon JSON RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Daemon JSON RPC API

    - - - -

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit rpc-bind-port in your configuration file

    - -
    rpc-bind-port=29081
    -
    - -

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit your configuration file

    - -
    rpc-bind-port=29081
    -rpc-bind-ip=0.0.0.0
    -
    - -

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29081/json_rpc
    - http://localhost:29081/json_rpc
    -
    - -

    getblockcount

    - -

    Returns current chain height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "count" : {
    -                    "type" : "integer",
    -                    "minimum": 0,
    -                    "description": ""
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -        "required": ["count", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockcount)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockcount"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "count": 123456,
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockhash

    - -

    Returns block hash by its height

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "string",
    -            "description": ""
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id": "test",
    -    "method": "on_getblockhash",
    -    "params": {
    -        "height": 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": "a7428..."
    - }
    -
    - -

    getblocktemplate

    - -

    Returns blocktemplate with an empty “hole” for nonce.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "reserve_size" : {
    -            "type" : "integer"
    -        },
    -        "wallet_address" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    - }
    -
    - -

    Return value schema

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "result" : {
    -            "difficulty" : {
    -                "type" : "integer"
    -            },
    -            "height" : {
    -                "type" :"integer"
    -            },
    -            "reserved_offset" : {
    -                "type" : "integer"
    -            },
    -            "blocktemplate_blob" : {
    -                "type" : "string"
    -            },
    -            "status" : {
    -                "type" : "string"
    -            }
    -        },
    -    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    -    }
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblocktemplate)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblocktemplate",
    -    "params": {
    -        "reserve_size": 200,
    -        "wallet_address": "28j5g2Hbe1..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "blocktemplate_blob": "0100de...",
    -        "difficulty": 65563,
    -        "height": 123456,
    -        "reserved_offset": 395,
    -        "status": ""
    -    }
    - }
    -
    - -

    submitblock

    - -

    Submits mined block.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "block" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "block"]
    - } 
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "status" : {
    -                "type" : "string",
    -                "description": ""
    -            },
    -            "required": ["status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (submitblock)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "submitblock",
    -    "params": ["0100b...."]
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "status" : "OK"
    -    }
    - }
    -
    - -

    getlastblockheader

    - -

    Returns last block header.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "block_header : {
    -                    "type" : "object",
    -                    "properties" : {
    -                        "major_version" :    {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "minor_version" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                            },
    -                        "timestamp" : {
    -                            "type" : "integer",
    -                            "description" : "UNIX timestamp"
    -                        },
    -                        "prev_hash" : {
    -                            "type" : "string",
    -                            "description" : "previous block's hash"
    -                        },
    -                        "nonce" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "orphan_status" : {
    -                            "type" : "boolean",
    -                            "description" : "True if the block was marked as orphaned"
    -                        },
    -                        "height" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "depth" : {
    -                            "type" : "integer",
    -                            "description" : "last_block_height - this_block_height"
    -                        },
    -                        "hash" : {
    -                            "type" : "string",
    -                            "description" : ""
    -                        },
    -                        "difficulty" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "reward" : {
    -                            "type" : "integer",
    -                            "description" : "Reward for the block in atomic units"
    -                        }
    -                    },
    -                    "required": [
    -                        "major_version", 
    -                        "minor_version", 
    -                        "timestamp", 
    -                        "prev_hash", 
    -                        "nonce",
    -                        "orphan_status",
    -                        "height",
    -                        "depth",
    -                        "hash",
    -                        "difficulty",
    -                        "reward"
    -                    ]
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "required": ["block_header", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getlastblockheader)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getlastblockheader"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyhash

    - -

    Returns last block header by given hash.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "hash" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "hash"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyhash",
    -    "params": {
    -        "hash" : "9a8be8..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyheight

    - -

    Returns block header by given block height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyheight)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyheight",
    -    "params": {
    -        "height" : 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -            },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getcurrencyId

    - -

    Returns unique currency identifier.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "currency_id_blob" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (getcurrencyId)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getcurrencyid"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "currency_id_blob" : "a7..."
    -    }
    - }
    -
    - -
    - - -
    - - - - - - - -;T; I"> -# Daemon JSON RPC API - -* TOC -{:toc} - -To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon's arguments). You can choose any free port. To do that execute the following command from the command line: - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    -
    - -Atlernatively, you can edit *rpc-bind-port* in your configuration file - - rpc-bind-port=29081 - - -If you want Daemon to be accessed from other computer not only yours you should also use a --rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line: - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    -
    - -Atlernatively, you can edit your configuration file - - rpc-bind-port=29081 - rpc-bind-ip=0.0.0.0 - -Having done that you're ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100): - - http://126.0.1.100:29081/json_rpc - http://localhost:29081/json_rpc - - -## getblockcount - -Returns current chain height. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "object", - "properties" : { - "count" : { - "type" : "integer", - "minimum": 0, - "description": "" - }, - "status" : { - "type" : "string" - } - }, - "required": ["count", "status"] - } - }, - "required": ["result"] - } - -### Example (getblockcount) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockcount" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "count": 123456, - "status": "OK" - } - } - - -##getblockhash - -Returns block hash by its height - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "height" : { - "type" : "integer" - } - }, - "required" : ["jsonrpc", "method", "height"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "string", - "description": "" - } - }, - "required": ["result"] - } - -###Example (getblockhash) - -Input: - - { - "jsonrpc": "2.0", - "id": "test", - "method": "on_getblockhash", - "params": { - "height": 123456 - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": "a7428..." - } - - -##getblocktemplate - -Returns blocktemplate with an empty “hole” for nonce. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "reserve_size" : { - "type" : "integer" - }, - "wallet_address" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] - } - -Return value schema - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "difficulty" : { - "type" : "integer" - }, - "height" : { - "type" :"integer" - }, - "reserved_offset" : { - "type" : "integer" - }, - "blocktemplate_blob" : { - "type" : "string" - }, - "status" : { - "type" : "string" - } - }, - "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"] - } - "required": ["result"] - } - -###Example (getblocktemplate) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblocktemplate", - "params": { - "reserve_size": 200, - "wallet_address": "28j5g2Hbe1..." - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "blocktemplate_blob": "0100de...", - "difficulty": 65563, - "height": 123456, - "reserved_offset": 395, - "status": "" - } - } - - -##submitblock - -Submits mined block. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "block" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "block"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "status" : { - "type" : "string", - "description": "" - }, - "required": ["status"] - } - }, - "required": ["result"] - } - -### Example (submitblock) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "submitblock", - "params": ["0100b...."] - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "status" : "OK" - } - } - - -##getlastblockheader - -Returns last block header. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "object", - "properties" : { - "block_header : { - "type" : "object", - "properties" : { - "major_version" : { - "type" : "integer", - "description" : "" - }, - "minor_version" : { - "type" : "integer", - "description" : "" - }, - "timestamp" : { - "type" : "integer", - "description" : "UNIX timestamp" - }, - "prev_hash" : { - "type" : "string", - "description" : "previous block's hash" - }, - "nonce" : { - "type" : "integer", - "description" : "" - }, - "orphan_status" : { - "type" : "boolean", - "description" : "True if the block was marked as orphaned" - }, - "height" : { - "type" : "integer", - "description" : "" - }, - "depth" : { - "type" : "integer", - "description" : "last_block_height - this_block_height" - }, - "hash" : { - "type" : "string", - "description" : "" - }, - "difficulty" : { - "type" : "integer", - "description" : "" - }, - "reward" : { - "type" : "integer", - "description" : "Reward for the block in atomic units" - } - }, - "required": [ - "major_version", - "minor_version", - "timestamp", - "prev_hash", - "nonce", - "orphan_status", - "height", - "depth", - "hash", - "difficulty", - "reward" - ] - }, - "status" : { - "type" : "string" - } - }, - "required": ["block_header", "status"] - } - }, - "required": ["result"] - } - -### Example (getlastblockheader) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getlastblockheader" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getblockheaderbyhash - -Returns last block header by given hash. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "hash" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "hash"] - } - -Return value schema: - -*See [getlastblockheader](#getlastblockheader) above* - -### Example (getblockheaderbyhash) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockheaderbyhash", - "params": { - "hash" : "9a8be8..." - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getblockheaderbyheight - -Returns block header by given block height. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "height" : { - "type" : "integer" - } - }, - "required" : ["jsonrpc", "method", "height"] - } - -Return value schema: - -*See [getlastblockheader](#getlastblockheader) above* - -### Example (getblockheaderbyheight) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockheaderbyheight", - "params": { - "height" : 123456 - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getcurrencyId - -Returns unique currency identifier. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "currency_id_blob" : { - "type" : "string" - } - } - } - -### Example (getcurrencyId) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getcurrencyid" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "currency_id_blob" : "a7..." - } - } -;T; -I"A -

    Daemon JSON RPC API

    - - - -

    To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit rpc-bind-port in your configuration file

    - -
    rpc-bind-port=29081
    -
    - -

    If you want Daemon to be accessed from other computer not only yours you should also use a –rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line:

    - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    -
    - -

    Atlernatively, you can edit your configuration file

    - -
    rpc-bind-port=29081
    -rpc-bind-ip=0.0.0.0
    -
    - -

    Having done that you’re ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29081/json_rpc
    - http://localhost:29081/json_rpc
    -
    - -

    getblockcount

    - -

    Returns current chain height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "count" : {
    -                    "type" : "integer",
    -                    "minimum": 0,
    -                    "description": ""
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -        "required": ["count", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockcount)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockcount"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "count": 123456,
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockhash

    - -

    Returns block hash by its height

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "string",
    -            "description": ""
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblockhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id": "test",
    -    "method": "on_getblockhash",
    -    "params": {
    -        "height": 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": "a7428..."
    - }
    -
    - -

    getblocktemplate

    - -

    Returns blocktemplate with an empty “hole” for nonce.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "reserve_size" : {
    -            "type" : "integer"
    -        },
    -        "wallet_address" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] 
    - }
    -
    - -

    Return value schema

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "result" : {
    -            "difficulty" : {
    -                "type" : "integer"
    -            },
    -            "height" : {
    -                "type" :"integer"
    -            },
    -            "reserved_offset" : {
    -                "type" : "integer"
    -            },
    -            "blocktemplate_blob" : {
    -                "type" : "string"
    -            },
    -            "status" : {
    -                "type" : "string"
    -            }
    -        },
    -    "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"]
    -    }
    -    "required": ["result"]
    - }
    -
    - -

    Example (getblocktemplate)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblocktemplate",
    -    "params": {
    -        "reserve_size": 200,
    -        "wallet_address": "28j5g2Hbe1..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "blocktemplate_blob": "0100de...",
    -        "difficulty": 65563,
    -        "height": 123456,
    -        "reserved_offset": 395,
    -        "status": ""
    -    }
    - }
    -
    - -

    submitblock

    - -

    Submits mined block.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "block" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "block"]
    - } 
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "status" : {
    -                "type" : "string",
    -                "description": ""
    -            },
    -            "required": ["status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (submitblock)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "submitblock",
    -    "params": ["0100b...."]
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "status" : "OK"
    -    }
    - }
    -
    - -

    getlastblockheader

    - -

    Returns last block header.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "result" : {
    -            "type" : "object",
    -            "properties" : {
    -                "block_header : {
    -                    "type" : "object",
    -                    "properties" : {
    -                        "major_version" :    {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "minor_version" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                            },
    -                        "timestamp" : {
    -                            "type" : "integer",
    -                            "description" : "UNIX timestamp"
    -                        },
    -                        "prev_hash" : {
    -                            "type" : "string",
    -                            "description" : "previous block's hash"
    -                        },
    -                        "nonce" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "orphan_status" : {
    -                            "type" : "boolean",
    -                            "description" : "True if the block was marked as orphaned"
    -                        },
    -                        "height" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "depth" : {
    -                            "type" : "integer",
    -                            "description" : "last_block_height - this_block_height"
    -                        },
    -                        "hash" : {
    -                            "type" : "string",
    -                            "description" : ""
    -                        },
    -                        "difficulty" : {
    -                            "type" : "integer",
    -                            "description" : ""
    -                        },
    -                        "reward" : {
    -                            "type" : "integer",
    -                            "description" : "Reward for the block in atomic units"
    -                        }
    -                    },
    -                    "required": [
    -                        "major_version", 
    -                        "minor_version", 
    -                        "timestamp", 
    -                        "prev_hash", 
    -                        "nonce",
    -                        "orphan_status",
    -                        "height",
    -                        "depth",
    -                        "hash",
    -                        "difficulty",
    -                        "reward"
    -                    ]
    -                },
    -                "status" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "required": ["block_header", "status"]
    -        }
    -    },
    -    "required": ["result"]
    - }
    -
    - -

    Example (getlastblockheader)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getlastblockheader"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyhash

    - -

    Returns last block header by given hash.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "hash" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "hash"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyhash)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyhash",
    -    "params": {
    -        "hash" : "9a8be8..."
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -        },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getblockheaderbyheight

    - -

    Returns block header by given block height.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method", "height"]
    - }
    -
    - -

    Return value schema:

    - -

    See getlastblockheader above

    - -

    Example (getblockheaderbyheight)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getblockheaderbyheight",
    -    "params": {
    -        "height" : 123456
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "block_header": {
    -            "depth": 1,
    -            "difficulty": 65198,
    -            "hash": "9a8be83...",
    -            "height": 123456,
    -            "major_version": 1,
    -            "minor_version": 0,
    -            "nonce": 2358499061,
    -            "orphan_status": false,
    -            "prev_hash": "dde56b7e...",
    -            "reward": 44090506423186,
    -            "timestamp": 1356589561
    -            },
    -        "status": "OK"
    -    }
    - }
    -
    - -

    getcurrencyId

    - -

    Returns unique currency identifier.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input arguments:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    },
    -    "required" : ["jsonrpc", "method"]
    - }
    -
    - -

    Return value schema:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "BCN JSON RPC API",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "currency_id_blob" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (getcurrencyId)

    - -

    Input:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "getcurrencyid"
    - }
    -
    - -

    Output:

    - -
     {
    -    "id": "test",
    -    "jsonrpc": "2.0",
    -    "result": {
    -        "currency_id_blob" : "a7..."
    -    }
    - }
    -
    -;T; @'I"$/documentation/payment-gateway/;T{;{ ;I"_ - - - - - - - Payment gateway overview and configuration | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Payment gateway overview and configuration

    - - - -

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    - -

    Configure Forknote RPC Wallet

    - -

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf
    -
    - -

    To get help on available options run:

    - -
     $ ./walletd -h
    -
    - -

    Please note, Forknote RPC Wallet config file may consist only of these options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    - -

    Example of a config file

    - -
    $ cat ./notrealcoin.conf 
    -
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -wallet-file = mywallet
    -wallet-password = mypassword
    -daemon-port = 17100
    -bind-port = 9090
    -
    -
    - -

    Note: config file’s path is relative to current working directory, not server root.

    - -

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    - -

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    - -

    Generate a new wallet

    - -

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    - -

    To generate a new wallet you should run the following command:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    -
    - -

    where:

    - -
      -
    • -<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • -
    • -<mypass> is a secret password for the new wallet file. Whichever you like;
    • -
    • -–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • -
    - -

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    - -

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    - -

    Start Forknote RPC Wallet

    - -

    There are two ways to start Forknote RPC Wallet:

    - -

    Start with a remote connection to the Daemon

    - -

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    - -
      -
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • -
    • For remote daemons specify the remote daemon’s IP address.
    • -
    - -

    Default Forknote daemon ports are 8080 and 8081.

    - -

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    - -
    daemon-address=<remote_ip>
    -daemon-port=8080
    -
    - -

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    - -

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    - -

    Start as in-process node

    - -

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    - -

    Use the following command to start Forknote RPC Wallet with an in-process node

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    -
    - -

    Run Forknote RPC Wallet

    - -

    Forknote RPC wallet can be started in both daemon and console modes.

    - -
      -
    • -

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      -
    • -
    • -

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      -
    • -
    - -

    Forknote RPC wallet starts in console mode by default.

    - -

    Start as daemon (UNIX only)

    - -

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    - -
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    -
    - -

    Note: it’s a common practice for daemons to set server root directory.

    - -

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    - -

    Start as service (Windows only)

    - -

    To run RPC wallet as a service on Windows you have to do the following:

    - -
      -
    1. -

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      - -

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      -
    2. -
    3. -

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      - -
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      -
      -
    4. -
    5. -

      After you see message about successful service registration you can run it in your Services panel.

      -
    6. -
    - -

    Uninstall service (Windows only)

    - -

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    - -
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    -
    - -

    Forknote RPC Wallet JSON RPC API

    - -

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    - -
      -
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. -
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. -
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. -
    7. Fund these amounts to the corresponding user accounts.
    8. -
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. -
    - -

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    - - -
    - - -
    - - - - - - - -;T; I"q7 -# Payment gateway overview and configuration - -* TOC -{:toc} - -This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] and much more. [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] page contains detailed description of every method. - - -##Configure Forknote RPC Wallet - -To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use "--config" option further. The command below launches Forknote RPC Wallet with a specific config file: - - $ ./walletd --config /home/Downloads/myconfig.conf - -To get help on available options run: - - $ ./walletd -h - -Please note, Forknote RPC Wallet config file may consist only of these options: - -Option | Description | Config Example | Console Example ------------|-----------|-----------|-----------| -bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 | --bind-address 127.0.0.1 -bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 | --bind-port 8071 -daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 | --daemon-address 127.0.0.1 -daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 | --daemon-port 8080 -wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet | --wallet-file mywallet -wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword | --wallet-password mypassword -generate-wallet | Generate new wallet | | --generate-wallet -log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log | --log-file mylog.log -server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet | --server-root /home/Downloads/RPCWallet -log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 -testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no | --testnet no -local | Option that allows you to start Forknote RPC Wallet as an in-process node | local | --local -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 -allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port -P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 - - -##Example of a config file - -
    $ cat ./notrealcoin.conf 
    -
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -wallet-file = mywallet
    -wallet-password = mypassword
    -daemon-port = 17100
    -bind-port = 9090
    -
    -
    - -Note: config file's path is relative to current working directory, not server root. - -Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode). - -Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory. - - -##Generate a new wallet - -To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly. - -To generate a new wallet you should run the following command: - - $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet - -where: - -* **<mywallet>** is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet's name will result in new *.wallet file located in the same folder as RPC Wallet -* **<mypass>** is a secret password for the new wallet file. Whichever you like; -* **--generate-wallet** option tells RPC wallet to generate wallet file and exit. - -Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name. - -If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down. - - -##Start Forknote RPC Wallet - -There are two ways to start Forknote RPC Wallet: - -###Start with a remote connection to the Daemon - -Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server. - -* For local daemons use localhost or 127.0.0.1 as an IP address. -* For remote daemons specify the remote daemon's IP address. - -Default Forknote daemon ports are 8080 and 8081. - -Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection: - - daemon-address= - daemon-port=8080 - -Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode. - -Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users. - -###Start as in-process node - -You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don't have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance. - -Use the following command to start Forknote RPC Wallet with an in-process node - - $ ./walletd --config /home/Downloads/myconfig.conf --local - -##Run Forknote RPC Wallet - -Forknote RPC wallet can be started in both daemon and console modes. - -* **Daemon mode** - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window. - -* **Console mode** - Forknote RPC Wallet is launched and prints log messages on the screen. - -Forknote RPC wallet starts in console mode by default. - -###Start as daemon (UNIX only) - -To start RPC wallet as daemon just set "--daemon" (or short "-d") option. - - ./walletd --config /home/Downloads/myconfig.conf --daemon - -Note: it's a common practice for daemons to set server root directory. - -Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory. - -###Start as service (Windows only) - -To run RPC wallet as a service on Windows you have to do the following: - -1. Create a config file and place it in the same directory as your RPC wallet's executable resides in. - - A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root); - -2. Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR: - - walletd.exe --config /home/Downloads/myconfig.conf --register-service - -3. After you see message about successful service registration you can run it in your Services panel. - - -###Uninstall service (Windows only) - -If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR: - - walletd.exe --config /home/Downloads/myconfig.conf --unregister-service - -##Forknote RPC Wallet JSON RPC API - -Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme: - -1. Create a unique address for each user to identify his particular deposits with **create_address()** method. -2. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run **get_transaction_count()** method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed. -3. Run **get_transaction()** method to receive amounts and addresses of new incoming transactions. -4. Fund these amounts to the corresponding user accounts. -5. Withdraw with **send_transaction()** method that allows you to send transaction to one or several addresses. - -Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] - - -[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment_gateway/json_rpc_api/ -;T; -I"*K -

    Payment gateway overview and configuration

    - - - -

    This wiki section describes Forknote integration process into your service with Forknote e-commerce solution called Forknote RPC Wallet. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Forknote RPC Wallet allows you to accept incoming payments, generate an address for each user via Forknote RPC Wallet JSON RPC API and much more. Forknote RPC Wallet JSON RPC API page contains detailed description of every method.

    - -

    Configure Forknote RPC Wallet

    - -

    To configure RPC wallet you can use both command line and config file. Config file allows you to configure your settings only once and use “–config” option further. The command below launches Forknote RPC Wallet with a specific config file:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf
    -
    - -

    To get help on available options run:

    - -
     $ ./walletd -h
    -
    - -

    Please note, Forknote RPC Wallet config file may consist only of these options:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionDescriptionConfig ExampleConsole Example
    bind-addressWhich address to bind Forknote RPC Wallet to. Default value is 0.0.0.0bind-address = 127.0.0.1–bind-address 127.0.0.1
    bind-portWhich port to bind Forknote RPC Wallet to. Default value is 8070bind-port = 8071–bind-port 8071
    daemon-addressForknote daemon (forknoted) address for remote daemon connection infrastructuredaemon-address = 127.0.0.1–daemon-address 127.0.0.1
    daemon-portForknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081daemon-port = 8080–daemon-port 8080
    wallet-fileMandatory’’’. Your wallet’s file namewallet-file = mywallet–wallet-file mywallet
    wallet-passwordMandatory. Your wallet’s passwordwallet-password = mypassword–wallet-password mypassword
    generate-walletGenerate new wallet –generate-wallet
    log-fileA name of log file that you want to use for logging. Default is walletd.loglog-file = mylog.log–log-file mylog.log
    server-rootWorking directory that you wish to use for Forknote RPC Wallet. Default is current working directory.server-root = /home/Downloads/RPCWallet–server-root /home/Downloads/RPCWallet
    log-levelLevel of logging. Default is 1.log-level = 2–log-level 2
    testnetAllows you to run Forknote RPC Wallet in testnet.testnet = no–testnet no
    localOption that allows you to start Forknote RPC Wallet as an in-process nodelocal–local
    p2p-bind-ipInterface for p2p network protocolp2p-bind-ip = 0.0.0.0–p2p-bind-ip 0.0.0.0
    p2p-bind-portPort for p2p network protocolp2p-bind-port = 29080–p2p-bind-port 29080
    p2p-external-portExternal port for p2p network protocol (if port forwarding used with NAT)p2p-external-port = 443–p2p-external-port 443
    allow-local-ipAllow local ip add to peer list, mostly in debug purposes –allow-local-ip
    add-peerManually add peer to local peerlistadd-peer = 127.0.0.1–add-peer 127.0.0.1
    add-priority-nodeSpecify list of peers to connect to and attempt to keep the connection openadd-priority-node = 127.0.0.1–add-priority-node 127.0.0.1
    add-exclusive-nodeSpecify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignoredadd-exclusive-node = 127.0.0.1–add-exclusive-node 127.0.0.1
    seed-nodeConnect to a node to retrieve peer addresses, and disconnectseed-node = 127.0.0.1–seed-node 127.0.0.1
    hide-my-portDo not announce yourself as peerlist candidatehide-my-port–hide-my-port
    P2P_STAT_TRUSTED
    _PUB_KEY
    P2P stat trusted pub keyP2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb
    –P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb
    BYTECOIN_NETWORKUsed for network packages in order not to mix two different cryptocoin networksBYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110–BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110
    GENESIS_COINBASE
    _TX_HEX
    The hex of the transaction in the genesis blockGENESIS_COINBASE
    _TX_HEX = 01..4a
    –GENESIS_COINBASE
    _TX_HEX 01..4a
    CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX
    Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generatorCRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86
    –CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86
    MONEY_SUPPLYTotal amount of coins to be emitted.MONEY_SUPPLY = 18446744073709551615–MONEY_SUPPLY 18446744073709551615
    EMISSION_
    SPEED_FACTOR
    Constant defines emission curve slope. This parameter is required to calulate block reward.EMISSION_
    SPEED_FACTOR = 18
    –EMISSION_
    SPEED_FACTOR 18
    DIFFICULTY_TARGETDifficulty target is an ideal time period between blocks. Measured in seconds.DIFFICULTY_TARGET = 120–DIFFICULTY_TARGET 120
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE
    The maximum size of a block not resulting into penelty.CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000
    CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1
    The maximum size of a block not resulting into penelty. Used only by old (v1) coinsCRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000
    –CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000
    CRYPTONOTE_DISPLAY
    _DECIMAL_POINT
    1 coin = 10^(this value) atomic unitsCRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8
    –CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8
    MINIMUM_FEETransactions with less than this fee wouldn’t be accepted by daemonsMINIMUM_FEE = 1000000–MINIMUM_FEE 1000000
    DEFAULT_
    DUST_THRESHOLD
    The amount bellow this value will be considered as dustDEFAULT_
    DUST_THRESHOLD = 1000000
    –DEFAULT_
    DUST_THRESHOLD 1000000
    CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW
    Number of blocks to unlock miner transactionsCRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10
    –CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10
    MAX_BLOCK_
    SIZE_INITIAL
    The size of the initial block. Used to correct error in v1 coinsMAX_BLOCK_
    SIZE_INITIAL = 20480
    –MAX_BLOCK_
    SIZE_INITIAL 20480
    EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY
    Expected number of blocks per day. Used to correct error in v1 coinsEXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720
    –EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720
    UPGRADE_HEIGHTBlock hight to move to blocks with major version 2. Use ‘1’ for new blockchainsUPGRADE_HEIGHT = 1–UPGRADE_HEIGHT 1
    DIFFICULTY_CUTTimestamps to cut after sortingDIFFICULTY_CUT = 60–DIFFICULTY_CUT 60
    DIFFICULTY_LAGLag of calculating the difficulty in terms of blocksDIFFICULTY_LAG = 15–DIFFICULTY_LAG 15
    MAX_TRANSACTION
    _SIZE_LIMIT
    Maximum size of the transactions sent through simplewalletMAX_TRANSACTION
    _SIZE_LIMIT = 20000
    –MAX_TRANSACTION
    _SIZE_LIMIT 20000
    - -

    Example of a config file

    - -
    $ cat ./notrealcoin.conf 
    -
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -p2p-bind-port=17100
    -rpc-bind-port=17101
    -MONEY_SUPPLY=18446744073709551615
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    -UPGRADE_HEIGHT=1
    -wallet-file = mywallet
    -wallet-password = mypassword
    -daemon-port = 17100
    -bind-port = 9090
    -
    -
    - -

    Note: config file’s path is relative to current working directory, not server root.

    - -

    Note: options “wallet-file” and “wallet-password” should ALWAYS be set (in either command line or config file mode).

    - -

    Note: “wallet-file” and “log-file” options are relative to “server-root”. “server-root” default is the current working directory.

    - -

    Generate a new wallet

    - -

    To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.

    - -

    To generate a new wallet you should run the following command:

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    -
    - -

    where:

    - -
      -
    • -<mywallet> is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet’s name will result in new *.wallet file located in the same folder as RPC Wallet
    • -
    • -<mypass> is a secret password for the new wallet file. Whichever you like;
    • -
    • -–generate-wallet option tells RPC wallet to generate wallet file and exit.
    • -
    - -

    Note: if <mywallet> exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.

    - -

    If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.

    - -

    Start Forknote RPC Wallet

    - -

    There are two ways to start Forknote RPC Wallet:

    - -

    Start with a remote connection to the Daemon

    - -

    Remote connection allows you to bind your Forknote RPC Wallet to a remote Forknote daemon (forknoted). You may establish Forknote daemon on both local and remote machines and connect to. Such type of connection allows you to start Forknote RPC Wallet on a relatively slow machine while heavy loaded daemon is going to work on a separate powerful server.

    - -
      -
    • For local daemons use localhost or 127.0.0.1 as an IP address.
    • -
    • For remote daemons specify the remote daemon’s IP address.
    • -
    - -

    Default Forknote daemon ports are 8080 and 8081.

    - -

    Add the following lines to your configuration file to start Forknote RPC Wallet with a remote connection:

    - -
    daemon-address=<remote_ip>
    -daemon-port=8080
    -
    - -

    Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.

    - -

    Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.

    - -

    Start as in-process node

    - -

    You can also start Forknote RPC Wallet with an in-process node. This allows you to start RPC Wallet out-of-box with no external daemon required. You will get a fully functional node for Forknote network inside Forknote RPC Wallet. You don’t have to download or install anything besides Forknote RPC Wallet. This approach will help reduce the overheads required for infrastructure maintenance.

    - -

    Use the following command to start Forknote RPC Wallet with an in-process node

    - -
     $ ./walletd --config /home/Downloads/myconfig.conf --local
    -
    - -

    Run Forknote RPC Wallet

    - -

    Forknote RPC wallet can be started in both daemon and console modes.

    - -
      -
    • -

      Daemon mode - Forknote RPC Wallet is launched in the background, while you can continue to work with a console window.

      -
    • -
    • -

      Console mode - Forknote RPC Wallet is launched and prints log messages on the screen.

      -
    • -
    - -

    Forknote RPC wallet starts in console mode by default.

    - -

    Start as daemon (UNIX only)

    - -

    To start RPC wallet as daemon just set “–daemon” (or short “-d”) option.

    - -
     ./walletd --config /home/Downloads/myconfig.conf --daemon
    -
    - -

    Note: it’s a common practice for daemons to set server root directory.

    - -

    Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory.

    - -

    Start as service (Windows only)

    - -

    To run RPC wallet as a service on Windows you have to do the following:

    - -
      -
    1. -

      Create a config file and place it in the same directory as your RPC wallet’s executable resides in.

      - -

      A note for Windows Users: In case the server root in config file is not specified all paths should be ABSOLUTE. If you set server root you can use relative paths (relative to your server root);

      -
    2. -
    3. -

      Register your Forknote RPC Wallet as a service. To do so, run the following command as an ADMINISTRATOR:

      - -
       walletd.exe --config /home/Downloads/myconfig.conf --register-service
      -
      -
    4. -
    5. -

      After you see message about successful service registration you can run it in your Services panel.

      -
    6. -
    - -

    Uninstall service (Windows only)

    - -

    If you want to delete RPC wallet you have to unregister windows service first (if you have registered it before). Run as an ADMINISTRATOR:

    - -
     walletd.exe --config /home/Downloads/myconfig.conf --unregister-service
    -
    - -

    Forknote RPC Wallet JSON RPC API

    - -

    Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:

    - -
      -
    1. Create a unique address for each user to identify his particular deposits with create_address() method.
    2. -
    3. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run get_transaction_count() method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed.
    4. -
    5. Run get_transaction() method to receive amounts and addresses of new incoming transactions.
    6. -
    7. Fund these amounts to the corresponding user accounts.
    8. -
    9. Withdraw with send_transaction() method that allows you to send transaction to one or several addresses.
    10. -
    - -

    Detailed description for every Forknote RPC Wallet API method can be found here: Forknote RPC Wallet JSON RPC API

    - -;T; @-I"1/documentation/payment-gateway/json-rpc-api/;T{;{ ;I". - - - - - - - Payment gateway JSON RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Payment gateway JSON RPC API

    - - - -

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    - -

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    - -

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    - -
    http://<service address>:<service port>/json_rpc
    -
    - -

    Where:

    - -
      -
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • -
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • -
    - -

    send_transaction

    - -

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    -
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    - -

    Input Example:

    - -
     {
    -    "params": {
    -        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    -        "fee": 1000000000, 
    -        "unlock_time": 0, 
    -        "mixin": 0, 
    -        "destinations": [ 
    -            {
    -            "amount": 10000000000, 
    -            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -            },
    -            {
    -            "amount": 500000, 
    -            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -            }
    -        ]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "send_transaction"
    - }
    -
    - -

    Return value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transaction_id":470
    -    }
    - }
    -
    - -

    get_address

    - -

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "get_address",
    -    "params": {
    -        "index": 42
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    create_address

    - -

    create_address() method creates an additional address in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input value example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "create_address",
    -    "params": {
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    get_address_count

    - -

    get_address_count() method returns a number of addresses in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_address_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "count":2
    -    }
    - }
    -
    - -

    delete_address

    - -

    delete_address() method deletes a specified address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - -

    In case of success returns an empty JSON object.

    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "delete_address"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {}
    - }
    -
    - -

    get_actual_balance

    - -

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -    { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_actual_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "actual_balance":32340960388304977
    -    }
    - }
    -
    - -

    get_pending_balance

    - -

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        },  
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_pending_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "pending_balance": 10000
    -    }
    - }
    -
    - -

    get_transactions_count

    - -

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    - -

    Input example:

    - -
     {
    -    "params": {},
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transactions_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "transactions_count":471
    -    }
    - }
    -
    - -

    get_transfers_count

    - -

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfers_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transfers_count":2
    -    }
    - }
    -
    - -

    get_transaction_id_by_transfer_id

    - -

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transaction_id_by_transfer_id"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result":{
    -        "transaction_id":469
    -    }
    - }
    -
    - -

    get_transaction

    - -

    get_transaction() method returns information about a particular transaction.

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transaction_id": 1
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": 
    -    "get_transaction"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transaction_info": { 
    -            "block_height":2,
    -            "extra":"2jh1iak...123yh1g4g",
    -            "fee":0,
    -            "first_transfer_id":103,
    -            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    -            "timestamp":1409833412,
    -            "total_amount":7036820,
    -            "transfer_count":0,
    -            "transfers": 
    -            [
    -                {
    -                    "amount": 10000000000, 
    -                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                },
    -                {
    -                    "amount": 500000, 
    -                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -                }   
    -            ]
    -        }
    -    }
    - }
    -
    - -

    get_transfer

    - -

    get_transfer() method returns a transfer that corresponds to the requested identifier

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfer"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transfer_info": {
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    -            "amount":100000
    -        }
    -    }
    - }
    -
    - -

    get_incoming_payments

    - -

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    -
    arraySee below
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_incoming_payments"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "payments": [
    -            {
    -                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    -                "payments": 
    -                [ 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    -                        "unlock_time":0
    -                    },
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    -                        "unlock_time":0
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - -

    list_transactions

    - -

    list_transactions() method returns an array of transactions starting from a particular id.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below.
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "starting_transaction_id": 100,
    -        "max_transaction_count": 50
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "list_transactions"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transactions": [
    -            { 
    -                "block_height":2,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            },
    -            { 
    -                "block_height":3,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - - -
    - - -
    - - - - - - - -;T; I"RS -# Payment gateway JSON RPC API - -* TOC -{:toc} - -On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method. - -More on how to start and operate Forknote RPC Wallet can be found here: [Forknote RPC Wallet][Forknote_RPC_Wallet] - -To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this: - - http://:/json_rpc - -Where: - -* <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost -* <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this [here][Configure_Forknote_RPC_Wallet]. - - -##send_transaction - -**send_transaction()** method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -payment_id | No | 64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service. | string | 96A3..A5BB -fee | Yes | Transaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000 | uint64 | 1000000 -unlock_time | No | Height of the block until which transaction is going to be locked for spending. | uint64 | 0 -mixin | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 -destinations | Yes | Array that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    | array | "amount": 10000000000,
    "address": "288Ck..Zv" | - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transaction_id | Identifier of the sent transaction. Identifier indicates a number of the transaction in your wallet. | uint64 | 25 - - -Input Example: - - { - "params": { - "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional - "fee": 1000000000, - "unlock_time": 0, - "mixin": 0, - "destinations": [ - { - "amount": 10000000000, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - }, - { - "amount": 500000, - "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - ] - }, - "jsonrpc": "2.0", - "id": "1", - "method": "send_transaction" - } - - -Return value example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transaction_id":470 - } - } - - -##get_address - -**get_address()** method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out "15" in the methods body. The first address created on wallet generation has id 0. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -index | No | ID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address. | uint64 | 20 - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -address | Corresponding address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw - - - -Input example: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "get_address", - "params": { - "index": 42 - } - } - -Output value example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - } - - -##create_address - -**create_address()** method creates an additional address in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -address | Created address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw - - -Input value example: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "create_address", - "params": { - } - } - -Output value example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - } - - -##get_address_count - -**get_address_count()** method returns a number of addresses in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -count | A number of addresses in your wallet | uint64 | 21 - - -Input example: - - { - "params": {}, - "jsonrpc": "2.0", - "id": "1", - "method": "get_address_count" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "count":2 - } - } - - -##delete_address - -**delete_address()** method deletes a specified address. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | An address to be deleted. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - - -Output: - -In case of success returns an empty JSON object. - - -Input example: - - { - "params": - { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - }, - "jsonrpc": "2.0", - "id": "1", - "method": "delete_address" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": {} - } - - - -##get_actual_balance - -**get_actual_balance()** method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address. - -* Actual Balance — your wallet's balance that is available for spending immediately -* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | Specify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -actual_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 - - -Input example: - - { - "params": - { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_actual_balance" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "actual_balance":32340960388304977 - } - } - - -##get_pending_balance - -**get_pending_balance()** method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address. - -* Actual Balance — your wallet's balance that is available for spending immediately -* Pending Balance — your wallet's balance that is locked and can't be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | Specify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -pending_balance | Cumulative balance or a balance of a single address in minimal BCN units. | uint64 | 100000000 - - -Input example: - - { - "params": - { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_pending_balance" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "pending_balance": 10000 - } - } - - -##get_transactions_count - -**get_transactions_count()** method returns a cumulative number of transactions in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactions_count | A number of transactions | uint64 | 21 - - -Input example: - - { - "params": {}, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transactions_count" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transactions_count":471 - } - } - - -##get_transfers_count - -**get_transfers_count()** method returns a cumulative number of transfers in your wallet. - - -No input. - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transfers_count | A number of transfers | uint64 | 21 - - -Input example: - - { - "params": {}, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transfers_count" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transfers_count":2 - } - } - - -##get_transaction_id_by_transfer_id - -**get_transaction_id_by_transfer_id()** method returns and id of a transaction containing this particular transfer. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transfer_id | Yes | Transfer identifier | uint64 | 20 - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transaction_id | Corresponding transaction id | uint64 | 21 - - -Input example: - - { - "params": { - "transfer_id": 0 - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transaction_id_by_transfer_id" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result":{ - "transaction_id":469 - } - } - - -##get_transaction - -**get_transaction()** method returns information about a particular transaction. - -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transaction_id | Yes | Requested transaction id | uint64 | 20 - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -found | Is found or not | bool | True / False -transaction_info | Contains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction's hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below - - -Input example: - - { - "params": { - "transaction_id": 1 - }, - "jsonrpc": "2.0", - "id": "1", - "method": - "get_transaction" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "found":true, - "transaction_info": { - "block_height":2, - "extra":"2jh1iak...123yh1g4g", - "fee":0, - "first_transfer_id":103, - "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39", - "timestamp":1409833412, - "total_amount":7036820, - "transfer_count":0, - "transfers": - [ - { - "amount": 10000000000, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - }, - { - "amount": 500000, - "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - ] - } - } - } - - -##get_transfer - -**get_transfer()** method returns a transfer that corresponds to the requested identifier - -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transfer_id | Yes | Requested transfer | uint64 | 20 - - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -found | Is found or not | bool | true / false -transfer_info | Returns transfer_info object containing:
    * amount - uint64
    * address - string | object | See below - - -Input example: - - { - "params": { - "transfer_id": 0 - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_transfer" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "found":true, - "transfer_info": { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw", - "amount":100000 - } - } - } - - -##get_incoming_payments - -**get_incoming_payments()** method returns payments with a requested payment_id. This method will be depreciated soon. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -payments | Yes | Contains strings of payment_id's | array | 96A3937D88E210..B1FE9C0487A5BB - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -payments | Contains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    | array | See below - - -Input example: - - { - "params": { - "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"] - }, - "jsonrpc": "2.0", - "id": "1", - "method": "get_incoming_payments" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "payments": [ - { - "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", - "payments": - [ - { - "amount":10000000000, - "block_height":728, - "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", - "unlock_time":0 - }, - { - "amount":10000000000, - "block_height":728, - "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", - "unlock_time":0 - }, - { - "amount":10000000000, - "block_height":728, - "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", - "unlock_time":0 - }, - { - "amount":10000000000, - "block_height":728, - "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", - "unlock_time":0 - } - ] - } - ] - } - } - - -##list_transactions - -**list_transactions()** method returns an array of transactions starting from a particular id. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -starting_transaction_id | Yes | Identifier of a starting transaction | uint32 | 20 -max_transaction_count | Yes | Maximum number of returned consecutive transactions | uint32 | 20 - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactions | An array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction's hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    | object | See below. - - -Input example: - - { - "params": { - "starting_transaction_id": 100, - "max_transaction_count": 50 - }, - "jsonrpc": "2.0", - "id": "1", - "method": "list_transactions" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "transactions": [ - { - "block_height":2, - "extra":"01e3...70f3acfc4", - "fee":0, - "first_transfer_id":-1, - "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", - "timestamp":1409833412, - "total_amount":7036820, - "transfer_count":0 - "transfers": [ - { - "amount": 102002, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - } - ] - }, - { - "block_height":3, - "extra":"01e3...70f3acfc4", - "fee":0, - "first_transfer_id":-1, - "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", - "timestamp":1409833412, - "total_amount":7036820, - "transfer_count":0 - "transfers": [ - { - "amount": 102002, - "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv" - } - ] - } - ] - } - } - - -[Forknote_RPC_Wallet]: /documentation/payment_gateway/ -[Configure_Forknote_RPC_Wallet]: /documentation/payment_gateway/#configure-forknote-rpc-wallet -;T; -I"k -

    Payment gateway JSON RPC API

    - - - -

    On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method.

    - -

    More on how to start and operate Forknote RPC Wallet can be found here: Forknote RPC Wallet

    - -

    To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this:

    - -
    http://<service address>:<service port>/json_rpc
    -
    - -

    Where:

    - -
      -
    • <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost
    • -
    • <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this here.
    • -
    - -

    send_transaction

    - -

    send_transaction() method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    payment_idNo64 symbol string consisting of A-Z and 0-9 characters. Will be depreciated soon. It used to serve as an identifier for each user of the service.string96A3..A5BB
    feeYesTransaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000uint641000000
    unlock_timeNoHeight of the block until which transaction is going to be locked for spending.uint640
    mixinYesPrivacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended.uint646
    destinationsYesArray that contains addresses and amounts for the transaction:
    * amount - uint64 - desired amount. Specify it in atomic units
    * address - string - desired address
    -
    array“amount”: 10000000000,
    “address”: “288Ck..Zv”
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idIdentifier of the sent transaction. Identifier indicates a number of the transaction in your wallet.uint6425
    - -

    Input Example:

    - -
     {
    -    "params": {
    -        "payment_id": "96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB", // optional
    -        "fee": 1000000000, 
    -        "unlock_time": 0, 
    -        "mixin": 0, 
    -        "destinations": [ 
    -            {
    -            "amount": 10000000000, 
    -            "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -            },
    -            {
    -            "amount": 500000, 
    -            "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -            }
    -        ]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "send_transaction"
    - }
    -
    - -

    Return value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transaction_id":470
    -    }
    - }
    -
    - -

    get_address

    - -

    get_address() method returns an address that corresponds to the provided id. For example, you have 20 addresses in your wallet, you want to get a 15th address. All you have to do is point out “15” in the methods body. The first address created on wallet generation has id 0.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    indexNoID of an address in a multi-address wallet. Please note, omitting the argument is similar to index=0 which will return the origin address.uint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCorresponding addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "get_address",
    -    "params": {
    -        "index": 42
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    create_address

    - -

    create_address() method creates an additional address in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    addressCreated addressstring2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw
    - -

    Input value example:

    - -
     {
    -    "jsonrpc": "2.0",
    -    "id" : "test",
    -    "method": "create_address",
    -    "params": {
    -    }
    - }
    -
    - -

    Output value example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -    }
    - }
    -
    - -

    get_address_count

    - -

    get_address_count() method returns a number of addresses in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    countA number of addresses in your walletuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_address_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "count":2
    -    }
    - }
    -
    - -

    delete_address

    - -

    delete_address() method deletes a specified address.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesAn address to be deleted.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - -

    In case of success returns an empty JSON object.

    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "delete_address"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {}
    - }
    -
    - -

    get_actual_balance

    - -

    get_actual_balance() method returns an actual balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see the balance of a particular address. Leave it blank if you want to see a cumulative balance of your wallet.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    actual_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -    { 
    -        "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_actual_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "actual_balance":32340960388304977
    -    }
    - }
    -
    - -

    get_pending_balance

    - -

    get_pending_balance() method returns a pending balance. You can request both cumulative balance of all your addresses or a balance of a single address.

    - -
      -
    • Actual Balance — your wallet’s balance that is available for spending immediately
    • -
    • Pending Balance — your wallet’s balance that is locked and can’t be spend. Usually funds are getting unlocked within 10 blocks (20 minutes) at most.
    • -
    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    addressYesSpecify an address if you wish to see pending balance of a particular address. Leave it blank if you want to see a cumulative balance.string2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    pending_balanceCumulative balance or a balance of a single address in minimal BCN units.uint64100000000
    - -

    Input example:

    - -
     {
    -    "params": 
    -        { 
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" 
    -        },  
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_pending_balance"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "pending_balance": 10000
    -    }
    - }
    -
    - -

    get_transactions_count

    - -

    get_transactions_count() method returns a cumulative number of transactions in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactions_countA number of transactionsuint6421
    - -

    Input example:

    - -
     {
    -    "params": {},
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transactions_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": { 
    -        "transactions_count":471
    -    }
    - }
    -
    - -

    get_transfers_count

    - -

    get_transfers_count() method returns a cumulative number of transfers in your wallet.

    - -

    No input.

    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transfers_countA number of transfersuint6421
    - -

    Input example:

    - -
     {
    -    "params": {}, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfers_count"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transfers_count":2
    -    }
    - }
    -
    - -

    get_transaction_id_by_transfer_id

    - -

    get_transaction_id_by_transfer_id() method returns and id of a transaction containing this particular transfer.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesTransfer identifieruint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transaction_idCorresponding transaction iduint6421
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transaction_id_by_transfer_id"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result":{
    -        "transaction_id":469
    -    }
    - }
    -
    - -

    get_transaction

    - -

    get_transaction() method returns information about a particular transaction.

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transaction_idYesRequested transaction iduint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notboolTrue / False
    transaction_infoContains:
    * 1. first_transfer_id - uint64 - identifier of the first transfer in this transaction. Numbering is relative to the number of transfers in your wallet
    * 2. transfer_count - uint64 - a number of transfers in this transaction
    * 3. total_amount - int64 - total transaction amount
    * 4. fee - uint64 - transaction fee.
    * 5. hash - string - transaction’s hash
    * 6. block_height - uint64 - height of the block containing this transaction
    * 7. timestamp - uint64 - time when transaction was included into the block
    * 8. extra - string - string of a variable length containing A-Z, 0-9 characters
    * 9. state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * 10. transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transaction_id": 1
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": 
    -    "get_transaction"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transaction_info": { 
    -            "block_height":2,
    -            "extra":"2jh1iak...123yh1g4g",
    -            "fee":0,
    -            "first_transfer_id":103,
    -            "hash":"ab29aa2ce295146dc8a4ed72a559aa3a2b3d5d213e23734cd161b0159a044c39",
    -            "timestamp":1409833412,
    -            "total_amount":7036820,
    -            "transfer_count":0,
    -            "transfers": 
    -            [
    -                {
    -                    "amount": 10000000000, 
    -                    "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                },
    -                {
    -                    "amount": 500000, 
    -                    "address": "2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw"
    -                }   
    -            ]
    -        }
    -    }
    - }
    -
    - -

    get_transfer

    - -

    get_transfer() method returns a transfer that corresponds to the requested identifier

    - -

    Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    transfer_idYesRequested transferuint6420
    - -

    Output:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    foundIs found or notbooltrue / false
    transfer_infoReturns transfer_info object containing:
    * amount - uint64
    * address - string
    objectSee below
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "transfer_id": 0
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_transfer"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "found":true,
    -        "transfer_info": {
    -            "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw",
    -            "amount":100000
    -        }
    -    }
    - }
    -
    - -

    get_incoming_payments

    - -

    get_incoming_payments() method returns payments with a requested payment_id. This method will be depreciated soon.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    paymentsYesContains strings of payment_id’sarray96A3937D88E210..B1FE9C0487A5BB
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    paymentsContains objects:
    * id - string - in payment_id format
    * payments - array, contains:
    ** tx_hash - string - hash of the transaction
    ** amount - uint64 - amount of the transaction
    ** block_height - uint64 - the height of the block containing a transaction
    ** unlock_time - uint64 - transaction unlock time
    -
    arraySee below
    - -

    Input example:

    - -
     {
    -    "params": { 
    -        "payments": ["96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB"]
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "get_incoming_payments"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "payments": [
    -            {
    -                "id":"96A3937D88E21009C7E3987EBC19000000E77FE29AEB080041B1FE9C0487A5BB",
    -                "payments": 
    -                [ 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"7c4fb735fbea0e918d2fa9b5abacfd6c763994718f86dc3272c7631b812bc3ce", 
    -                        "unlock_time":0
    -                    },
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"b467df2607d4475ebd2e5d9f01f4ae54ba197449fb099fdd76668d138e6f2f55", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"abfc13eaa21e9d3df3b03d410aece5de1d2abb6caa588faa15752d26d8101880", 
    -                        "unlock_time":0
    -                    }, 
    -                    {
    -                        "amount":10000000000, 
    -                        "block_height":728, 
    -                        "tx_hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d", 
    -                        "unlock_time":0
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - -

    list_transactions

    - -

    list_transactions() method returns an array of transactions starting from a particular id.

    - -

    Input:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentMandatoryDescriptionFormatExample
    starting_transaction_idYesIdentifier of a starting transactionuint3220
    max_transaction_countYesMaximum number of returned consecutive transactionsuint3220
    - -

    Output:

    - - - - - - - - - - - - - - - - - - -
    ArgumentDescriptionFormatExample
    transactionsAn array containing information about transactions:
    Contains:
    * block_height - uint64 - height of the block containing this transaction

    * extra - string - string of a variable length containing A-Z, 0-9 characters
    * fee - uint64 - transaction fee.
    * first_transfer_id - uint64 - identifier of the first transfer in this transaction
    * hash - string - transaction’s hash
    * timestamp - uint64 - time when transaction was included into the block
    * total_amount - int64 - total transaction amount
    * transfer_count - uint64 - a number of transfers in this transaction
    * state - uint8 - state of the transaction, where 0 - sending successful, 1 - sending failed, 2 - sending cancelled by user and 3 - transaction has been created but not yet sent
    * transfers - array - contains 2 fields:
    ** address - string
    ** amount - int64
    -
    objectSee below.
    - -

    Input example:

    - -
     {
    -    "params": {
    -        "starting_transaction_id": 100,
    -        "max_transaction_count": 50
    -    }, 
    -    "jsonrpc": "2.0", 
    -    "id": "1", 
    -    "method": "list_transactions"
    - }
    -
    - -

    Output example:

    - -
     {
    -    "id":"1",
    -    "jsonrpc":"2.0",
    -    "result": {
    -        "transactions": [
    -            { 
    -                "block_height":2,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            },
    -            { 
    -                "block_height":3,
    -                "extra":"01e3...70f3acfc4",
    -                "fee":0,
    -                "first_transfer_id":-1,
    -                "hash":"fcd43f9f784552fbc88c9928fa85e440f952d684f5ce525b3d3c544d6636080d",
    -                "timestamp":1409833412,
    -                "total_amount":7036820,
    -                "transfer_count":0
    -                "transfers": [
    -                    {
    -                        "amount": 102002,
    -                        "address": "28aYVwSsGMxCWJGCNe26GYPWVR2xLdGnSaHiv5WF8MSa4CGuWfnj8eY2CrSUqPRjaqbYVApwxPjwtbPpA3XKjCZSUamsrZv"
    -                    }
    -                ]
    -            }
    -        ]
    -    }
    - }
    -
    - -;T; @3I"./documentation/simplewallet/json-rpc-api/;T{;{ ;I"sC - - - - - - - Simplewallet JSON RPC API | Forknote - - - - - - - - - - - -
    - -
    - - - - -
    -
    - -

    Simplewallet JSON RPC API

    - - - -

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    -
    - -

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29082/json_rpc
    - http://localhost:29082/json_rpc
    -
    - -

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    - -

    getbalance

    - -

    Return balance.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "locked_amount" : {
    -            "type" : "integer"
    -        },
    -        "available_balance" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (getbalance)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "getbalance", 
    -    "params": {}
    - }
    -
    - -

    transfer

    - -

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    - -

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "destinations" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "address" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "minItems" : 1
    -        },
    - 
    -        "payment_id": {
    -            "type" : "string"
    -        }
    -    
    -        "fee" : {
    -            "type" : "integer"
    -        },
    -        
    -        "mixin" : {
    -            "type" : "integer"
    -        },
    -        
    -        "unlock_time" : { 
    -            "type" : "integer"
    -            "description" : "Unix timestamp"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "tx_hash" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (transfer)

    - -

    Please note, payment_id is an optional argument and can be left out.

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"transfer",
    -    "params":{
    -        "destinations":[
    -        {
    -            "amount":11111,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        },
    -        {
    -            "amount":22222,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        }
    -        ],
    -        "payment_id":"", 
    -        "fee":1000000,
    -        "mixin":0,
    -        "unlock_time":0
    -    }
    - }
    -
    - -

    store

    - -

    Store wallet data.

    - -

    URL:

    - -
      /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (store)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "store", 
    -    "params": {}
    - }
    -
    - -

    get_payments

    - -

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    - 
    -        "payment_id" :  {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "payments" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "block_height" : {
    -                    "type" : "integer"
    -                },
    -                "tx_hash" : {
    -                    "type" : "string"
    -                },
    -                "unlock_time" : {
    -                    "type" : "integer"
    -                }
    -            }
    -        }
    -    }
    - }
    -
    - -

    Example (get_payments)

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"get_payments",
    -    "params":{
    -        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    -    }
    - }
    -
    - -

    get_transfers

    - -

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input: - { - “$schema”: “http://json-schema.org/draft-04/schema#”, - “title”: “Bytecoin wallet api”, - “description”: “Schema for transfer method in Bytecoin wallet”, - “type”: “object”,

    - -
        "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "transfers"
    -            "transfers" : {
    -                "type" : "array",
    -                "items" : {
    -                    "address" : {
    -                        "type" : "string"
    -                    },
    -                    "amount" : {
    -                        "type" : "integer"
    -                    },
    -                    "blockIndex" : {
    -                        "type" : "integer"
    -                    },
    -                    "fee" : {
    -                        "type" : "integer"
    -                    },
    -                    "output" : {
    -                        "type" : "boolean"
    -                    },
    -                    "paymentId" : {
    -                        "type" : "string"
    -                    },
    -                    "time" : {
    -                        "type" : "integer"
    -                    },
    -                    "transactionHash" : {
    -                        "type" : "string"
    -                    },
    -                    "unlockTime" : {
    -                        "type" : "integer"
    -                    },
    -                }               
    -            }               
    -        }
    -    }
    - }
    -
    - -

    Example (get_transfers)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_transfers", 
    -    "params": {}
    - }
    -
    - -

    get_height

    - -

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (get_height)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_height", 
    -    "params": {}
    - }
    -
    - -

    reset

    - -

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (reset)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "reset", 
    -    "params": {}
    - }
    -
    - -
    - - -
    - - - - - - - -;T; I"p, -# Simplewallet JSON RPC API - -* TOC -{:toc} - -To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet's arguments). You can choose any free port. To do that execute the following command from the command line: - - simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082 - -Having done that you're ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100): - - http://126.0.1.100:29082/json_rpc - http://localhost:29082/json_rpc - -Please note, there is no "refresh" RPC method. RPC wallet refresh is performed automatically each 20 seconds. - - -##getbalance - -Return balance. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "locked_amount" : { - "type" : "integer" - }, - "available_balance" : { - "type" : "integer" - } - } - } - -###Example (getbalance) - - { - "jsonrpc": "2.0", - "method": "getbalance", - "params": {} - } - - -##transfer - -Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time. - -Please note: fee param is a mandatory and should not be less than 0.01 BCN - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "destinations" : { - "type" : "array", - "items" : { - "amount" : { - "type" : "integer" - }, - "address" : { - "type" : "string" - } - }, - "minItems" : 1 - }, - - "payment_id": { - "type" : "string" - } - - "fee" : { - "type" : "integer" - }, - - "mixin" : { - "type" : "integer" - }, - - "unlock_time" : { - "type" : "integer" - "description" : "Unix timestamp" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "tx_hash" : { - "type" : "string" - } - } - } - -###Example (transfer) - -Please note, payment_id is an optional argument and can be left out. - - { - "jsonrpc":"2.0", - "method":"transfer", - "params":{ - "destinations":[ - { - "amount":11111, - "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" - }, - { - "amount":22222, - "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" - } - ], - "payment_id":"", - "fee":1000000, - "mixin":0, - "unlock_time":0 - } - } - - -##store - -Store wallet data. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : {} - } - -###Example (store) - - { - "jsonrpc": "2.0", - "method": "store", - "params": {} - } - - -##get_payments - -Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - - "payment_id" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "payments" : { - "type" : "array", - "items" : { - "amount" : { - "type" : "integer" - }, - "block_height" : { - "type" : "integer" - }, - "tx_hash" : { - "type" : "string" - }, - "unlock_time" : { - "type" : "integer" - } - } - } - } - } - -###Example (get_payments) - - { - "jsonrpc":"2.0", - "method":"get_payments", - "params":{ - "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9" - } - } - - -##get_transfers - -Returns the list of all the wallet's incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change). - -URL: - - /json_rpc - -Input: - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "result" : { - "type" : "transfers" - "transfers" : { - "type" : "array", - "items" : { - "address" : { - "type" : "string" - }, - "amount" : { - "type" : "integer" - }, - "blockIndex" : { - "type" : "integer" - }, - "fee" : { - "type" : "integer" - }, - "output" : { - "type" : "boolean" - }, - "paymentId" : { - "type" : "string" - }, - "time" : { - "type" : "integer" - }, - "transactionHash" : { - "type" : "string" - }, - "unlockTime" : { - "type" : "integer" - }, - } - } - } - } - } - -###Example (get_transfers) - - { - "jsonrpc": "2.0", - "method": "get_transfers", - "params": {} - } - - -##get_height - -Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "height" : { - "type" : "integer" - } - } - } - -###Example (get_height) - - { - "jsonrpc": "2.0", - "method": "get_height", - "params": {} - } - - -##reset - -Erases simplewallet's internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : {} - } - -###Example (reset) - - { - "jsonrpc": "2.0", - "method": "reset", - "params": {} - } -;T; -I". -

    Simplewallet JSON RPC API

    - - - -

    To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet’s arguments). You can choose any free port. To do that execute the following command from the command line:

    - -
     simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082
    -
    - -

    Having done that you’re ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100):

    - -
     http://126.0.1.100:29082/json_rpc
    - http://localhost:29082/json_rpc
    -
    - -

    Please note, there is no “refresh” RPC method. RPC wallet refresh is performed automatically each 20 seconds.

    - -

    getbalance

    - -

    Return balance.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "locked_amount" : {
    -            "type" : "integer"
    -        },
    -        "available_balance" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (getbalance)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "getbalance", 
    -    "params": {}
    - }
    -
    - -

    transfer

    - -

    Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time.

    - -

    Please note: fee param is a mandatory and should not be less than 0.01 BCN

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    -        "destinations" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "address" : {
    -                    "type" : "string"
    -                }
    -            },
    -            "minItems" : 1
    -        },
    - 
    -        "payment_id": {
    -            "type" : "string"
    -        }
    -    
    -        "fee" : {
    -            "type" : "integer"
    -        },
    -        
    -        "mixin" : {
    -            "type" : "integer"
    -        },
    -        
    -        "unlock_time" : { 
    -            "type" : "integer"
    -            "description" : "Unix timestamp"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "tx_hash" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Example (transfer)

    - -

    Please note, payment_id is an optional argument and can be left out.

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"transfer",
    -    "params":{
    -        "destinations":[
    -        {
    -            "amount":11111,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        },
    -        {
    -            "amount":22222,
    -            "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD"
    -        }
    -        ],
    -        "payment_id":"", 
    -        "fee":1000000,
    -        "mixin":0,
    -        "unlock_time":0
    -    }
    - }
    -
    - -

    store

    - -

    Store wallet data.

    - -

    URL:

    - -
      /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (store)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "store", 
    -    "params": {}
    - }
    -
    - -

    get_payments

    - -

    Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object", 
    - 
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        },
    - 
    -        "payment_id" :  {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "payments" : {
    -            "type" : "array",
    -            "items" : {
    -                "amount" : {
    -                    "type" : "integer"
    -                },
    -                "block_height" : {
    -                    "type" : "integer"
    -                },
    -                "tx_hash" : {
    -                    "type" : "string"
    -                },
    -                "unlock_time" : {
    -                    "type" : "integer"
    -                }
    -            }
    -        }
    -    }
    - }
    -
    - -

    Example (get_payments)

    - -
     {
    -    "jsonrpc":"2.0",
    -    "method":"get_payments",
    -    "params":{
    -        "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9"
    -    }
    - }
    -
    - -

    get_transfers

    - -

    Returns the list of all the wallet’s incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change).

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input: - { - “$schema”: “http://json-schema.org/draft-04/schema#”, - “title”: “Bytecoin wallet api”, - “description”: “Schema for transfer method in Bytecoin wallet”, - “type”: “object”,

    - -
        "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    - 
    -    "properties" : {
    -        "result" : {
    -            "type" : "transfers"
    -            "transfers" : {
    -                "type" : "array",
    -                "items" : {
    -                    "address" : {
    -                        "type" : "string"
    -                    },
    -                    "amount" : {
    -                        "type" : "integer"
    -                    },
    -                    "blockIndex" : {
    -                        "type" : "integer"
    -                    },
    -                    "fee" : {
    -                        "type" : "integer"
    -                    },
    -                    "output" : {
    -                        "type" : "boolean"
    -                    },
    -                    "paymentId" : {
    -                        "type" : "string"
    -                    },
    -                    "time" : {
    -                        "type" : "integer"
    -                    },
    -                    "transactionHash" : {
    -                        "type" : "string"
    -                    },
    -                    "unlockTime" : {
    -                        "type" : "integer"
    -                    },
    -                }               
    -            }               
    -        }
    -    }
    - }
    -
    - -

    Example (get_transfers)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_transfers", 
    -    "params": {}
    - }
    -
    - -

    get_height

    - -

    Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "height" : {
    -            "type" : "integer"
    -        }
    -    }
    - }
    -
    - -

    Example (get_height)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "get_height", 
    -    "params": {}
    - }
    -
    - -

    reset

    - -

    Erases simplewallet’s internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state.

    - -

    URL:

    - -
     /json_rpc
    -
    - -

    Input:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {
    -        "jsonrpc" : {
    -            "type" : "string"
    -        }, 
    -        "method" : {
    -            "type" : "string"
    -        }
    -    }
    - }
    -
    - -

    Output:

    - -
     {
    -    "$schema": "http://json-schema.org/draft-04/schema#",
    -    "title": "Bytecoin wallet api",
    -    "description": "Schema for transfer method in Bytecoin wallet",
    -    "type": "object",
    -    
    -    "properties" : {}
    - }
    -
    - -

    Example (reset)

    - -
     {
    -    "jsonrpc": "2.0", 
    -    "method": "reset", 
    -    "params": {}
    - }
    -
    -;T; @9I"6/blog/2015-10-11-documentation-added-to-forknote/;T{;{ ;I"! - - - - - - - Documentation added to Forknote - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Documentation added to Forknote -

    - -
    -
      -
    • - - October 11, 2015 -
    • -
    • - Avatar for pmitchev - pmitchev -
    • -
    -
    - - - -

    Documentation was added for:

    - - - -

    Guides for the most common questions were created:

    - - - - - - - - -
    - - -
    -
    - - - -
    - - - - - - - -;T; I" -Documentation was added for: - -* [Daemon][documentation-daemon] -* [Simplewallet][documentation-simplewallet] -* [Payment gateway][documentation-payment-gateway] - -Guides for the most common questions were created: - -* [Getting started][guide-get-started] -* [Create coin][guide-create-coin] -* [Starting seed node][guide-starting-seed-node] - - -[documentation-daemon]: /documentation/daemon/ -[documentation-simplewallet]: /documentation/simplewallet/ -[documentation-payment-gateway]: /documentation/payment-gateway/ -[guide-get-started]: /guide/getting-started/ -[guide-create-coin]: /guide/create-coin/ -[guide-starting-seed-node]: /guide/starting-seed-node/ - - - - - -;T; -I" -

    Documentation was added for:

    - - - -

    Guides for the most common questions were created:

    - - - -;T; @?I"6/blog/2015-10-12-documentation-added-to-forknote/;T{;{ ;I"! - - - - - - - Documentation added to Forknote - - - - - - - - - - - -
    - - -
    - -
    - - -
    -
    -
    -

    - Documentation added to Forknote -

    - -
    -
      -
    • - - October 12, 2015 -
    • -
    • - Avatar for pmitchev - pmitchev -
    • -
    -
    - - - -

    Documentation was added for:

    - - - -

    Guides for the most common questions were created:

    - - - - - - - - -
    - - -
    -
    - - - -
    - - - - - - - -;T; I" -Documentation was added for: - -* [Daemon][documentation-daemon] -* [Simplewallet][documentation-simplewallet] -* [Payment gateway][documentation-payment-gateway] - -Guides for the most common questions were created: - -* [Getting started][guide-get-started] -* [Create coin][guide-create-coin] -* [Starting seed node][guide-starting-seed-node] - - -[documentation-daemon]: /documentation/daemon/ -[documentation-simplewallet]: /documentation/simplewallet/ -[documentation-payment-gateway]: /documentation/payment-gateway/ -[guide-get-started]: /guide/getting-started/ -[guide-create-coin]: /guide/create-coin/ -[guide-starting-seed-node]: /guide/starting-seed-node/ - - - - - -;T; -I" -

    Documentation was added for:

    - - - -

    Guides for the most common questions were created:

    - - - -;T; @EI"/static/CNAME/;T{;{: versioni \ No newline at end of file diff --git a/tmp/dependencies b/tmp/dependencies deleted file mode 100644 index 7b78bbeab78cd45c930afba65ffe87a43343a8e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7499 zcmb8z=~vU-8pdJQyUt=R^E}Ton1&eyR1i^61{EAp`-V1@-K0rL0?0c5{Mq@@mLx68 z`LgMHu4nJu&Cn$Lr|Q3ztJNvZ)8yY8J(bqolYe&pIjIzn#3MOYvTT>(P3&9&JDy&<3;tZ9p5*Mzj%aL>tj2vo%M!V5&v>WX~d(a-V2kk+7(O$F{?L~XhKC}<*L;KJ^v>)w9 z`_X>1A00pk&;fJ+9Y6=sL39uuL`zq&@prz9Y@E}adaGgO#LzS$J8HFpJ3JmI)P506X+y5iB6)E=p;IY zPN7ri6gq`Yqtoa#I*m@FPtYgm6Z8rC1XWN4RZs<0&^Q`L<7ga>qbjPRDypI?I)l!j zGw2LDgU+I}=qx&m&Z2YZ96E>2p>yawI*-ny^XNRffG(g5=mNTcE~1O*BD#n!qD$x! zx`ZyFOXxDXj4q?g=rX#3uAnRE3c7+mMW3Qi(WmHBbQN7iSJ72;6T5FVQV@3*ADu&@J>8`U-u8zCvH2+vqmBjc%jc=xg*f`Wk(WzDD1mZ_qdB z8}tpjgYKX^=nlGr?xMTsF1m~EqHoc+=v(wH`WAhMzC+)k@6dPX9=eC_p?l~ax{vOo z`{+Kpj~<{0=mC0w9-xQlA$o`&qKD{v^ga3>eUH9JKcFAb59kN<1NssDh<-#rq94&C z^awpdkI*CZ7(GUh(PQ)&{e*r(KcSz{Pv~d#Gx{0*jDAMHpkL50=oj=0`W5|(enr2c zU(s*qH}o6&4gH3GN57-r(eLPY^aMRYPtX(e1pR^jK!2b=&>!ee^e6fg{fYiWf1$t7 zU+6FN7n(p5XaY^33G`p|UsU6>mjCQO@14?STXf#2D)t8{~M7 ziu~9tD?+p|wlcOcwlj7xb~1J`_AvG`_A&M|4#+XXni)~S=UPTTLxv0);b+JQKSM?| zGBz>#88T$Z2tPwc_!%<7&yW#*hK%qtWQ3m~Bf1&=BpKl+$p}A5M)*lG;x@@3pZ#a= z4Ew|&n?W{1_}L8hk3lwrYzEm3vKhk9W(Yr%_N&i zHj`{7*-WyTWHZTTlFcMrmTXxnSt=GeEpl4qvB+bwzQqbQvutMN_?*js_Rrx9Di`Fx zApZsVFUWsE{tNP7kpF`G4znEcJLGrB?~vaizbhWC#;$b76G{2@=FObQH#*_z+1=q9 zbzx>ftyrztK0c{jtJ)o2Qcq1gt$ z49oU(wPLM0Kez36u4bBvob7sUfEsV1 zqNX%GYg_8Mmo*h9msGTz2qf((-+dSRp5-#G+~K9mwMLe^TW2&PIqk+ja!Oi$scY>f z5NY-=o%d{dC^F3z*_Z!a9TArTPopAd|X?xc4PjHb8H?|ZSw+=SYfv~8zNT}htH zYa)EyMnkRg%)Z|Ce_UM-Q0RQ^Ds-M{SN<-K%c0!26Io6EV^B?MR#G?PxzJ@&JanO^ zjk({EzQ=`a75capoZfi4f7wTxr~cSny7=^;`)wy3*+BU;Da}29aGFB%L(>%dOVgD9 zy0)e3SHdh4NGbbu1O26$;(wh|8f!H&Cv*iDezfJ2LRLxZmhK8SvXhq|Jl~Z+(UHk> z51kyDH~+_ZS2mU5xL03^#@LL)*=y00KivF(EbeCIlgdLEr@3_T;tzWMOP=dmO5Q-jJ2<+>ZktLM>x-NZ^3mIl zEHzlBrF5ZaDp%K>w+~ILwWfAsUwXU4 z^=d-i=`Svek5e_f!*yyRt9x2uv$7IX!|!6U)RHeHIKuNzyo^yx>1Ue!DGe-l&%2B4j;UwzXzRr{JhtLrH-XtP_4Yyvlo~0SLf%~h)dtm; zue(=5zYY}Z)X-b0+<<(3m2VfPnxpX2n|~~oAkVHmgwCA6Vr|8aw7B%&Q0^wz7l_(w MolN4&S7%ZEKU``!N&o-= diff --git a/tmp/rule_memory b/tmp/rule_memory deleted file mode 100644 index e52db7b4cfbbb11ee772be597f61b50b92286769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38059 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 N;kD>^A-ucg{{c`Xy#oLM From a22075d2b68d5eff85cf71b768eccc2e360c89b5 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Tue, 13 Oct 2015 02:21:41 +0300 Subject: [PATCH 05/56] Analytics place changed --- layouts/footer.html | 10 ---------- layouts/head.html | 11 +++++++++++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/layouts/footer.html b/layouts/footer.html index 748e8b2..c97edfa 100644 --- a/layouts/footer.html +++ b/layouts/footer.html @@ -21,15 +21,5 @@
    - - \ No newline at end of file diff --git a/layouts/head.html b/layouts/head.html index f422f05..2c87d51 100644 --- a/layouts/head.html +++ b/layouts/head.html @@ -13,4 +13,15 @@ + + From d5dd54acf6866b5a53e33719fbde3f44f610e5da Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Wed, 28 Oct 2015 22:11:53 +0200 Subject: [PATCH 06/56] Cryptonote generator documentation added --- config.yaml | 2 +- ...5-10-12-documentation-added-to-forknote.md | 6 +- ...0-28-cryptonote-generator-documentation.md | 21 +++ content/coins/index.md | 2 +- .../cryptonote-generator/extensions.md | 120 ++++++++++++++++++ .../cryptonote-generator/forknote.md | 22 ++++ .../cryptonote-generator/index.md | 80 ++++++++++++ content/documentation/daemon/index.md | 19 ++- content/documentation/daemon/json-rpc-api.md | 3 +- .../documentation/payment-gateway/index.md | 33 +++-- .../payment-gateway/json-rpc-api.md | 4 +- content/documentation/simplewallet/index.md | 18 ++- content/download.md | 12 +- layouts/_social.html | 4 +- layouts/head.html | 1 + layouts/sidebar-documentation.html | 8 ++ static/images/coins/safecoin.png | Bin 0 -> 6832 bytes static/images/coins/safecoin@2x.png | Bin 0 -> 15601 bytes static/images/coins/safecoin@org.png | Bin 0 -> 17725 bytes .../script-generated-multiplied.png | Bin 0 -> 30643 bytes .../images/documentation/script-generated.png | Bin 0 -> 14019 bytes static/js/app_create.js | 8 +- static/partials/create.js | 29 ++++- static/search-index.json | 5 + 24 files changed, 351 insertions(+), 46 deletions(-) create mode 100644 content/blog/2015-10-28-cryptonote-generator-documentation.md create mode 100644 content/documentation/cryptonote-generator/extensions.md create mode 100644 content/documentation/cryptonote-generator/forknote.md create mode 100644 content/documentation/cryptonote-generator/index.md create mode 100644 static/images/coins/safecoin.png create mode 100644 static/images/coins/safecoin@2x.png create mode 100644 static/images/coins/safecoin@org.png create mode 100644 static/images/documentation/script-generated-multiplied.png create mode 100644 static/images/documentation/script-generated.png diff --git a/config.yaml b/config.yaml index f03b423..826f48a 100644 --- a/config.yaml +++ b/config.yaml @@ -45,7 +45,7 @@ data_sources: items_root: /static # For the atom feed. -base_url: http://bezkaries.com +base_url: http://forknote.net # Articles per page for the blog page_size: 5 diff --git a/content/blog/2015-10-12-documentation-added-to-forknote.md b/content/blog/2015-10-12-documentation-added-to-forknote.md index 92476f7..4578685 100644 --- a/content/blog/2015-10-12-documentation-added-to-forknote.md +++ b/content/blog/2015-10-12-documentation-added-to-forknote.md @@ -21,9 +21,9 @@ Guides for the most common questions were created: [documentation-daemon]: /documentation/daemon/ [documentation-simplewallet]: /documentation/simplewallet/ [documentation-payment-gateway]: /documentation/payment-gateway/ -[guide-get-started]: /guide/getting-started/ -[guide-create-coin]: /guide/create-coin/ -[guide-starting-seed-node]: /guide/starting-seed-node/ +[guide-get-started]: /guides/getting-started/ +[guide-create-coin]: /guides/create-coin/ +[guide-starting-seed-node]: /guides/starting-seed-node/ diff --git a/content/blog/2015-10-28-cryptonote-generator-documentation.md b/content/blog/2015-10-28-cryptonote-generator-documentation.md new file mode 100644 index 0000000..294c94b --- /dev/null +++ b/content/blog/2015-10-28-cryptonote-generator-documentation.md @@ -0,0 +1,21 @@ +--- +kind: article +title: "Cryptonote generator documentation added" +created_at: 2015-10-28 +author_name: pmitchev +--- + +[Documentation][cryptonote-generator-overview] for the [Cryptonote generator][cryptonote-generator-github] was added. With the generator you can generate a separate source of any Forknote coins. This ability is valuable if you need an actual source or you want to extend the functionality of a coin. + +The way to extend the functionality of a Forknote coin is through [extensions][cryptonote-generator-extensions]. This ensures that the development of your coin constantly matches that of Bytecoin. + +What the actual positives of using the generator instead of merging? + +* In most of the cases it will save you the actual merging process +* It will save you the merge conflicts + +The downside is writing extensions is slower than writing just a C code. But since the extensions are pure json, the process CAN be reduced to just writing a C code. + +[cryptonote-generator-github]: https://github.com/forknote/cryptonote-generator +[cryptonote-generator-overview]: /documentation/cryptonote-generator/ +[cryptonote-generator-extensions]: /documentation/cryptonote-generator/extensions/ diff --git a/content/coins/index.md b/content/coins/index.md index 021824d..d0eba9b 100644 --- a/content/coins/index.md +++ b/content/coins/index.md @@ -59,7 +59,7 @@ body_class: coins

    A few tips you start:

    diff --git a/content/documentation/cryptonote-generator/extensions.md b/content/documentation/cryptonote-generator/extensions.md new file mode 100644 index 0000000..a71be27 --- /dev/null +++ b/content/documentation/cryptonote-generator/extensions.md @@ -0,0 +1,120 @@ +--- +title: Cryptonote generator extensions | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Cryptonote generator extensions + +* TOC +{:toc} + +Extensions are the way to add functionality to the Forknote. Your extensions must be located in the *extensions* folder. + +*Notice: If you make big changes in the way your coin functions, it may no longer be compatible with Forknote* + + +## Meta data + +Key | Description +[file][files_anchor] | Filename of the extension. Use relative name +description | Short description of the functionality of the extension +required | Array of required extensions. +files | Array of added or edited files. + + +## File + +Key | Description +path | Path of the file +[changes][changes_anchor] | Array of the changes made in the file. Optional +action | Use with value "add" to add a file. Optional +source | Path to file. Used only with "add" action + + +## Changes + +Key | Description +action | Available options: replace, add_above, add_bellow, delete +marker | Place in the file where to perform the "action" +parameters | "text" - array of strings, used as new or added text. Use %s for variables
    "var" - variable from the configuration file + + +## Example + + { + "file":"multiply.json", + "description":"Adds core parameters as option for daemon, simplewallet and walletd", + "required":[ "core/bytecoin.json", "print-genesis-tx.json", "genesis-block-reward.json" ], + "files": [ + { + "path":"/src/CryptoNoteConfig.h", + "changes": [ + { + "action":"add_above", + "marker":"} // parameters", + "parameters": { + "text":[ + "const char GENESIS_COINBASE_TX_HEX[] = \"%s\";" + ], + "var":"GENESIS_COINBASE_TX_HEX" + } + } + { + "action":"add_bellow", + "marker":"size_t blockGrantedFullRewardZone()", + "parameters": { + "text":[ + " size_t blockGrantedFullRewardZoneV1() const { return m_blockGrantedFullRewardZoneV1; }" + ] + } + } + ] + }, + { + "path":"/src/CryptoNoteCore/Currency.cpp", + "changes": [ + { + "action":"replace", + "marker":"CryptoNote::parameters::CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1;", + "parameters": { + "text":[ + " m_blockGrantedFullRewardZoneV1;" + ] + } + } + + ] + }, + { + "path":"/README.md", + "action":"add", + "source":"/multiply/files/README.md" + } + ] + } + +## Adding extension to your configuration + +Add the created extension in your Cryptonote generator's configuration file to execute it + + { + "base_coin": { + ... + }, + "core": { + ... + }, + "extensions": [ + "core/bytecoin.json", + "print-genesis-tx.json", + "MY-EXTENSION.json" + ] + } + + + +[files_anchor]: #file +[changes_anchor]: #changes \ No newline at end of file diff --git a/content/documentation/cryptonote-generator/forknote.md b/content/documentation/cryptonote-generator/forknote.md new file mode 100644 index 0000000..8196e73 --- /dev/null +++ b/content/documentation/cryptonote-generator/forknote.md @@ -0,0 +1,22 @@ +--- +title: Forknote overview | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Cryptonote generator: Forknote + +* TOC +{:toc} + +Forknote adds the [parameters of Cryptonote generator][Cryptonote_generator_core_parameters_documentation] to the daemon, simplewallet and payment gateway. It allows easy creation of private chains. + + +## How it works + +![Forknote diagram](/images/documentation/script-generated-multiplied.png) + + +[Cryptonote_generator_core_parameters_documentation]: /documentation/cryptonote-generator/#core-parameters diff --git a/content/documentation/cryptonote-generator/index.md b/content/documentation/cryptonote-generator/index.md new file mode 100644 index 0000000..bbebd40 --- /dev/null +++ b/content/documentation/cryptonote-generator/index.md @@ -0,0 +1,80 @@ +--- +title: Cryptonote generator overview | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# Cryptonote generator overview + +* TOC +{:toc} + +The Cryptonote generator is a collection of scripts for creating and maintaining a Bytecoin clone. The code produced by it have the same properties as its Forknote equivalent. + + +## How it works + +Instead of merging the changes from the seed into the clone, the Cryptonote genetor applies changes to the latest version of the seed. + +![Cryptonote generator diagram](/images/documentation/script-generated.png) + + +## Core parameters + +Parameter | Description +SEED_NODES | Array of seed nodes +CHECKPOINTS | Checkpoints. See the example for the format +GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator +MONEY_SUPPLY | Total amount of coins to be emitted. +EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins +CRYPTONOTE_DISPLAY_DECIMAL_POINT | 1 coin = 10^(this value) atomic units +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons +DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transactions +MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins +EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains +DIFFICULTY_CUT | Timestamps to cut after sorting +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks +MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet +DEFAULT_FEE | Default fee of the transactions sent through simplewallet + + +## Example + + { + "base_coin": { + "name": "bytecoin", + "git": "https://github.com/amjuarez/bytecoin.git" + }, + "core": { + "SEED_NODES": ["108.61.188.93:7610", "128.199.146.243:29080"], + "EMISSION_SPEED_FACTOR": 18, + "DIFFICULTY_TARGET": 120, + "CRYPTONOTE_DISPLAY_DECIMAL_POINT": 12, + "MONEY_SUPPLY": "18446744073709551615", + "PREMINED_PERCENT": 0, + "DEFAULT_DUST_THRESHOLD": 1000000, + "MINIMUM_FEE": 1000000, + "CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW": 10, + "CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE": 60000, + "CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX": 86, + "P2P_DEFAULT_PORT": 28134, + "RPC_DEFAULT_PORT": 28135, + "BYTECOIN_NETWORK": "0x46, 0x5f, 0x4a, 0x0c, 0xdc, 0x15, 0xf2, 0xdb, 0x49, 0xc3, 0x6c, 0xb1, 0x42, 0xdf, 0xbf, 0x8b", + "CRYPTONOTE_NAME": "newcoin", + "DAEMON_NAME": "newcoind", + "CHECKPOINTS": "{28000, \"70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8\"}, {40000, \"c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038\"}", + "GENESIS_COINBASE_TX_HEX":"010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a" + }, + "extensions": [ + "core/bytecoin.json", + "print-genesis-tx.json" + ] + } diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 9f80042..4aa8f25 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -21,7 +21,7 @@ sidebar_nav: sidebar-documentation --config-file arg (=./configs/-.conf) Specify configuration file -##Command line options and settings options: +##Command line options and settings options Option | Description |   Config Example   |   Console Example   @@ -78,17 +78,24 @@ seed-node=1.1.1.1:17100 seed-node=2.2.2.2:17100 seed-node=seed.notarealcoin.com:17100 GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a -p2p-bind-port=17100 -rpc-bind-port=17101 +EMISSION_SPEED_FACTOR=18 +DIFFICULTY_TARGET=120 +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 +PREMINED_PERCENT=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf +p2p-bind-port=29829 +rpc-bind-port=29830 +BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc +CRYPTONOTE_NAME=test +UPGRADE_HEIGHT=1 CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8 CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038 -UPGRADE_HEIGHT=1 + ##Daemon commands diff --git a/content/documentation/daemon/json-rpc-api.md b/content/documentation/daemon/json-rpc-api.md index d2bac0d..07b05a7 100644 --- a/content/documentation/daemon/json-rpc-api.md +++ b/content/documentation/daemon/json-rpc-api.md @@ -99,7 +99,8 @@ Input: { "jsonrpc": "2.0", "id" : "test", - "method": "getblockcount" + "method": "getblockcount", + "params": {} } Output: diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/payment-gateway/index.md index c0db200..9382511 100644 --- a/content/documentation/payment-gateway/index.md +++ b/content/documentation/payment-gateway/index.md @@ -78,17 +78,24 @@ seed-node=1.1.1.1:17100 seed-node=2.2.2.2:17100 seed-node=seed.notarealcoin.com:17100 GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a -p2p-bind-port=17100 -rpc-bind-port=17101 +EMISSION_SPEED_FACTOR=18 +DIFFICULTY_TARGET=120 +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 +PREMINED_PERCENT=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf +p2p-bind-port=29829 +rpc-bind-port=29830 +BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc +CRYPTONOTE_NAME=test +UPGRADE_HEIGHT=1 CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8 CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038 -UPGRADE_HEIGHT=1 + wallet-file = mywallet wallet-password = mypassword daemon-port = 17100 @@ -96,11 +103,11 @@ bind-port = 9090 -Note: config file's path is relative to current working directory, not server root. +*Note: config file's path is relative to current working directory, not server root.* -Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode). +*Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode).* -Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory. +*Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory.* ##Generate a new wallet @@ -117,7 +124,7 @@ where: * **<mypass>** is a secret password for the new wallet file. Whichever you like; * **--generate-wallet** option tells RPC wallet to generate wallet file and exit. -Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name. +*Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.* If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down. @@ -140,9 +147,9 @@ Add the following lines to your configuration file to start Forknote RPC Wallet daemon-address= daemon-port=8080 -Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode. +*Note: Forknote daemon (forknoted) should be running at the moment RPC wallet is starting in a remote connection mode.* -Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users. +*Note: Forknote RPC Wallet will still provide some functionality even if Daemon server fails. For example, you will be able to generate addresses for your users.* ###Start as in-process node @@ -168,7 +175,7 @@ To start RPC wallet as daemon just set "--daemon" (or short "-d") option. ./walletd --config /home/Downloads/myconfig.conf --daemon -Note: it's a common practice for daemons to set server root directory. +*Note: it's a common practice for daemons to set server root directory.* Server root is the directory where RPC Wallet stores all its files. All relative paths in RPC Wallet configuration are relative to the server root directory. @@ -206,4 +213,4 @@ Forknote RPC Wallet API allows you to create addresses for your users, accept an Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] -[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment_gateway/json_rpc_api/ +[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment-gateway/json-rpc-api/ diff --git a/content/documentation/payment-gateway/json-rpc-api.md b/content/documentation/payment-gateway/json-rpc-api.md index 808e5db..5613456 100644 --- a/content/documentation/payment-gateway/json-rpc-api.md +++ b/content/documentation/payment-gateway/json-rpc-api.md @@ -694,5 +694,5 @@ Output example: } -[Forknote_RPC_Wallet]: /documentation/payment_gateway/ -[Configure_Forknote_RPC_Wallet]: /documentation/payment_gateway/#configure-forknote-rpc-wallet +[Forknote_RPC_Wallet]: /documentation/payment-gateway/ +[Configure_Forknote_RPC_Wallet]: /documentation/payment-gateway/#configure-forknote-rpc-wallet diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md index f35cc6f..9eb2df4 100644 --- a/content/documentation/simplewallet/index.md +++ b/content/documentation/simplewallet/index.md @@ -52,7 +52,7 @@ UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 -DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE | --DEFAULT_FEE 1000000000 +DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE = 1000000000 | --DEFAULT_FEE 1000000000 SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet | SYNC_FROM_ZERO | --SYNC_FROM_ZERO @@ -67,17 +67,23 @@ seed-node=1.1.1.1:17100 seed-node=2.2.2.2:17100 seed-node=seed.notarealcoin.com:17100 GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a -p2p-bind-port=17100 -rpc-bind-port=17101 +EMISSION_SPEED_FACTOR=18 +DIFFICULTY_TARGET=120 +CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 +PREMINED_PERCENT=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 -CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 -BYTECOIN_NETWORK=2e799881-7aab-d4dc-19d1-15895b79d6bf +p2p-bind-port=29829 +rpc-bind-port=29830 +BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc +CRYPTONOTE_NAME=test +UPGRADE_HEIGHT=1 CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8 CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038 -UPGRADE_HEIGHT=1 wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet password=FAKE_PASSWORD diff --git a/content/download.md b/content/download.md index f4a1125..932743c 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    diff --git a/layouts/_social.html b/layouts/_social.html index a91028e..3bbf39a 100644 --- a/layouts/_social.html +++ b/layouts/_social.html @@ -1,6 +1,6 @@ diff --git a/layouts/head.html b/layouts/head.html index 2c87d51..f3c949d 100644 --- a/layouts/head.html +++ b/layouts/head.html @@ -21,6 +21,7 @@ })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-883823-25', 'auto'); + ga('require', 'linkid'); ga('send', 'pageview'); diff --git a/layouts/sidebar-documentation.html b/layouts/sidebar-documentation.html index d75146d..c3da2cb 100644 --- a/layouts/sidebar-documentation.html +++ b/layouts/sidebar-documentation.html @@ -20,5 +20,13 @@

    JSON RPC API + +
  • +

    Cryptonote generator

    + +
  • \ No newline at end of file diff --git a/static/images/coins/safecoin.png b/static/images/coins/safecoin.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc931ec79c28c748f3e6d76944fe31169f548c3 GIT binary patch literal 6832 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 IM6N<$f~mgcivR!s literal 0 HcmV?d00001 diff --git a/static/images/documentation/script-generated-multiplied.png b/static/images/documentation/script-generated-multiplied.png new file mode 100644 index 0000000000000000000000000000000000000000..8a062018d200ee090c5ee95168a606844fea7200 GIT binary patch literal 30643 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 pK|hWDJ=P6XhyK5Rs|QzBrT0$gy-8J& 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 Date: Wed, 25 Nov 2015 19:39:54 +0200 Subject: [PATCH 07/56] Documentation added for Forknote 1.0.8.2 --- content/coins/index.md | 18 +- content/create.md | 4 +- content/developers.md | 55 ---- .../cryptonote-generator/forknote.md | 2 +- .../cryptonote-generator/index.md | 18 +- content/documentation/daemon/index.md | 128 ++++---- content/documentation/daemon/json-rpc-api.md | 296 +++++++++++++++++- .../documentation/payment-gateway/index.md | 87 ++--- content/documentation/simplewallet/index.md | 99 +++--- content/download.md | 19 +- content/guides/getting-started.md | 90 ------ content/guides/index.md | 71 ++++- ...te-coin.md => setup-private-blockchain.md} | 22 +- content/index.md | 14 +- layouts/documentation.html | 2 +- layouts/header.html | 4 +- layouts/sidebar-giudes.html | 5 +- static/css/documentation.css | 1 + static/partials/create.html | 16 +- static/partials/create.js | 23 +- 20 files changed, 596 insertions(+), 378 deletions(-) delete mode 100644 content/developers.md delete mode 100644 content/guides/getting-started.md rename content/guides/{create-coin.md => setup-private-blockchain.md} (84%) diff --git a/content/coins/index.md b/content/coins/index.md index d0eba9b..4e926a8 100644 --- a/content/coins/index.md +++ b/content/coins/index.md @@ -1,5 +1,5 @@ --- -title: Existing coins | Forknote +title: Existing blockchains | Forknote layout: overview body_class: coins --- @@ -9,7 +9,7 @@ body_class: coins

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    +

    The easiest way to create Cryptonote blockchains. Create now.

    @@ -18,7 +18,7 @@ body_class: coins
  • Bytecoin

    -

    The seed coin of Forknote. All Forknote-based coins have the same core features as Bytecoin.

    +

    The seed coin of Forknote. All Forknote-based blockchains have the same core features as Bytecoin.

  • @@ -41,8 +41,8 @@ body_class: coins
  • -

    Add Your Coin

    -

    Contact us to get your Forknote coin added to this list.

    +

    Add Your Blockchain

    +

    Contact us to get your Forknote blockchain added to this list.

  •   @@ -65,11 +65,11 @@ body_class: coins
    -

    Want to create your own cryptocurrency?

    -

    Visit the developer section or go streight to the documentation:

    +

    Want to create a private blockchain?

    +

    Fast start with our blockchain creation form or go streight to the documentation:

    diff --git a/content/create.md b/content/create.md index e0c3d10..62a1fb7 100644 --- a/content/create.md +++ b/content/create.md @@ -1,7 +1,7 @@ --- -title: Create Cryptonote coin | Forknote +title: Create Cryptonote private blockchain | Forknote layout: overview -body_class: developers +body_class: create ---
    diff --git a/content/developers.md b/content/developers.md deleted file mode 100644 index 6b5ac13..0000000 --- a/content/developers.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Developers | Forknote -layout: overview -body_class: developers ---- - -
    -
    -

    Create Cryptonote cryptocurrencies fast and easy.

    -

    All you need to create or connect to a Forknote-based cryptocurrency is a configuration file

    - Create now -
    -
    - -
    - -
    - -
    -
    - -

    Already have a configuration file?

    -

    We'd love to have you be part of Forknote. Here’s how you can get started in few steps:

    - -
    - -
    - -

    Ready to start a Forknote-based service?

    -

    Helpful resources for individual developers and companies:

    - -
    -
    diff --git a/content/documentation/cryptonote-generator/forknote.md b/content/documentation/cryptonote-generator/forknote.md index 8196e73..934d42b 100644 --- a/content/documentation/cryptonote-generator/forknote.md +++ b/content/documentation/cryptonote-generator/forknote.md @@ -11,7 +11,7 @@ sidebar_nav: sidebar-documentation * TOC {:toc} -Forknote adds the [parameters of Cryptonote generator][Cryptonote_generator_core_parameters_documentation] to the daemon, simplewallet and payment gateway. It allows easy creation of private chains. +Forknote adds the [parameters of Cryptonote generator][Cryptonote_generator_core_parameters_documentation] to the daemon, simplewallet and payment gateway. It allows easy creation of private blockchains. ## How it works diff --git a/content/documentation/cryptonote-generator/index.md b/content/documentation/cryptonote-generator/index.md index bbebd40..73d18f4 100644 --- a/content/documentation/cryptonote-generator/index.md +++ b/content/documentation/cryptonote-generator/index.md @@ -25,20 +25,21 @@ Instead of merging the changes from the seed into the clone, the Cryptonote gene Parameter | Description SEED_NODES | Array of seed nodes -CHECKPOINTS | Checkpoints. See the example for the format +CHECKPOINTS | Array of checkpoints. See the example for the format GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator -MONEY_SUPPLY | Total amount of coins to be emitted. +MONEY_SUPPLY | Total amount of atomic units to be emitted. EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. +GENESIS_BLOCK_REWARD | Premine amount. Measured in atomic units. CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) blockchains CRYPTONOTE_DISPLAY_DECIMAL_POINT | 1 coin = 10^(this value) atomic units MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transactions -MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins -EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins +MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 blockchains +EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 blockchains UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains DIFFICULTY_CUT | Timestamps to cut after sorting DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks @@ -59,7 +60,7 @@ DEFAULT_FEE | Default fee of the transactions sent through simplewallet "DIFFICULTY_TARGET": 120, "CRYPTONOTE_DISPLAY_DECIMAL_POINT": 12, "MONEY_SUPPLY": "18446744073709551615", - "PREMINED_PERCENT": 0, + "GENESIS_BLOCK_REWARD": 0, "DEFAULT_DUST_THRESHOLD": 1000000, "MINIMUM_FEE": 1000000, "CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW": 10, @@ -67,10 +68,9 @@ DEFAULT_FEE | Default fee of the transactions sent through simplewallet "CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX": 86, "P2P_DEFAULT_PORT": 28134, "RPC_DEFAULT_PORT": 28135, - "BYTECOIN_NETWORK": "0x46, 0x5f, 0x4a, 0x0c, 0xdc, 0x15, 0xf2, 0xdb, 0x49, 0xc3, 0x6c, 0xb1, 0x42, 0xdf, 0xbf, 0x8b", + "BYTECOIN_NETWORK": "3354bb33-28e2-66d3-7d92-9267413bede6", "CRYPTONOTE_NAME": "newcoin", - "DAEMON_NAME": "newcoind", - "CHECKPOINTS": "{28000, \"70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8\"}, {40000, \"c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038\"}", + "CHECKPOINTS": ["28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8", "40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038"], "GENESIS_COINBASE_TX_HEX":"010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a" }, "extensions": [ diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 4aa8f25..7f6dfe5 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -20,53 +20,55 @@ sidebar_nav: sidebar-documentation Specify data directory --config-file arg (=./configs/-.conf) Specify configuration file + --allow-local-ip Allow local ip add to peer list -##Command line options and settings options - - -Option | Description |   Config Example   |   Console Example   ------------|-----------|-----------|-----------| -log-file | A name of log file that you want to use for logging. | log-file = mylog.log | --log-file mylog.log -log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 -no-console | Disable daemon console commands | no-console | --no-console -testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet | --testnet -rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 | --rpc-bind-ip 127.0.0.1 -rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 | --rpc-bind-port 29081 -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 -allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port -P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 -extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt | --extra-messages-file message.txt -start-mining | Specify wallet address to mining for | start-mining = FPM...yR | --start-mining FPM...yR -mining-threads | Specify mining threads count | mining-threads = 1 | --mining-threads 1 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin | --CRYPTONOTE_NAME dashcoin -CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 | --CHECKPOINT 10:70d..f8 -print-genesis-tx | Prints genesis block transaction hex and exits | | --print-genesis-tx -PREMINED_PERCENT | Percent of premined coins from all coins coming into existence | PREMINED_PERCENT = 10 | --PREMINED_PERCENT 10 -genesis-block-reward-address | The premined coins will be sent to this address. Multiple addresses can be used | | --genesis-block-reward-address FPM...yR + --print-genesis-tx Prints genesis block transaction hex and exits + --genesis-block-reward-address arg (=FPM...yR) + Addresses for premined coins + + +##Configuration options + +Option | Description |   Config Example   +-----------|-----------|-----------| +log-file | A name of log file that you want to use for logging. | log-file = mylog.log +log-level | Level of logging. Default is 1. | log-level = 2 +no-console | Disable daemon console commands | no-console +testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet +rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 +rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port +extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt +start-mining | Specify wallet address to mining for | start-mining = FPM...yR +mining-threads | Specify mining threads count | mining-threads = 1 +P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED_PUB_KEY = 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 +GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE_TX_HEX = 01..4a +CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 +EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_SPEED_FACTOR = 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 +DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 +CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 +MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 +CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin +CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 +GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units | GENESIS_BLOCK_REWARD = 1844674407370955161 ##Example of a config file @@ -82,7 +84,7 @@ EMISSION_SPEED_FACTOR=18 DIFFICULTY_TARGET=120 CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 -PREMINED_PERCENT=0 +GENESIS_BLOCK_REWARD=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 @@ -100,19 +102,19 @@ CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf03 ##Daemon commands -Command | Description | Arg 1 | Arg 2 ------------|-----------|-----------|-----------| -help | print forknoted commands | - | - -start_mining | Start mining in several threads to a given wallet address | [string] wallet_address | [uint] threads -stop_mining | Stop mining | - | - -show_hr | Show current mining hashrate | - | - -hide_hr | Stop showing current mining hashrate | - | - -exit | Exit forknoted | - | - -print_bc | Print blockchain info in a given blocks range | [uint] begin_height | [uint] end_height (optional) -print_block | Print block | [string] block_hash or [uint] block_height | - -print_cn | Print connections | - | - -print_pl | Print peer list | - | - -print_pool | Print transaction pool (long format) | - | - -print_pool_sh | Print transaction pool (short format) | - | - -set_log | Change current log detailization level | [uint] log level (0 - 4) | - -print_tx | Print transaction | [string] transaction_hash | - +Command | Description | Args +-----------|-----------|-----------| +help | print forknoted commands | - +start_mining | Start mining in several threads to a given wallet address | [string] wallet_address
    [uint] threads +stop_mining | Stop mining | - +show_hr | Show current mining hashrate | - +hide_hr | Stop showing current mining hashrate | - +exit | Exit forknoted | - +print_bc | Print blockchain info in a given blocks range | [uint] begin_height
    [uint] end_height (optional) +print_block | Print block | [string] block_hash or [uint] block_height +print_cn | Print connections | - +print_pl | Print peer list | - +print_pool | Print transaction pool (long format) | - +print_pool_sh | Print transaction pool (short format) | - +set_log | Change current log detailization level | [uint] log level (0 - 4) +print_tx | Print transaction | [string] transaction_hash diff --git a/content/documentation/daemon/json-rpc-api.md b/content/documentation/daemon/json-rpc-api.md index 07b05a7..48fdb12 100644 --- a/content/documentation/daemon/json-rpc-api.md +++ b/content/documentation/daemon/json-rpc-api.md @@ -169,9 +169,7 @@ Input: "jsonrpc": "2.0", "id": "test", "method": "on_getblockhash", - "params": { - "height": 123456 - } + "params": [123456] } Output: @@ -692,3 +690,295 @@ Output: "currency_id_blob" : "a7..." } } + + +##f_get_blockchain_settings + +Returns the settings of the used configuration file + +URL: + + /json_rpc + +### Example (f_get_blockchain_settings) + +Input: + + { + "jsonrpc": "2.0", + "id": "test", + "method": "f_get_blockchain_settings" + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "base_coin": { + "git": "https://github.com/amjuarez/bytecoin.git", + "name": "bytecoin" + }, + "core": { + "BYTECOIN_NETWORK": "12112111-1110-4101-1311-001212110110", + "CHECKPOINTS": [ + "28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8", + "40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038" + ], + "CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE": 20000, + "CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1": 10000, + "CRYPTONOTE_DISPLAY_DECIMAL_POINT": 12, + "CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW": 10, + "CRYPTONOTE_NAME": "dashcoin", + "CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX": 72, + "DEFAULT_DUST_THRESHOLD": 1000000, + "DIFFICULTY_CUT": 60, + "DIFFICULTY_LAG": 15, + "DIFFICULTY_TARGET": 120, + "EMISSION_SPEED_FACTOR": 18, + "EXPECTED_NUMBER_OF_BLOCKS_PER_DAY": 720, + "GENESIS_BLOCK_REWARD": 0, + "GENESIS_COINBASE_TX_HEX": "010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a", + "MAX_BLOCK_SIZE_INITIAL": 25600, + "MINIMUM_FEE": 1000000, + "MONEY_SUPPLY": "18446744073709551615", + "P2P_DEFAULT_PORT": 7610, + "RPC_DEFAULT_PORT": 7611, + "SEED_NODES": [ + "108.61.188.93:7610", + "128.199.146.243:29080" + ], + "UPGRADE_HEIGHT": 91452 + }, + "extensions": [ + "core/bytecoin.json", + "print-genesis-tx.json", + "simplewallet-default-fee.json", + "max-transaction-size-limit.json", + "genesis-block-reward.json" + ], + "status": "OK" + } + } + + +##f_blocks_list_json + +Returns list of shortly described blocks. + +URL: + + /json_rpc + +### Example (f_blocks_list_json) + +Input: + + { + "jsonrpc": "2.0", + "id": "test", + "method": "f_blocks_list_json", + "params": { + "height": 10 + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "blocks": [ + { + "cumul_size": 350, + "hash": "73c87db65839d0697627ef0a58fbe4d20340c74503df0c22aba5298e0814a16d", + "height": 10, + "timestamp": 1404556851, + "tx_count": 1 + }, + ... + { + "cumul_size": 120, + "hash": "2eb6307a9b1be29348db19fdd0a1dad483983cf25241ca27f56d333dbb913d85", + "height": 0, + "timestamp": 0, + "tx_count": 1 + } + ], + "status": "OK" + } + } + + +##f_block_json + +Returns detailed description of a block. + +URL: + + /json_rpc + +### Example (f_block_json) + +Input: + + { + "jsonrpc": "2.0", + "id": "test", + "method": "f_block_json", + "params": { + "hash": "74e21b7b7869465dd0bc0929a92df667d0fc88979999fe07ffa24ab925fad17d" + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block": { + "alreadyGeneratedCoins": -4907142100217515000, + "alreadyGeneratedTransactions": 672169, + "baseReward": 18719332960321, + "blockSize": 1515, + "depth": 308976312, + "difficulty": 308978448, + "hash": "74e21b7b7869465dd0bc0929a92df667d0fc88979999fe07ffa24ab925fad17d", + "height": 347655, + "major_version": 2, + "minor_version": 0, + "nonce": 2147485048, + "orphan_status": false, + "penalty": 0, + "prev_hash": "d1d2e3a67decae0cf7c6559cb5c50e908db572aa04f092c5f4db1693781702c6", + "reward": 18720332960321, + "sizeMedian": 386, + "timestamp": 1446725921, + "totalFeeAmount": 1000000000, + "transactions": [ + { + "amount_out": 18720332960321, + "blockSize": 37383401493432, + "fee": 0, + "hash": "eba9c70143bf39a211a2ab2e0635d928455299da45f21cf8da31461ebc467a6a" + }, + { + "amount_out": 1999000464873, + "blockSize": 7672522688954774000, + "fee": 1000000000, + "hash": "b3aacbdc9cdb3dbd80731621d3dbbcaf9d6bdc7b731933c5cc92b5ff12777852" + } + ], + "transactionsCumulativeSize": 1119 + }, + "status": "OK" + } + } + + +##f_transaction_json + +Returns detailed description of a transaction. + +URL: + + /json_rpc + +### Example (f_transaction_json) + +Input: + + { + "jsonrpc": "2.0", + "id": "test", + "method": "f_transaction_json", + "params": { + "hash": "17246c6ee2e8c05f93dd29ee499f38e8ce4023ea693a3a9e39fb41f2877bbd3d" + } + } + +Output: + + { + "id": "test", + "jsonrpc": "2.0", + "result": { + "block": { + "cumul_size": 8751, + "hash": "533380e35d0dcec920ed58d92eb6af81771e2f4e414fca54f6105f5208650730", + "height": 347985, + "timestamp": 1446765470, + "tx_count": 5 + }, + "status": "OK", + "tx": { + "": "288a8873fe8cbe233b51fd1d2c252f8a74e8eee3dae61d35b9b434645c27f704a502357be566a75ef168032d676d2e0936d50c6f38ea5317ea7a82dd2ce69f03", + "extra": "01d58d5fd664de79feb3f53ebf9a6a4fa0a5d7987a4c905840d29ef9f13fe380da", + "unlock_time": 0, + "version": 1, + "vin": [ + { + "type": "02", + "value": { + "amount": 200000000000, + "k_image": "1980a3e2d130c8548b92c63e16c6fedf79819755232eda22939c353c3b66046c", + "key_offsets": [ + 33019, + 22585, + 63469, + 65530 + ] + } + }, + ... + { + "type": "02", + "value": { + "amount": 8000000000000, + "k_image": "9831d04dc056d8ef5d562ba68ccaa276653594bc32ea687584bfc143c2089b84", + "key_offsets": [ + 46597, + 1208, + 4399, + 42365 + ] + } + } + ], + "vout": [ + { + "amount": 10000000, + "target": { + "data": { + "key": "de25ddd2a718fa274689a6a5c1d996b67c4b41ad30660a44a3a0fb5968d92547" + }, + "type": "02" + } + }, + ... + { + "amount": 5000000000000, + "target": { + "data": { + "key": "ba9bfb77a79b7b3a6a61c6fbaa441443e38d1a7f44279c78652f84121be3b4b9" + }, + "type": "02" + } + } + ] + }, + "txDetails": { + "amount_out": 8199010000000, + "fee": 1000000000, + "hash": "17246c6ee2e8c05f93dd29ee499f38e8ce4023ea693a3a9e39fb41f2877bbd3d", + "mixin": 4, + "paymentId": "", + "receiveTime": 140271204841312, + "size": 1227 + } + } + } + diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/payment-gateway/index.md index 9382511..ca72550 100644 --- a/content/documentation/payment-gateway/index.md +++ b/content/documentation/payment-gateway/index.md @@ -26,48 +26,49 @@ To get help on available options run: Please note, Forknote RPC Wallet config file may consist only of these options: -Option | Description | Config Example | Console Example ------------|-----------|-----------|-----------| -bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 | --bind-address 127.0.0.1 -bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 | --bind-port 8071 -daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 | --daemon-address 127.0.0.1 -daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 | --daemon-port 8080 -wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet | --wallet-file mywallet -wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword | --wallet-password mypassword -generate-wallet | Generate new wallet | | --generate-wallet -log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log | --log-file mylog.log -server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet | --server-root /home/Downloads/RPCWallet -log-level | Level of logging. Default is 1. | log-level = 2 | --log-level 2 -testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no | --testnet no -local | Option that allows you to start Forknote RPC Wallet as an in-process node | local | --local -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 | --p2p-bind-ip 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 | --p2p-bind-port 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 | --p2p-external-port 443 -allow-local-ip | Allow local ip add to peer list, mostly in debug purposes | | --allow-local-ip -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 | --add-peer 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 | --add-priority-node 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 | --add-exclusive-node 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 | --seed-node 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port | --hide-my-port -P2P_STAT_TRUSTED
    _PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED
    _PUB_KEY = 4d..eb | --P2P_STAT_TRUSTED
    _PUB_KEY 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 | --BYTECOIN_NETWORK 11100111-1100-0101-1011-001210110110 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 +Option | Description | Config Example +-----------|-----------|-----------| +bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 +bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 +daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 +daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 +wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet +wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword +log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log +server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet +log-level | Level of logging. Default is 1. | log-level = 2 +testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no +local | Option that allows you to start Forknote RPC Wallet as an in-process node | local +p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 +p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 +add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 +seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 +hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port +P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED_PUB_KEY = 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 +GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE_TX_HEX = 01..4a +CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 +EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_SPEED_FACTOR = 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 +DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 +CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 +MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 +CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin +CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 +GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units | GENESIS_BLOCK_REWARD = 1844674407370955161 +MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION_SIZE_LIMIT = 20000 ##Example of a config file @@ -82,7 +83,7 @@ EMISSION_SPEED_FACTOR=18 DIFFICULTY_TARGET=120 CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 -PREMINED_PERCENT=0 +GENESIS_BLOCK_REWARD=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md index 9eb2df4..a4d9284 100644 --- a/content/documentation/simplewallet/index.md +++ b/content/documentation/simplewallet/index.md @@ -19,41 +19,46 @@ sidebar_nav: sidebar-documentation Specify data directory --config-file arg (=./configs/-.conf) Specify configuration file --command arg Specify command + --generate-new-wallet arg (=/home/USER/forknote/my.wallet) + Generate new wallet and save it to ##Wallet options -Option | Description | Config Example | Console Example ------------|-----------|-----------|-----------| -wallet-file | Use wallet <arg> | wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet | --wallet-file /home/USERNAME/
    forknote-linux/dashcoin.wallet -generate-new-wallet | Generate new wallet and save it to <arg> | | --generate-new-wallet /home/USERNAME/
    forknote-linux/dashcoin.wallet -password | Wallet password | password = PASSWORD | --password PASSWORD -daemon-address | Use daemon instance at <host>:<port> | daemon-address = 127.0.0.1:29081 | --daemon-address 127.0.0.1:29081 -daemon-host | Use daemon instance at host <arg> instead of localhost | daemon-host = 127.0.0.1 | --daemon-host 127.0.0.1 -daemon-port | Use daemon instance at port <arg> instead of 8081 | daemon-port = 29081 | --daemon-port 29081 -set_log | Level of logging. Default is 1. | set_log = 4 | --set_log 4 -testnet | Used to deploy test nets. The daemon must be launched with --testnet flag | | --testnet -wallet-rpc-bind-ip | Specify ip to bind rpc server | wallet-rpc-bind-ip = 127.0.0.1 | --wallet-rpc-bind-ip 127.0.0.1 -wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server | wallet-rpc-bind-port = 29082 | --wallet-rpc-bind-port 29082 -GENESIS_COINBASE
    _TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE
    _TX_HEX = 01..4a | --GENESIS_COINBASE
    _TX_HEX 01..4a -CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 | --CRYPTONOTE_
    PUBLIC_ADDRESS_
    BASE58_PREFIX 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 | --MONEY_SUPPLY 18446744073709551615 -EMISSION_
    SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_
    SPEED_FACTOR = 18 | --EMISSION_
    SPEED_FACTOR 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 | --DIFFICULTY_TARGET 120 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE = 20000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE 20000 -CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 = 10000 | --CRYPTONOTE_BLOCK
    _GRANTED_FULL
    _REWARD_ZONE_V1 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 | --CRYPTONOTE_DISPLAY
    _DECIMAL_POINT 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 | --MINIMUM_FEE 1000000 -DEFAULT_
    DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_
    DUST_THRESHOLD = 1000000 | --DEFAULT_
    DUST_THRESHOLD 1000000 -CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW = 10 | --CRYPTONOTE_
    MINED_MONEY_
    UNLOCK_WINDOW 10 -MAX_BLOCK_
    SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_
    SIZE_INITIAL = 20480 | --MAX_BLOCK_
    SIZE_INITIAL 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 | --EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 | --UPGRADE_HEIGHT 1 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 | --DIFFICULTY_CUT 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 | --DIFFICULTY_LAG 15 -MAX_TRANSACTION
    _SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 | --MAX_TRANSACTION
    _SIZE_LIMIT 20000 -DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE = 1000000000 | --DEFAULT_FEE 1000000000 -SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet | SYNC_FROM_ZERO | --SYNC_FROM_ZERO +Option | Description | Config Example +-----------|-----------|-----------| +wallet-file | Use wallet <arg> | wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet +password | Wallet password | password = PASSWORD +daemon-address | Use daemon instance at <host>:<port> | daemon-address = 127.0.0.1:29081 +daemon-host | Use daemon instance at host <arg> instead of localhost | daemon-host = 127.0.0.1 +daemon-port | Use daemon instance at port <arg> instead of 8081 | daemon-port = 29081 +set_log | Level of logging. Default is 1. | set_log = 4 +P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED_PUB_KEY = 4d..eb +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 +GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE_TX_HEX = 01..4a +CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 +MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 +EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_SPEED_FACTOR = 18 +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 +CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 +DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 +CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 +MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 +EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 +UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 +CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin +CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 +GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units | GENESIS_BLOCK_REWARD = 1844674407370955161 +wallet-rpc-bind-ip | Specify ip to bind rpc server | wallet-rpc-bind-ip = 127.0.0.1 +wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server | wallet-rpc-bind-port = 29082 +MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 +DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE = 1000000000 +SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet | SYNC_FROM_ZERO ##Example of a config file @@ -71,7 +76,7 @@ EMISSION_SPEED_FACTOR=18 DIFFICULTY_TARGET=120 CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 -PREMINED_PERCENT=0 +GENESIS_BLOCK_REWARD=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 @@ -93,19 +98,19 @@ wallet-rpc-bind-port=17102 ##Wallet commands -Command | Description | Arg 1 | Arg 2 | Arg 3 | Arg 4 | Arg 5 ------------|-----------|-----------|-----------|-----------|-----------|-----------| -address | Show current wallet public address | - | - | - | - | - -balance | Show current wallet balance | - | - | - | - | - -bc_height | Show blockchain height | - | - | - | - | - -help | Print help on wallet commands | - | - | - | - | - -incoming_transfers | Show incoming transfers | - | - | - | - | - -list_transfers | Show all known transfers | - | - | - | - | - -payments | Show payments with the corresponding payment_id's. You may indicate more than one payment_id. | [string] payment_id | - | - | - | - -reset | Discard cache data and start synchronizing from scratch | - | - | - | - | - -save | Save wallet synchronized data | - | - | - | - | - -set_log | Change current log detailization level | [uint] log level (0 - 4) | - | - | - | - -start_mining | Start mining in daemon | - | - | - | - | - -stop_mining | Stop mining in daemon | - | - | - | - | - -transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count | [string] address | [double] amount | [string] -p payment_id | [double] -f fee +Command | Description | Args +-----------|-----------|-----------| +address | Show current wallet public address | - +balance | Show current wallet balance | - +bc_height | Show blockchain height | - +help | Print help on wallet commands | - +incoming_transfers | Show incoming transfers | - +list_transfers | Show all known transfers | - +payments | Show payments with the corresponding payment_id's. You may indicate more than one payment_id. | [string] payment_id +reset | Discard cache data and start synchronizing from scratch | - +save | Save wallet synchronized data | - +set_log | Change current log detailization level | [uint] log level (0 - 4) +start_mining | Start mining in daemon | - +stop_mining | Stop mining in daemon | - +transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count
    [string] address
    [double] amount
    [string] -p payment_id
    [double] -f fee diff --git a/content/download.md b/content/download.md index 932743c..37cb7ac 100644 --- a/content/download.md +++ b/content/download.md @@ -7,25 +7,25 @@ body_class: download

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    +

    The easiest way to create Cryptonote blockchains. Create now.

    @@ -38,7 +38,7 @@ body_class: download

    Awesome! A few tips you may find useful:

    @@ -47,8 +47,7 @@ body_class: download

    Want to create your own cryptocurrency?

    Follow our guides and launch in a few minutes:

    diff --git a/content/guides/getting-started.md b/content/guides/getting-started.md deleted file mode 100644 index e772649..0000000 --- a/content/guides/getting-started.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Getting Started | Forknote -layout: documentation -body_class: developers -subnav_class: docs-guides -sidebar_nav: sidebar-giudes ---- - -# Getting Started - -* TOC -{:toc} - -Let's walk through core Forknote concepts as we tackle a simple use case. - -## Overview - -Forknote uses configuration files to describe the properties of a Cryptonote network. To get started you must [download][download] the latest version of Forknote. - -## Starting the daemon for preconfigured networks - -Forknote comes preconfigured with 2 networks - Dashcoin and [Bytecoin][bytecoin]. - -### Connecting to Dashcoin - -To connect to Dashcoin open up a command prompt and enter the -following command (without the `$`): - -
    -$ ./forknoted
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -By default, Forknote will load the Dashcoin configuration file (`configs/-.conf`), if no configuration file is passed as option. - -### Connecting to Bytecoin - -To connect to Dashcoin open up a command prompt and enter the -following command (without the `$`): - -
    -$ ./forknoted --config-file configs/bytecoin.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -## Starting the daemon for custom networks - -To connect to custom networks, you must save the configuraton file in the `configs` subfolder of Forknote. - -Next, let's start the daemon itself: - -
    -$ ./forknoted --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -12:34:56.789012 INFO forknote v1.0.8.608()
    -
    - -Please note you have to change `CUSTOM_NETWORK` with appropriate file name. - -## Starting simplewallet - -Simplewallet uses the same configuration file as the daemon. - -To start simplewallet: - -
    -$ ./simplewallet --config-file configs/CUSTOM_NETWORK.conf
    -
    -config path exist
    -forknote wallet v1.0.8.608()
    -Nor 'generate-new-wallet' neither 'wallet-file' argument was specified.
    -What do you want to do?
    -[O]pen existing wallet, [G]enerate new wallet file or [E]xit.
    -
    - -Press `g` to create new wallet and type your wallet's name and password. - -A good practice for naming your wallet is to add `NETWORK.` prefix to your name.
    -For example, for Dashcoin wallet use the `dashcoin.` prefix - `dashcoin.example_wallet` - -Don't forget to backup your wallet. - - -[download]: /download/ -[bytecoin]: https://bytecoin.org/ \ No newline at end of file diff --git a/content/guides/index.md b/content/guides/index.md index bc05af6..8a23faf 100644 --- a/content/guides/index.md +++ b/content/guides/index.md @@ -1,15 +1,76 @@ --- -title: Guides | Forknote +title: Getting Started | Forknote layout: documentation body_class: developers subnav_class: docs-guides sidebar_nav: sidebar-giudes --- -# Development Guides +# Getting Started -This section of the documentation is intended to get you up-and-running with -real-world Forknote-based cryptocurrency. We'll cover everything you need to know, from -configuration, to creating premined coins, to running seed nodes. +* TOC +{:toc} +Let's walk through core Forknote concepts as we tackle a simple use case. +## Overview + +Forknote uses configuration files to describe the properties of a Cryptonote blockchain. To get started you must [download][download] the latest version of Forknote. + +## Connecting the daemon to a blockchain + +To connect to the daemon to existing blockchain, just start `forknoted` with the corresponding configuration file. + +
    +$ ./forknoted --config-file configs/imaginary_blockchain.conf
    +
    + +New blockchains are created by creating new configuration files. Configuration files are created with our [blockchain creation form][create]. +You can find more about the available configuration options in our [documentation][documentation]. + +### Examples + +Dashcoin is the preconfigured blockchain in Forknote. To connect the daemon to the Dashcoin just start `forknoted`: + +
    +$ ./forknoted
    +
    + +To connect to the Bytecoin blockchain, start `forknoted` with its corresponding configuration file: + +
    +$ ./forknoted --config-file configs/bytecoin.conf
    +
    + + +## Starting simplewallet + +Simplewallet uses the same configuration file as the daemon. + +To start simplewallet: + +
    +$ ./simplewallet --config-file configs/imaginary_blockchain.conf
    +
    + + +### Examples + +Starting `simplewallet` for the Dashcoin blockchain: + +
    +$ ./simplewallet
    +
    + +Starting `simplewallet` for the Bytecoin blockchain: + +
    +$ ./simplewallet --config-file configs/bytecoin.conf
    +
    + + + +[bytecoin]: https://bytecoin.org/ +[create]: /create/ +[download]: /download/ +[documentation]: /documentation/daemon/#configuration-options \ No newline at end of file diff --git a/content/guides/create-coin.md b/content/guides/setup-private-blockchain.md similarity index 84% rename from content/guides/create-coin.md rename to content/guides/setup-private-blockchain.md index c898cb7..f731af5 100644 --- a/content/guides/create-coin.md +++ b/content/guides/setup-private-blockchain.md @@ -1,21 +1,21 @@ --- -title: Create Cryptonote coin guide | Forknote +title: Setup Cryptonote blockchain guide | Forknote layout: documentation body_class: developers subnav_class: docs-guides sidebar_nav: sidebar-giudes --- -# Create coin +# Setup new Cryptonote blockchain * TOC {:toc} -Let's walk through the process of creating a configuration file for your coin. +Let's walk through the process of creating a configuration file for a new private blockchain. -## Creating config file +## Creating configuration file Create the configuration file of your coin by using our [configuration form][create]. @@ -25,13 +25,13 @@ Save the resulted configuration in the `configs` folder of Forknote. ###Example on Linux/Mac: -
    $ cat >testcoin.conf 
    +
    $ cat >imaginary_blockchain.conf 
     
     EMISSION_SPEED_FACTOR=18
     DIFFICULTY_TARGET=120
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
     MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    +GENESIS_BLOCK_REWARD=0
     DEFAULT_DUST_THRESHOLD=1000000
     MINIMUM_FEE=1000000
     CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    @@ -40,7 +40,7 @@ CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
     p2p-bind-port=13539
     rpc-bind-port=13540
     BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b
    -CRYPTONOTE_NAME=testcoin
    +CRYPTONOTE_NAME=imaginary_blockchain
     UPGRADE_HEIGHT=1
     
    @@ -52,7 +52,7 @@ If you want to learn more you can checkout the [supported parameters][supported- *This step is only required if your coin has premine* -
    $ ./simplewallet --config-file configs/testcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
    +
    $ ./simplewallet --config-file configs/imaginary_blockchain.conf --generate-new-wallet MY.wallet --password PASSWORD
     
     config path exist
     forknote wallet v1.0.8.1.614()
    @@ -70,7 +70,7 @@ view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
     
     ### For coins without premine
     
    -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx
    +
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx
     
     config path exist
     Modify this line into your coin configuration file as is: 
    @@ -80,7 +80,7 @@ GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1
     
     ###For coins with premine
     
    -
    $ ./forknoted --config-file configs/testcoin.conf --print-genesis-tx \
    +
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx \
      --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
      --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
     
    @@ -102,7 +102,7 @@ Alternatively, you can add it into the [configuration form][create] and save the
     
     You must use the `SYNC_FROM_ZERO` option of simplewallet to see the premined coins.
     
    -
    $ ./simplewallet --config-file configs/testcoin.conf --SYNC_FROM_ZERO
    +
    $ ./simplewallet --config-file configs/imaginary_blockchain.conf --SYNC_FROM_ZERO
     
    diff --git a/content/index.md b/content/index.md index c4a0601..cf947bb 100644 --- a/content/index.md +++ b/content/index.md @@ -1,12 +1,12 @@ --- -title: Create Cryptonote tokens | Forknote +title: Create Cryptonote private blockchains | Forknote layout: overview ---

    Leverage the power of
    - Bytecoin in your Coin. + Bytecoin in your blockchain.

    Get started with one of our guides, or jump straight into the download section.

    Download @@ -16,21 +16,21 @@ layout: overview

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote coins. Learn more.

    +

    The easiest way to create Cryptonote blockchains. Create now.

    • - -

      Get Started

      + +

      Get Started

      New to Forknote? With these guides you’ll be up and running in a snap.

    • -

      Forknote coins

      -

      List of existing Forknote-based cryptocurrencies.

      +

      Existing blockchains

      +

      List of existing Forknote-supported blockchains.

    • diff --git a/layouts/documentation.html b/layouts/documentation.html index a498e40..d1e51a0 100644 --- a/layouts/documentation.html +++ b/layouts/documentation.html @@ -1,6 +1,6 @@ <%= render 'head' %> - + <%= render 'header' %> @@ -152,6 +152,11 @@ body_class: coins Twitter

      +

      Other links

      +

      + ChainRadar
      +

      +
    - -
    diff --git a/static/images/coins/magnatoj.png b/static/images/coins/magnatoj.png index b74e126ae738b5af217c79d8a14b4e81b3f0e45c..8d541fe4619a3ae08623531dfc80ddf4c25ad158 100644 GIT binary patch literal 2880 zcmV-G3%~SEX>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_0K*JTY>22p zL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr?{oLrd!Mx~ z03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE@L0LWj&=4?(nOT_siPRbOditRHZrp6?S8AgejFG^6va$=5K z|`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t74chfY%+(L z4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AWE=!MYYHiJ+ zdvY?9I0Av8Ka-Wn(gPeepdb@piwLhwjRWWeSr7baCBSDM=|pK0Q5^$>Pur z|2)M1IPkCYSQ^NQ`z*pYmq4Rp8z$= z2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV=Mor9X9@Wk zi)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3F4znTKoQsl z_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZXRY(gmfXpBU zWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6qn9`(3jA6(BtSg7z~Dn(ZN_@JTc*z z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW#Hr%UaPGJW z91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5YU_t_6Gogae zLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*CkMxR6CTo)& z$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4=0!`QmC#Pm zhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`hkG4N# zKjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=?H;57x71R{; zCfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV4H2`e-B#~i zJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOjV`f+`tbMHK zY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9k0dT6g(bBn zMJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3sdQ;h>DV6M zJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP-cdbwfPG-_ zpyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1@Q#ce4LsV@ zXw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy`y}IJ%XeDe zRku;v3frOf?DmPgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3e|F(q&bit1 zspqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bETE}(E>+O9O zeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$cQ|r*xkvZnNio#z9&IX9*nWZp8u5o(}(f= zr{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8{*wQ4;n(6< z@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh;dbp6hu<#rA zg!B8%JG^WF000JJOGiWi{{a60|De66lK=n!32;bRa{vGi!~g&e!~vBn4jTXf00(qQ zO+^Ra3=#u02RBr%LI3~&l1W5CRCwC$*Fg$^Fbo91D*pe=@eR=sgPl1FVp*~@t_1)9 z0009V58jD}Z+w1+(`*PvFoF?GzpL<8i{$e+H&OPxCPtNpS1F3>maR|K;%8z6Go(tB zZ!r@im>(>7Rki9okBJe?@C7ehfeGg^F@h0{U<9+ Date: Fri, 15 Jan 2016 23:24:57 +0200 Subject: [PATCH 14/56] Rakefile remove unused files --- Rakefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Rakefile b/Rakefile index a6647fc..5de03b4 100644 --- a/Rakefile +++ b/Rakefile @@ -1,6 +1,6 @@ require 'nanoc3/tasks' require 'tmpdir' -- + task :default => [:test] desc "Compile the site" @@ -48,8 +48,6 @@ task :publish, [:no_commit_msg] => [:clean, :remove_output_dir] do |t, args| `git checkout gh-pages` end tmpdir = Dir.mktmpdir - FileUtils.cp_r("enterprise", tmpdir) - FileUtils.cp("robots.txt", tmpdir) `git checkout master` ENV['GIT_DIR'] = File.expand_path(`git rev-parse --git-dir`.chomp) @@ -60,8 +58,6 @@ task :publish, [:no_commit_msg] => [:clean, :remove_output_dir] do |t, args| ENV['GIT_WORK_TREE'] = Dir.pwd File.unlink(gif) if File.file?(gif) # restore precious files - FileUtils.cp_r("#{tmpdir}/enterprise", ".") - FileUtils.cp("#{tmpdir}/robots.txt", ".") FileUtils.rm_rf(tmpdir) if File.exists?(tmpdir) `git add -A` tsha = `git write-tree`.strip From 3fdc87f89bd45aa2205e4b7f8daf29410a7a69c5 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Thu, 21 Jan 2016 02:51:48 +0200 Subject: [PATCH 15/56] payment gateway docs updated to 1.0.9 --- .../documentation/payment-gateway/index.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/payment-gateway/index.md index 5a84320..f681ba0 100644 --- a/content/documentation/payment-gateway/index.md +++ b/content/documentation/payment-gateway/index.md @@ -32,8 +32,8 @@ bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0. bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 -wallet-file | Mandatory'''. Your wallet's file name | wallet-file = mywallet -wallet-password | Mandatory. Your wallet's password | wallet-password = mypassword +container-file | Mandatory'''. Your container's file name | container-file = mycontainer +container-password | Mandatory. Your container's password | container-password = mypassword log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet log-level | Level of logging. Default is 1. | log-level = 2 @@ -75,9 +75,9 @@ MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simpl
    $ cat ./notrealcoin.conf 
     
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    +seed-node=1.1.1.1:29829
    +seed-node=seed.notarealcoin.com:29829
    +seed-node=2.2.2.2:29829
     GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
     EMISSION_SPEED_FACTOR=18
     DIFFICULTY_TARGET=120
    @@ -97,8 +97,8 @@ UPGRADE_HEIGHT=1
     CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
     CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
     
    -wallet-file = mywallet
    -wallet-password = mypassword
    +container-file = mycontainer
    +container-password = mypassword
     daemon-port = 29830
     bind-port = 9090
     
    @@ -106,28 +106,28 @@ bind-port = 9090
     
     *Note: config file's path is relative to current working directory, not server root.*
     
    -*Note: options "wallet-file" and "wallet-password" should ALWAYS be set (in either command line or config file mode).*
    +*Note: options "container-file" and "container-password" should ALWAYS be set (in either command line or config file mode).*
     
    -*Note: "wallet-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory.*
    +*Note: "container-file" and "log-file" options are relative to "server-root". "server-root" default is the current working directory.*
     
     
     ##Generate a new wallet
     
    -To start using RPC wallet you must first generate a wallet. Wallet file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.
    +To start using RPC wallet you must first generate a container. Container file is the only file that stores all data required to run your service. It contains user addresses and private keys required to operate them. Make sure to backup this file regularly.
     
     To generate a new wallet you should run the following command:
     
    -     $ ./walletd --config /home/Downloads/myconfig.conf --generate-wallet
    +     $ ./walletd --config /home/Downloads/myconfig.conf --generate-container
     
     where: 
     
    -* **<mywallet>** is the wallet file name and a path to it (relative or absolute); path is optional in this argument, specifying only a wallet's name will result in new *.wallet file located in the same folder as RPC Wallet
    +* **<mycontainer>** is the container file name and a path to it (relative or absolute); path is optional in this argument, specifying only a container's name will result in new file located in the same folder as RPC Wallet
     * **<mypass>** is a secret password for the new wallet file. Whichever you like;
    -* **--generate-wallet** option tells RPC wallet to generate wallet file and exit.
    +* **--generate-container** option tells RPC wallet to generate container file and exit.
     
    -*Note: if **<mywallet>** exists Forknote RPC Wallet will show you the notification and will ask you to provide a different name.*
    +*Note: if **<mycontainer>** exists Bytecoin RPC Wallet will show you the notification and will ask you to provide a different name.*
     
    -If the operation was successful you will get a corresponding message with your new Forknote address. At the same time Forknote RPC Wallet will save your wallet with .wallet extension on the local disk (in the same folder where Forknote RPC Wallet is located) and shut down.
    +If the operation was successful you will get a corresponding message with your new Bytecoin address. At the same time Bytecoin RPC Wallet will save your container on the local disk (in the same folder where Bytecoin RPC Wallet is located) and shut down
     
     
     ##Start Forknote RPC Wallet
    
    From 3bdf7e03e4fb086c535d4af7d66fc620e62f6a60 Mon Sep 17 00:00:00 2001
    From: Petar Mitchev 
    Date: Fri, 22 Jan 2016 00:35:09 +0200
    Subject: [PATCH 16/56] Small fixes
    
    ---
     content/documentation/payment-gateway/index.md | 8 +-------
     content/guides/starting-seed-node.md           | 2 +-
     2 files changed, 2 insertions(+), 8 deletions(-)
    
    diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/payment-gateway/index.md
    index f681ba0..ff082c1 100644
    --- a/content/documentation/payment-gateway/index.md
    +++ b/content/documentation/payment-gateway/index.md
    @@ -203,13 +203,7 @@ If you want to delete RPC wallet you have to unregister windows service first (i
     
     ##Forknote RPC Wallet JSON RPC API
     
    -Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more. Here is an example of integration scheme:
    -
    -1. Create a unique address for each user to identify his particular deposits with **create_address()** method. 
    -2. When user is going to fund his account he will send you a transaction to this address. To know about new transactions run **get_transaction_count()** method (e.g., every 5 minutes). This method returns you a cumulative number of transactions; number of the transaction corresponds to its ID. This way you will be able to notice when number of your transactions have changed. 
    -3. Run **get_transaction()** method to receive amounts and addresses of new incoming transactions. 
    -4. Fund these amounts to the corresponding user accounts. 
    -5. Withdraw with **send_transaction()** method that allows you to send transaction to one or several addresses. 
    +Forknote RPC Wallet API allows you to create addresses for your users, accept and send transactions and much more.
     
     Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API]
     
    diff --git a/content/guides/starting-seed-node.md b/content/guides/starting-seed-node.md
    index 1133fed..db2374e 100644
    --- a/content/guides/starting-seed-node.md
    +++ b/content/guides/starting-seed-node.md
    @@ -78,7 +78,7 @@ EMISSION_SPEED_FACTOR=18
     DIFFICULTY_TARGET=120
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
     MONEY_SUPPLY=18446744073709551615
    -PREMINED_PERCENT=0
    +GENESIS_BLOCK_REWARD=0
     DEFAULT_DUST_THRESHOLD=1000000
     MINIMUM_FEE=1000000
     CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    
    From c64dcb556f342f4731d12d3cda883f0ce6bf3d4a Mon Sep 17 00:00:00 2001
    From: Petar Mitchev 
    Date: Sat, 23 Jan 2016 19:59:32 +0200
    Subject: [PATCH 17/56] Premined json exported file fix
    
    ---
     static/partials/create.js | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/static/partials/create.js b/static/partials/create.js
    index 64972e1..54c6a09 100755
    --- a/static/partials/create.js
    +++ b/static/partials/create.js
    @@ -298,6 +298,9 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$tim
         $scope.coreChanged = function () {
             if ($scope.base_coin == "bytecoin") {
                 $scope.coin.extensions = [ "core/bytecoin.json", "print-genesis-tx.json" ];
    +            if ($scope.coin.core.GENESIS_BLOCK_REWARD != 0) 
    +                $scope.coin.extensions.push("genesis-block-reward.json");
    +
                 $scope.coin.base_coin.name = "bytecoin";
                 $scope.coin.base_coin.git = "https://github.com/amjuarez/bytecoin.git";
             }
    
    From 9229ff92f1dce5cb9b65124888820597816cb0d7 Mon Sep 17 00:00:00 2001
    From: Petar Mitchev 
    Date: Mon, 1 Feb 2016 11:57:49 +0200
    Subject: [PATCH 18/56] Genesis tx is now populated in the creation form
    
    ---
     .../genesis-coinbase-transaction-creation.md  | 40 +++++++++
     content/guides/setup-private-blockchain.md    | 33 +-------
     layouts/sidebar-giudes.html                   |  1 +
     static/css/documentation.css                  |  4 +
     static/js/app_create.js                       | 39 +++++++++
     static/partials/create.html                   | 22 +++++
     static/partials/create.js                     | 81 +++++++++++--------
     7 files changed, 156 insertions(+), 64 deletions(-)
     create mode 100644 content/guides/genesis-coinbase-transaction-creation.md
    
    diff --git a/content/guides/genesis-coinbase-transaction-creation.md b/content/guides/genesis-coinbase-transaction-creation.md
    new file mode 100644
    index 0000000..28d6e72
    --- /dev/null
    +++ b/content/guides/genesis-coinbase-transaction-creation.md
    @@ -0,0 +1,40 @@
    +---
    +title: Creating manually genesis coinbase transaction hex for Cryptonote coins | Forknote
    +layout: documentation
    +body_class: developers
    +subnav_class: docs-guides
    +sidebar_nav: sidebar-giudes
    +---
    +
    +# Creating manually genesis coinbase transaction hex
    +
    +* TOC
    +{:toc}
    +
    +
    +Forknote give you the ability to create your own genesis coinbase transaction hex if you need.
    +
    +## For coins without premine
    +
    +
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx
    +
    +config path exist
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    +
    +
    + +##For coins with premine + +
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx \
    + --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    + --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    +
    +config path exist
    +outs: 922337203685477580
    +outs: 922337203685477580
    +Modify this line into your coin configuration file as is: 
    +GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    +
    +
    + diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md index f731af5..c9d32a7 100644 --- a/content/guides/setup-private-blockchain.md +++ b/content/guides/setup-private-blockchain.md @@ -41,6 +41,7 @@ p2p-bind-port=13539 rpc-bind-port=13540 BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b CRYPTONOTE_NAME=imaginary_blockchain +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101f2b92f2b27d8af7ac7e12f8e7972326d8fc8103d571b4d8e9d61bdfa178ea92a UPGRADE_HEIGHT=1
    @@ -66,38 +67,6 @@ view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e **Caution: Don't forget to backup the wallets** -## Genesis coinbase transaction creation - -### For coins without premine - -
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx
    -
    -config path exist
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
    -
    -
    - -###For coins with premine - -
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx \
    - --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    - --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    -
    -config path exist
    -outs: 922337203685477580
    -outs: 922337203685477580
    -Modify this line into your coin configuration file as is: 
    -GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
    -
    -
    - -You have to add `GENESIS_COINBASE_TX_HEX` to your configuration file. - -Alternatively, you can add it into the [configuration form][create] and save the config file again. - -[![Create cryptonote coin form - genesis](/images/documentation/create-form-genesis.png)][create] - ### Using simplewallet for wallets, containing premined coins: You must use the `SYNC_FROM_ZERO` option of simplewallet to see the premined coins. diff --git a/layouts/sidebar-giudes.html b/layouts/sidebar-giudes.html index c9eca5c..1337da4 100644 --- a/layouts/sidebar-giudes.html +++ b/layouts/sidebar-giudes.html @@ -3,6 +3,7 @@
  • Getting started

  • Setup new blockchain

  • Starting seed node

  • +
  • Genesis coinbase transaction creation

  • Troubleshooting

  • \ No newline at end of file diff --git a/static/css/documentation.css b/static/css/documentation.css index 4e4401b..e6af672 100644 --- a/static/css/documentation.css +++ b/static/css/documentation.css @@ -581,6 +581,10 @@ label .note { color: #ae4545 !important; } +.text-smaller { + font-size: 11px; +} + /* @end */ /*------------------------------------------------------------------------------ diff --git a/static/js/app_create.js b/static/js/app_create.js index 16fd306..091cfe5 100644 --- a/static/js/app_create.js +++ b/static/js/app_create.js @@ -19,6 +19,7 @@ var createCoinApp = angular.module("create-coin", ["ngRoute", "googlechart", 'ui createCoinApp.config(['$httpProvider', function ($httpProvider) { $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; }]); + createCoinApp. filter('nlToArray', function() { return function(text) { @@ -27,4 +28,42 @@ filter('nlToArray', function() { } return ''; }; +}); + +createCoinApp.filter('unique', function () { + return function (items, filterOn) { + + if (filterOn === false) { + return items; + } + + if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) { + var hashCheck = {}, newItems = []; + + var extractValueToCompare = function (item) { + if (angular.isObject(item) && angular.isString(filterOn)) { + return item[filterOn]; + } else { + return item; + } + }; + + angular.forEach(items, function (item) { + var valueToCheck, isDuplicate = false; + + for (var i = 0; i < newItems.length; i++) { + if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) { + isDuplicate = true; + break; + } + } + if (!isDuplicate) { + newItems.push(item); + } + + }); + items = newItems; + } + return items; + }; }); \ No newline at end of file diff --git a/static/partials/create.html b/static/partials/create.html index 5e94bc4..ee2b01d 100755 --- a/static/partials/create.html +++ b/static/partials/create.html @@ -69,6 +69,28 @@

    Create Cryptonote blockchain

    +
    + +
    + + + + +
    +

    Min length: 95

    +

    Max length: 105

    + +
    + + +
    diff --git a/static/partials/create.js b/static/partials/create.js index 54c6a09..e888078 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -1,13 +1,14 @@ 'use strict'; -angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$timeout', function($scope, $http, $timeout, $document) { +angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$filter', '$timeout', function($scope, $http, $filter, $timeout, $document) { $scope.coin = {}; $scope.coin.base_coin = {}; $scope.coin.core = {}; $scope.base_coin = 'bytecoin'; + $scope.coin.core.ADDRESSES = []; $scope.coin.core.SEED_NODES = []; $scope.MONEY_SUPPLY = new JSBigInt(2).pow(64).subtract(1); $scope.coin.core.EMISSION_SPEED_FACTOR = 18; @@ -277,6 +278,10 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$tim cryptonoteDisplayDecimalPoint = 0; } var preminedAmount = moneySupply * preminePercent / 100; + if (preminePercent != 0) { + $scope.coin.extensions.push("genesis-block-reward.json"); + $scope.coin.extensions = $filter('unique')($scope.coin.extensions); + } var days = 1100, // 3 years k = 1 / Math.pow(2, emissionSpeedFactor); @@ -298,14 +303,23 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$tim $scope.coreChanged = function () { if ($scope.base_coin == "bytecoin") { $scope.coin.extensions = [ "core/bytecoin.json", "print-genesis-tx.json" ]; - if ($scope.coin.core.GENESIS_BLOCK_REWARD != 0) - $scope.coin.extensions.push("genesis-block-reward.json"); - $scope.coin.base_coin.name = "bytecoin"; $scope.coin.base_coin.git = "https://github.com/amjuarez/bytecoin.git"; } } + +// Addresses + $scope.addToAddresses = function () { + var newAddress = $scope.newAddress; + if (newAddress !== undefined) + $scope.coin.core.ADDRESSES.push(newAddress); + }; + + $scope.removeAddress = function(index) { + $scope.coin.core.ADDRESSES.splice(index, 1); + }; + // Seed nodes $scope.addToSeedNodes = function () { var newSeedNode = ''; @@ -384,34 +398,15 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$tim // Generate genesis tx // TODO: DO IT +/* $scope.genesis_tx = function () { cnUtil.configChanged($scope.coin); var emission_speed_factor_shift = new JSBigInt(2).pow($scope.coin.core.EMISSION_SPEED_FACTOR); var base_reward = $scope.MONEY_SUPPLY.divide(emission_speed_factor_shift); - - console.log(base_reward); } -// Get genesis transaction hex - $scope.get_genesis_tx = function() { - // Writing it to the server - // - var dataObj = { - MoneySupply : $scope.coin.core.MONEY_SUPPLY, - EmissionSpeedFactor : $scope.coin.core.EMISSION_SPEED_FACTOR, - DifficultyTarget : $scope.coin.core.DIFFICULTY_TARGET, - GenesisBlockReward : $scope.coin.core.GENESIS_BLOCK_REWARD - }; - var res = $http.post('http://api.forknote.net:8080/genesis_tx/', dataObj); - res.success(function(data, status, headers, config) { - alert( "success message: " + JSON.stringify({data: data})); - }); - res.error(function(data, status, headers, config) { - alert( "failure message: " + JSON.stringify({data: data})); - }); - }; - +*/ // Cryptonote_name changed $scope.cryptonoteNameChanged = function () { @@ -466,16 +461,33 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$tim $scope.show_config_modal = function () { $scope.$broadcast('show-errors-check-validity'); if ($scope.coinForm.$valid) { - - console.log("valid form"); -// $scope.get_genesis_tx(); - setTimeout(function(){$('#coin_daemon_config_modal').modal('show')}, 100); - $scope.create_daemon_config(); + var addressPrefix = $scope.coin.core.CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX; + if ($scope.coin.core.ADDRESSES[0] !== undefined && $scope.coin.core.ADDRESSES[0] !== null && $scope.coin.core.ADDRESSES[0][0] == 'D') + addressPrefix = 72; + + var dataObj = { + MoneySupply : $scope.coin.core.MONEY_SUPPLY, + EmissionSpeedFactor : $scope.coin.core.EMISSION_SPEED_FACTOR, + DifficultyTarget : $scope.coin.core.DIFFICULTY_TARGET, + GenesisBlockReward : $scope.coin.core.GENESIS_BLOCK_REWARD, + AddressPrefix : addressPrefix, + Addresses : $scope.coin.core.ADDRESSES + }; + var res = $http.post('http://api.forknote.net:8080/genesis_tx/', dataObj); + res.success(function(data, status, headers, config) { + $scope.coin.core.GENESIS_COINBASE_TX_HEX = data; + setTimeout(function(){$('#coin_daemon_config_modal').modal('show')}, 100); + $scope.create_daemon_config(); + }); + res.error(function(data, status, headers, config) { + $scope.coin.core.GENESIS_COINBASE_TX_HEX = "invalid address"; + }); } } $scope.show_json_modal = function () { $scope.coin_json = (JSON.parse(JSON.stringify($scope.coin))); + delete $scope.coin_json.core.ADDRESSES; $scope.coin_json.core.CHECKPOINTS = ""; $scope.coin_json_stringified = JSON.stringify($scope.coin_json, null, 4); $scope.$broadcast('show-errors-check-validity'); @@ -509,9 +521,15 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$tim $scope.coin_daemon_config += prop + "=" + $scope.deamon_network_identifier + "\n"; } else if (prop == "GENESIS_COINBASE_TX_HEX") { $scope.coin_daemon_config += "GENESIS_COINBASE_TX_HEX=" + $scope.coin.core[prop] + "\n"; + } else if (prop == "GENESIS_BLOCK_REWARD") { + $scope.coin_daemon_config += "GENESIS_BLOCK_REWARD=" + $scope.coin.core[prop] + "\n"; + if ($scope.coin.core[prop] > 0) + $scope.coin_daemon_config += "SYNC_FROM_ZERO=1\n"; } else if (prop == "DAEMON_NAME") { // daemon_name is not needed - } else { + } else if (prop == "ADDRESSES") { + // addresses is not needed + } else { $scope.coin_daemon_config += prop + "=" + $scope.coin.core[prop] + "\n"; } } @@ -549,7 +567,6 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$tim $scope.randomizeNetworkIdentifier(); $scope.coreChanged(); $scope.supplyParameterChanged(); - $scope.genesis_tx(); } $timeout($scope.init); From e3f98b8cae064f8b8fa3f86128b4599a924eddd8 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sat, 20 Feb 2016 08:48:22 +0200 Subject: [PATCH 19/56] Forknote 1.0.9.1 release --- .../blog/2016-02-20-forknote-1.0.9.1-released.md | 15 +++++++++++++++ content/download.md | 12 ++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 content/blog/2016-02-20-forknote-1.0.9.1-released.md diff --git a/content/blog/2016-02-20-forknote-1.0.9.1-released.md b/content/blog/2016-02-20-forknote-1.0.9.1-released.md new file mode 100644 index 0000000..4b9025c --- /dev/null +++ b/content/blog/2016-02-20-forknote-1.0.9.1-released.md @@ -0,0 +1,15 @@ +--- +kind: article +title: "Forknote 1.0.9.1 Release" +created_at: 2016-02-20 +author_name: pmitchev +--- + +Forknote 1.0.9.1 was released. + +Changes in this version: + +* Core changed to Bytecoin 1.0.9.1 +* Various minor bug fixes +* Bug fixes affecting premined coins +* 'walletd --local' now works \ No newline at end of file diff --git a/content/download.md b/content/download.md index c4b96f7..f6dca65 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From e52273b9692b0a9371d832c9b0ac9da014299760 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sun, 21 Feb 2016 09:53:48 +0200 Subject: [PATCH 20/56] Create new blockchain tutorial updated --- content/guides/setup-private-blockchain.md | 82 ++++++++++++---------- static/search-index.json | 5 ++ 2 files changed, 50 insertions(+), 37 deletions(-) diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md index c9d32a7..4103a31 100644 --- a/content/guides/setup-private-blockchain.md +++ b/content/guides/setup-private-blockchain.md @@ -15,12 +15,41 @@ sidebar_nav: sidebar-giudes Let's walk through the process of creating a configuration file for a new private blockchain. + +## Creating simplewallet addresses + +*This step is only required for blockchains has premined coins* + +
    $ ./simplewallet --generate-new-wallet MY.wallet --password PASSWORD
    +
    +config path exist
    +forknote wallet v1.0.9.1.662()
    +Sync from timestamp: 1455950318
    +Error: wallet failed to connect to daemon (http://localhost:29081).
    +Generated new wallet: D9CTMkRfsJ594cuvX2pGXNWMFK5ARwxPN1x7bFC5wY5XTZxf12LjWUK5QkMVeSkD6gT532FepdaohRYkt99e9gdF6hyrUgx
    +view key: f45a0505d89e4c3bbb91c3481861c12b2b0c6e43b9de23fa108a48a0db116901
    +**********************************************************************
    +Your wallet has been generated.
    +Use "help" command to see the list of available commands.
    +Always use "exit" command when closing simplewallet to save
    +current session's state. Otherwise, you will possibly need to synchronize 
    +your wallet again. Your wallet key is NOT under risk anyway.
    +**********************************************************************
    +
    + +At this line is your wallet address: +``` +Generated new wallet: D9CTMkRfsJ594cuvX2pGXNWMFK5ARwxPN1x7bFC5wY5XTZxf12LjWUK5QkMVeSkD6gT532FepdaohRYkt99e9gdF6hyrUgx +``` + +**Caution: Don't forget to backup the wallets**
    +**Notice: You can also use walletd or another wallet to create an address** + + ## Creating configuration file Create the configuration file of your coin by using our [configuration form][create]. -[![Create cryptonote coin form](/images/documentation/create-form.png)][create] - Save the resulted configuration in the `configs` folder of Forknote. ###Example on Linux/Mac: @@ -31,47 +60,28 @@ EMISSION_SPEED_FACTOR=18 DIFFICULTY_TARGET=120 CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 -GENESIS_BLOCK_REWARD=0 +GENESIS_BLOCK_REWARD=1844674407370955300 +SYNC_FROM_ZERO=1 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 -p2p-bind-port=13539 -rpc-bind-port=13540 -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b +p2p-bind-port=6966 +rpc-bind-port=6967 +BYTECOIN_NETWORK=96a24a34-4585-25af-884d-6039b3ab7fd1 CRYPTONOTE_NAME=imaginary_blockchain -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101f2b92f2b27d8af7ac7e12f8e7972326d8fc8103d571b4d8e9d61bdfa178ea92a +GENESIS_COINBASE_TX_HEX=010a01ff0001a4b4e6cc99b3e6cc190285f558a81f548c1a7be29836e8f512cc33738d07326eeb22a6f4c5b5e1a3aa8e210187216740de551aedfd1b6d8ee7ce73e88a2cc22297d44b46dd4ee5ef6d864e5b UPGRADE_HEIGHT=1 +seed-node=127.0.0.1:6966
    +**Notice: Be careful when you test different configurations with the same CRYPTONOTE_NAME. You may need to delete the blockchain folder to avoid conflict.**
    +Example OSX/Linux: ~/.imaginary_blockchain/
    +Example Windows: C:\Users\%user_name%\AppData\Roaming\imaginary_blockchain\ -If you want to learn more you can checkout the [supported parameters][supported-parameters] of the configuration file. - - -## Creating simplewallet addresses - -*This step is only required if your coin has premine* - -
    $ ./simplewallet --config-file configs/imaginary_blockchain.conf --generate-new-wallet MY.wallet --password PASSWORD
    -
    -config path exist
    -forknote wallet v1.0.8.1.614()
    -Sync from timestamp: 1444336575
    -Error: wallet failed to connect to daemon (http://localhost:13540).
    -Generated new wallet: FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT
    -view key: 18367126f3948849c1754d14e53702c046751ed7a108290f16bbfd5b3a71180e
    -
    -
    - -**Caution: Don't forget to backup the wallets** - - -### Using simplewallet for wallets, containing premined coins: - -You must use the `SYNC_FROM_ZERO` option of simplewallet to see the premined coins. - -
    $ ./simplewallet --config-file configs/imaginary_blockchain.conf --SYNC_FROM_ZERO
    +Check is the configuration file working properly by:
    +
    $ ./forknoted --config-file configs/imaginary_blockchain.conf
     
    @@ -87,13 +97,11 @@ After you know the IP of the VPS, you have to add `seed-node` to your configurat
    seed-node=1.1.1.1:40741
     
    -Alternatively, you can add it into the [configuration form][create] and save the config file again. - -[![Create cryptonote coin form - seed](/images/documentation/create-form-seed.png)][create] +**Notice: Don't forget to delete the line seed-node=127.0.0.1:xxxxx** [supported-parameters]: /documentation/daemon/#command-line-options-and-settings-options [create]: /create/ [seed-node-guide]: /guides/starting-seed-node/ [ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 -[vultr]: http://www.vultr.com/?ref=6832621 \ No newline at end of file +[vultr]: http://www.vultr.com/?ref=6832621 diff --git a/static/search-index.json b/static/search-index.json index dc8813c..daafc58 100644 --- a/static/search-index.json +++ b/static/search-index.json @@ -25,6 +25,11 @@ "title": "Forknote 1.0.9 Release", "section": "Blog/" }, + { + "url": "/blog/2016-02-20-forknote-1/", + "title": "Forknote 1.0.9.1 Release", + "section": "Blog/" + }, { "url": "/blog/all_posts/", "title": "¬", From c1e5dd8c2be650a6ea56960eea4e02826be0b16e Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Wed, 24 Feb 2016 11:12:30 +0200 Subject: [PATCH 21/56] Coins' info refreshed --- content/coins/index.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/content/coins/index.md b/content/coins/index.md index 6adb27f..b2219f8 100644 --- a/content/coins/index.md +++ b/content/coins/index.md @@ -93,11 +93,9 @@ body_class: coins

    Pools

    -

    Democats
    +

    Democats
    Minergate
    Miner.center
    - shscrypto.net
    - cryptonight.net
    cryptmonero.com

    @@ -139,10 +137,8 @@ body_class: coins

    Pools

    -

    Democats
    +

    Democats
    Minergate
    - shscrypto.net
    - cryptonight.net

    Community

    @@ -174,7 +170,7 @@ body_class: coins
    $ ./simplewallet --config-file configs/magnatoj.conf

    Pools

    -

    Democats
    +

    Democats

    Community

    @@ -199,7 +195,7 @@ body_class: coins
    $ ./simplewallet --config-file configs/ethanolium.conf

    Pools

    -

    Democats
    +

    Democats

    Community

    From fede711223bf3e99096754fab89728a0a5f57638 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sun, 28 Feb 2016 17:35:22 +0200 Subject: [PATCH 22/56] Minor text changes --- content/guides/genesis-coinbase-transaction-creation.md | 4 +--- content/guides/setup-private-blockchain.md | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/content/guides/genesis-coinbase-transaction-creation.md b/content/guides/genesis-coinbase-transaction-creation.md index 28d6e72..9d4bed2 100644 --- a/content/guides/genesis-coinbase-transaction-creation.md +++ b/content/guides/genesis-coinbase-transaction-creation.md @@ -26,9 +26,7 @@ GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1 ##For coins with premine -
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx \
    - --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT \
    - --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    +
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx  --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT  --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
     
     config path exist
     outs: 922337203685477580
    diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md
    index 4103a31..2ab67fa 100644
    --- a/content/guides/setup-private-blockchain.md
    +++ b/content/guides/setup-private-blockchain.md
    @@ -76,14 +76,14 @@ UPGRADE_HEIGHT=1
     seed-node=127.0.0.1:6966
     
    -**Notice: Be careful when you test different configurations with the same CRYPTONOTE_NAME. You may need to delete the blockchain folder to avoid conflict.**
    -Example OSX/Linux: ~/.imaginary_blockchain/
    -Example Windows: C:\Users\%user_name%\AppData\Roaming\imaginary_blockchain\ - Check is the configuration file working properly by:
    $ ./forknoted --config-file configs/imaginary_blockchain.conf
     
    +**Notice: Be careful when you test different configurations with the same CRYPTONOTE_NAME. You may need to delete the blockchain folder to avoid conflict.**
    +Example OSX/Linux: ~/.imaginary_blockchain/
    +Example Windows: C:\Users\%user_name%\AppData\Roaming\imaginary_blockchain\ + ## Adding seed nodes From bc10c066b0afbc61eb0db2ba9514cf85869e1f61 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Thu, 3 Mar 2016 02:13:56 +0200 Subject: [PATCH 23/56] Added Bitaltcoin --- content/coins/index.md | 35 +++++++++++++++++++ .../genesis-coinbase-transaction-creation.md | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/content/coins/index.md b/content/coins/index.md index b2219f8..f37e6a8 100644 --- a/content/coins/index.md +++ b/content/coins/index.md @@ -39,6 +39,11 @@ body_class: coins

    Ethanolium

  • +
  • + B +

    Bitaltcoin

    +

    +
  • Add Your Blockchain

    @@ -211,4 +216,34 @@ body_class: coins + + + + \ No newline at end of file diff --git a/content/guides/genesis-coinbase-transaction-creation.md b/content/guides/genesis-coinbase-transaction-creation.md index 9d4bed2..5fc2a69 100644 --- a/content/guides/genesis-coinbase-transaction-creation.md +++ b/content/guides/genesis-coinbase-transaction-creation.md @@ -26,7 +26,7 @@ GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1 ##For coins with premine -
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx  --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT  --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
    +
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
     
     config path exist
     outs: 922337203685477580
    
    From 1111872f41933494101d19447869a6a4b43d9335 Mon Sep 17 00:00:00 2001
    From: Petar Mitchev 
    Date: Sat, 12 Mar 2016 04:18:36 +0200
    Subject: [PATCH 24/56] License change to CC
    
    ---
     layouts/footer.html | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/layouts/footer.html b/layouts/footer.html
    index c97edfa..3fb86aa 100644
    --- a/layouts/footer.html
    +++ b/layouts/footer.html
    @@ -17,7 +17,7 @@
         
     
         
    -

    © Forknote. All rights reserved.

    +

    Creative Commons License

    From 37e71412971c1c4dce7dd4b612127b3093f772ef Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Fri, 15 Apr 2016 19:03:00 +0300 Subject: [PATCH 25/56] Download link updated --- content/download.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/download.md b/content/download.md index f6dca65..bd907b2 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From 983b8a9cb2db5275d73445780c4e80fa095eb691 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sat, 16 Apr 2016 05:03:51 +0300 Subject: [PATCH 26/56] Parameters updated to 1.0.10 --- static/partials/create.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/partials/create.js b/static/partials/create.js index e888078..29d7501 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -24,7 +24,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil $scope.coin.core.DEFAULT_DUST_THRESHOLD = 1000000; $scope.coin.core.MINIMUM_FEE = 1000000; $scope.coin.core.CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW = 10; - $scope.coin.core.CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE = 60000; + $scope.coin.core.CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE = 100000; $scope.coin.core.CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 86; $scope.address_prefix = 'F'; $scope.ports_range_min = 1024; @@ -534,7 +534,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil } } } - $scope.coin_daemon_config += "UPGRADE_HEIGHT=1" + "\n"; + $scope.coin_daemon_config += "UPGRADE_HEIGHT_V2=1" + "\n"; if(!$scope.coin.core['SEED_NODES'].length) { $scope.coin_daemon_config += "seed-node=127.0.0.1:" + $scope.coin.core['P2P_DEFAULT_PORT']; } From 921605afcd355733a6d421d21c1fca21c00e9bcb Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sun, 17 Apr 2016 08:06:31 +0300 Subject: [PATCH 27/56] Documentation updated --- .../cryptonote-generator/index.md | 5 +- content/documentation/daemon/index.md | 7 +- .../documentation/payment-gateway/index.md | 5 +- .../payment-gateway/json-rpc-api.md | 132 ++++++++++++++++++ content/documentation/simplewallet/index.md | 7 +- content/guides/setup-private-blockchain.md | 4 +- content/guides/starting-seed-node.md | 17 +-- 7 files changed, 157 insertions(+), 20 deletions(-) diff --git a/content/documentation/cryptonote-generator/index.md b/content/documentation/cryptonote-generator/index.md index 73d18f4..85f01b5 100644 --- a/content/documentation/cryptonote-generator/index.md +++ b/content/documentation/cryptonote-generator/index.md @@ -34,13 +34,14 @@ DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Me GENESIS_BLOCK_REWARD | Premine amount. Measured in atomic units. CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) blockchains +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) blockchains CRYPTONOTE_DISPLAY_DECIMAL_POINT | 1 coin = 10^(this value) atomic units MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transactions MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 blockchains EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 blockchains -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains DIFFICULTY_CUT | Timestamps to cut after sorting DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet @@ -64,7 +65,7 @@ DEFAULT_FEE | Default fee of the transactions sent through simplewallet "DEFAULT_DUST_THRESHOLD": 1000000, "MINIMUM_FEE": 1000000, "CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW": 10, - "CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE": 60000, + "CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE": 100000, "CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX": 86, "P2P_DEFAULT_PORT": 28134, "RPC_DEFAULT_PORT": 28135, diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 7f6dfe5..c30b838 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -57,13 +57,14 @@ EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 = 10000 CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin @@ -88,13 +89,13 @@ GENESIS_BLOCK_REWARD=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 p2p-bind-port=29829 rpc-bind-port=29830 BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc CRYPTONOTE_NAME=test -UPGRADE_HEIGHT=1 +UPGRADE_HEIGHT_V2=1 CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8 CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038 diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/payment-gateway/index.md index ff082c1..1ae189f 100644 --- a/content/documentation/payment-gateway/index.md +++ b/content/documentation/payment-gateway/index.md @@ -56,13 +56,14 @@ EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 = 10000 CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin @@ -93,7 +94,7 @@ p2p-bind-port=29829 rpc-bind-port=29830 BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc CRYPTONOTE_NAME=test -UPGRADE_HEIGHT=1 +UPGRADE_HEIGHT_V2=1 CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8 CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038 diff --git a/content/documentation/payment-gateway/json-rpc-api.md b/content/documentation/payment-gateway/json-rpc-api.md index b29ddf4..d6e005f 100644 --- a/content/documentation/payment-gateway/json-rpc-api.md +++ b/content/documentation/payment-gateway/json-rpc-api.md @@ -62,6 +62,34 @@ Output value example: } +## save + +**save()** method allows you to save your wallet by request. + +No input. + +No output in case of success. + +Input value example: + + { + 'params':{ + }, + 'jsonrpc':'2.0', + 'id':'test', + 'method':'save' + } + +Output value example: + + { + 'jsonrpc':'2.0', + 'id':'test', + 'result':{ + } + } + + ## getViewKey **getViewKey()** method returns your view key. @@ -909,5 +937,109 @@ Output example: } +## sendFusionTransaction + +**sendFusionTransaction()** method allows you to send a fusion transaction, by taking funds from selected addresses and transferring them to the destination address. + +If there aren't any outputs that can be optimized, **sendFusionTransaction()** will return an error. You can use **estimateFusion** to check the outputs, available for the optimization. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +threshold | Yes | Value that determines which outputs will be optimized. Only the outputs, lesser than the threshold value, will be included into a fusion transaction. | uint64 | 1000000 +anonymity | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 +addresses | No | Array of strings, where each string is an address to take the funds from | array | See below +destinationAddress | No | An address that the optimized funds will be sent to. Valid and existing in this container address. | string | 28aYVwSsGMxCWJGCN..CZSUamsrZv + +Note: if container contains only 1 address, **destinationAddress** field can be left empty and the funds are going to be sent to this address. + +Note: if **addresses** field contains only 1 address, **destinationAddress** can be left empty and the funds are going to be sent to this address. + +Note: in the rest of the cases, **destinationAddress** field is mandatory and must contain an address. + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +transactionHash | Hash of the sent transaction. | string | 93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f + +Input Example: + + { + 'params':{ + 'anonymity':6, + 'threshold':1000000, + 'addresses':[ + '27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh', + '24JtjYsLdSJKNNDCPGdMco5NbMBLqVWZ5ZiW5vzjXQUrLpMs1MRnfTQ3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFXHARwn', + '21fYPCpaM3ochSSyLnhDAhgw1yV5WPb5c1BfyX5eidbMGyEPgnbSgJW3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX8VQMv' + ], + 'destinationAddress':'27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh' + }, + 'jsonrpc':'2.0', + 'id':'test', + 'method':'sendFusionTransaction' + } + +Return value example: + + { + 'jsonrpc':'2.0', + 'id':'test', + 'result':{ + 'transactionHash':'93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f' + } + } + + +## estimateFusion + +**estimateFusion()** method counts the number of unspent outputs of the specified addresses and returns how many of those outputs can be optimized. + +This method is used to understand if a fusion transaction can be created. If **fusionReadyCount** returns a value = 0, then a fusion transaction cannot be created. + +Input: + +Argument | Mandatory | Description | Format | Example +-----------|-----------|-----------|-----------|-----------| +threshold | Yes | Value that determines which outputs will be optimized. Only the outputs, lesser than the threshold value, will be included into a fusion transaction. | uint64 | 1000000 +addresses | No | Array of strings, where each string is an address to take the funds from. | array | See below + +Output: + +Argument | Description | Format | Example +-----------|-----------|-----------|-----------| +totalOutputCount | Total number of unspent outputs of the specified addresses. | uint64 | 1000 +fusionReadyCount | Number of outputs that can be optimized. | uint64 | 50 + +Input example: + + { + 'params':{ + 'threshold':1000000, + 'addresses':[ + '27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh', + '24JtjYsLdSJKNNDCPGdMco5NbMBLqVWZ5ZiW5vzjXQUrLpMs1MRnfTQ3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFXHARwn', + '21fYPCpaM3ochSSyLnhDAhgw1yV5WPb5c1BfyX5eidbMGyEPgnbSgJW3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX8VQMv' + ] + }, + 'jsonrpc':'2.0', + 'id':'test', + 'method':'estimateFusion' + } + +Output example: + + { + 'jsonrpc':'2.0', + 'id':'test', + 'result':{ + 'totalOutputCount':1000, + 'fusionReadyCount':50 + } + } + + [Forknote_RPC_Wallet]: /documentation/payment-gateway/ [Configure_Forknote_RPC_Wallet]: /documentation/payment-gateway/#configure-forknote-rpc-wallet diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md index a4d9284..e3b513f 100644 --- a/content/documentation/simplewallet/index.md +++ b/content/documentation/simplewallet/index.md @@ -42,13 +42,14 @@ EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 +CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 = 10000 CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin @@ -80,13 +81,13 @@ GENESIS_BLOCK_REWARD=0 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 p2p-bind-port=29829 rpc-bind-port=29830 BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc CRYPTONOTE_NAME=test -UPGRADE_HEIGHT=1 +UPGRADE_HEIGHT_V2=1 CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8 CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038 diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md index 2ab67fa..74a3909 100644 --- a/content/guides/setup-private-blockchain.md +++ b/content/guides/setup-private-blockchain.md @@ -65,14 +65,14 @@ SYNC_FROM_ZERO=1 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 p2p-bind-port=6966 rpc-bind-port=6967 BYTECOIN_NETWORK=96a24a34-4585-25af-884d-6039b3ab7fd1 CRYPTONOTE_NAME=imaginary_blockchain GENESIS_COINBASE_TX_HEX=010a01ff0001a4b4e6cc99b3e6cc190285f558a81f548c1a7be29836e8f512cc33738d07326eeb22a6f4c5b5e1a3aa8e210187216740de551aedfd1b6d8ee7ce73e88a2cc22297d44b46dd4ee5ef6d864e5b -UPGRADE_HEIGHT=1 +UPGRADE_HEIGHT_V2=1 seed-node=127.0.0.1:6966
    diff --git a/content/guides/starting-seed-node.md b/content/guides/starting-seed-node.md index db2374e..3fd3b5a 100644 --- a/content/guides/starting-seed-node.md +++ b/content/guides/starting-seed-node.md @@ -78,18 +78,19 @@ EMISSION_SPEED_FACTOR=18 DIFFICULTY_TARGET=120 CRYPTONOTE_DISPLAY_DECIMAL_POINT=12 MONEY_SUPPLY=18446744073709551615 -GENESIS_BLOCK_REWARD=0 +GENESIS_BLOCK_REWARD=1844674407370955300 +SYNC_FROM_ZERO=1 DEFAULT_DUST_THRESHOLD=1000000 MINIMUM_FEE=1000000 CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10 -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000 +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000 CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86 -p2p-bind-port=13539 -rpc-bind-port=13540 -BYTECOIN_NETWORK=e3df4e17-934c-9768-d63d-37df3503e80b -CRYPTONOTE_NAME=testcoin -UPGRADE_HEIGHT=1 -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449 +p2p-bind-port=6966 +rpc-bind-port=6967 +BYTECOIN_NETWORK=96a24a34-4585-25af-884d-6039b3ab7fd1 +CRYPTONOTE_NAME=imaginary_blockchain +GENESIS_COINBASE_TX_HEX=010a01ff0001a4b4e6cc99b3e6cc190285f558a81f548c1a7be29836e8f512cc33738d07326eeb22a6f4c5b5e1a3aa8e210187216740de551aedfd1b6d8ee7ce73e88a2cc22297d44b46dd4ee5ef6d864e5b +UPGRADE_HEIGHT_V2=1 seed-node=45.32.238.88:13539
    From 8ee4c787f5d4497ebbcddecfb7aa2b02ecf0efc2 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Fri, 22 Apr 2016 08:10:30 +0300 Subject: [PATCH 28/56] Release note about 1.0.10 added --- ...2016-04-22-forknote-1.0.10.0.1-released.md | 26 +++++++++++++++++++ content/guides/index.md | 6 ++--- content/guides/setup-private-blockchain.md | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 content/blog/2016-04-22-forknote-1.0.10.0.1-released.md diff --git a/content/blog/2016-04-22-forknote-1.0.10.0.1-released.md b/content/blog/2016-04-22-forknote-1.0.10.0.1-released.md new file mode 100644 index 0000000..db7585f --- /dev/null +++ b/content/blog/2016-04-22-forknote-1.0.10.0.1-released.md @@ -0,0 +1,26 @@ +--- +kind: article +title: "Forknote 1.0.10.0.1 Release" +created_at: 2016-04-22 +author_name: pmitchev +--- + +Forknote 1.0.10.0.1 was released. + +Since Bytecoin hardforks at this version, because of the new block size, all existing Forknote blockchains (Dashcoin, Magnatoj, Ethanolium, ...) hardforked or will hardfork as well. +We urge everyone to update since old wallets won't be able to support new block sizes. + +Changes: + + * Core changed to Bytecoin 1.0.10 (more info (https://bytecoin.org/news/bytecoin-1.0.10-new-block-size-rpc-wallet-fusion-transactions/)) + * --config-file option of forknoted and simplewallet is now mandatory + + +Configuration variables changes: + + * UPGRADE_HEIGHT changed to UPGRADE_HEIGHT_V2 + * CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE changed to CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 + * New parameters added: CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE, UPGRADE_HEIGHT_V3 + +You can download this release from here: +https://github.com/forknote/forknote/releases/tag/1.0.10.0.1 diff --git a/content/guides/index.md b/content/guides/index.md index 8a23faf..8af5a69 100644 --- a/content/guides/index.md +++ b/content/guides/index.md @@ -30,10 +30,10 @@ You can find more about the available configuration options in our [documentatio ### Examples -Dashcoin is the preconfigured blockchain in Forknote. To connect the daemon to the Dashcoin just start `forknoted`: +To connect the daemon to the Dashcoin, start `forknoted` with its corresponding configuration file:
    -$ ./forknoted
    +$ ./forknoted --config-file configs/dashcoin.conf
     
    To connect to the Bytecoin blockchain, start `forknoted` with its corresponding configuration file: @@ -59,7 +59,7 @@ $ ./simplewallet --config-file configs/imaginary_blockchain.conf Starting `simplewallet` for the Dashcoin blockchain:
    -$ ./simplewallet
    +$ ./simplewallet --config-file configs/dashcoin.conf
     
    Starting `simplewallet` for the Bytecoin blockchain: diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md index 74a3909..b7b4d7f 100644 --- a/content/guides/setup-private-blockchain.md +++ b/content/guides/setup-private-blockchain.md @@ -20,7 +20,7 @@ Let's walk through the process of creating a configuration file for a new privat *This step is only required for blockchains has premined coins* -
    $ ./simplewallet --generate-new-wallet MY.wallet --password PASSWORD
    +
    $ ./simplewallet --config-file configs/dashcoin.conf --generate-new-wallet MY.wallet --password PASSWORD
     
     config path exist
     forknote wallet v1.0.9.1.662()
    
    From 8bd800fe25e3e6dc64a1000a718eb7a9deb285ff Mon Sep 17 00:00:00 2001
    From: Petar Mitchev 
    Date: Sat, 30 Apr 2016 21:18:27 +0300
    Subject: [PATCH 29/56] Adding upgrade_height_v3 to docs
    
    ---
     content/documentation/cryptonote-generator/index.md | 3 +++
     content/documentation/daemon/index.md               | 3 ++-
     content/documentation/payment-gateway/index.md      | 3 ++-
     content/documentation/simplewallet/index.md         | 3 ++-
     content/guides/setup-private-blockchain.md          | 1 +
     content/guides/starting-seed-node.md                | 1 +
     static/partials/create.js                           | 1 +
     static/search-index.json                            | 5 +++++
     8 files changed, 17 insertions(+), 3 deletions(-)
    
    diff --git a/content/documentation/cryptonote-generator/index.md b/content/documentation/cryptonote-generator/index.md
    index 85f01b5..ce3298f 100644
    --- a/content/documentation/cryptonote-generator/index.md
    +++ b/content/documentation/cryptonote-generator/index.md
    @@ -42,6 +42,7 @@ CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transact
     MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 blockchains
     EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 blockchains
     UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains
    +UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains
     DIFFICULTY_CUT | Timestamps to cut after sorting
     DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks
     MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet
    @@ -69,6 +70,8 @@ DEFAULT_FEE | Default fee of the transactions sent through simplewallet
                 "CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX": 86,
                 "P2P_DEFAULT_PORT": 28134,
                 "RPC_DEFAULT_PORT": 28135,
    +            "UPGRADE_HEIGHT_V2": 1,
    +            "UPGRADE_HEIGHT_V3": 2,
                 "BYTECOIN_NETWORK": "3354bb33-28e2-66d3-7d92-9267413bede6",
                 "CRYPTONOTE_NAME": "newcoin",
                 "CHECKPOINTS": ["28000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8", "40000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038"],
    diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md
    index c30b838..0cc6ce0 100644
    --- a/content/documentation/daemon/index.md
    +++ b/content/documentation/daemon/index.md
    @@ -64,7 +64,8 @@ DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust
     CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT_V2 = 1 +UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains | UPGRADE_HEIGHT_V3 = 2 DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/payment-gateway/index.md index 1ae189f..f4796ab 100644 --- a/content/documentation/payment-gateway/index.md +++ b/content/documentation/payment-gateway/index.md @@ -63,7 +63,8 @@ DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT_V2 = 1 +UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains | UPGRADE_HEIGHT_V3 = 2 DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md index e3b513f..06d74fd 100644 --- a/content/documentation/simplewallet/index.md +++ b/content/documentation/simplewallet/index.md @@ -49,7 +49,8 @@ DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT = 1 +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT_V2 = 1 +UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains | UPGRADE_HEIGHT_V3 = 2 DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md index b7b4d7f..e4c2014 100644 --- a/content/guides/setup-private-blockchain.md +++ b/content/guides/setup-private-blockchain.md @@ -73,6 +73,7 @@ BYTECOIN_NETWORK=96a24a34-4585-25af-884d-6039b3ab7fd1 CRYPTONOTE_NAME=imaginary_blockchain GENESIS_COINBASE_TX_HEX=010a01ff0001a4b4e6cc99b3e6cc190285f558a81f548c1a7be29836e8f512cc33738d07326eeb22a6f4c5b5e1a3aa8e210187216740de551aedfd1b6d8ee7ce73e88a2cc22297d44b46dd4ee5ef6d864e5b UPGRADE_HEIGHT_V2=1 +UPGRADE_HEIGHT_V3=2 seed-node=127.0.0.1:6966
    diff --git a/content/guides/starting-seed-node.md b/content/guides/starting-seed-node.md index 3fd3b5a..44e3121 100644 --- a/content/guides/starting-seed-node.md +++ b/content/guides/starting-seed-node.md @@ -91,6 +91,7 @@ BYTECOIN_NETWORK=96a24a34-4585-25af-884d-6039b3ab7fd1 CRYPTONOTE_NAME=imaginary_blockchain GENESIS_COINBASE_TX_HEX=010a01ff0001a4b4e6cc99b3e6cc190285f558a81f548c1a7be29836e8f512cc33738d07326eeb22a6f4c5b5e1a3aa8e210187216740de551aedfd1b6d8ee7ce73e88a2cc22297d44b46dd4ee5ef6d864e5b UPGRADE_HEIGHT_V2=1 +UPGRADE_HEIGHT_V3=2 seed-node=45.32.238.88:13539
    diff --git a/static/partials/create.js b/static/partials/create.js index 29d7501..dc6cf8e 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -535,6 +535,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil } } $scope.coin_daemon_config += "UPGRADE_HEIGHT_V2=1" + "\n"; + $scope.coin_daemon_config += "UPGRADE_HEIGHT_V3=2" + "\n"; if(!$scope.coin.core['SEED_NODES'].length) { $scope.coin_daemon_config += "seed-node=127.0.0.1:" + $scope.coin.core['P2P_DEFAULT_PORT']; } diff --git a/static/search-index.json b/static/search-index.json index daafc58..252eac6 100644 --- a/static/search-index.json +++ b/static/search-index.json @@ -30,6 +30,11 @@ "title": "Forknote 1.0.9.1 Release", "section": "Blog/" }, + { + "url": "/blog/2016-04-22-forknote-1/", + "title": "Forknote 1.0.10.0.1 Release", + "section": "Blog/" + }, { "url": "/blog/all_posts/", "title": "¬", From 1f36502288e382bbc153c104eff51abaf0b60750 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Tue, 10 May 2016 21:27:13 +0300 Subject: [PATCH 30/56] Change api port --- static/partials/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/partials/create.js b/static/partials/create.js index dc6cf8e..8671737 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -473,7 +473,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil AddressPrefix : addressPrefix, Addresses : $scope.coin.core.ADDRESSES }; - var res = $http.post('http://api.forknote.net:8080/genesis_tx/', dataObj); + var res = $http.post('http://api.forknote.net:8090/genesis_tx/', dataObj); res.success(function(data, status, headers, config) { $scope.coin.core.GENESIS_COINBASE_TX_HEX = data; setTimeout(function(){$('#coin_daemon_config_modal').modal('show')}, 100); From c77e52112bc1e1f3d0e11f861b834ff836b393f0 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sat, 2 Jul 2016 03:17:20 +0300 Subject: [PATCH 31/56] Forknote v1.0.11 --- content/documentation/daemon/html-rpc-api.md | 19 +- content/documentation/daemon/index.md | 131 ++- content/documentation/daemon/json-rpc-api.md | 688 +---------- .../payment-gateway/json-rpc-api.md | 1045 ----------------- .../{payment-gateway => rpc-wallet}/index.md | 113 +- .../documentation/rpc-wallet/json-rpc-api.md | 16 + content/documentation/simplewallet/index.md | 92 +- .../simplewallet/json-rpc-api.md | 456 +------ content/download.md | 12 +- content/guides/setup-private-blockchain.md | 25 +- content/guides/starting-seed-node.md | 47 +- layouts/sidebar-documentation.html | 4 +- 12 files changed, 221 insertions(+), 2427 deletions(-) delete mode 100644 content/documentation/payment-gateway/json-rpc-api.md rename content/documentation/{payment-gateway => rpc-wallet}/index.md (60%) create mode 100644 content/documentation/rpc-wallet/json-rpc-api.md diff --git a/content/documentation/daemon/html-rpc-api.md b/content/documentation/daemon/html-rpc-api.md index 36b2488..0d5a980 100644 --- a/content/documentation/daemon/html-rpc-api.md +++ b/content/documentation/daemon/html-rpc-api.md @@ -8,14 +8,11 @@ sidebar_nav: sidebar-documentation # Daemon HTTP RPC API -URL | Description | Format | Arg 1 | Arg 2 | Return value ------------|-----------|-----------|-----------|-----------|-----------| -/getheight | Returns current chain height | JSON | - | - | [int] height -/getknownblockids | Returns list of known block ids | JSON | - | - | [list] main chain block ids
    [list] alternative chains block ids
    [list] invalid block ids -/start_mine | Starts mining threads | JSON | [string] wallet address | [int] number of threads | [string] status -/stop_mine | Stops mining threads | JSON | - | - | [string] status -/gettransactions | Returns transactions as serialized blobs | JSON | [list] tx ids | - | [list] transactions as hex
    [list] missing tx ids
    [string] status -/sendrawtransactions | Send transaction to the network | JSON | [string] serialized transaction in hex form | - | [string] status -/getblocks.bin | Returns blocks in binary form | BIN | [list] block ids | - | [list] blocks
    [int] start height
    [int] current height
    [string] status -/get_o_indexes.bin |Get global output indicies | BIN | [hash] transaction id | - | [vector] output indicies
    [string] status -/getrandom_outs.bin | Get random output indicies
    for a given amount
    (purpose: for ring signatures) | BIN | [list] amounts | [int] count | [vector]
    { [int] amount; [list] outs }
    output entries +Forknote's Daemon is using the same HTTP API as Bytecoin's daemon. A list of the available methods and usage examples can be found at the Bytecoin Wiki: + +[Bytecoin Daemon HTTP RPC API][Bytecoin_Daemon_HTTP_RPC_API] + + + +[Bytecoin_Daemon_HTTP_RPC_API]: https://wiki.bytecoin.org/wiki/Daemon_HTTP_RPC_API + diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 0cc6ce0..fa3ac9d 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -27,78 +27,79 @@ sidebar_nav: sidebar-documentation Addresses for premined coins -##Configuration options - -Option | Description |   Config Example   ------------|-----------|-----------| -log-file | A name of log file that you want to use for logging. | log-file = mylog.log -log-level | Level of logging. Default is 1. | log-level = 2 -no-console | Disable daemon console commands | no-console -testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. | testnet -rpc-bind-ip | Specify ip to bind rpc server | rpc-bind-ip = 127.0.0.1 -rpc-bind-port | Specify port to bind rpc server | rpc-bind-port = 29081 -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port -extra-messages-file | Specify file for extra messages to include into coinbase transactions | extra-messages-file = message.txt -start-mining | Specify wallet address to mining for | start-mining = FPM...yR -mining-threads | Specify mining threads count | mining-threads = 1 -P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED_PUB_KEY = 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 -GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE_TX_HEX = 01..4a -CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 -EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_SPEED_FACTOR = 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 = 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 -DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 -CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 -MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT_V2 = 1 -UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains | UPGRADE_HEIGHT_V3 = 2 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 -CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin -CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 -GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units | GENESIS_BLOCK_REWARD = 1844674407370955161 - +##Command line options and settings options + +Option | Description +-----------|-----------| +log-file | A name of log file that you want to use for logging. +log-level | Level of logging. Default is 1. +no-console | Disable daemon console commands +testnet | Used to deploy test nets. Checkpoints and hardcoded seeds are ignored, network id is --data-dir flag. The wallet must be launched with --testnet flag. +rpc-bind-ip | Specify ip to bind rpc server +rpc-bind-port | Specify port to bind rpc server +p2p-bind-ip | Interface for p2p network protocol +p2p-bind-port | Port for p2p network protocol +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) +add-peer | Manually add peer to local peerlist +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored +seed-node | Connect to a node to retrieve peer addresses, and disconnect +hide-my-port | Do not announce yourself as peerlist candidate +extra-messages-file | Specify file for extra messages to include into coinbase transactions +start-mining | Specify wallet address to mining for +mining-threads | Specify mining threads count +enable-cors | Adds header 'Access-Control-Allow-Origin' to the daemon's RPC responses +enable-blockchain-indexes | Enable blockchain indexes + +##Blockchain options + +Option | Description +-----------|-----------| +BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks +CHECKPOINT | Checkpoints. Format: HEIGHT:HASH +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins +CRYPTONOTE_COIN_VERSION | Use '1' for Cryptonote coin clones (the new version) +CRYPTONOTE_DISPLAY_DECIMAL_POINT | 1 coin = 10^(this value) atomic units +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transactions +CRYPTONOTE_NAME | Cryptonote name. Used for storage directory +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator +DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust +DIFFICULTY_CUT | Timestamps to cut after sorting +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks +DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. +EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. +EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins +GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units +GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block +KILL_HEIGHT | End blockchain at height +MANDATORY_TRANSACTION | Only blocks with more than 1 transactions are valid (exluding the base transaction) +MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins +MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons +MONEY_SUPPLY | Total amount of coins to be emitted. +P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key +UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains +UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains ##Example of a config file
    $ cat ./notrealcoin.conf 
     
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    +BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -GENESIS_BLOCK_REWARD=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=29829
    -rpc-bind-port=29830
    -BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc
    -CRYPTONOTE_NAME=test
    +CRYPTONOTE_NAME=fakecoin
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +P2P_STAT_TRUSTED_PUB_KEY=
    +
     UPGRADE_HEIGHT_V2=1
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT_V3=2
    +
    +p2p-bind-port=8080
    +rpc-bind-port=8081
    +
    +seed-node=127.0.0.1:8080
     
     
    diff --git a/content/documentation/daemon/json-rpc-api.md b/content/documentation/daemon/json-rpc-api.md index d25b29c..550505d 100644 --- a/content/documentation/daemon/json-rpc-api.md +++ b/content/documentation/daemon/json-rpc-api.md @@ -8,689 +8,15 @@ sidebar_nav: sidebar-documentation # Daemon JSON RPC API -* TOC -{:toc} - -To start Daemon JSON RPC API server you should specify a port on which server binds (additionally to standard daemon's arguments). You can choose any free port. To do that execute the following command from the command line: - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-port=29081 
    -
    - -Atlernatively, you can edit *rpc-bind-port* in your configuration file - - rpc-bind-port=29081 - - -If you want Daemon to be accessed from other computer not only yours you should also use a --rpc-bind-ip 0.0.0.0 command. To do that execute the following command from the command line: - -
    - forknoted --config-file <path_to_config_file> --rpc-bind-ip=0.0.0.0 --rpc-bind-port=29081 
    -
    - -Atlernatively, you can edit your configuration file - - rpc-bind-port=29081 - rpc-bind-ip=0.0.0.0 - -Having done that you're ready to operate with the daemon through the following API URLs (e.g., your IP address is 126.0.1.100): - - http://126.0.1.100:29081/json_rpc - http://localhost:29081/json_rpc - - -## getblockcount - -Returns current chain height. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "object", - "properties" : { - "count" : { - "type" : "integer", - "minimum": 0, - "description": "" - }, - "status" : { - "type" : "string" - } - }, - "required": ["count", "status"] - } - }, - "required": ["result"] - } - -### Example (getblockcount) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockcount", - "params": {} - } - -Output: +Forknote's Daemon is using the same JSON API as Bytecoin's daemon. A list of the available methods and usage examples can be found at the Bytecoin Wiki: - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "count": 123456, - "status": "OK" - } - } - - -##getblockhash - -Returns block hash by its height - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "height" : { - "type" : "integer" - } - }, - "required" : ["jsonrpc", "method", "height"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "string", - "description": "" - } - }, - "required": ["result"] - } - -###Example (getblockhash) - -Input: - - { - "jsonrpc": "2.0", - "id": "test", - "method": "on_getblockhash", - "params": [123456] - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": "a7428..." - } +[Bytecoin Daemon JSON RPC API][Bytecoin_Daemon_JSON_RPC_API] -##getblocktemplate - -Returns blocktemplate with an empty “hole” for nonce. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "reserve_size" : { - "type" : "integer" - }, - "wallet_address" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "reserve_size", "wallet_address"] - } - -Return value schema - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "difficulty" : { - "type" : "integer" - }, - "height" : { - "type" :"integer" - }, - "reserved_offset" : { - "type" : "integer" - }, - "blocktemplate_blob" : { - "type" : "string" - }, - "status" : { - "type" : "string" - } - }, - "required": ["difficulty", "height", "reserved_offset", "blocktemplate_blob", "status"] - } - "required": ["result"] - } - -###Example (getblocktemplate) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblocktemplate", - "params": { - "reserve_size": 200, - "wallet_address": "28j5g2Hbe1..." - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "blocktemplate_blob": "0100de...", - "difficulty": 65563, - "height": 123456, - "reserved_offset": 395, - "status": "" - } - } - - -##submitblock - -Submits mined block. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "block" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "block"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "status" : { - "type" : "string", - "description": "" - }, - "required": ["status"] - } - }, - "required": ["result"] - } - -### Example (submitblock) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "submitblock", - "params": ["0100b...."] - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "status" : "OK" - } - } - - -##getlastblockheader - -Returns last block header. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "result" : { - "type" : "object", - "properties" : { - "block_header : { - "type" : "object", - "properties" : { - "major_version" : { - "type" : "integer", - "description" : "" - }, - "minor_version" : { - "type" : "integer", - "description" : "" - }, - "timestamp" : { - "type" : "integer", - "description" : "UNIX timestamp" - }, - "prev_hash" : { - "type" : "string", - "description" : "previous block's hash" - }, - "nonce" : { - "type" : "integer", - "description" : "" - }, - "orphan_status" : { - "type" : "boolean", - "description" : "True if the block was marked as orphaned" - }, - "height" : { - "type" : "integer", - "description" : "" - }, - "depth" : { - "type" : "integer", - "description" : "last_block_height - this_block_height" - }, - "hash" : { - "type" : "string", - "description" : "" - }, - "difficulty" : { - "type" : "integer", - "description" : "" - }, - "reward" : { - "type" : "integer", - "description" : "Reward for the block in atomic units" - } - }, - "required": [ - "major_version", - "minor_version", - "timestamp", - "prev_hash", - "nonce", - "orphan_status", - "height", - "depth", - "hash", - "difficulty", - "reward" - ] - }, - "status" : { - "type" : "string" - } - }, - "required": ["block_header", "status"] - } - }, - "required": ["result"] - } - -### Example (getlastblockheader) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getlastblockheader" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getblockheaderbyhash - -Returns last block header by given hash. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "hash" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method", "hash"] - } - -Return value schema: - -*See [getlastblockheader](#getlastblockheader) above* - -### Example (getblockheaderbyhash) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockheaderbyhash", - "params": { - "hash" : "9a8be8..." - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getblockheaderbyheight - -Returns block header by given block height. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "height" : { - "type" : "integer" - } - }, - "required" : ["jsonrpc", "method", "height"] - } - -Return value schema: - -*See [getlastblockheader](#getlastblockheader) above* - -### Example (getblockheaderbyheight) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getblockheaderbyheight", - "params": { - "height" : 123456 - } - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "block_header": { - "depth": 1, - "difficulty": 65198, - "hash": "9a8be83...", - "height": 123456, - "major_version": 1, - "minor_version": 0, - "nonce": 2358499061, - "orphan_status": false, - "prev_hash": "dde56b7e...", - "reward": 44090506423186, - "timestamp": 1356589561 - }, - "status": "OK" - } - } - - -##getcurrencyId - -Returns unique currency identifier. - -URL: - - /json_rpc - -Input arguments: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - }, - "required" : ["jsonrpc", "method"] - } - -Return value schema: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "BCN JSON RPC API", - "type": "object", - - "properties" : { - "currency_id_blob" : { - "type" : "string" - } - } - } - -### Example (getcurrencyId) - -Input: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "getcurrencyid" - } - -Output: - - { - "id": "test", - "jsonrpc": "2.0", - "result": { - "currency_id_blob" : "a7..." - } - } +#Additional method added to Forknote +* TOC +{:toc} ##f_get_blockchain_settings @@ -981,3 +307,7 @@ Output: } } + + +[Bytecoin_Daemon_JSON_RPC_API]: https://wiki.bytecoin.org/wiki/Daemon_JSON_RPC_API + diff --git a/content/documentation/payment-gateway/json-rpc-api.md b/content/documentation/payment-gateway/json-rpc-api.md deleted file mode 100644 index d6e005f..0000000 --- a/content/documentation/payment-gateway/json-rpc-api.md +++ /dev/null @@ -1,1045 +0,0 @@ ---- -title: Payment gateway JSON RPC API | Forknote -layout: documentation -body_class: developers -subnav_class: docs-documentation -sidebar_nav: sidebar-documentation ---- - -# Payment gateway JSON RPC API - -* TOC -{:toc} - -On this page you will find description of every method in Forknote RPC Wallet API. Forknote RPC Wallet is a HTTP server which provides JSON 2.0 RPC interface for Forknote payment operations and address management. Each method has its own page that can be found by clicking on this method. - -More on how to start and operate Forknote RPC Wallet can be found here: [Forknote RPC Wallet][Forknote_RPC_Wallet] - -To make a JSON PRC request to your Forknote RPC Wallet you should use POST request that looks like this: - - http://:/json_rpc - -Where: - -* <service address> is an IP of Forknote RPC Wallet, if RPC Wallet is located on local machine it is either 127.0.0.1 or localhost -* <service port> is Forknote RPC Wallet port, by default it is binded to 8070 port, but it can be manually binded to any port you want, read more about this [here][Configure_Forknote_RPC_Wallet]. - - -#Forknote RPC Wallet API methods - -## reset - -**reset()** method allows you to re-sync your wallet. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -viewSecretKey | No | Private view key | string | 4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907 - -No output in case of success. - -**Important:** If the view_secret_key was not pointed out reset() methods resets the wallet and re-syncs it. If the view_secret_key argument was pointed out reset() method substitutes the existing wallet with a new one with a specified view_secret_key and creates an address for it. - -Input value example: - - { - 'params':{ - 'viewSecretKey':'4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'reset' - } - -Output value example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - } - } - - -## save - -**save()** method allows you to save your wallet by request. - -No input. - -No output in case of success. - -Input value example: - - { - 'params':{ - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'save' - } - -Output value example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - } - } - - -## getViewKey - -**getViewKey()** method returns your view key. - -No input. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -viewSecretKey | Private view key | string | 4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907 - -Input Example: - - { - 'params':{ - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getViewKey' - } - -Return value example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'viewSecretKey':'4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907' - } - } - - -## getSpendKeys - -**getSpendKeys()** method returns your spend keys. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | Valid and existing in this container address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -spendSecretKey | Private spend key | string | 4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907 -spendPublicKey | Public spend key | string | 4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907 - -Input Example: - - { - 'params':{ - 'address':'22p4wUHAMndSscvtYErtqUaYrcUTvrZ9zhWwxc3JtkBHAnw4FJqenZyaePSApKWwJ5BjCJz1fKJoA6QHn5j6bVHg8A8dyhp' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getSpendKeys' - } - -Return value example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'spendSecretKey':'4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907' - 'spendPublicKey':'4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907' - } - } - - -## getStatus - -**getStatus()** method returns information about the current RPC Wallet state: block_count, known_block_count, last_block_hash and peer_count. - -No input. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -blockCount | Node's known number of blocks | uint32 | 123456 -knownBlockCount | Maximum known number of blocks of all seeds that are connected to the node | uint32 | 123123 -lastBlockHash | Hash of the last known block | string | 8a6f1cb7ed7a9db4751d7b283a0482baff20567173dbfae136c9bceb188e51c4 -peerCount | Connected peers number | uint32 | 5 - -Input example: - - { - 'params':{ - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getStatus' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'peerCount':2, - 'blockCount':1, - 'lastBlockHash':'8a6f1cb7ed7a9db4751d7b283a0482baff20567173dbfae136c9bceb188e51c4', - 'knownBlockCount':0 - } - } - - -## getAddresses - -getAddresses() method returns an array of your RPC Wallet's addresses. - -No input. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -addresses | Array of strings, where each strings is an address | array | See below - -Input example: - - { - 'params':{ - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getAddresses' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'addresses':[ - '2785gGLpyMJhw4JFVVd4vMDeRMmvTNda9MMgQNBd8se2a1mNRcKYubnaCk5zubLSefZAAmjDk9Fyejb2hVDRZQ23MB2BgUW', - '2785gGLpyMJhw4JFVVd5kFDeRMmvTNda9CClNASd8se2a1mNRcKYubnaCk5zubLSefZAAmjDk9Fyejb2hVDRZQ23MB2BgUW' - ] - } - } - - -## createAddress - -**createAddress()** method creates an additional address in your wallet. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -secretSpendKey | No | Private spend key. If secretSpendKey was specified, RPC Wallet creates spend address | string | -publicSpendKey | No | Public spend key. If publicSpendKey was specified, RPC Wallet creates view address | string | - -**Note:** If none of the above mentioned parameters were specified, RPC Wallet creates spend address with generated spend key.
    -**Note:** both above mentioned parameters can't be present in a single request - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -address | Created address | string | 2A8CkYbbEqSSeGPZPmfVvyUM..UqLbtcoyvETNt7MqSw - - -Input value example: - - { - "jsonrpc": "2.0", - "id" : "test", - "method": "create_address", - "params": { - } - } - -Output value example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - } - } - - -## deleteAddress - -**delete_address()** method deletes a specified address. - - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | Yes | An address to be deleted. | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - - -Output: - -In case of success returns an empty JSON object. - - -Input example: - - { - "params": - { - "address":"2A8CkYbbEqSSeGPZPmfVvyUMR3PB1RxQ4XTGE2x7cFsUhxe4hwPzJJBd4TQ38Mc3R7hqRXuU13ABxUqLbtcoyvETNt7MqSw" - }, - "jsonrpc": "2.0", - "id": "1", - "method": "delete_address" - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": {} - } - - -## getBalance - -**getBalance()** method returns a balance for a specified address.
    -**Please note:** If address is not specified, returns a cumulative balance of all RPC Wallet's addresses. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -address | No | Valid and existing address in this particular wallet | string | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -availableBalance | Available balance of the specified address | uint64 | 123123 -lockedAmount | Locked amount of the specified address | uint64 | 123123 - -Input example: - - { - 'params':{ - 'address':'2785gGLpyMJhw4JFVVd4vMDeRMmvTNda9MMgQNBd8se2a1mNRcKYubnaCk5zubLSefZAAmjDk9Fyejb2hVDRZQ23MB2BgUW' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getBalance' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'lockedAmount':210, - 'availableBalance':110 - } - } - - -## getBlockHashes - -**getBlockHashes()** method returns an array of block hashes for a specified block range. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -firstBlockIndex | Yes | Starting height | uint32 | 123123 -blockCount | Yes | Number of blocks to process | uint32 | 20 - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -blockHashes | Array of strings, where each element is a block hash | array | example - -Input example: - - { - 'params':{ - 'blockCount':11, - 'firstBlockIndex':0 - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getBlockHashes' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'blockHashes':[ - '8a6f1cb7ed7a9db4751d7b283a0482baff20567173dbfae136c9bceb188e51c4', - '657cd1c33df7f4250d581c97db665cb4a1856ebfadd6efabaeab745c2c76b1be', - '21047174f74576b6722e72646d7bd553e17d7c9f07fef05151bb1f9df7ed9dd8', - '504b9bfb2cd34531551cb2d68ea3e34e030d991164589ba7ed24e16fed3ea374', - 'd9d36b5226d11b2cf60e3cf2038b21032c4ac753eabc32fbdd506158f95a69ca', - '171be105f8e39729838144c78ced336d0ebc29a4bd2c7a22901c0e8c0eaabb42', - '5f7933bd0257649a44e571d59a9f4083297acbdd338c1c0094a7226ade8d0f0f', - '967fd52a57e8193f56329bb37abdddce717098429f62c00776342c605a28e19b', - '6b1a21634a3d72821c43a244af16098eba7c0a59a2e409efa38bd420702f7594', - '7bb5ca944c5f916f80d50246f48789cc4605efd166efc2308553fe0d208fbe12', - '83dfef7c288121d87e60f52c74d3da6b422d4b8581ce732ef8b54273bd6c4f45' - ] - } - } - - -## getTransactionHashes - -**getTransactionHashes()** method returns an array of block and transaction hashes.
    -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -addresses | No | Array of strings, where each string is an address | array | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw -blockHash | Only one of these parameters (blockHash or firstBlockIndex) is allowed. | Hash of the starting block | string | f8f07ace392474bfbdc0fc30749a45f779a8aea10c489a103270f63ed88178ad -firstBlockIndex | Only one of these parameters (blockHash or firstBlockIndex) is allowed. | Starting height | uint32 | 123123 -blockCount | Yes | Number of blocks to return transaction hashes from | uint32 | 20 -paymentId | No | Valid payment_id | string | somePaymentId - -**Note:** if **paymentId** parameter is set, getTransactionHashes() method returns transaction hashes of transactions that contain specified payment_id. (in the set block range)
    -**Note:** if **addresses** parameter is set, getTransactionHashes() method returns transaction hashes of transactions that contain transfer from at least one of specified addresses.
    -**Note:** if both above mentioned parameters are set, getTransactionHashes() method returns transaction hashes of transactions that contain both specified payment_id and transfer from at least one of specified addresses. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -items | Array that contains:
    * blockHash - string - hash of the block which contains transaction hashes
    * transactionHashes - array - array of strings, where each string is a transaction hash | array | See below - -Input example: - - { - 'params':{ - 'blockCount':100, - 'firstBlockIndex':0, - 'addresses':[ - '2AFUzhkRatH2kQ19RaUNiE33mMQ3ejvJrGDhdDo77zn3RJQquQG7QBidoe7AD4EgBbChteaVesg3xcLVdq9EoCHH4NV9mxp' - ] - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getTransactionHashes' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'items':[ - { - 'transactionHashes':[ - 957dcbf54f327846ea0c7a16b2ae8c24ba3fa8305cc3bbc6424e85e7d358b44b - 25bb751814dd39bf46c972bd760e7516e34200f5e5dd02fda696671e11201f78 - ], - 'blockHash':'8a6f1cb7ed7a9db4751d7b283a0482baff20567173dbfae136c9bceb188e51c4' - } - ] - } - } - -## getTransactions - -**getTransactions()** method returns an array of block and transaction hashes. -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -addresses | No | Array of strings, where each string is an address | array | 2A8CkYbbEqSSeGPZPmf..tcoyvETNt7MqSw -blockHash | Only one of these parameters (blockHash or firstBlockIndex) is allowed. | Hash of the starting block | string | f8f07ace392474bfbdc0fc30749a45f779a8aea10c489a103270f63ed88178ad -firstBlockIndex | Only one of these parameters (blockHash or firstBlockIndex) is allowed. | Starting height | uint32 | 123123 -blockCount | Yes | Number of blocks to return transaction hashes from | uint32 | 20 -paymentId | No | Valid payment_id | string | somePaymentId - -**Note:** if **paymentId** parameter is set, getTransactions() method returns transaction hashes of transactions that contain specified payment_id. (in the set block range)
    -**Note:** if **addresses** parameter is set, getTransactions() method returns transaction hashes of transactions that contain transfer from at least one of specified addresses.
    -**Note:** if both above mentioned parameters are set, getTransactions() method returns transaction hashes of transactions that contain both specified payment_id and transfer from at least one of specified addresses. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -items | Array that contains:
    * block_hash - string - hash of the block which contains a transaction
    * transactions - array - contains
      * transactionHash - string - hash of the transaction
      * blockIndex - uint32 - number of the block that contains a transaction
      * timestamp - uint64 - timestamp of the transaction
      * isBase - boolean - shows if the transaction is a coinbase transaction or not
      * unlockTime - uint64 - height of the block when transaction is going to be available for spending
      * amount - int64 - amount of the transaction
      * fee - uint64- transaction fee
      * extra - string
      * paymentId - string - payment_id of the transaction (optional)
      * transfers - array - contains
        * address - string
        * amount - int64 | array | See below - -Input example: - - { - 'params':{ - 'blockCount':1000, - 'firstBlockIndex':1, - 'addresses':[ - '22p4wUHAMndSscvtYErtqUaYrcUTvrZ9zhWwxc3JtkBHAnw4FJqenZyaePSApKWwJ5BjCJz1fKJoA6QHn5j6bVHg8A8dyhp', - '261K6FuYL4vYvLFQx2ene92JNHip8YGyJGHCCNjPwoFE2RsRYwtzPC7aePSApKWwJ5BjCJz1fKJoA6QHn5j6bVHg8DRRpU1', - '2AVwwZ6Ju6gGeztrtHjsj42xWLavrXPN1PrpnNKGXCMcLACj2WhGqYwaePSApKWwJ5BjCJz1fKJoA6QHn5j6bVHg8A4Z9K8' - ], - paymentId:'somePaymentId' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getTransactions' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'items':[ - { - 'blockHash':'01bd06ca731914f27e143bbb902ce0bc05bff13d76faa027ea817e68f217488c', - 'transactions':[ - { - 'fee':-70368475742208, - 'extra':'0127cea59bfadc49aa02ed4a225936671e55607b5241621abca2a5e14405906dbb', - 'timestamp':1446029698, - 'blockIndex':1, - 'state':0, - 'transactionHash':'06ec210a8359f253f8b2160a0d6040cf89f2a05a553aaa577b7f508ee5d831f9', - 'amount':70368475742208, - 'unlockTime':11, - 'transfers':[ - { - 'amount':70368475742208, - 'type':0, - 'address':'22p4wUHAMndSscvtYErtqUaYrcUTvrZ9zhWwxc3JtkBHAnw4FJqenZyaePSApKWwJ5BjCJz1fKJoA6QHn5j6bVHg8A8dyhp' - } - ], - 'paymentId':, - 'isBase':True - } - ] - }, - { - 'blockHash':'28aa7d32f4274f6387969d7671bd4db98fd871bf0dd510a1df5e2ef4b1d41a35', - 'transactions':[ - { - 'fee':-70368207307776, - 'extra':'01a8e6e408282b2ddf343e20d5e9aab283723ba10ab7ab7b3131f6981b02a84431', - 'timestamp':1446029698, - 'blockIndex':2, - 'state':0, - 'transactionHash':'922d00d2e6eaed63f62d8e3b968cb08b6ea5c555fe0e6af948ab06efe6eb213a', - 'amount':70368207307776, - 'unlockTime':12, - 'transfers':[ - { - 'amount':70368207307776, - 'type':0, - 'address':'22p4wUHAMndSscvtYErtqUaYrcUTvrZ9zhWwxc3JtkBHAnw4FJqenZyaePSApKWwJ5BjCJz1fKJoA6QHn5j6bVHg8A8dyhp' - } - ], - 'paymentId':, - 'isBase':True - } - ] - } - ] - } - } - - -## getUnconfirmedTransactionHashes - -**getUnconfirmedTransactionHashes()** method returns information about the current unconfirmed transaction pool or for a specified addresses. -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -addresses | No | Array of strings, where each string is a valid address | array | See below - -**Note:** if **addresses** parameter is set, getUnconfirmedTransactionHashes() method returns transactions that contain transfer from at least one of specified addresses. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactionHashes | Array of strings, where each element is a block hash | array | See below - -Input example: - - { - 'params':{ - 'addresses':[ - '26hM1rZa9wWFHSUBbdrof3C5BZ37s1XiLcVnK3xMSrn1583SEBQ98MnTHvsVSkNFbFWgjhrhmdNzgJDy3JudNV9BFMs66ao', - '27am7ubgS834uVkpMgnqyKicxEJTLNJeL3QtC2zaJuHMbPyBkHcRBnQTHvsVSkNFbFWgjhrhmdNzgJDy3JudNV9BFLppiKL', - '21pbz9qMWKq6xvFAYe723V4adjEF4ZXNrcJHZ1JFB2geHVwDFuze8A4THvsVSkNFbFWgjhrhmdNzgJDy3JudNV9BFLL4WH8' - ] - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getUnconfirmedTransactionHashes' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'transactionHashes':[ - ..., - ..., - ... - ] - } - } - - -## getTransaction - -**getTransaction()** method returns information about a particular transaction. -Transaction consists of transfers. Transfer is an amount-address pair. There could be several transfers in a single transaction. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transactionHash | Yes | Hash of the requested transaction | string | example - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transaction | Contains:
    * transactionHash - string - hash of the transaction
    * blockIndex - uint32 - number of the block that contains a transaction (optional)
    * timestamp - uint64 - timestamp of the transaction (optional)
    * isBase - boolean - shows if the transaction is a coinbase transaction or not
    * unlockTime - uint64 - height of the block when transaction is going to be available for spending
    * amount - int64 - amount of the transaction
    * fee - uint64- transaction fee
    * extra - string - ?
    * paymentId - string - payment_id of the transaction (optional)
    * transfers - array - contains
      * address - string
      * amount - int64 | array | See below - - -Input example: - - { - 'params':{ - 'transactionHash':'92423b0857d36bd172b3f2effbd47ea477bfe0618a50c29d475542c6d5d1b835' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'getTransaction' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'transaction':{ - 'fee':1000000, - 'extra':'0130b4472974f2deb9fae7d8fd6602b26396379f3fa05cca2430e10e9e60179f42', - 'timestamp':0, - 'blockIndex':4294967295, - 'state':0, - 'transactionHash':'92423b0857d36bd172b3f2effbd47ea477bfe0618a50c29d475542c6d5d1b835', - 'amount':-1703701, - 'unlockTime':0, - 'transfers':[ - { - 'amount':123456, - 'type':0, - 'address':'25AqTidmdu1awhLZPEUkumZEnM8Rt1fNsbpdRwEGNeLpDDfc1WW9RP6QsdENfxafTz4qE8vThbv413nXhs6WAzYeKBtgA98' - }, - { - 'amount':234567, - 'type':0, - 'address':'278g3wNw5W48DeGbjwxkW3XauBip64uYKS9eFveUHBfdRAG3dYHPZvqXy5BWbfuKEtWZ86PJZdRacAgr1x3gtP5nLyGcVt8' - }, - { - 'amount':345678, - 'type':0, - 'address':'2AtjUXGmhP6CmbRxCtBESR4MjSGiWCQUTPCdsDpw72Co2pwzZT7rjnaBNRCSFCEygjNo5oe8mHyXU4Eip8szu4ZnAFyPW1a' - } - ], - 'paymentId':, - 'isBase':False - } - } - } - -## sendTransaction - -**send_transaction()** method allows you to send transaction to one or several addresses. Also, it allows you to use a payment_id for a transaction to a single address. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -addresses | No | Array of strings, where each string is an address to take the funds from | array | See below -transfers | Yes | Array that contains:
    address - string
    amount - int64 | array | "amount": 10000000000,
    "address": "28aYVwSsGMxCWJGCN..CZSUamsrZv" -fee | Yes | Transaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000 | uint64 | 1000000 -unlockTime | No | Height of the block until which transaction is going to be locked for spending. | uint64 | 0 -anonymity | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 -extra | No | String of variable length. Can contain A-Z, 0-9 characters. | string | something123 -payment_id | No | payment_id | string | somePaymentId -changeAddress | No | Valid and existing in this container address. | string | 28aYVwSsGMxCWJGCN..CZSUamsrZv - -**Note:** if container contains only 1 address, **changeAddress** field can be left empty and the change is going to be sent to this address
    -**Note:** if **addresses** field contains only 1 address, **changeAddress** can be left empty and the change is going to be sent to this address
    -**Note:** in the rest of the cases, **changeAddress** field is mandatory and must contain an address. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactionHash | Hash of the sent transaction. | string | 93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f - -Input Example: - - { - 'params':{ - 'anonymity':0, - 'fee':1000000, - 'unlockTime':0, - 'paymentId':'somePaymentId', - 'addresses':[ - '27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh', - '24JtjYsLdSJKNNDCPGdMco5NbMBLqVWZ5ZiW5vzjXQUrLpMs1MRnfTQ3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFXHARwn', - '21fYPCpaM3ochSSyLnhDAhgw1yV5WPb5c1BfyX5eidbMGyEPgnbSgJW3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX8VQMv' - ], - 'transfers':[ - { - 'amount':123456, - 'address':'27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh' - }, - { - 'amount':234567, - 'address':'278g3wNw5W48DeGbjwxkW3XauBip64uYKS9eFveUHBfdRAG3dYHPZvqXy5BWbfuKEtWZ86PJZdRacAgr1x3gtP5nLyGcVt8' - }, - { - 'amount':345678, - 'address':'2AtjUXGmhP6CmbRxCtBESR4MjSGiWCQUTPCdsDpw72Co2pwzZT7rjnaBNRCSFCEygjNo5oe8mHyXU4Eip8szu4ZnAFyPW1a' - } - ], - 'changeAddress':'27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'sendTransaction' - } - -Return value example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'transactionHash':'93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f' - } - } - - -## createDelayedTransaction - -**createDelayedTransaction()** method creates a delayed transaction. Such transactions are not sent into the network automatically and should be pushed using sendDelayedTransaction method - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -addresses | No | Array of strings, where each string is an address to take the funds from | array | See below -transfers | Yes | Array that contains:
    address - string
    amount - int64 | array | "amount": 10000000000,
    "address": "28aYVwSsGMxCWJGCN..CZSUamsrZv" -fee | Yes | Transaction fee. Minimal fee in Bytecoin network is .01 BCN. This parameter should be specified in minimal available BCN units. For example, if your fee is .01 BCN, you should pass it as 1000000 | uint64 | 1000000 -unlockTime | No | Height of the block until which transaction is going to be locked for spending. | uint64 | 0 -anonymity | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 -extra | No | String of variable length. Can contain A-Z, 0-9 characters. | string | something123 -payment_id | No | payment_id | string | somePaymentId -changeAddress | No | Valid and existing in this container address. | string | 28aYVwSsGMxCWJGCN..CZSUamsrZv - -**Note:** if container contains only 1 address, **changeAddress** field can be left empty and the change is going to be sent to this address
    -**Note:** if **addresses** field contains only 1 address, **changeAddress** can be left empty and the change is going to be sent to this address
    -**Note:** in the rest of the cases, **changeAddress** field is mandatory and must contain an address.
    -**Note:** outputs that were used for this transactions will be locked until the transaction is sent or cancelled - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactionHash | Hash of the sent transaction. | string | 93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f - -Input Example: - - { - 'params':{ - 'anonymity':0, - 'fee':1000000, - 'unlockTime':0, - 'paymentId':'somePaymentId', - 'addresses':[ - '27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh', - '24JtjYsLdSJKNNDCPGdMco5NbMBLqVWZ5ZiW5vzjXQUrLpMs1MRnfTQ3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFXHARwn', - '21fYPCpaM3ochSSyLnhDAhgw1yV5WPb5c1BfyX5eidbMGyEPgnbSgJW3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX8VQMv' - ], - 'transfers':[ - { - 'amount':123456, - 'address':'27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh' - }, - { - 'amount':234567, - 'address':'278g3wNw5W48DeGbjwxkW3XauBip64uYKS9eFveUHBfdRAG3dYHPZvqXy5BWbfuKEtWZ86PJZdRacAgr1x3gtP5nLyGcVt8' - }, - { - 'amount':345678, - 'address':'2AtjUXGmhP6CmbRxCtBESR4MjSGiWCQUTPCdsDpw72Co2pwzZT7rjnaBNRCSFCEygjNo5oe8mHyXU4Eip8szu4ZnAFyPW1a' - } - ], - 'changeAddress':'27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'createDelayedTransaction' - } - -Return value example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'transactionHash':'93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f' - } - } - - -## getDelayedTransactionHashes - -**getDelayedTransactionHashes()** method returns hashes of delayed transactions. - -No input. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactionHashes | Array of strings, where each string is a transaction hash | array | See below - -Input example: - - { - "jsonrpc": "2.0", - "id": "1", - "method": "getDelayedTransactionHashes" - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'transactionHashes':[ - 957dcbf54f327846ea0c7a16b2ae8c24ba3fa8305cc3bbc6424e85e7d358b44b - 25bb751814dd39bf46c972bd760e7516e34200f5e5dd02fda696671e11201f78 - ], - } - ] - } - } - - -## deleteDelayedTransaction - -**deleteDelayedTransaction()** method deletes a specified delayed transaction. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transactionHash | Yes | Valid, existing delayed transaction | string | c671d1005eaaf7c51b1e23eeec1c899e43fa7a332cdc2bcf1e45b908e23d8837 - -Output: - -In case of success returns an empty JSON object. - -Input example: - - { - 'params':{ - 'transactionHash':'c671d1005eaaf7c51b1e23eeec1c899e43fa7a332cdc2bcf1e45b908e23d8837' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'deleteDelayedTransaction' - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": {} - } - - -## sendDelayedTransaction - -**sendDelayedTransaction()** method sends a specified delayed transaction. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -transactionHash | Yes | Valid, existing delayed transaction | string | c671d1005eaaf7c51b1e23eeec1c899e43fa7a332cdc2bcf1e45b908e23d8837 - -Output: - -In case of success returns an empty JSON object. - -Input example: - - { - 'params':{ - 'transactionHash':'c671d1005eaaf7c51b1e23eeec1c899e43fa7a332cdc2bcf1e45b908e23d8837' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'sendDelayedTransaction' - } - -Output example: - - { - "id":"1", - "jsonrpc":"2.0", - "result": {} - } - - -## sendFusionTransaction - -**sendFusionTransaction()** method allows you to send a fusion transaction, by taking funds from selected addresses and transferring them to the destination address. - -If there aren't any outputs that can be optimized, **sendFusionTransaction()** will return an error. You can use **estimateFusion** to check the outputs, available for the optimization. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -threshold | Yes | Value that determines which outputs will be optimized. Only the outputs, lesser than the threshold value, will be included into a fusion transaction. | uint64 | 1000000 -anonymity | Yes | Privacy level (a discrete number from 1 to infinity). Level 6 and higher is recommended. | uint64 | 6 -addresses | No | Array of strings, where each string is an address to take the funds from | array | See below -destinationAddress | No | An address that the optimized funds will be sent to. Valid and existing in this container address. | string | 28aYVwSsGMxCWJGCN..CZSUamsrZv - -Note: if container contains only 1 address, **destinationAddress** field can be left empty and the funds are going to be sent to this address. - -Note: if **addresses** field contains only 1 address, **destinationAddress** can be left empty and the funds are going to be sent to this address. - -Note: in the rest of the cases, **destinationAddress** field is mandatory and must contain an address. - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -transactionHash | Hash of the sent transaction. | string | 93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f - -Input Example: - - { - 'params':{ - 'anonymity':6, - 'threshold':1000000, - 'addresses':[ - '27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh', - '24JtjYsLdSJKNNDCPGdMco5NbMBLqVWZ5ZiW5vzjXQUrLpMs1MRnfTQ3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFXHARwn', - '21fYPCpaM3ochSSyLnhDAhgw1yV5WPb5c1BfyX5eidbMGyEPgnbSgJW3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX8VQMv' - ], - 'destinationAddress':'27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh' - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'sendFusionTransaction' - } - -Return value example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'transactionHash':'93faedc8b8a80a084a02dfeffd163934746c2163f23a1b6022b32423ec9ae08f' - } - } - - -## estimateFusion - -**estimateFusion()** method counts the number of unspent outputs of the specified addresses and returns how many of those outputs can be optimized. - -This method is used to understand if a fusion transaction can be created. If **fusionReadyCount** returns a value = 0, then a fusion transaction cannot be created. - -Input: - -Argument | Mandatory | Description | Format | Example ------------|-----------|-----------|-----------|-----------| -threshold | Yes | Value that determines which outputs will be optimized. Only the outputs, lesser than the threshold value, will be included into a fusion transaction. | uint64 | 1000000 -addresses | No | Array of strings, where each string is an address to take the funds from. | array | See below - -Output: - -Argument | Description | Format | Example ------------|-----------|-----------|-----------| -totalOutputCount | Total number of unspent outputs of the specified addresses. | uint64 | 1000 -fusionReadyCount | Number of outputs that can be optimized. | uint64 | 50 - -Input example: - - { - 'params':{ - 'threshold':1000000, - 'addresses':[ - '27eJo2S9eVo5N2G9zyjkqNBZPR6d2qvVD122vQMGAhcrjZjLu8nsMqk3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX4qWNh', - '24JtjYsLdSJKNNDCPGdMco5NbMBLqVWZ5ZiW5vzjXQUrLpMs1MRnfTQ3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFXHARwn', - '21fYPCpaM3ochSSyLnhDAhgw1yV5WPb5c1BfyX5eidbMGyEPgnbSgJW3c4KQ9iMJ4AV4fpBMccmjfJ4cu7uprKLNFX8VQMv' - ] - }, - 'jsonrpc':'2.0', - 'id':'test', - 'method':'estimateFusion' - } - -Output example: - - { - 'jsonrpc':'2.0', - 'id':'test', - 'result':{ - 'totalOutputCount':1000, - 'fusionReadyCount':50 - } - } - - -[Forknote_RPC_Wallet]: /documentation/payment-gateway/ -[Configure_Forknote_RPC_Wallet]: /documentation/payment-gateway/#configure-forknote-rpc-wallet diff --git a/content/documentation/payment-gateway/index.md b/content/documentation/rpc-wallet/index.md similarity index 60% rename from content/documentation/payment-gateway/index.md rename to content/documentation/rpc-wallet/index.md index f4796ab..4220d30 100644 --- a/content/documentation/payment-gateway/index.md +++ b/content/documentation/rpc-wallet/index.md @@ -1,12 +1,12 @@ --- -title: Payment gateway overview and configuration | Forknote +title: RPC Wallet overview and configuration | Forknote layout: documentation body_class: developers subnav_class: docs-documentation sidebar_nav: sidebar-documentation --- -# Payment gateway overview and configuration +# RPC Wallet overview and configuration * TOC {:toc} @@ -26,82 +26,56 @@ To get help on available options run: Please note, Forknote RPC Wallet config file may consist only of these options: -Option | Description | Config Example ------------|-----------|-----------| -bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 | bind-address = 127.0.0.1 -bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 | bind-port = 8071 -daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure | daemon-address = 127.0.0.1 -daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 | daemon-port = 8080 -container-file | Mandatory'''. Your container's file name | container-file = mycontainer -container-password | Mandatory. Your container's password | container-password = mypassword -log-file | A name of log file that you want to use for logging. Default is walletd.log | log-file = mylog.log -server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. | server-root = /home/Downloads/RPCWallet -log-level | Level of logging. Default is 1. | log-level = 2 -testnet | Allows you to run Forknote RPC Wallet in testnet. | testnet = no -local | Option that allows you to start Forknote RPC Wallet as an in-process node | local -p2p-bind-ip | Interface for p2p network protocol | p2p-bind-ip = 0.0.0.0 -p2p-bind-port | Port for p2p network protocol | p2p-bind-port = 29080 -p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) | p2p-external-port = 443 -add-peer | Manually add peer to local peerlist | add-peer = 127.0.0.1 -add-priority-node | Specify list of peers to connect to and attempt to keep the connection open | add-priority-node = 127.0.0.1 -add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored | add-exclusive-node = 127.0.0.1 -seed-node | Connect to a node to retrieve peer addresses, and disconnect | seed-node = 127.0.0.1 -hide-my-port | Do not announce yourself as peerlist candidate | hide-my-port -P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED_PUB_KEY = 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 -GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE_TX_HEX = 01..4a -CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 -EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_SPEED_FACTOR = 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 = 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 -DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 -CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 -MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT_V2 = 1 -UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains | UPGRADE_HEIGHT_V3 = 2 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 -CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin -CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 -GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units | GENESIS_BLOCK_REWARD = 1844674407370955161 -MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION_SIZE_LIMIT = 20000 +Option | Description +-----------|-----------| +bind-address | Which address to bind Forknote RPC Wallet to. Default value is 0.0.0.0 +bind-port | Which port to bind Forknote RPC Wallet to. Default value is 8070 +daemon-address | Forknote daemon (forknoted) address for remote daemon connection infrastructure +daemon-port | Forknote daemon (forknoted) port for remote daemon connection infrastructure. Default Forknote daemon ports are 8080 and 8081 +container-file | Mandatory'''. Your container's file name +container-password | Mandatory. Your container's password +log-file | A name of log file that you want to use for logging. Default is walletd.log +server-root | Working directory that you wish to use for Forknote RPC Wallet. Default is current working directory. +log-level | Level of logging. Default is 1. +testnet | Allows you to run Forknote RPC Wallet in testnet. +local | Option that allows you to start Forknote RPC Wallet as an in-process node +p2p-bind-ip | Interface for p2p network protocol +p2p-bind-port | Port for p2p network protocol +p2p-external-port | External port for p2p network protocol (if port forwarding used with NAT) +add-peer | Manually add peer to local peerlist +add-priority-node | Specify list of peers to connect to and attempt to keep the connection open +add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored +seed-node | Connect to a node to retrieve peer addresses, and disconnect +hide-my-port | Do not announce yourself as peerlist candidate +MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet + +### Blockchain options + +See [Blockchain options][Blockchain_options] ##Example of a config file -
    $ cat ./notrealcoin.conf 
    +
     
    -seed-node=1.1.1.1:29829
    -seed-node=seed.notarealcoin.com:29829
    -seed-node=2.2.2.2:29829
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    +BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -GENESIS_BLOCK_REWARD=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=60000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=29829
    -rpc-bind-port=29830
    -BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc
    -CRYPTONOTE_NAME=test
    +CRYPTONOTE_NAME=fakecoin
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +P2P_STAT_TRUSTED_PUB_KEY=
    +
     UPGRADE_HEIGHT_V2=1
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT_V3=2
    +
    +p2p-bind-port=8080
    +rpc-bind-port=8081
    +
    +seed-node=127.0.0.1:8080
     
     container-file = mycontainer
     container-password = mypassword
    -daemon-port = 29830
    +daemon-port = 8081
     bind-port = 9090
     
     
    @@ -210,4 +184,5 @@ Forknote RPC Wallet API allows you to create addresses for your users, accept an Detailed description for every Forknote RPC Wallet API method can be found here: [Forknote RPC Wallet JSON RPC API][Forknote_RPC_Wallet_JSON_RPC_API] -[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/payment-gateway/json-rpc-api/ +[Forknote_RPC_Wallet_JSON_RPC_API]: /documentation/rpc-wallet/json-rpc-api/ +[Blockchain_options]: /documentation/daemon/#blockchain-options diff --git a/content/documentation/rpc-wallet/json-rpc-api.md b/content/documentation/rpc-wallet/json-rpc-api.md new file mode 100644 index 0000000..63a60e2 --- /dev/null +++ b/content/documentation/rpc-wallet/json-rpc-api.md @@ -0,0 +1,16 @@ +--- +title: RPC Wallet JSON API | Forknote +layout: documentation +body_class: developers +subnav_class: docs-documentation +sidebar_nav: sidebar-documentation +--- + +# RPC Wallet JSON API + +Forknote's RPC Wallet is using the same JSON API as Bytecoin. A list of the available methods and usage examples can be found at the Bytecoin Wiki: + +[Bytecoin RPC Wallet JSON RPC API][Bytecoin_RPC_Wallet_JSON_RPC_API] + + +[Bytecoin_RPC_Wallet_JSON_RPC_API]: https://wiki.bytecoin.org/wiki/Bytecoin_RPC_Wallet_JSON_RPC_API diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md index 06d74fd..577cbb1 100644 --- a/content/documentation/simplewallet/index.md +++ b/content/documentation/simplewallet/index.md @@ -25,76 +25,48 @@ sidebar_nav: sidebar-documentation ##Wallet options -Option | Description | Config Example ------------|-----------|-----------| -wallet-file | Use wallet <arg> | wallet-file = /home/USERNAME/
    forknote-linux/dashcoin.wallet -password | Wallet password | password = PASSWORD -daemon-address | Use daemon instance at <host>:<port> | daemon-address = 127.0.0.1:29081 -daemon-host | Use daemon instance at host <arg> instead of localhost | daemon-host = 127.0.0.1 -daemon-port | Use daemon instance at port <arg> instead of 8081 | daemon-port = 29081 -set_log | Level of logging. Default is 1. | set_log = 4 -P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key | P2P_STAT_TRUSTED_PUB_KEY = 4d..eb -BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks | BYTECOIN_NETWORK = 11100111-1100-0101-1011-001210110110 -GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block | GENESIS_COINBASE_TX_HEX = 01..4a -CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator | CRYPTONOTE_PUBLIC_ADDRESS_
    BASE58_PREFIX = 86 -MONEY_SUPPLY | Total amount of coins to be emitted. | MONEY_SUPPLY = 18446744073709551615 -EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. | EMISSION_SPEED_FACTOR = 18 -DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. | DIFFICULTY_TARGET = 120 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE = 20000 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V1 = 10000 -CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins | CRYPTONOTE_BLOCK_GRANTED_
    FULL_REWARD_ZONE_V2 = 10000 -CRYPTONOTE_DISPLAY
    _DECIMAL_POINT | 1 coin = 10^(this value) atomic units | CRYPTONOTE_DISPLAY
    _DECIMAL_POINT = 8 -MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons | MINIMUM_FEE = 1000000 -DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust | DEFAULT_DUST_THRESHOLD = 1000000 -CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW | Number of blocks to unlock miner transactions | CRYPTONOTE_MINED_MONEY_
    UNLOCK_WINDOW = 10 -MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins | MAX_BLOCK_SIZE_INITIAL = 20480 -EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins | EXPECTED_NUMBER_
    OF_BLOCKS_PER_DAY = 720 -UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains | UPGRADE_HEIGHT_V2 = 1 -UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains | UPGRADE_HEIGHT_V3 = 2 -DIFFICULTY_CUT | Timestamps to cut after sorting | DIFFICULTY_CUT = 60 -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks | DIFFICULTY_LAG = 15 -CRYPTONOTE_NAME | Cryptonote name. Used for storage directory | CRYPTONOTE_NAME = dashcoin -CHECKPOINT | Checkpoints. Format: HEIGHT:HASH | CHECKPOINT = 10:70d..f8 -GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units | GENESIS_BLOCK_REWARD = 1844674407370955161 -wallet-rpc-bind-ip | Specify ip to bind rpc server | wallet-rpc-bind-ip = 127.0.0.1 -wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server | wallet-rpc-bind-port = 29082 -MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet | MAX_TRANSACTION
    _SIZE_LIMIT = 20000 -DEFAULT_FEE | Default fee of the transactions sent through simplewallet | DEFAULT_FEE = 1000000000 -SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet | SYNC_FROM_ZERO +Option | Description +-----------|-----------| +wallet-file | Use wallet <arg> +password | Wallet password +daemon-address | Use daemon instance at <host>:<port> +daemon-host | Use daemon instance at host <arg> instead of localhost +daemon-port | Use daemon instance at port <arg> instead of 8081 +set_log | Level of logging. Default is 1. +wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server +MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet +DEFAULT_FEE | Default fee of the transactions sent through simplewallet +SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet + +### Blockchain options + +See [Blockchain options][Blockchain_options] ##Example of a config file You can use the same configuration file as the daemon -
    $ cat ./notrealcoin.conf 
    +
     
    -CRYPTONOTE_NAME=notrealcoin
    -seed-node=1.1.1.1:17100
    -seed-node=2.2.2.2:17100
    -seed-node=seed.notarealcoin.com:17100
    -GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    +BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -GENESIS_BLOCK_REWARD=0
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=29829
    -rpc-bind-port=29830
    -BYTECOIN_NETWORK=64954525-ff98-5ed4-0576-7c5a0b9c18cc
    -CRYPTONOTE_NAME=test
    +CRYPTONOTE_NAME=fakecoin
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=72
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +P2P_STAT_TRUSTED_PUB_KEY=
    +
     UPGRADE_HEIGHT_V2=1
    -CHECKPOINT=10000:70d2531151529ac00bf875281e15f51324934bc85e5733dcd92e1ccb1a665ff8
    -CHECKPOINT=20000:c181ec9223a91fef8658c7aa364c093c41c28d250870ca1ed829bf74f0abf038
    +UPGRADE_HEIGHT_V3=2
    +
    +p2p-bind-port=8080
    +rpc-bind-port=8081
     
    -wallet-file=/home/USERNAME/forknote-linux/notrealwallet.wallet
    +seed-node=127.0.0.1:8080
    +
    +wallet-file=/home/USERNAME/forknote-linux/fake_wallet.wallet
     password=FAKE_PASSWORD
    -wallet-rpc-bind-port=17102
    +wallet-rpc-bind-port=8082
     
    @@ -116,3 +88,5 @@ start_mining | Start mining in daemon | - stop_mining | Stop mining in daemon | - transfer | Transfer amount to address with mixin_count (number of transactions yours is indistinguishable from) | [uint] mixin_count
    [string] address
    [double] amount
    [string] -p payment_id
    [double] -f fee + +[Blockchain_options]: /documentation/daemon/#blockchain-options \ No newline at end of file diff --git a/content/documentation/simplewallet/json-rpc-api.md b/content/documentation/simplewallet/json-rpc-api.md index f0634d2..5691eef 100644 --- a/content/documentation/simplewallet/json-rpc-api.md +++ b/content/documentation/simplewallet/json-rpc-api.md @@ -8,460 +8,10 @@ sidebar_nav: sidebar-documentation # Simplewallet JSON RPC API -* TOC -{:toc} +Forknote's Simplewallet is using the same JSON API as Bytecoin's Simplewallet. A list of the available methods and usage examples can be found at the Bytecoin Wiki: -To start wallet JSON RPC API server you should specify a port on which server binds (additionally to standard wallet's arguments). You can choose any free port. To do that execute the following command from the command line: +[Bytecoin Simplewallet JSON RPC API][Bytecoin_Simplewallet_JSON_RPC_API] - simplewallet --wallet-file=example_wallet.wallet --pass=12345 --rpc-bind-port=29082 -Having done that you're ready to operate with the wallet through the following API URLs (e.g., your IP address is 126.0.1.100): +[Bytecoin_Simplewallet_JSON_RPC_API]: https://wiki.bytecoin.org/wiki/Simplewallet_JSON_RPC_API - http://126.0.1.100:29082/json_rpc - http://localhost:29082/json_rpc - -Please note, there is no "refresh" RPC method. RPC wallet refresh is performed automatically each 20 seconds. - - -##getbalance - -Return balance. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "locked_amount" : { - "type" : "integer" - }, - "available_balance" : { - "type" : "integer" - } - } - } - -###Example (getbalance) - - { - "jsonrpc": "2.0", - "method": "getbalance", - "params": {} - } - - -##transfer - -Transfer money to several destinations with specified fee, mixin ambiguity degree, and unlock time. - -Please note: fee param is a mandatory and should not be less than 0.01 BCN - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - "destinations" : { - "type" : "array", - "items" : { - "amount" : { - "type" : "integer" - }, - "address" : { - "type" : "string" - } - }, - "minItems" : 1 - }, - - "payment_id": { - "type" : "string" - } - - "fee" : { - "type" : "integer" - }, - - "mixin" : { - "type" : "integer" - }, - - "unlock_time" : { - "type" : "integer" - "description" : "Unix timestamp" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "tx_hash" : { - "type" : "string" - } - } - } - -###Example (transfer) - -Please note, payment_id is an optional argument and can be left out. - - { - "jsonrpc":"2.0", - "method":"transfer", - "params":{ - "destinations":[ - { - "amount":11111, - "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" - }, - { - "amount":22222, - "address":"248iCFTjpRKGdoD34B6nJVfgLLgnoucNhMYWeTVAAkpoQQV6yVve2sxh6QVxSh4HW213Wy5siw8eBa5k2G1sV639QzFWqGD" - } - ], - "payment_id":"", - "fee":1000000, - "mixin":0, - "unlock_time":0 - } - } - - -##store - -Store wallet data. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : {} - } - -###Example (store) - - { - "jsonrpc": "2.0", - "method": "store", - "params": {} - } - - -##get_payments - -Receives all the payments with a corresponding payment_id that were sent to the wallet. This method is used to get the BCN payments for the 3rd party services. As Bytecoin uses only one address to receive BCN deposits, a unique payment_id should be assigned and shown to each user. The method will return all the payments for this user. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - }, - - "payment_id" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "payments" : { - "type" : "array", - "items" : { - "amount" : { - "type" : "integer" - }, - "block_height" : { - "type" : "integer" - }, - "tx_hash" : { - "type" : "string" - }, - "unlock_time" : { - "type" : "integer" - } - } - } - } - } - -###Example (get_payments) - - { - "jsonrpc":"2.0", - "method":"get_payments", - "params":{ - "payment_id": "78cc4b76a48bd50ab955ac61a0c04e4a82079fbcf27298f87b39c76aefccbcc9" - } - } - - -##get_transfers - -Returns the list of all the wallet's incoming and outgoing transfers. This data is available starting from v.1.0.2 build. For the transfers created by simplewallet of previous versions this method returns not exact transfers amounts but the transaction amounts (transfer amount + change). - -URL: - - /json_rpc - -Input: - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "result" : { - "type" : "transfers" - "transfers" : { - "type" : "array", - "items" : { - "address" : { - "type" : "string" - }, - "amount" : { - "type" : "integer" - }, - "blockIndex" : { - "type" : "integer" - }, - "fee" : { - "type" : "integer" - }, - "output" : { - "type" : "boolean" - }, - "paymentId" : { - "type" : "string" - }, - "time" : { - "type" : "integer" - }, - "transactionHash" : { - "type" : "string" - }, - "unlockTime" : { - "type" : "integer" - }, - } - } - } - } - } - -###Example (get_transfers) - - { - "jsonrpc": "2.0", - "method": "get_transfers", - "params": {} - } - - -##get_height - -Returns the last top known block height for simplewallet. This method can be used to verify that simplewallet is correctly synchronized. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "height" : { - "type" : "integer" - } - } - } - -###Example (get_height) - - { - "jsonrpc": "2.0", - "method": "get_height", - "params": {} - } - - -##reset - -Erases simplewallet's internal state but keeps safe the wallet.bin. The method should be used to re-synchronize the wallet from scratch. The next refresh (which is automatically called each 20 seconds) will update the simplewallet state. - -URL: - - /json_rpc - -Input: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : { - "jsonrpc" : { - "type" : "string" - }, - "method" : { - "type" : "string" - } - } - } - -Output: - - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Bytecoin wallet api", - "description": "Schema for transfer method in Bytecoin wallet", - "type": "object", - - "properties" : {} - } - -###Example (reset) - - { - "jsonrpc": "2.0", - "method": "reset", - "params": {} - } diff --git a/content/download.md b/content/download.md index bd907b2..85e14b5 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md index e4c2014..08ef1e8 100644 --- a/content/guides/setup-private-blockchain.md +++ b/content/guides/setup-private-blockchain.md @@ -56,25 +56,20 @@ Save the resulted configuration in the `configs` folder of Forknote.
    $ cat >imaginary_blockchain.conf 
     
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    +BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -GENESIS_BLOCK_REWARD=1844674407370955300
    -SYNC_FROM_ZERO=1
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=6966
    -rpc-bind-port=6967
    -BYTECOIN_NETWORK=96a24a34-4585-25af-884d-6039b3ab7fd1
     CRYPTONOTE_NAME=imaginary_blockchain
    -GENESIS_COINBASE_TX_HEX=010a01ff0001a4b4e6cc99b3e6cc190285f558a81f548c1a7be29836e8f512cc33738d07326eeb22a6f4c5b5e1a3aa8e210187216740de551aedfd1b6d8ee7ce73e88a2cc22297d44b46dd4ee5ef6d864e5b
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +P2P_STAT_TRUSTED_PUB_KEY=
    +
     UPGRADE_HEIGHT_V2=1
     UPGRADE_HEIGHT_V3=2
    -seed-node=127.0.0.1:6966
    +
    +p2p-bind-port=8080
    +rpc-bind-port=8081
    +
    +seed-node=127.0.0.1:8080
     
    Check is the configuration file working properly by: diff --git a/content/guides/starting-seed-node.md b/content/guides/starting-seed-node.md index 44e3121..05f4ede 100644 --- a/content/guides/starting-seed-node.md +++ b/content/guides/starting-seed-node.md @@ -43,9 +43,9 @@ $ cd ~ Now you can download Forknote. -
    $ wget https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.
    +
    $ wget https://github.com/forknote/forknote/releases/download/1.0.11/forknote-linux.tar.
     
    ---2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.8.1/forknote-linux.tar.gz
    +--2015-10-10 03:34:36--  https://github.com/forknote/forknote/releases/download/1.0.11/forknote-linux.tar.gz
     Resolving github.com (github.com)... 192.30.252.32
     
     
    @@ -59,8 +59,7 @@ forknote-linux/configs/ forknote-linux/forknoted forknote-linux/simplewallet forknote-linux/walletd -forknote-linux/configs/-.conf -forknote-linux/configs/bytecoin.conf +...
    @@ -72,26 +71,21 @@ Log into the forknote directory Write your configuration file -
    $ cat >configs/testcoin.conf 
    +
    $ cat >configs/imaginary_blockchain.conf 
     
    -EMISSION_SPEED_FACTOR=18
    -DIFFICULTY_TARGET=120
    +BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -MONEY_SUPPLY=18446744073709551615
    -GENESIS_BLOCK_REWARD=1844674407370955300
    -SYNC_FROM_ZERO=1
    -DEFAULT_DUST_THRESHOLD=1000000
    -MINIMUM_FEE=1000000
    -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW=10
    -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE=100000
    -CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    -p2p-bind-port=6966
    -rpc-bind-port=6967
    -BYTECOIN_NETWORK=96a24a34-4585-25af-884d-6039b3ab7fd1
     CRYPTONOTE_NAME=imaginary_blockchain
    -GENESIS_COINBASE_TX_HEX=010a01ff0001a4b4e6cc99b3e6cc190285f558a81f548c1a7be29836e8f512cc33738d07326eeb22a6f4c5b5e1a3aa8e210187216740de551aedfd1b6d8ee7ce73e88a2cc22297d44b46dd4ee5ef6d864e5b
    +CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
    +GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
    +P2P_STAT_TRUSTED_PUB_KEY=
    +
     UPGRADE_HEIGHT_V2=1
     UPGRADE_HEIGHT_V3=2
    +
    +p2p-bind-port=8080
    +rpc-bind-port=8081
    +
     seed-node=45.32.238.88:13539
     
     
    @@ -106,14 +100,14 @@ Log with `root` user and change the directory to `/etc/init/`. Create the upstart config file. -
    $ cat >forknote-testcoin-daemon.conf 
    +
    $ cat >forknote-imaginaryblockchain-daemon.conf 
     
    -description "testcoin daemon"
    +description "imaginary_blockchain daemon"
     
     start on runlevel [23]
     stop on shutdown
     
    -exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/testcoin.conf
    +exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/imaginary_blockchain.conf
     
     post-stop exec sleep 30
     
    @@ -124,10 +118,17 @@ respawn limit 5 30
     
     Start the service.
     
    -
    $ start forknote-testcoin-daemon 
    +
    $ start forknote-imaginary_blockchain-daemon 
     
    You now have your seed node up and running. It will automatically restart if something goes wrong. + +Stopping the service. + +
    $ stop forknote-imaginary_blockchain-daemon 
    +
    + + [ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 [vultr]: http://www.vultr.com/?ref=6832621 \ No newline at end of file diff --git a/layouts/sidebar-documentation.html b/layouts/sidebar-documentation.html index c3da2cb..dca80cf 100644 --- a/layouts/sidebar-documentation.html +++ b/layouts/sidebar-documentation.html @@ -15,9 +15,9 @@

  • Payment gateway

    +

    RPC Wallet

  • From 1ef88930f63637f4826c875dda0feaf58c7d3f3b Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sat, 2 Jul 2016 14:57:26 +0300 Subject: [PATCH 32/56] Forknote 1.0.11 blog post --- .../2016-07-02-forknote-1.0.11-released.md | 39 +++++++++++++++++++ content/documentation/daemon/index.md | 2 +- content/documentation/rpc-wallet/index.md | 2 +- content/documentation/simplewallet/index.md | 2 +- content/guides/setup-private-blockchain.md | 12 +++--- content/guides/starting-seed-node.md | 14 +++---- 6 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 content/blog/2016-07-02-forknote-1.0.11-released.md diff --git a/content/blog/2016-07-02-forknote-1.0.11-released.md b/content/blog/2016-07-02-forknote-1.0.11-released.md new file mode 100644 index 0000000..cd7c979 --- /dev/null +++ b/content/blog/2016-07-02-forknote-1.0.11-released.md @@ -0,0 +1,39 @@ +--- +kind: article +title: "Forknote 1.0.11 Release" +created_at: 2016-07-02 +author_name: pmitchev +--- + +Forknote 1.0.11 was released. + + +Changes: + + * Core changed to Bytecoin 1.0.11 + * _enable-cors_ option added to the daemon + * _enable-blockchain-indexes_ option added to the daemon + + +Configuration variables changes: + + * CRYPTONOTE_COIN_VERSION - enables the support for Cryptonote coin clones + * KILL_HEIGHT - use to define the maximum height of a blockchain + * MANDATORY_TRANSACTION - only blocks with more than 1 real transaction (excluding the base transaction) are valid + +You can download this release from here: +https://github.com/forknote/forknote/releases/tag/1.0.11 + + +Currently, Forknote support those networks: + + * [Bikercoin][http://bikercoin.org] + * [Bytecoin][https://bytecoin.org] + * Crossnote (testnet) : more info to be released soon + * [Dashcoin][http://dashcoin.info] + * [Dinastycoin][http://www.dinastycoin.com] + * [Ethanolium][https://bitcointalk.org/index.php?topic=1184064.0] + * [Karbowanec][http://karbowanec.com] + * [Magnatoj][https://bitcointalk.org/index.php?topic=1270755.0] + * [Quazarcoin][https://bitcointalk.org/index.php?topic=600658.260] + * [Redwind][https://bitcointalk.org/index.php?topic=904485.520] diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index fa3ac9d..78b3820 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -84,7 +84,7 @@ UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' ##Example of a config file -
    $ cat ./notrealcoin.conf 
    +
    $ cat ./fakecoin.conf 
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    diff --git a/content/documentation/rpc-wallet/index.md b/content/documentation/rpc-wallet/index.md
    index 4220d30..1ee7bf5 100644
    --- a/content/documentation/rpc-wallet/index.md
    +++ b/content/documentation/rpc-wallet/index.md
    @@ -56,7 +56,7 @@ See [Blockchain options][Blockchain_options]
     
     ##Example of a config file
     
    -
    +
    $ cat ./fakecoin.conf 
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md
    index 577cbb1..a5ad8d5 100644
    --- a/content/documentation/simplewallet/index.md
    +++ b/content/documentation/simplewallet/index.md
    @@ -47,7 +47,7 @@ See [Blockchain options][Blockchain_options]
     
     You can use the same configuration file as the daemon
     
    -
    +
    $ cat >fakecoin.conf 
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md
    index 08ef1e8..e57f0e6 100644
    --- a/content/guides/setup-private-blockchain.md
    +++ b/content/guides/setup-private-blockchain.md
    @@ -54,11 +54,11 @@ Save the resulted configuration in the `configs` folder of Forknote.
     
     ###Example on Linux/Mac:
     
    -
    $ cat >imaginary_blockchain.conf 
    +
    $ cat >configs/fakecoin.conf 
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_NAME=imaginary_blockchain
    +CRYPTONOTE_NAME=fakecoin
     CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
     GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
     P2P_STAT_TRUSTED_PUB_KEY=
    @@ -73,12 +73,12 @@ seed-node=127.0.0.1:8080
     
    Check is the configuration file working properly by: -
    $ ./forknoted --config-file configs/imaginary_blockchain.conf
    +
    $ ./forknoted --config-file configs/fakecoin.conf
     
    **Notice: Be careful when you test different configurations with the same CRYPTONOTE_NAME. You may need to delete the blockchain folder to avoid conflict.**
    -Example OSX/Linux: ~/.imaginary_blockchain/
    -Example Windows: C:\Users\%user_name%\AppData\Roaming\imaginary_blockchain\ +Example OSX/Linux: ~/.fakecoin/
    +Example Windows: C:\Users\%user_name%\AppData\Roaming\fakecoin\ ## Adding seed nodes @@ -90,7 +90,7 @@ You can use our [guide about seed node creation][seed-node-guide] to get started After you know the IP of the VPS, you have to add `seed-node` to your configuration file. -
    seed-node=1.1.1.1:40741
    +
    seed-node=1.1.1.1:8080
     
    **Notice: Don't forget to delete the line seed-node=127.0.0.1:xxxxx** diff --git a/content/guides/starting-seed-node.md b/content/guides/starting-seed-node.md index 05f4ede..541a434 100644 --- a/content/guides/starting-seed-node.md +++ b/content/guides/starting-seed-node.md @@ -71,11 +71,11 @@ Log into the forknote directory Write your configuration file -
    $ cat >configs/imaginary_blockchain.conf 
    +
    $ cat >configs/fakecoin.conf 
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    -CRYPTONOTE_NAME=imaginary_blockchain
    +CRYPTONOTE_NAME=fakecoin
     CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX=86
     GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1c0cbff8883f8024f5142ee494ffbbd08807121013c086a48c15fb637a96991bc6d53caf77068b5ba6eeb3c82357228c49790584a
     P2P_STAT_TRUSTED_PUB_KEY=
    @@ -100,14 +100,14 @@ Log with `root` user and change the directory to `/etc/init/`.
     
     Create the upstart config file.
     
    -
    $ cat >forknote-imaginaryblockchain-daemon.conf 
    +
    $ cat >forknote-fakecoin-daemon.conf 
     
    -description "imaginary_blockchain daemon"
    +description "fakecoin daemon"
     
     start on runlevel [23]
     stop on shutdown
     
    -exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/imaginary_blockchain.conf
    +exec sudo -u fork /home/fork/forknote-linux/forknoted --no-console --config-file /home/fork/forknote-linux/configs/fakecoin.conf
     
     post-stop exec sleep 30
     
    @@ -118,7 +118,7 @@ respawn limit 5 30
     
     Start the service.
     
    -
    $ start forknote-imaginary_blockchain-daemon 
    +
    $ start forknote-fakecoin-daemon 
     
    You now have your seed node up and running. It will automatically restart if something goes wrong. @@ -126,7 +126,7 @@ You now have your seed node up and running. It will automatically restart if som Stopping the service. -
    $ stop forknote-imaginary_blockchain-daemon 
    +
    $ stop forknote-fakecoin-daemon 
     
    From c40ff1bf99b02c13798d0973b5df149d0e7f69de Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sat, 2 Jul 2016 15:18:14 +0300 Subject: [PATCH 33/56] Blog post fixes --- ...> 2015-11-25-forknote-1_0_8_2-released.md} | 0 ... => 2015-12-15-forknote-1_0_9-released.md} | 0 ...> 2016-02-20-forknote-1_0_9_1-released.md} | 0 ...016-04-22-forknote-1_0_10_0_1-released.md} | 0 .../2016-07-02-forknote-1.0.11-released.md | 39 ------------------- .../2016-07-02-forknote-1_0_11-released.md | 39 +++++++++++++++++++ static/search-index.json | 5 +++ 7 files changed, 44 insertions(+), 39 deletions(-) rename content/blog/{2015-11-25-forknote-1.0.8.2-released.md => 2015-11-25-forknote-1_0_8_2-released.md} (100%) rename content/blog/{2015-12-15-forknote-1.0.9-released.md => 2015-12-15-forknote-1_0_9-released.md} (100%) rename content/blog/{2016-02-20-forknote-1.0.9.1-released.md => 2016-02-20-forknote-1_0_9_1-released.md} (100%) rename content/blog/{2016-04-22-forknote-1.0.10.0.1-released.md => 2016-04-22-forknote-1_0_10_0_1-released.md} (100%) delete mode 100644 content/blog/2016-07-02-forknote-1.0.11-released.md create mode 100644 content/blog/2016-07-02-forknote-1_0_11-released.md diff --git a/content/blog/2015-11-25-forknote-1.0.8.2-released.md b/content/blog/2015-11-25-forknote-1_0_8_2-released.md similarity index 100% rename from content/blog/2015-11-25-forknote-1.0.8.2-released.md rename to content/blog/2015-11-25-forknote-1_0_8_2-released.md diff --git a/content/blog/2015-12-15-forknote-1.0.9-released.md b/content/blog/2015-12-15-forknote-1_0_9-released.md similarity index 100% rename from content/blog/2015-12-15-forknote-1.0.9-released.md rename to content/blog/2015-12-15-forknote-1_0_9-released.md diff --git a/content/blog/2016-02-20-forknote-1.0.9.1-released.md b/content/blog/2016-02-20-forknote-1_0_9_1-released.md similarity index 100% rename from content/blog/2016-02-20-forknote-1.0.9.1-released.md rename to content/blog/2016-02-20-forknote-1_0_9_1-released.md diff --git a/content/blog/2016-04-22-forknote-1.0.10.0.1-released.md b/content/blog/2016-04-22-forknote-1_0_10_0_1-released.md similarity index 100% rename from content/blog/2016-04-22-forknote-1.0.10.0.1-released.md rename to content/blog/2016-04-22-forknote-1_0_10_0_1-released.md diff --git a/content/blog/2016-07-02-forknote-1.0.11-released.md b/content/blog/2016-07-02-forknote-1.0.11-released.md deleted file mode 100644 index cd7c979..0000000 --- a/content/blog/2016-07-02-forknote-1.0.11-released.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -kind: article -title: "Forknote 1.0.11 Release" -created_at: 2016-07-02 -author_name: pmitchev ---- - -Forknote 1.0.11 was released. - - -Changes: - - * Core changed to Bytecoin 1.0.11 - * _enable-cors_ option added to the daemon - * _enable-blockchain-indexes_ option added to the daemon - - -Configuration variables changes: - - * CRYPTONOTE_COIN_VERSION - enables the support for Cryptonote coin clones - * KILL_HEIGHT - use to define the maximum height of a blockchain - * MANDATORY_TRANSACTION - only blocks with more than 1 real transaction (excluding the base transaction) are valid - -You can download this release from here: -https://github.com/forknote/forknote/releases/tag/1.0.11 - - -Currently, Forknote support those networks: - - * [Bikercoin][http://bikercoin.org] - * [Bytecoin][https://bytecoin.org] - * Crossnote (testnet) : more info to be released soon - * [Dashcoin][http://dashcoin.info] - * [Dinastycoin][http://www.dinastycoin.com] - * [Ethanolium][https://bitcointalk.org/index.php?topic=1184064.0] - * [Karbowanec][http://karbowanec.com] - * [Magnatoj][https://bitcointalk.org/index.php?topic=1270755.0] - * [Quazarcoin][https://bitcointalk.org/index.php?topic=600658.260] - * [Redwind][https://bitcointalk.org/index.php?topic=904485.520] diff --git a/content/blog/2016-07-02-forknote-1_0_11-released.md b/content/blog/2016-07-02-forknote-1_0_11-released.md new file mode 100644 index 0000000..36001d4 --- /dev/null +++ b/content/blog/2016-07-02-forknote-1_0_11-released.md @@ -0,0 +1,39 @@ +--- +kind: article +title: "Forknote 1.0.11 Release" +created_at: 2016-07-02 +author_name: pmitchev +--- + +Forknote 1.0.11 was released. + + +*Changes:* + + * Core changed to Bytecoin 1.0.11 + * _enable-cors_ option added to the daemon + * _enable-blockchain-indexes_ option added to the daemon + + +*Configuration variables changes:* + + * _CRYPTONOTE_COIN_VERSION_ - enables the support for Cryptonote coin clones + * _KILL_HEIGHT_ - use to define the maximum height of a blockchain + * _MANDATORY_TRANSACTION_ - only blocks with more than 1 real transaction (excluding the base transaction) are valid + +You can download this release from here: +[https://github.com/forknote/forknote/releases/tag/1.0.11](https://github.com/forknote/forknote/releases/tag/1.0.11) + + +Currently, Forknote support those networks: + + * [Bikercoin](http://bikercoin.org)) + * [Bytecoin](https://bytecoin.org) + * Crossnote (testnet) : more info to be released soon + * [Dashcoin](http://dashcoin.info) + * [Dinastycoin](http://www.dinastycoin.com) + * [Ethanolium](https://bitcointalk.org/index.php?topic=1184064.0) + * [Karbowanec](http://karbowanec.com) + * [Magnatoj](https://bitcointalk.org/index.php?topic=1270755.0) + * [Quazarcoin](https://bitcointalk.org/index.php?topic=600658.260) + * [Redwind](https://bitcointalk.org/index.php?topic=904485.520) diff --git a/static/search-index.json b/static/search-index.json index 252eac6..a1f823d 100644 --- a/static/search-index.json +++ b/static/search-index.json @@ -35,6 +35,11 @@ "title": "Forknote 1.0.10.0.1 Release", "section": "Blog/" }, + { + "url": "/blog/2016-07-02-forknote-1/", + "title": "Forknote 1.0.11 Release", + "section": "Blog/" + }, { "url": "/blog/all_posts/", "title": "¬", From d4d217db74a4eb5228de5b8bb7ad81925c637cdd Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sat, 2 Jul 2016 15:20:32 +0300 Subject: [PATCH 34/56] Typo fix --- content/blog/2016-07-02-forknote-1_0_11-released.md | 6 +++--- static/search-index.json | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/blog/2016-07-02-forknote-1_0_11-released.md b/content/blog/2016-07-02-forknote-1_0_11-released.md index 36001d4..6c3756c 100644 --- a/content/blog/2016-07-02-forknote-1_0_11-released.md +++ b/content/blog/2016-07-02-forknote-1_0_11-released.md @@ -8,14 +8,14 @@ author_name: pmitchev Forknote 1.0.11 was released. -*Changes:* +**Changes:** * Core changed to Bytecoin 1.0.11 * _enable-cors_ option added to the daemon * _enable-blockchain-indexes_ option added to the daemon -*Configuration variables changes:* +**Configuration variables changes:** * _CRYPTONOTE_COIN_VERSION_ - enables the support for Cryptonote coin clones * _KILL_HEIGHT_ - use to define the maximum height of a blockchain @@ -27,7 +27,7 @@ You can download this release from here: Currently, Forknote support those networks: - * [Bikercoin](http://bikercoin.org)) + * [Bikercoin](http://bikercoin.org) * [Bytecoin](https://bytecoin.org) * Crossnote (testnet) : more info to be released soon * [Dashcoin](http://dashcoin.info) diff --git a/static/search-index.json b/static/search-index.json index a1f823d..f1e5942 100644 --- a/static/search-index.json +++ b/static/search-index.json @@ -16,27 +16,27 @@ "section": "Blog/" }, { - "url": "/blog/2015-11-25-forknote-1/", + "url": "/blog/2015-11-25-forknote-1_0_8_2-released/", "title": "Forknote Wallet 1.0.8.2 Release", "section": "Blog/" }, { - "url": "/blog/2015-12-15-forknote-1/", + "url": "/blog/2015-12-15-forknote-1_0_9-released/", "title": "Forknote 1.0.9 Release", "section": "Blog/" }, { - "url": "/blog/2016-02-20-forknote-1/", + "url": "/blog/2016-02-20-forknote-1_0_9_1-released/", "title": "Forknote 1.0.9.1 Release", "section": "Blog/" }, { - "url": "/blog/2016-04-22-forknote-1/", + "url": "/blog/2016-04-22-forknote-1_0_10_0_1-released/", "title": "Forknote 1.0.10.0.1 Release", "section": "Blog/" }, { - "url": "/blog/2016-07-02-forknote-1/", + "url": "/blog/2016-07-02-forknote-1_0_11-released/", "title": "Forknote 1.0.11 Release", "section": "Blog/" }, From de55889034a6b1b23123fa5a47cc4f6c833288c0 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Wed, 17 Aug 2016 16:09:38 +0300 Subject: [PATCH 35/56] Version reverse --- content/documentation/rpc-wallet/index.md | 3 +- .../rpc-wallet/rpc-wallet-curl-examples.md | 157 ++++++++++++++++++ content/documentation/simplewallet/index.md | 4 +- content/download.md | 12 +- layouts/sidebar-documentation.html | 1 + 5 files changed, 168 insertions(+), 9 deletions(-) create mode 100644 content/documentation/rpc-wallet/rpc-wallet-curl-examples.md diff --git a/content/documentation/rpc-wallet/index.md b/content/documentation/rpc-wallet/index.md index 1ee7bf5..c406507 100644 --- a/content/documentation/rpc-wallet/index.md +++ b/content/documentation/rpc-wallet/index.md @@ -47,7 +47,8 @@ add-priority-node | Specify list of peers to connect to and attempt to keep the add-exclusive-node | Specify list of peers to connect to only. If this option is given the options add-priority-node and seed-node are ignored seed-node | Connect to a node to retrieve peer addresses, and disconnect hide-my-port | Do not announce yourself as peerlist candidate -MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet +MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent +SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet ### Blockchain options diff --git a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md new file mode 100644 index 0000000..01a8eaa --- /dev/null +++ b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md @@ -0,0 +1,157 @@ +--- +title: RPC Wallet curl examples | Forknote +layout: documentation +body_class: developers +subnav_class: docs-guides +sidebar_nav: sidebar-giudes +--- + +# RPC Wallet curl examples + +* TOC +{:toc} + +## reset + +### no parameters + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0", "id": "test","method":"reset"}' http://localhost:9090/json_rpc
    +
    + +### viewSecretKey + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"viewSecretKey": "4a2583e42d010e8aabfed22743789569714196246bf01b5f2fec35af9232d907"},"jsonrpc": "2.0", "id": "test","method":"reset"}' http://localhost:9090/json_rpc
    +
    + + +## save + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0", "id": "test","method":"save"}' http://localhost:9090/json_rpc
    +
    + + +## getViewKey + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0", "id": "test","method":"getViewKey"}' http://localhost:9090/json_rpc
    +
    + + +## getSpendKeys + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"address": "D5dLTBqbemtTFkM9HptxaEgx844trQP2kXk4BfobTYS2J4njZxsQP4nDSeHBf2cGGDWLejg1xaAnKFAAvGTs9rmnVZsmqio"} ,"jsonrpc": "2.0", "id": "test","method":"getSpendKeys"}' http://localhost:9090/json_rpc
    +
    + + +## getStatus + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0", "id": "test","method":"getStatus"}' http://localhost:9090/json_rpc
    +
    + + +## getAddresses + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0", "id": "test","method":"getAddresses"}' http://localhost:9090/json_rpc
    +
    + + +## createAddress + +### no parameter + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
    +
    + +### secretSpendKey + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"secretSpendKey": "7d2ba46048a75235cc260913d4fd85769bc02203583bfdc795bae996ff314421"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
    +
    + +### publicSpendKey + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"publicSpendKey": "9da3c85258fd194c027c20ee9063b2fe3dee48201c083b2574af89e02b18a884"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
    +
    + + +## deleteAddress + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"address": "D4vADauhf7NBYTQ8AoKyByQxJ2g44uiZrLHc1j1iDTccEtTxJdK2pyxDSeHBf2cGGDWLejg1xaAnKFAAvGTs9rmnVZvQLJe"} ,"jsonrpc": "2.0", "id": "test","method":"deleteAddress"}' http://localhost:9090/json_rpc
    +
    + + +## getBalance + +### no parameter + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0", "id": "test","method":"getBalance"}' http://localhost:9090/json_rpc
    +
    + +### address + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"address": "D8ExoFUt2nU961ytoh3YGHb1wF5UoszHmEDjzoPvipdPHz5geH6SPZoddLoNAN5iSDQ6PCQPnMPshMgZMAfjdxmYFMvVuVe"} ,"jsonrpc": "2.0", "id": "test","method":"getBalance"}' http://localhost:9090/json_rpc
    +
    + + +## getBlockHashes + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"firstBlockIndex": 100, "blockCount": 20} ,"jsonrpc": "2.0", "id": "test","method":"getBlockHashes"}' http://localhost:9090/json_rpc
    +
    + + +## getTransactionHashes + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"firstBlockIndex": 100, "blockCount": 20} ,"jsonrpc": "2.0", "id": "test","method":"getBlockHashes"}' http://localhost:9090/json_rpc
    +
    + + +## getTransactions + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"firstBlockIndex": 100, "blockCount": 20} ,"jsonrpc": "2.0", "id": "test","method":"getTransactions"}' http://localhost:9090/json_rpc
    +
    + + +## getUnconfirmedTransactionHashes + +### no parameters + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {} ,"jsonrpc": "2.0", "id": "test","method":"getUnconfirmedTransactionHashes"}' http://localhost:9090/json_rpc
    +
    + +### addresses + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"addresses": []} ,"jsonrpc": "2.0", "id": "test","method":"getUnconfirmedTransactionHashes"}' http://localhost:9090/json_rpc
    +
    + + +## getTransaction + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"transactionHash": "c47ba0bad3c62318732dde8029542df3c06a1577ba9152f8212e754190b1e593"} ,"jsonrpc": "2.0", "id": "test","method":"getTransaction"}' http://localhost:9090/json_rpc
    +
    + + +## sendTransaction + +not working + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"anonymity":0, "fee":1000000,"transfers":[{"amount":100000000,"address":"D8ExoFUt2nU961ytoh3YGHb1wF5UoszHmEDjzoPvipdPHz5geH6SPZoddLoNAN5iSDQ6PCQPnMPshMgZMAfjdxmYFMvVuVe"}], "changeAddress": "D8ExoFUt2nU961ytoh3YGHb1wF5UoszHmEDjzoPvipdPHz5geH6SPZoddLoNAN5iSDQ6PCQPnMPshMgZMAfjdxmYFMvVuVe"},"jsonrpc": "2.0", "id": "test","method":"sendTransaction"}' http://localhost:9090/json_rpc
    +
    + diff --git a/content/documentation/simplewallet/index.md b/content/documentation/simplewallet/index.md index a5ad8d5..ac33df0 100644 --- a/content/documentation/simplewallet/index.md +++ b/content/documentation/simplewallet/index.md @@ -34,8 +34,8 @@ daemon-host | Use daemon instance at host <arg> instead of localhost daemon-port | Use daemon instance at port <arg> instead of 8081 set_log | Level of logging. Default is 1. wallet-rpc-bind-port | Starts wallet as rpc server for wallet operations, sets bind port for server -MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet -DEFAULT_FEE | Default fee of the transactions sent through simplewallet +MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent +DEFAULT_FEE | Default fee of the transactions sent SYNC_FROM_ZERO | Sync from block 0. Use for premine wallet or brainwallet ### Blockchain options diff --git a/content/download.md b/content/download.md index 85e14b5..d3af322 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    diff --git a/layouts/sidebar-documentation.html b/layouts/sidebar-documentation.html index dca80cf..5ec3f55 100644 --- a/layouts/sidebar-documentation.html +++ b/layouts/sidebar-documentation.html @@ -18,6 +18,7 @@

    RPC Wallet

    From 6d53c01a01d14eecb700510d52148099ae796043 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Thu, 8 Sep 2016 15:53:20 +0300 Subject: [PATCH 36/56] Download link fixed --- content/download.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/download.md b/content/download.md index d3af322..6ae3e19 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From c18c9a2492d03c048c24be5c68c7b27912ad7129 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Fri, 7 Oct 2016 20:19:01 +0300 Subject: [PATCH 37/56] Added MAX_BLOCK_SIZE_INITIAL fix --- .../rpc-wallet/rpc-wallet-curl-examples.md | 4 ++-- layouts/sidebar.html | 18 ------------------ lib/search_generator.rb | 17 ----------------- static/partials/create.js | 2 ++ 4 files changed, 4 insertions(+), 37 deletions(-) delete mode 100644 layouts/sidebar.html diff --git a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md index 01a8eaa..a8c3eea 100644 --- a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md +++ b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md @@ -75,10 +75,10 @@ curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0" curl -X POST -i -H "Accept: application/json" -d '{"params": {"secretSpendKey": "7d2ba46048a75235cc260913d4fd85769bc02203583bfdc795bae996ff314421"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
    -### publicSpendKey +### spendPublicKey
    -curl -X POST -i -H "Accept: application/json" -d '{"params": {"publicSpendKey": "9da3c85258fd194c027c20ee9063b2fe3dee48201c083b2574af89e02b18a884"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"spendPublicKey": "9da3c85258fd194c027c20ee9063b2fe3dee48201c083b2574af89e02b18a884"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
     
    diff --git a/layouts/sidebar.html b/layouts/sidebar.html deleted file mode 100644 index 5e55dbf..0000000 --- a/layouts/sidebar.html +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/lib/search_generator.rb b/lib/search_generator.rb index c824abd..89f829e 100755 --- a/lib/search_generator.rb +++ b/lib/search_generator.rb @@ -8,24 +8,7 @@ class SearchFilter < Nanoc::Filter $search_file_path = File.join(Dir.pwd, "static", "search-index.json") $search_file_contents = { :pages => [] } - sidebar = File.open(File.join(Dir.pwd, "layouts", "sidebar.html")) - $sidebar_doc = Nokogiri::HTML(sidebar) - sidebar.close - def run(content, params={}) - # uses nokogiri to determine parent section name - containing_li_text = $sidebar_doc.xpath("//a[@href='#{@item.identifier}']/../../../h3/a[2]/text()") - - # we're looking at an overview page - containing_li_text = $sidebar_doc.xpath("//a[@href='#{@item.identifier}']/text()") if containing_li_text.empty? - - page = { :url => @item.identifier, :title => @item[:title].split("|")[0].strip, :section => "Blog/#{containing_li_text}" } - - $search_file_contents[:pages] << page - $search_file_contents[:pages] = merge_sort($search_file_contents[:pages]) - - write_search_file - content end diff --git a/static/partials/create.js b/static/partials/create.js index 8671737..7ab5c38 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -489,6 +489,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil $scope.coin_json = (JSON.parse(JSON.stringify($scope.coin))); delete $scope.coin_json.core.ADDRESSES; $scope.coin_json.core.CHECKPOINTS = ""; + $scope.coin_json.core.MAX_BLOCK_SIZE_INITIAL = $scope.coin.core['CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE']; $scope.coin_json_stringified = JSON.stringify($scope.coin_json, null, 4); $scope.$broadcast('show-errors-check-validity'); if ($scope.coinForm.$valid) { @@ -534,6 +535,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil } } } + $scope.coin_daemon_config += "MAX_BLOCK_SIZE_INITIAL=" + $scope.coin.core['CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE'] + "\n"; $scope.coin_daemon_config += "UPGRADE_HEIGHT_V2=1" + "\n"; $scope.coin_daemon_config += "UPGRADE_HEIGHT_V3=2" + "\n"; if(!$scope.coin.core['SEED_NODES'].length) { From bcfd1c38791db7ceae7a4bd228ed0aafffc5d054 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Fri, 11 Nov 2016 05:55:30 +0200 Subject: [PATCH 38/56] Change version to the newest release. Coins now leads to github repo --- content/coins/index.md | 249 ------------------ .../cryptonote-generator/extensions.md | 4 +- content/download.md | 12 +- content/index.md | 4 +- 4 files changed, 10 insertions(+), 259 deletions(-) delete mode 100644 content/coins/index.md diff --git a/content/coins/index.md b/content/coins/index.md deleted file mode 100644 index f37e6a8..0000000 --- a/content/coins/index.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: Existing blockchains | Forknote -layout: overview -body_class: coins ---- - - - -
    -
    -

    Join the Forknote Community.

    -

    The easiest way to create Cryptonote blockchains. Create now.

    -
    -
    - -
    -
      -
    • - -

      Bytecoin

      -

      The seed coin of Forknote. All Forknote-based blockchains have the same core features as Bytecoin.

      -
    • -
    • - -

      Dashcoin

      -

      The original idea for cloning the core features of Bytecoin started with Dashcoin.

      -
    • -
    • - -

      Magnatoj

      -

      Magnatoj is the first coin joined the Forknote familly

      -
    • -
    -
    -
    - -
    - -
    -
    - -

    New to Forknote?

    -

    A few tips you start:

    - -
    - -
    - -

    Want to create a private blockchain?

    -

    Fast start with our blockchain creation form or go streight to the documentation:

    - -
    -
    - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/documentation/cryptonote-generator/extensions.md b/content/documentation/cryptonote-generator/extensions.md index a71be27..b80b65d 100644 --- a/content/documentation/cryptonote-generator/extensions.md +++ b/content/documentation/cryptonote-generator/extensions.md @@ -37,7 +37,7 @@ source | Path to file. Used only with "add" action ## Changes Key | Description -action | Available options: replace, add_above, add_bellow, delete +action | Available options: replace, add_above, add_below, delete marker | Place in the file where to perform the "action" parameters | "text" - array of strings, used as new or added text. Use %s for variables
    "var" - variable from the configuration file @@ -63,7 +63,7 @@ parameters | "text" - array of strings, used as new or added text. Use %s for va } } { - "action":"add_bellow", + "action":"add_below", "marker":"size_t blockGrantedFullRewardZone()", "parameters": { "text":[ diff --git a/content/download.md b/content/download.md index 6ae3e19..85e14b5 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    diff --git a/content/index.md b/content/index.md index cf947bb..1a000b5 100644 --- a/content/index.md +++ b/content/index.md @@ -28,8 +28,8 @@ layout: overview

    New to Forknote? With these guides you’ll be up and running in a snap.

  • - -

    Existing blockchains

    + +

    Existing blockchains

    List of existing Forknote-supported blockchains.

  • From 32cf24fda55d850b03c125484dbdfe1c668e1be8 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sat, 14 Jan 2017 09:39:09 +0200 Subject: [PATCH 39/56] Forknote v2.0.1 changes --- .../cryptonote-generator/index.md | 4 ++-- content/documentation/daemon/index.md | 15 ++++++++++--- content/documentation/index.md | 21 ++++++++++++++++--- .../rpc-wallet/rpc-wallet-curl-examples.md | 2 +- content/download.md | 12 +++++------ layouts/_social.html | 2 -- 6 files changed, 39 insertions(+), 17 deletions(-) diff --git a/content/documentation/cryptonote-generator/index.md b/content/documentation/cryptonote-generator/index.md index ce3298f..12dde7b 100644 --- a/content/documentation/cryptonote-generator/index.md +++ b/content/documentation/cryptonote-generator/index.md @@ -44,9 +44,9 @@ EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to c UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains DIFFICULTY_CUT | Timestamps to cut after sorting +DIFFICULTY_CUT | Timestamps to cut after sorting +DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks -MAX_TRANSACTION_SIZE_LIMIT | Maximum size of the transactions sent through simplewallet -DEFAULT_FEE | Default fee of the transactions sent through simplewallet ## Example diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 78b3820..9f00a82 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -58,8 +58,8 @@ Option | Description BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks CHECKPOINT | Checkpoints. Format: HEIGHT:HASH CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used only by old (v1) coins -CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used only by old (v2) coins +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V1 | The maximum size of a block not resulting into penelty. Used by (v1) blockchains +CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 | The maximum size of a block not resulting into penelty. Used by (v2) blockchains CRYPTONOTE_COIN_VERSION | Use '1' for Cryptonote coin clones (the new version) CRYPTONOTE_DISPLAY_DECIMAL_POINT | 1 coin = 10^(this value) atomic units CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transactions @@ -67,10 +67,17 @@ CRYPTONOTE_NAME | Cryptonote name. Used for storage directory CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX | Prefix of the wallet address. Since the rules for address prefixes are nontrivial you may use a prefix generator DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust DIFFICULTY_CUT | Timestamps to cut after sorting +DIFFICULTY_CUT_V1 | Timestamps to cut after sorting. Used by (v1) blockchains +DIFFICULTY_CUT_V2 | Timestamps to cut after sorting. Used by (v2) blockchains DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks +DIFFICULTY_LAG_V1 | Lag of calculating the difficulty in terms of blocks. Used by (v1) blockchains +DIFFICULTY_LAG_V2 | Lag of calculating the difficulty in terms of blocks. Used by (v2) blockchains DIFFICULTY_TARGET | Difficulty target is an ideal time period between blocks. Measured in seconds. +DIFFICULTY_WINDOW | Window length for calculation the difficulty +DIFFICULTY_WINDOW_V1 | Window length for calculation the difficulty. Used by (v1) blockchains +DIFFICULTY_WINDOW_V2 | Window length for calculation the difficulty. Used by (v2) blockchains EMISSION_SPEED_FACTOR | Constant defines emission curve slope. This parameter is required to calulate block reward. -EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 coins +EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct errors GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block KILL_HEIGHT | End blockchain at height @@ -79,8 +86,10 @@ MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons MONEY_SUPPLY | Total amount of coins to be emitted. P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key +TAIL_EMISSION_REWARD | Block reward will never drop below this value. UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains +ZAWY_DIFFICULTY_V2 | '1' if the coin uses Zawy difficulty. Active if the block major version is >=2 ##Example of a config file diff --git a/content/documentation/index.md b/content/documentation/index.md index eafe588..d782d64 100644 --- a/content/documentation/index.md +++ b/content/documentation/index.md @@ -8,17 +8,22 @@ sidebar_nav: sidebar-documentation # Forknote command line client overview -Forknote works through 2 separate binary files operated through command line: +Forknote works through 3 separate binary files operated through command line: * **forknoted** – daemon to synchronize the block chain and mine cryptonote tokens. * **simplewallet** – wallet to receive and send funds. +* **walletd** – RPC wallet for services. + ## Install Forknote 1. Unzip the archive to one separate folder +2. Create or download the desired configuration: [Forknote configurations][github_forknote_configs] + + ## Launch Forknote @@ -51,7 +56,7 @@ help | Show all daemon commands exit | Exit forknoted -## Wallet: send and receive payments +## Simplewallet: send and receive payments *Main article: [Simplewallet configuration and commands][simplewallet_commands]* @@ -69,5 +74,15 @@ help | Show all wallet commands exit | Exit simplewallet +## Walletd: + +*Main article: [RPC wallet introduction][rpc_wallet_index]* + +The RPC wallet is the way for services to send, recieve and track transactions. + + + [daemon_commands]: /documentation/daemon/ -[simplewallet_commands]: /documentation/simplewallet/ \ No newline at end of file +[simplewallet_commands]: /documentation/simplewallet/ +[rpc_wallet_index]: /documentation/rpc-wallet/json-rpc-api/ +[github_forknote_configs]: https://github.com/forknote/configs diff --git a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md index a8c3eea..dff340f 100644 --- a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md +++ b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md @@ -72,7 +72,7 @@ curl -X POST -i -H "Accept: application/json" -d '{"params": {},"jsonrpc": "2.0" ### secretSpendKey
    -curl -X POST -i -H "Accept: application/json" -d '{"params": {"secretSpendKey": "7d2ba46048a75235cc260913d4fd85769bc02203583bfdc795bae996ff314421"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"spendSecretKey": "7d2ba46048a75235cc260913d4fd85769bc02203583bfdc795bae996ff314421"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
     
    ### spendPublicKey diff --git a/content/download.md b/content/download.md index 85e14b5..8b80c54 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    diff --git a/layouts/_social.html b/layouts/_social.html index 3bbf39a..77dc067 100644 --- a/layouts/_social.html +++ b/layouts/_social.html @@ -1,6 +1,4 @@ From 15901c8ae656ed4fa734000f6b131c7dfb05c70c Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Wed, 10 May 2017 17:03:52 +0300 Subject: [PATCH 40/56] version update --- .../rpc-wallet/rpc-wallet-curl-examples.md | 6 ++++++ content/documentation/rpc-wallet/untitled.mdown | 1 + content/download.md | 12 ++++++------ 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 content/documentation/rpc-wallet/untitled.mdown diff --git a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md index dff340f..dc610b3 100644 --- a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md +++ b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md @@ -155,3 +155,9 @@ not working curl -X POST -i -H "Accept: application/json" -d '{"params": {"anonymity":0, "fee":1000000,"transfers":[{"amount":100000000,"address":"D8ExoFUt2nU961ytoh3YGHb1wF5UoszHmEDjzoPvipdPHz5geH6SPZoddLoNAN5iSDQ6PCQPnMPshMgZMAfjdxmYFMvVuVe"}], "changeAddress": "D8ExoFUt2nU961ytoh3YGHb1wF5UoszHmEDjzoPvipdPHz5geH6SPZoddLoNAN5iSDQ6PCQPnMPshMgZMAfjdxmYFMvVuVe"},"jsonrpc": "2.0", "id": "test","method":"sendTransaction"}' http://localhost:9090/json_rpc
  • + +## getUnspendOuts + +
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"address": "D8ExoFUt2nU961ytoh3YGHb1wF5UoszHmEDjzoPvipdPHz5geH6SPZoddLoNAN5iSDQ6PCQPnMPshMgZMAfjdxmYFMvVuVe"} ,"jsonrpc": "2.0", "id": "test","method":"getUnspendOuts"}' http://localhost:9090/json_rpc
    +
    diff --git a/content/documentation/rpc-wallet/untitled.mdown b/content/documentation/rpc-wallet/untitled.mdown new file mode 100644 index 0000000..9b23db9 --- /dev/null +++ b/content/documentation/rpc-wallet/untitled.mdown @@ -0,0 +1 @@ +curl -X POST -i -H "Accept: application/json" -d '{"params": {"address": "D4HKyBuZPqF4GizL13kM6rK5H6iF2Em9BA55tdaMKyDHBEs674sG5gah3aWN9KJHHbJkfG9LwE3qfNy67iN8i2JBREdH4ZB"} ,"jsonrpc": "2.0", "id": "test","method":"getUnspendOuts"}' http://localhost:9090/json_rpc \ No newline at end of file diff --git a/content/download.md b/content/download.md index 8b80c54..a33a759 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From b687767cd76ca60998a4cc1082cbeb9e67f58784 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Wed, 10 May 2017 17:04:28 +0300 Subject: [PATCH 41/56] version update --- content/documentation/rpc-wallet/untitled.mdown | 1 - 1 file changed, 1 deletion(-) delete mode 100644 content/documentation/rpc-wallet/untitled.mdown diff --git a/content/documentation/rpc-wallet/untitled.mdown b/content/documentation/rpc-wallet/untitled.mdown deleted file mode 100644 index 9b23db9..0000000 --- a/content/documentation/rpc-wallet/untitled.mdown +++ /dev/null @@ -1 +0,0 @@ -curl -X POST -i -H "Accept: application/json" -d '{"params": {"address": "D4HKyBuZPqF4GizL13kM6rK5H6iF2Em9BA55tdaMKyDHBEs674sG5gah3aWN9KJHHbJkfG9LwE3qfNy67iN8i2JBREdH4ZB"} ,"jsonrpc": "2.0", "id": "test","method":"getUnspendOuts"}' http://localhost:9090/json_rpc \ No newline at end of file From 76200e94c51952a13796928ea6262f7231476515 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Sun, 28 May 2017 18:29:04 +0300 Subject: [PATCH 42/56] version change --- content/download.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/download.md b/content/download.md index a33a759..c6ec606 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From 5b85d6e5bf3223e08dddd0d67f4f62edc9a32635 Mon Sep 17 00:00:00 2001 From: Petar Mitchev Date: Thu, 15 Jun 2017 01:25:46 +0300 Subject: [PATCH 43/56] v2.0.6 release --- content/download.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/download.md b/content/download.md index c6ec606..e38946e 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From d6a3843d71064a3f3fc57c813e7007840a8f1a5a Mon Sep 17 00:00:00 2001 From: pmitchev Date: Sat, 29 Jul 2017 03:01:08 +0300 Subject: [PATCH 44/56] version changed to 2.0.6.1 --- content/download.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/download.md b/content/download.md index e38946e..0ae2975 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From 8daa9c371366809207e0d67702e8bc0dc13e085b Mon Sep 17 00:00:00 2001 From: pmitchev Date: Tue, 22 Aug 2017 02:51:28 +0300 Subject: [PATCH 45/56] v2.1.0 --- Gemfile | 4 ++-- content/download.md | 12 ++++++------ static/partials/create.js | 31 +++++++++++++++++++++++++------ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/Gemfile b/Gemfile index 64969aa..4deeb4a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source "http://rubygems.org" -ruby '2.2.1' +ruby '2.4.1' gem 'builder' gem 'coderay' @@ -11,7 +11,7 @@ gem 'nokogiri', '~> 1.6.0' gem 'rouge', '~> 1.4' gem 'rake', '~> 0.9.2' gem 'thin' -gem 'yajl-ruby', '~> 0.8.2' +gem 'yajl-ruby' group :development do gem 'adsf' diff --git a/content/download.md b/content/download.md index 0ae2975..c929761 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    diff --git a/static/partials/create.js b/static/partials/create.js index 7ab5c38..c02eb8a 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -26,6 +26,17 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil $scope.coin.core.CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW = 10; $scope.coin.core.CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE = 100000; $scope.coin.core.CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 86; + $scope.coin.core.DIFFICULTY_CUT_V1 = 60; + $scope.coin.core.DIFFICULTY_CUT_V2 = 60; + $scope.coin.core.DIFFICULTY_CUT = 0; + $scope.coin.core.DIFFICULTY_LAG_V1 = 15; + $scope.coin.core.DIFFICULTY_LAG_V2 = 15; + $scope.coin.core.DIFFICULTY_LAG = 0; + $scope.coin.core.DIFFICULTY_WINDOW_V1 = 720; + $scope.coin.core.DIFFICULTY_WINDOW_V2 = 720; + $scope.coin.core.DIFFICULTY_WINDOW = 17; + $scope.coin.core.ZAWY_DIFFICULTY_V3 = 1; + $scope.address_prefix = 'F'; $scope.ports_range_min = 1024; $scope.ports_range_max = 49151; @@ -340,6 +351,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil // Difficulty target changed $scope.difficultyTargetChanged = function () { + setDifficultyWindow(); setMinedMoneyUnlockWindow(); } @@ -386,8 +398,8 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil break; } - if (i === 7) { - j++; + if (i === 7) { + j++; i = -1; } @@ -413,6 +425,13 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil $scope.coin.core.DAEMON_NAME = $scope.coin.core.CRYPTONOTE_NAME + "d"; } +// Set mined money unlock window + function setDifficultyWindow() { + $scope.coin.core.DIFFICULTY_WINDOW_V1 = Math.ceil(24 * 60 * 60 / $scope.coin.core.DIFFICULTY_TARGET); + $scope.coin.core.DIFFICULTY_WINDOW_V2 = Math.ceil(24 * 60 * 60 / $scope.coin.core.DIFFICULTY_TARGET); + return 0; + } + // Set mined money unlock window function setMinedMoneyUnlockWindow() { $scope.coin.core.CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW = Math.ceil(1200 / $scope.coin.core.DIFFICULTY_TARGET); @@ -430,18 +449,18 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil } $scope.P2PDefaultPortChanged = function (){ - $scope.coin.core.RPC_DEFAULT_PORT = $scope.coin.core.P2P_DEFAULT_PORT + 1; + $scope.coin.core.RPC_DEFAULT_PORT = $scope.coin.core.P2P_DEFAULT_PORT + 1; } $scope.networkIdentifierJson = { } $scope.networkIdentifierConfig = { - + } // Randomize network identifier - $scope.randomizeNetworkIdentifier = function () { + $scope.randomizeNetworkIdentifier = function () { var network_identifier = ''; var deamon_network_identifier = ''; for(var i = 0; i < 16; i++) { @@ -537,7 +556,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil } $scope.coin_daemon_config += "MAX_BLOCK_SIZE_INITIAL=" + $scope.coin.core['CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE'] + "\n"; $scope.coin_daemon_config += "UPGRADE_HEIGHT_V2=1" + "\n"; - $scope.coin_daemon_config += "UPGRADE_HEIGHT_V3=2" + "\n"; + $scope.coin_daemon_config += "UPGRADE_HEIGHT_V3=25" + "\n"; if(!$scope.coin.core['SEED_NODES'].length) { $scope.coin_daemon_config += "seed-node=127.0.0.1:" + $scope.coin.core['P2P_DEFAULT_PORT']; } From 0b988ca8a58fd84806ad2f828331a31ca2134d05 Mon Sep 17 00:00:00 2001 From: pmitchev Date: Wed, 23 Aug 2017 16:38:51 +0300 Subject: [PATCH 46/56] Version changed to v2.1.0.1 --- content/download.md | 12 ++++++------ static/partials/create.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/content/download.md b/content/download.md index c929761..d76baf0 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    diff --git a/static/partials/create.js b/static/partials/create.js index c02eb8a..e469748 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -556,7 +556,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil } $scope.coin_daemon_config += "MAX_BLOCK_SIZE_INITIAL=" + $scope.coin.core['CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE'] + "\n"; $scope.coin_daemon_config += "UPGRADE_HEIGHT_V2=1" + "\n"; - $scope.coin_daemon_config += "UPGRADE_HEIGHT_V3=25" + "\n"; + $scope.coin_daemon_config += "UPGRADE_HEIGHT_V3=30" + "\n"; if(!$scope.coin.core['SEED_NODES'].length) { $scope.coin_daemon_config += "seed-node=127.0.0.1:" + $scope.coin.core['P2P_DEFAULT_PORT']; } From c223d11bcaf08f9623d85a34824e0ab0c4a3d34a Mon Sep 17 00:00:00 2001 From: pmitchev Date: Thu, 24 Aug 2017 03:59:00 +0300 Subject: [PATCH 47/56] Adding --- static/partials/create.js | 1 + 1 file changed, 1 insertion(+) diff --git a/static/partials/create.js b/static/partials/create.js index e469748..93f0b5c 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -25,6 +25,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil $scope.coin.core.MINIMUM_FEE = 1000000; $scope.coin.core.CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW = 10; $scope.coin.core.CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE = 100000; + $scope.coin.core.MAX_TRANSACTION_SIZE_LIMIT = 100000; $scope.coin.core.CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 86; $scope.coin.core.DIFFICULTY_CUT_V1 = 60; $scope.coin.core.DIFFICULTY_CUT_V2 = 60; From 606e67052ff7d5e24e9fd2a770cdf8aa8a10000b Mon Sep 17 00:00:00 2001 From: pmitchev Date: Sat, 26 Aug 2017 23:43:33 +0300 Subject: [PATCH 48/56] Adding line for zawy --- static/partials/create.js | 1 + 1 file changed, 1 insertion(+) diff --git a/static/partials/create.js b/static/partials/create.js index 93f0b5c..b0dad85 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -37,6 +37,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil $scope.coin.core.DIFFICULTY_WINDOW_V2 = 720; $scope.coin.core.DIFFICULTY_WINDOW = 17; $scope.coin.core.ZAWY_DIFFICULTY_V3 = 1; + $scope.coin.core.ZAWY_DIFFICULTY_DIFFICULTY_BLOCK_VERSION = 3; $scope.address_prefix = 'F'; $scope.ports_range_min = 1024; From a3ac511d481873eb48f428d8cb2ae010fb9076ff Mon Sep 17 00:00:00 2001 From: pmitchev Date: Thu, 14 Sep 2017 03:13:30 +0300 Subject: [PATCH 49/56] v2.1.1 --- .../2017-09-13-forknote-2_1_1-released.md | 37 +++++++++++++++++++ content/documentation/daemon/index.md | 26 ++++++++----- content/download.md | 12 +++--- 3 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 content/blog/2017-09-13-forknote-2_1_1-released.md diff --git a/content/blog/2017-09-13-forknote-2_1_1-released.md b/content/blog/2017-09-13-forknote-2_1_1-released.md new file mode 100644 index 0000000..bb236e1 --- /dev/null +++ b/content/blog/2017-09-13-forknote-2_1_1-released.md @@ -0,0 +1,37 @@ +--- +kind: article +title: "Forknote 2.1.1 Release" +created_at: 2017-09-13 +author_name: pmitchev +--- + +Forknote 2.1.1 was released. + + +**Changes:** + + * Core changed to Bytecoin 2.1.1 + + +**Configuration variables changes:** + + * _MIN_MIXIN_ - minimum mixin amount. Not enforced by default on blockchain level + * _MIXIN_START_HEIGHT_ - use to define the maximum height of a blockchain + * _MANDATORY_MIXIN_BLOCK_VERSION_ - Enforce minimum mixin _MIN_MIXIN_ on blockchain level, after block with major version bigger than _MANDATORY_MIXIN_BLOCK_VERSION_ + * _BUGGED_ZAWY_DIFFICULTY_BLOCK_INDEX_ - used only by coins adopted bugged _ZAWY_DIFFICULTY_BLOCK_INDEX_ + +You can download this release from here: +[https://github.com/forknote/forknote/releases/tag/2.1.1](https://github.com/forknote/forknote/releases/tag/2.1.1) + + +**Replay attack protection for Forknote blockchains** + +To protect your transactions from replay attacks, use in your config _MIN_MIXIN_ greater than 0 and _MIXIN_START_HEIGHT_ equal or greater than the fork's height. + +Example for Dashcoin and Dashcoin Minergate: +https://github.com/forknote/configs/blob/master/dashcoin.conf +https://github.com/forknote/configs/blob/master/dashcoin.minergate.conf + +Example for Quazarcoin Forknote and Quazarcoin Minergate: +https://github.com/forknote/configs/blob/master/quazarcoin.conf +https://github.com/forknote/configs/blob/master/quazarcoin.minergate.conf diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 9f00a82..2d1e0ee 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -15,7 +15,7 @@ sidebar_nav: sidebar-documentation --help Produce help message --version Output version information - --os-version + --os-version --data-dir arg (=/Users/USER/.forknote) Specify data directory --config-file arg (=./configs/-.conf) Specify configuration file @@ -55,6 +55,7 @@ enable-blockchain-indexes | Enable blockchain indexes Option | Description -----------|-----------| +BUGGED_ZAWY_DIFFICULTY_BLOCK_INDEX | used only by coins adopted bugged ZAWY_DIFFICULTY_BLOCK_INDEX BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks CHECKPOINT | Checkpoints. Format: HEIGHT:HASH CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. @@ -81,19 +82,24 @@ EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to c GENESIS_BLOCK_REWARD | Amount of premined coins. In atomic units GENESIS_COINBASE_TX_HEX | The hex of the transaction in the genesis block KILL_HEIGHT | End blockchain at height +MANDATORY_MIXIN_BLOCK_VERSION | Enforce minimum mixin MIN_MIXIN on blockchain level, after block with major version bigger than MANDATORY_MIXIN_BLOCK_VERSION MANDATORY_TRANSACTION | Only blocks with more than 1 transactions are valid (exluding the base transaction) MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins +MIN_MIXIN | minimum mixin amount. Not enforced by default on blockchain level MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons +MIXIN_START_HEIGHT | use to define the maximum height of a blockchain MONEY_SUPPLY | Total amount of coins to be emitted. P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key TAIL_EMISSION_REWARD | Block reward will never drop below this value. UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains +ZAWY_DIFFICULTY_BLOCK_INDEX | Activates Zawy difficulty after certain block height +ZAWY_DIFFICULTY_DIFFICULTY_BLOCK_VERSION | Activates Zawy difficulty after block major version ZAWY_DIFFICULTY_V2 | '1' if the coin uses Zawy difficulty. Active if the block major version is >=2 ##Example of a config file -
    $ cat ./fakecoin.conf 
    +
    $ cat ./fakecoin.conf
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    @@ -118,15 +124,15 @@ Command | Description | Args
     -----------|-----------|-----------|
     help | print forknoted commands | -
     start_mining | Start mining in several threads to a given wallet address | [string] wallet_address 
    [uint] threads -stop_mining | Stop mining | - -show_hr | Show current mining hashrate | - +stop_mining | Stop mining | - +show_hr | Show current mining hashrate | - hide_hr | Stop showing current mining hashrate | - exit | Exit forknoted | - print_bc | Print blockchain info in a given blocks range | [uint] begin_height
    [uint] end_height (optional) print_block | Print block | [string] block_hash or [uint] block_height -print_cn | Print connections | - -print_pl | Print peer list | - -print_pool | Print transaction pool (long format) | - -print_pool_sh | Print transaction pool (short format) | - -set_log | Change current log detailization level | [uint] log level (0 - 4) -print_tx | Print transaction | [string] transaction_hash +print_cn | Print connections | - +print_pl | Print peer list | - +print_pool | Print transaction pool (long format) | - +print_pool_sh | Print transaction pool (short format) | - +set_log | Change current log detailization level | [uint] log level (0 - 4) +print_tx | Print transaction | [string] transaction_hash diff --git a/content/download.md b/content/download.md index d76baf0..f57a979 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From 8ff92f1ea4fd1bf02aea4d4ed9fa6142a4a9b79d Mon Sep 17 00:00:00 2001 From: pmitchev Date: Thu, 14 Sep 2017 15:09:37 +0300 Subject: [PATCH 50/56] Documentation fix --- content/documentation/daemon/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 2d1e0ee..49b17fe 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -87,7 +87,7 @@ MANDATORY_TRANSACTION | Only blocks with more than 1 transactions are valid (exl MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 coins MIN_MIXIN | minimum mixin amount. Not enforced by default on blockchain level MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons -MIXIN_START_HEIGHT | use to define the maximum height of a blockchain +MIXIN_START_HEIGHT | minimum block height of the used outputs for mixin MONEY_SUPPLY | Total amount of coins to be emitted. P2P_STAT_TRUSTED_PUB_KEY | P2P stat trusted pub key TAIL_EMISSION_REWARD | Block reward will never drop below this value. From 354b0445604e37c148d365e5ec02154a2688ea83 Mon Sep 17 00:00:00 2001 From: pmitchev Date: Wed, 18 Oct 2017 22:44:46 +0300 Subject: [PATCH 51/56] v2.1.2 released --- Gemfile | 2 +- .../2017-10-17-forknote-2_1_2-released.md | 19 +++++++++++++++++++ .../rpc-wallet/rpc-wallet-curl-examples.md | 2 +- content/download.md | 12 ++++++------ 4 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 content/blog/2017-10-17-forknote-2_1_2-released.md diff --git a/Gemfile b/Gemfile index 4deeb4a..7389683 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source "http://rubygems.org" -ruby '2.4.1' +ruby '2.4.2' gem 'builder' gem 'coderay' diff --git a/content/blog/2017-10-17-forknote-2_1_2-released.md b/content/blog/2017-10-17-forknote-2_1_2-released.md new file mode 100644 index 0000000..02bfe53 --- /dev/null +++ b/content/blog/2017-10-17-forknote-2_1_2-released.md @@ -0,0 +1,19 @@ +--- +kind: article +title: "Forknote 2.1.2 Release" +created_at: 2017-10-17 +author_name: pmitchev +--- + +Forknote 2.1.2 was released. + + +**Changes:** + + * Core changed to Bytecoin 2.1.2 + * simplewallet hanging issues fixed + * daemon sync problems for some networks fixed + * minor bugs fixed + +You can download this release from here: +[https://github.com/forknote/forknote/releases/tag/2.1.2](https://github.com/forknote/forknote/releases/tag/2.1.2) diff --git a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md index dc610b3..ac39164 100644 --- a/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md +++ b/content/documentation/rpc-wallet/rpc-wallet-curl-examples.md @@ -78,7 +78,7 @@ curl -X POST -i -H "Accept: application/json" -d '{"params": {"spendSecretKey": ### spendPublicKey
    -curl -X POST -i -H "Accept: application/json" -d '{"params": {"spendPublicKey": "9da3c85258fd194c027c20ee9063b2fe3dee48201c083b2574af89e02b18a884"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
    +curl -X POST -i -H "Accept: application/json" -d '{"params": {"spendPublicKey": "5c4da91676f4906575d03345aa3c822fadcbea432f2fd23701e2b466b73d0dec"},"jsonrpc": "2.0", "id": "test","method":"createAddress"}' http://localhost:9090/json_rpc
     
    diff --git a/content/download.md b/content/download.md index f57a979..6bdaa24 100644 --- a/content/download.md +++ b/content/download.md @@ -14,18 +14,18 @@ body_class: download
    From b8e9b449df97264b76efc2ab2027b1ef824a7022 Mon Sep 17 00:00:00 2001 From: pmitchev Date: Thu, 1 Feb 2018 14:19:56 +0200 Subject: [PATCH 52/56] Zawy diff is refactored to ZAWY_DIFFICULTY_BLOCK_INDEX. Old format is depricated --- static/partials/create.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/static/partials/create.js b/static/partials/create.js index b0dad85..1cb99ee 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -36,8 +36,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil $scope.coin.core.DIFFICULTY_WINDOW_V1 = 720; $scope.coin.core.DIFFICULTY_WINDOW_V2 = 720; $scope.coin.core.DIFFICULTY_WINDOW = 17; - $scope.coin.core.ZAWY_DIFFICULTY_V3 = 1; - $scope.coin.core.ZAWY_DIFFICULTY_DIFFICULTY_BLOCK_VERSION = 3; + $scope.coin.core.ZAWY_DIFFICULTY_BLOCK_INDEX = 30; // Zawy diff kicks in this block $scope.address_prefix = 'F'; $scope.ports_range_min = 1024; From ccaa66b1b35f53205265eecdc1449010979848c0 Mon Sep 17 00:00:00 2001 From: pmitchev Date: Thu, 1 Feb 2018 14:22:05 +0200 Subject: [PATCH 53/56] Ruby version update --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 7389683..48a232f 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source "http://rubygems.org" -ruby '2.4.2' +ruby '~> 2.4.0' gem 'builder' gem 'coderay' From afab6ee0bd31fb214f9c94a9cfe7a45302c4e98d Mon Sep 17 00:00:00 2001 From: pmitchev Date: Thu, 1 Feb 2018 15:00:57 +0200 Subject: [PATCH 54/56] Adding missing extensions in the create form --- static/partials/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/partials/create.js b/static/partials/create.js index 1cb99ee..48e95db 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -314,7 +314,7 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil // Core changed $scope.coreChanged = function () { if ($scope.base_coin == "bytecoin") { - $scope.coin.extensions = [ "core/bytecoin.json", "print-genesis-tx.json" ]; + $scope.coin.extensions = [ "core/bytecoin.json", "print-genesis-tx.json", "versionized-parameters.json", "zawy-difficulty-algorithm.json" ]; $scope.coin.base_coin.name = "bytecoin"; $scope.coin.base_coin.git = "https://github.com/amjuarez/bytecoin.git"; } From 637b5068e4f2f3ca62f5372633897a38e1a7393a Mon Sep 17 00:00:00 2001 From: pmitchev Date: Tue, 6 Feb 2018 07:35:57 +0200 Subject: [PATCH 55/56] Documentation update --- .../cryptonote-generator/index.md | 4 +--- content/documentation/daemon/index.md | 6 ++---- .../genesis-coinbase-transaction-creation.md | 7 +++---- content/guides/index.md | 21 ++++++++++++++++++- content/guides/setup-private-blockchain.md | 19 ++++++++++++++--- content/guides/starting-seed-node.md | 15 ++++++------- 6 files changed, 50 insertions(+), 22 deletions(-) diff --git a/content/documentation/cryptonote-generator/index.md b/content/documentation/cryptonote-generator/index.md index 12dde7b..a0b59f9 100644 --- a/content/documentation/cryptonote-generator/index.md +++ b/content/documentation/cryptonote-generator/index.md @@ -38,14 +38,12 @@ CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 | The maximum size of a block not r CRYPTONOTE_DISPLAY_DECIMAL_POINT | 1 coin = 10^(this value) atomic units MINIMUM_FEE | Transactions with less than this fee wouldn't be accepted by daemons DEFAULT_DUST_THRESHOLD | The amount bellow this value will be considered as dust -CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transactions +CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW | Number of blocks to unlock miner transactions MAX_BLOCK_SIZE_INITIAL | The size of the initial block. Used to correct error in v1 blockchains EXPECTED_NUMBER_OF_BLOCKS_PER_DAY | Expected number of blocks per day. Used to correct error in v1 blockchains UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains DIFFICULTY_CUT | Timestamps to cut after sorting -DIFFICULTY_CUT | Timestamps to cut after sorting -DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks DIFFICULTY_LAG | Lag of calculating the difficulty in terms of blocks diff --git a/content/documentation/daemon/index.md b/content/documentation/daemon/index.md index 49b17fe..024a0b6 100644 --- a/content/documentation/daemon/index.md +++ b/content/documentation/daemon/index.md @@ -55,7 +55,6 @@ enable-blockchain-indexes | Enable blockchain indexes Option | Description -----------|-----------| -BUGGED_ZAWY_DIFFICULTY_BLOCK_INDEX | used only by coins adopted bugged ZAWY_DIFFICULTY_BLOCK_INDEX BYTECOIN_NETWORK | Used for network packages in order not to mix two different cryptocoin networks CHECKPOINT | Checkpoints. Format: HEIGHT:HASH CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE | The maximum size of a block not resulting into penelty. @@ -94,8 +93,6 @@ TAIL_EMISSION_REWARD | Block reward will never drop below this value. UPGRADE_HEIGHT_V2 | Block hight to move to blocks with major version 2. Use '1' for new blockchains UPGRADE_HEIGHT_V3 | Block hight to move to blocks with major version 3. Use '2' for new blockchains ZAWY_DIFFICULTY_BLOCK_INDEX | Activates Zawy difficulty after certain block height -ZAWY_DIFFICULTY_DIFFICULTY_BLOCK_VERSION | Activates Zawy difficulty after block major version -ZAWY_DIFFICULTY_V2 | '1' if the coin uses Zawy difficulty. Active if the block major version is >=2 ##Example of a config file @@ -109,7 +106,8 @@ GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1 P2P_STAT_TRUSTED_PUB_KEY= UPGRADE_HEIGHT_V2=1 -UPGRADE_HEIGHT_V3=2 +UPGRADE_HEIGHT_V3=30 +ZAWY_DIFFICULTY_BLOCK_INDEX=30 p2p-bind-port=8080 rpc-bind-port=8081 diff --git a/content/guides/genesis-coinbase-transaction-creation.md b/content/guides/genesis-coinbase-transaction-creation.md index 5fc2a69..f4ca711 100644 --- a/content/guides/genesis-coinbase-transaction-creation.md +++ b/content/guides/genesis-coinbase-transaction-creation.md @@ -19,20 +19,19 @@ Forknote give you the ability to create your own genesis coinbase transaction he
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx
     
     config path exist
    -Modify this line into your coin configuration file as is: 
    +Modify this line into your coin configuration file as is:
     GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd0880712101fc680aba69fb5028ade093fb1186ca9de4e65a369ca13ae75fdeef9e952b9449
     
     
    -##For coins with premine +## For coins with premine
    $ ./forknoted --config-file configs/imaginary_blockchain.conf --print-genesis-tx --genesis-block-reward-address FXhKiPxMdJ6LL1iqkEDWbk1BiiQ7SzHY1b3L9KqqPmP95e9toTXKvQSVGePtjfoDUhMPqSEKFhzymA84o6fGPhQiUYP92rT --genesis-block-reward-address FPMfUYtRHcZJdL2nLDH7zi2bZUMzgdMPm8kHibeV4qLh8pfsvZsBF6eiHH8T2QkdZm4viA2F9S4YvUk2PXodvxRPDYVvXyR
     
     config path exist
     outs: 922337203685477580
     outs: 922337203685477580
    -Modify this line into your coin configuration file as is: 
    +Modify this line into your coin configuration file as is:
     GENESIS_COINBASE_TX_HEX=010a01ff0002cc99b3e6cc99b3e60c024fe47e814d9f44c83184334fb3b5f9a4ab3ebb347050e3742729703086a5e130cc99b3e6cc99b3e60c021011cd9c37a669ea1e5a930cac793aa98431dfe77a9274385b4ed29e3e5e2ac021011afb48c42cbd0a72fc9d782580d6474cf68b5eaac224315447e9694809410930
     
     
    - diff --git a/content/guides/index.md b/content/guides/index.md index 8af5a69..14f9862 100644 --- a/content/guides/index.md +++ b/content/guides/index.md @@ -69,8 +69,27 @@ $ ./simplewallet --config-file configs/bytecoin.conf
    +## Mining with miner + +`miner` needs a running and synced daemon. + +To start mining: + +
    +$ ./miner --daemon-address 127.0.0.1:[DAEMON_RPC_PORT]  --address [WALLET_ADDRESS]
    +
    + + +### Examples + +Starting `miner` for the Dashcoin blockchain: + +
    +$ ./miner --daemon-address 127.0.0.1:29081  --address D6WLtrV1SBWV8HWQzQv8uuYuGy3uwZ8ah5iT5HovSqhTKMauquoTsKP8RBJzVqVesX87poYWQgkGWB4
    +
    + [bytecoin]: https://bytecoin.org/ [create]: /create/ [download]: /download/ -[documentation]: /documentation/daemon/#configuration-options \ No newline at end of file +[documentation]: /documentation/daemon/#configuration-options diff --git a/content/guides/setup-private-blockchain.md b/content/guides/setup-private-blockchain.md index e57f0e6..826b71b 100644 --- a/content/guides/setup-private-blockchain.md +++ b/content/guides/setup-private-blockchain.md @@ -32,7 +32,7 @@ view key: f45a0505d89e4c3bbb91c3481861c12b2b0c6e43b9de23fa108a48a0db116901 Your wallet has been generated. Use "help" command to see the list of available commands. Always use "exit" command when closing simplewallet to save -current session's state. Otherwise, you will possibly need to synchronize +current session's state. Otherwise, you will possibly need to synchronize your wallet again. Your wallet key is NOT under risk anyway. **********************************************************************
    @@ -52,9 +52,10 @@ Create the configuration file of your coin by using our [configuration form][cre Save the resulted configuration in the `configs` folder of Forknote. + ###Example on Linux/Mac: -
    $ cat >configs/fakecoin.conf 
    +
    $ cat >configs/fakecoin.conf
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    @@ -64,7 +65,8 @@ GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1
     P2P_STAT_TRUSTED_PUB_KEY=
     
     UPGRADE_HEIGHT_V2=1
    -UPGRADE_HEIGHT_V3=2
    +UPGRADE_HEIGHT_V3=30
    +ZAWY_DIFFICULTY_BLOCK_INDEX=30
     
     p2p-bind-port=8080
     rpc-bind-port=8081
    @@ -96,6 +98,17 @@ After you know the IP of the VPS, you have to add `seed-node` to your configurat
     **Notice: Don't forget to delete the line seed-node=127.0.0.1:xxxxx**
     
     
    +## Starting Mining
    +
    +To see your premined coins, you must start mining:
    +
    +
    +$ ./miner --daemon-address 127.0.0.1:8081  --address D9CTMkRfsJ594cuvX2pGXNWMFK5ARwxPN1x7bFC5wY5XTZxf12LjWUK5QkMVeSkD6gT532FepdaohRYkt99e9gdF6hyrUgx
    +
    + +**Notice: The first few blocks may take a few hours to be found** + + [supported-parameters]: /documentation/daemon/#command-line-options-and-settings-options [create]: /create/ [seed-node-guide]: /guides/starting-seed-node/ diff --git a/content/guides/starting-seed-node.md b/content/guides/starting-seed-node.md index 541a434..f74634f 100644 --- a/content/guides/starting-seed-node.md +++ b/content/guides/starting-seed-node.md @@ -52,7 +52,7 @@ Resolving github.com (github.com)... 192.30.252.32 Unarchive the downloaded file. -
    $ tar -zxvf forknote-linux.tar.gz 
    +
    $ tar -zxvf forknote-linux.tar.gz
     
     forknote-linux/
     forknote-linux/configs/
    @@ -71,7 +71,7 @@ Log into the forknote directory
     
     Write your configuration file
     
    -
    $ cat >configs/fakecoin.conf 
    +
    $ cat >configs/fakecoin.conf
     
     BYTECOIN_NETWORK=10101010-1010-1010-1010-101010101010
     CRYPTONOTE_DISPLAY_DECIMAL_POINT=12
    @@ -81,7 +81,8 @@ GENESIS_COINBASE_TX_HEX=010a01ff0001ffffffffffff0f029b2e4c0271c0b42e7c53291a94d1
     P2P_STAT_TRUSTED_PUB_KEY=
     
     UPGRADE_HEIGHT_V2=1
    -UPGRADE_HEIGHT_V3=2
    +UPGRADE_HEIGHT_V3=30
    +ZAWY_DIFFICULTY_BLOCK_INDEX=30
     
     p2p-bind-port=8080
     rpc-bind-port=8081
    @@ -100,7 +101,7 @@ Log with `root` user and change the directory to `/etc/init/`.
     
     Create the upstart config file.
     
    -
    $ cat >forknote-fakecoin-daemon.conf 
    +
    $ cat >forknote-fakecoin-daemon.conf
     
     description "fakecoin daemon"
     
    @@ -118,7 +119,7 @@ respawn limit 5 30
     
     Start the service.
     
    -
    $ start forknote-fakecoin-daemon 
    +
    $ start forknote-fakecoin-daemon
     
    You now have your seed node up and running. It will automatically restart if something goes wrong. @@ -126,9 +127,9 @@ You now have your seed node up and running. It will automatically restart if som Stopping the service. -
    $ stop forknote-fakecoin-daemon 
    +
    $ stop forknote-fakecoin-daemon
     
    [ditital-ocean]: https://www.digitalocean.com/?refcode=8ebba1ef9746 -[vultr]: http://www.vultr.com/?ref=6832621 \ No newline at end of file +[vultr]: http://www.vultr.com/?ref=6832621 From ba9e8e6a553bc49037f18a2a3719efe685663542 Mon Sep 17 00:00:00 2001 From: pmitchev Date: Thu, 29 Mar 2018 04:38:11 +0300 Subject: [PATCH 56/56] Start moving to multicore --- static/partials/create.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/static/partials/create.js b/static/partials/create.js index 48e95db..7c884f9 100755 --- a/static/partials/create.js +++ b/static/partials/create.js @@ -4,10 +4,9 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$filter', '$timeout', function($scope, $http, $filter, $timeout, $document) { $scope.coin = {}; - $scope.coin.base_coin = {}; $scope.coin.core = {}; - $scope.base_coin = 'bytecoin'; + $scope.base_coin = 'bytecoin-v2'; $scope.coin.core.ADDRESSES = []; $scope.coin.core.SEED_NODES = []; $scope.MONEY_SUPPLY = new JSBigInt(2).pow(64).subtract(1); @@ -313,10 +312,9 @@ angular.module('create-coin').controller("CreateCtrl", ['$scope', '$http', '$fil // Core changed $scope.coreChanged = function () { - if ($scope.base_coin == "bytecoin") { + if ($scope.base_coin == "bytecoin-v2") { $scope.coin.extensions = [ "core/bytecoin.json", "print-genesis-tx.json", "versionized-parameters.json", "zawy-difficulty-algorithm.json" ]; - $scope.coin.base_coin.name = "bytecoin"; - $scope.coin.base_coin.git = "https://github.com/amjuarez/bytecoin.git"; + $scope.coin.base_coin = "bytecoin-v2"; } }

    txjA4cqGpzi`kj} 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�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 z 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