diff --git a/old_chef_blog/jerryaldrichiii.github.io/.gitignore b/old_chef_blog/jerryaldrichiii.github.io/.gitignore new file mode 100644 index 0000000..e520ad7 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/.gitignore @@ -0,0 +1,6 @@ +_site/ +.sass-cache/ + +**/do_not_track/** + +*.swp diff --git a/old_chef_blog/jerryaldrichiii.github.io/CNAME b/old_chef_blog/jerryaldrichiii.github.io/CNAME new file mode 100644 index 0000000..b39bffb --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/CNAME @@ -0,0 +1 @@ +blog.jerryaldrichiii.com \ No newline at end of file diff --git a/old_chef_blog/jerryaldrichiii.github.io/Gemfile b/old_chef_blog/jerryaldrichiii.github.io/Gemfile new file mode 100644 index 0000000..37f5eaa --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'github-pages', group: :jekyll_plugins diff --git a/old_chef_blog/jerryaldrichiii.github.io/Gemfile.lock b/old_chef_blog/jerryaldrichiii.github.io/Gemfile.lock new file mode 100644 index 0000000..00247e4 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/Gemfile.lock @@ -0,0 +1,248 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (4.2.11.1) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.6.0) + public_suffix (>= 2.0.2, < 4.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.17.13) + ruby-enum (~> 0.5) + concurrent-ruby (1.1.5) + dnsruby (1.61.2) + addressable (~> 2.5) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + ethon (0.12.0) + ffi (>= 1.3.0) + eventmachine (1.2.7) + execjs (2.7.0) + faraday (0.15.4) + multipart-post (>= 1.2, < 3) + ffi (1.11.1) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (198) + activesupport (= 4.2.11.1) + github-pages-health-check (= 1.16.1) + jekyll (= 3.8.5) + jekyll-avatar (= 0.6.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.1.5) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.11.0) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.12.1) + jekyll-mentions (= 1.4.1) + jekyll-optional-front-matter (= 0.3.0) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.2.0) + jekyll-redirect-from (= 0.14.0) + jekyll-relative-links (= 0.6.0) + jekyll-remote-theme (= 0.3.1) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.5.0) + jekyll-sitemap (= 1.2.0) + jekyll-swiss (= 0.4.0) + jekyll-theme-architect (= 0.1.1) + jekyll-theme-cayman (= 0.1.1) + jekyll-theme-dinky (= 0.1.1) + jekyll-theme-hacker (= 0.1.1) + jekyll-theme-leap-day (= 0.1.1) + jekyll-theme-merlot (= 0.1.1) + jekyll-theme-midnight (= 0.1.1) + jekyll-theme-minimal (= 0.1.1) + jekyll-theme-modernist (= 0.1.1) + jekyll-theme-primer (= 0.5.3) + jekyll-theme-slate (= 0.1.1) + jekyll-theme-tactile (= 0.1.1) + jekyll-theme-time-machine (= 0.1.1) + jekyll-titles-from-headings (= 0.5.1) + jemoji (= 0.10.2) + kramdown (= 1.17.0) + liquid (= 4.0.0) + listen (= 3.1.5) + mercenary (~> 0.3) + minima (= 2.5.0) + nokogiri (>= 1.8.5, < 2.0) + rouge (= 2.2.1) + terminal-table (~> 1.4) + github-pages-health-check (1.16.1) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (~> 3.0) + typhoeus (~> 1.3) + html-pipeline (2.11.0) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.8.5) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.6.0) + jekyll (~> 3.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.3.1) + commonmarker (~> 0.14) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.5) + commonmarker (~> 0.17.6) + jekyll-commonmark (~> 1) + rouge (~> 2) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.11.0) + jekyll (~> 3.3) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.12.1) + jekyll (~> 3.4) + octokit (~> 4.0, != 4.4.0) + jekyll-mentions (1.4.1) + html-pipeline (~> 2.3) + jekyll (~> 3.0) + jekyll-optional-front-matter (0.3.0) + jekyll (~> 3.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.2.0) + jekyll (~> 3.0) + jekyll-redirect-from (0.14.0) + jekyll (~> 3.3) + jekyll-relative-links (0.6.0) + jekyll (~> 3.3) + jekyll-remote-theme (0.3.1) + jekyll (~> 3.5) + rubyzip (>= 1.2.1, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.5.0) + jekyll (~> 3.3) + jekyll-sitemap (1.2.0) + jekyll (~> 3.3) + jekyll-swiss (0.4.0) + jekyll-theme-architect (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.5.3) + jekyll (~> 3.5) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.1) + jekyll (~> 3.3) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.10.2) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (~> 3.0) + kramdown (1.17.0) + liquid (4.0.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + mercenary (0.3.6) + mini_portile2 (2.4.0) + minima (2.5.0) + jekyll (~> 3.5) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.11.3) + multipart-post (2.1.1) + nokogiri (1.10.3) + mini_portile2 (~> 2.4.0) + octokit (4.14.0) + sawyer (~> 0.8.0, >= 0.5.3) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (3.1.0) + rb-fsevent (0.10.3) + rb-inotify (0.10.0) + ffi (~> 1.0) + rouge (2.2.1) + ruby-enum (0.7.2) + i18n + ruby_dep (1.5.0) + rubyzip (1.2.3) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + typhoeus (1.3.1) + ethon (>= 0.9.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + unicode-display_width (1.6.0) + +PLATFORMS + ruby + +DEPENDENCIES + github-pages + +BUNDLED WITH + 2.0.1 diff --git a/old_chef_blog/jerryaldrichiii.github.io/README.md b/old_chef_blog/jerryaldrichiii.github.io/README.md new file mode 100644 index 0000000..8a6894c --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/README.md @@ -0,0 +1,23 @@ +# blog.jerryaldrichiii.com +This is a [GitHub Pages](https://pages.github.com/) blog. You can view it at [blog.jerryaldrichiii.com](blog.jerryaldrichiii.com). + +## Running Locally + +1. Verify Ruby 2.1.0 or higher is installed: + + ``` + $ruby --version + ruby 2.X.X + ``` + +2. Install Bundler + + ``` + $ gem install bundler + ``` + +3. Run `bundle install` inside this repo + +4. Run `bundle exec jekyll serve` + +5. Navigate to [http://127.0.0.1:4000](http://127.0.0.1:4000) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_config.yml b/old_chef_blog/jerryaldrichiii.github.io/_config.yml new file mode 100644 index 0000000..bb647f3 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_config.yml @@ -0,0 +1,13 @@ +title: Jerry's Blog + +description: > + Ohai! Welcome to my blog.
+ Expect nothing but rambling.
+ All opinions are my own. + +url: "http://blog.jerryaldrichiii.com" + +twitter_username: jerryaldrichiii +github_username: jerryaldrichiii +linkedin_username: jerryaldrichiii +email: me@jerryaldrichiii.com diff --git a/old_chef_blog/jerryaldrichiii.github.io/_layouts/default.html b/old_chef_blog/jerryaldrichiii.github.io/_layouts/default.html new file mode 100644 index 0000000..cef1a5f --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_layouts/default.html @@ -0,0 +1,105 @@ + + + + + {{ site.title }} + + + + + + + + + + + + + + + + + {{ content }} + + + + diff --git a/old_chef_blog/jerryaldrichiii.github.io/_layouts/post.html b/old_chef_blog/jerryaldrichiii.github.io/_layouts/post.html new file mode 100644 index 0000000..f50da55 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_layouts/post.html @@ -0,0 +1,16 @@ +--- +layout: default +--- + +
+
+
+

{{ page.title }}

+ +
+ +
+ {{ content }} +
+
+
diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-09-06-finding-sample-documents-for-syntax-highlighters.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-09-06-finding-sample-documents-for-syntax-highlighters.md new file mode 100644 index 0000000..48de584 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-09-06-finding-sample-documents-for-syntax-highlighters.md @@ -0,0 +1,148 @@ +--- +layout: post +title: Finding sample documents for syntax highlighters +category: other +tags: [syntax, other] +summary: Testing syntax highlighters can be difficult without a sample document. Here is a sample document in Ruby that I found. +--- + +When selecting a syntax highlighting theme, generally all that is presented to choose from is a short sample block. Most of the time it is merely a simple function that prints `Hello world` and if you're lucky it has a comment. Unfortunately, making an informed decision with such little information is difficult. + +One solution would be to write a sample document that contains examples of what you would like to see highlighted. However, the task of writing a lengthy sample document can be quite daunting. The next best solution would be to search for prefabricated documents. When I started down that path I quickly learned that finding such a document is difficult. + +Eventually, I found [this](https://github.com/jneen/rouge/tree/master/spec/visual/samples) collection of documents. Below is an edited version of their Ruby sample: + +```ruby +####### +# ruby 1.9 examples +####### + +state :foo do + rule %r(/) do + token Operator + goto :expr_start + end + + rule(//) { goto :method_call_spaced } +end + +state :foo do + rule %r(/), Thing +end + +%i(this is an array of symbols) +%I(this is too, but with #{@interpolation}) +hash = { answer: 42 } +link_to 'new', new_article_path, class: 'btn' + +##### +# ternaries +# NB [jneen]: MRI ruby actually has different parsing behavior depending on +# ~what variables are defined~, which we can't know in a highlighting context. +# So... we're going to be wrong here, sometimes. Whatever. These cases look +# okay though, but if they break I don't care a whole lot, because Ruby itself +# doesn't parse them consistently. +a ? b::c : :d +a ? b:c +method_that_takes_a_char ?b +cond??b::c : d + +# lol +?????:?? +//?//:// + +a/1 # comment +a / b # comment +a /1 \r[egex]\// +a/ b #comment +x.a / 1 # comment +Foo::a / 3 + 4 + +######## +# method calls +######## + +foo.bar +foo.bar.baz +foo.bar(123).baz() + +foo. + bar + +foo + .bar() + .baz + +foo. + bar + +foo. + bar(). + baz + +######## +# function definitions +######## + +class (get_foo("blub"))::Foo + def (foo("bar") + bar("baz")).something argh, aaahaa + 42 + end +end + +def -@ + 0 - self +end + +class get_the_fuck("out")::Of::My + def parser_definition + ruby! + end +end + +############### +# General +############### + +a.each{|el|anz[el]=anz[el]?anz[el]+1:1} +while x<10000 + b=(p[x]%32)/16<1 ? 0 : 1 + + (x-102>=0? n[x-102].to_i : 0)*a+(x-101>=0?n[x-101].to_i : 0)*e+n[x-100].to_i + n[x+199].to_i*b+n[x+200].to_i*d+n[x+201].to_i*b + +g=%w{} +x=0 + +test //, 123 + +{staples: /\ASTAPLE?S?\s*[0-9]/i, + target: "^TARGET "} + +while x<100 + puts"#{g[x]}" + x+=1 +end + +puts"" +sleep(10) + +1E1E1 +puts 30.send(:/, 5) # prints 6 + +# fun with class attributes +class Foo + def self.blub x + if not x.nil? + self.new + end + end + def another_way_to_get_class + self.class + end +end + +# ruby 1.9 "call operator" +a = Proc.new { 42 } +a.() +``` diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-10-18-debugging-ruby-with-the-pry-debugger.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-10-18-debugging-ruby-with-the-pry-debugger.md new file mode 100644 index 0000000..182ac97 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-10-18-debugging-ruby-with-the-pry-debugger.md @@ -0,0 +1,340 @@ +--- +layout: post +title: Debugging Ruby with the Pry debugger +category: ruby +tags: [ruby, pry, debugging, code] +summary: What is Pry? How does it help me debug my Ruby? +--- + +## What is Pry? +Pry is an interactive shell that provides an approachable interface to debugging Ruby. Most notably it allows for the ability to transverse a running Ruby program much like one would a filesystem. + +## Using Pry + +Pry can be installed using `gem install pry` and be ran directly from your shell using `pry`. + +By adding `require pry` to your Ruby code you can use Pry in your current project. Just requiring Pry will not start a session during execution however. For that, you must also include a breakpoint by adding `binding.pry` to your code. + +> NOTE: I prefer to invoke Pry with a breakpoint on one line (`require 'pry'; binding.pry`). +> This prevents me from forgetting to remove the `require 'pry'` line from the top of the file and accidentally submitting a PR. + +## Navigating the Shell +Once inside a Pry shell you can get a list of available commands by running `help`. + +From that output you can see there are a plethora of executable commands. Don't be discouraged though, I made it for embarrassingly too long using only `ls`, `step`, `puts my_variable_name`, and `exit-program` + +## Simple Usage Guide +One thing I wish I had had when starting to use Pry was a "Simple Usage Guide". Below is just such a thing. + +### Create a Sample File +Create a file called `pry_example.rb` with the following contents + +```ruby +def output_hash(input_hash) + puts input_hash +end + +def set_baz(input_hash, input_value) + input_hash[:baz] = input_value +end + +require 'pry'; binding.pry + +some_hash = {} +some_hash[:foo] = 'bar' + +output_hash(some_hash) + +set_baz(some_hash, 'spam') + +puts "Don't execute me" +``` + +### Starting Pry +Run `ruby pry_example.rb` + +``` +[~/Playground/Blog]$ ruby pry_example.rb + +Frame number: 0/1 + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 11 : + + 6: input_hash[:baz] = input_value + 7: end + 8: + 9: require 'pry'; binding.pry + 10: + => 11: some_hash = {} + 12: some_hash[:foo] = 'bar' + 13: + 14: output_hash(some_hash) + 15: + 16: set_baz(some_hash, 'spam') + +[1] pry(main)> +``` + +As you can see we have halted execution and are at line 11 of our example program + +### Using `step` +To execute the current line and proceed to the next type `step` + +``` +[1] pry(main)> step + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 12 : + + 7: end + 8: + 9: require 'pry'; binding.pry + 10: + 11: some_hash = {} + => 12: some_hash[:foo] = 'bar' + 13: + 14: output_hash(some_hash) + 15: + 16: set_baz(some_hash, 'spam') + 17: + +[1] pry(main):1> +``` + +### Viewing Objects +To verify that line 11 was executed we can inspect the object by typing `some_hash` + +``` +[1] pry(main):1> some_hash +{} +[2] pry(main):1> +``` + +We can see here that `some_hash` is an empty array. + +Run `step` again to execute line 12 and set `some_hash[:foo]` to `bar` + +``` +[2] pry(main):1> step + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 14 : + + 9: require 'pry'; binding.pry + 10: + 11: some_hash = {} + 12: some_hash[:foo] = 'bar' + 13: + => 14: output_hash(some_hash) + 15: + 16: set_baz(some_hash, 'spam') + 17: + 18: puts "Don't execute me" + +[2] pry(main)> +``` + +Now we can see that `some_hash` contains the symbol `:foo` which has the value of `bar` + +``` +[2] pry(main)> some_hash +{:foo=>"bar"} +[3] pry(main)> +``` + +### Using `whereami` +At any time during our execution we can show lines surrounding us with the command `whereami` + +``` +[3] pry(main)> whereami + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 14 : + + 9: require 'pry'; binding.pry + 10: + 11: some_hash = {} + 12: some_hash[:foo] = 'bar' + 13: + => 14: output_hash(some_hash) + 15: + 16: set_baz(some_hash, 'spam') + 17: + 18: puts "Don't execute me" + +[4] pry(main)> +``` + +After doing this we can see that the method `output_hash` is about to be executed + +### Investigating Methods +We can view the `output_hash` method with `show-method output_hash` + +``` +[4] pry(main)> show-method output_hash + +From: pry_example.rb @ line 1: +Owner: Object +Visibility: private +Number of lines: 3 + +def output_hash(input_hash) + puts input_hash +end +[5] pry(main)> +``` + +After viewing the method we can step into it using `step` + +``` +[5] pry(main)> step + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 2 Object#output_hash: + + 1: def output_hash(input_hash) + => 2: puts input_hash + 3: end + +[5] pry(main)> +``` + +We can now see that we are inside the `output_hash` method + +> Technically, we now know that `output_hash` is a procedure and not a method, but such semantics are out of scope for this post. + +We can view local variables in `output_hash` by using `ls` + +``` +[5] pry(main)> ls +self.methods: inspect to_s +locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_ input_hash +[6] pry(main)> +``` + +We can inspect any of these variables with `ls` as well + +Inspect `input_hash` by running `ls input_hash` + +``` +[6] pry(main)> ls input_hash +Enumerable#methods: + all? collect cycle drop_while each_slice redacted + any? collect_concat detect each_cons each_with_index redacted + chunk count drop each_entry each_with_object redacted +Hash#methods: + == clear default= delete_if redacted + [] compare_by_identity default_proc each redacted + []= compare_by_identity? default_proc= each_key redacted + assoc default delete each_pair redacted +[7] pry(main)> +``` + +> NOTE: Output here is redacted to shorten line length + +As you can see `input_hash` is indeed a Hash + +Also listed are the available methods for both the Hash and Enumerable classes + +Run `step` to execute the `puts input_hash` line and return to our main code + +``` +[7] pry(main)> step +{:foo=>"bar"} + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 16 : + + 11: some_hash = {} + 12: some_hash[:foo] = 'bar' + 13: + 14: output_hash(some_hash) + 15: + => 16: set_baz(some_hash, 'spam') + 17: + 18: puts "Don't execute me" + +[7] pry(main)> +``` + +As you can see the output of `output_hash` is sent to screen (`{:foo=>"bar"}`) + +### Modifying Code During Runtime +Run `step` to go into the `set_baz` method + +``` +[7] pry(main)> step + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 6 Object#set_baz: + + 5: def set_baz(input_hash, input_value) + => 6: input_hash[:baz] = input_value + 7: end + +[7] pry(main)> +``` + +Since we are in a running Ruby session we can modify code during runtime + +Let's change the value of `input_value` to `eggs` by running `input_value = 'eggs'` + +``` +[7] pry(main)> input_value = 'eggs' +=> "eggs" +[8] pry(main)> +``` + +Now execute line 6 with `step` + +``` +[8] pry(main)> step + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 18 : + + 13: + 14: output_hash(some_hash) + 15: + 16: set_baz(some_hash, 'spam') + 17: + => 18: puts "Don't execute me" + +[8] pry(main)> +``` + +Now we can see `set_baz` set `some_hash[:bar]` to `eggs` by running `puts some_hash;` + +``` +[8] pry(main)> puts some_hash; +{:foo=>"bar", :baz=>"eggs"} +[9] pry(main)> +``` + +> TIP: Adding `;` to the end of Ruby commands will suppress extra shell output + +### Exiting Pry +After running `whereami` we see that we do not want to execute line 18 + +So run `exit-program` to end our Pry session + +``` +[9] pry(main)> whereami + +From: /home/jerry/Playground/Blog/pry_example.rb @ line 18 : + + 13: + 14: output_hash(some_hash) + 15: + 16: set_baz(some_hash, 'spam') + 17: + => 18: puts "Don't execute me" + +[10] pry(main)> exit-program +[~/Playground/Blog]$ +``` + +## Conclusion +As you can see, with just a few simple commands we can do some valuable debugging of our code. I personally use Pry daily in my current job (*shakes fist at Ruby's `nil` errors*) + +While this post just scratches the surface of Pry, I highly recommend that you dig deeper. Learning more about Pry will significantly reduce headaches and increase efficiency. + +## Extra Resources +Below are some extra resources that I've found helpful for learning Pry + + - [Pry GitHub Page](https://github.com/pry/pry) + - [Pry Wiki](https://github.com/pry/pry/wiki) + - [YouTube Talk by Luke Bergen](https://www.youtube.com/watch?v=o90CCPjcIKE) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-12-workflow-using-chef-vaults-in-workflow.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-12-workflow-using-chef-vaults-in-workflow.md new file mode 100644 index 0000000..cd15739 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-12-workflow-using-chef-vaults-in-workflow.md @@ -0,0 +1,153 @@ +--- +layout: post +title: Workflow - Using Chef Vaults in Workflow +category: chef_automate_1 +tags: [chef, workflow] +summary: Secrets are hard. Shared key encryption is bad. Use Chef Vault. +--- + +## What is Chef Vault +Chef Vault is a solution for securing data used during a Chef Client run. Chef Vault solves the shared key encryption problem present in encrypted data bags. + +Currently, encrypted data bags use shared key encryption; this means that both the key to encrypt and decrypt the data are the same. This leads to security issues due to the fact that this single key must be shared with anyone who wants to use the data. + +Chef Vault solves the shared key encryption problem by using the already present trust relationship between Chef clients and the Chef Server. By using each client's public key to encrypt the data and allowing the clients to decrypt the data using their secret private key at no point do sensitive keys need to be transmitted. + +For more info on how Chef Vaults work see [here](https://github.com/chef/chef-vault). + +--- + +## Using Chef Vaults in Chef Automate Workflow +The method demonstrated in this post uses a data bag called `workflow-vaults` to hold all of the Chef Vaults used by Workflow projects. + +The vaults inside of `workflow-vaults` are created with a specific naming and scoping scheme to enable the following: + + - Using the `*-slug` helper methods in [delivery-sugar](https://github.com/chef-cookbooks/delivery-sugar#workflow_project_slug) to load vaults + - Sharing data within the Enterprise, Organization, and Project + - Reducing variable duplication through merging down to a single Ruby hash + +--- + +## Naming Scheme and Scope +Vaults should be named and data be scoped as follows: + +| Vault
Name | Enterprise
Scope | Organization
Scope | Project
Scope | +|------------------------------------------ | --------------------- | ----------------------- | ------------------ | +| `#{ent_name}` | Y | Y | Y | +| `#{ent_name}-#{org_name}` | | Y | Y | +| `#{ent_name}-#{org_name}-#{project_name}` | | | Y | + +--- + +## Creating the Chef Vaults +There are a few options for creating Chef Vaults. You can set your `EDITOR` environment variable and type the JSON at creation, pass the JSON in as a string, or create JSON files on disk and reference them. + +I personally prefer creating the files on disk and referencing them. To use this method do the following: + +### Create your directory structure + +```none +workflow-vaults +├── my_ent.json +├── my_ent-my_org.json +├── my_ent-my_org-project1.json +└── my_ent-my_org-project2.json +``` + +### Populate your JSON files (EXAMPLE) + +```none +{ + "id":"my_ent-my_org-project1", + "secret_data": "something secret", + "other_data": "something else" +} +``` + +> NOTE: Keys with the same name in multiple vaults will be merged in such a way that Project level data will overwrite Organization data and Organization data will overwrite Enterprise data + +### Create your vaults using `knife vault create` (EXAMPLE) + +```none +knife vault create \ + workflow-vaults \ + my_ent-my_org-project1 \ + -J '/path/to/my_ent-my_org-project1.json' \ + -A 'delivery,jerry' \ + -S 'tags:delivery-job-runner' \ + -M client +``` + +| Argument | Purpose | +| --------------------------------- | --------------------------------------------------------- | +| `workflow-vaults` | Selects the data bag that will contain our vaults | +| `my_ent-my_org-my_project` | Sets the Chef Vault name in `workflow-vaults` | +| `-A 'delivery,jerry'` | Comma separated list of Admins to grant access | +| `-S 'tags:delivery-job-runner'` | SOLR search that gives access to all Workflow runners | +| `-M client` | Enables creating vaults on Chef Server instead of locally | + +> NOTE: After creating your vaults it is recommended that you delete the JSON files from disk + +--- + +## Using Chef Vaults in your build_cookbook +There are two methods of accessing your Chef Vaults in your build_cookbook. + +You can add the code snippet below or use the built-in `get_workflow_vault_data` method included when you generate a cookbook with ChefDK. + +### Using the built-in method +By default, when you generate a cookbook with the ChefDK via `chef generate cookbook` it creates a `.delivery/build_cookbook`. This default build_cookbook exposes the `get_workflow_vault_data` method to you. + +To use this method just assign the output to a Ruby Hash: + +```ruby +vault_data = get_workflow_vault_data +``` + +### Using a code snippet. +> Note: This is functionally equivalent to using the `get_workflow_vault_data` method above + +From any recipe in your build_cookbook you can now use the below code to access your vault data: + +```ruby +# Load the `chef-vault` gem +require 'chef-vault' + +# Load a Chef config that has rights to view workflow-vaults +Chef::Config.from_file(automate_knife_rb) + +# Compile list of Vault items using `delivery-sugar` helper methods +vault_items = [ + workflow_change_enterprise, + workflow_organization_slug, + workflow_project_slug +] + +# Populate a list of hashes with empty hashes for non-existent vaults +vault_data_list = [] +vault_items.each do |item| + vault_data_list.push( + begin + ChefVault::Item.load('workflow-vaults', item) + rescue ChefVault::Exceptions::KeysNotFound + {} + end + ) +end + +# Merge each of the hashes above into a single hash +vault_data = vault_data_list.inject(&:merge) + +# Raise an error if no data is found +if vault_data.empty? + raise 'No Chef Vaults found in \'workflow-vaults\' that match naming standard' +end +``` + +> NOTE: The above code only works if you added `-A 'delivery'` when creating your Chef Vaults + +## Extra Resources + + - [Chef Vault GitHub](https://github.com/chef/chef-vault) + - [Chef Vault Blog Post](https://blog.chef.io/2016/01/21/chef-vault-what-is-it-and-what-can-it-do-for-you/) + - [Knife Examples](https://github.com/chef/chef-vault/blob/master/KNIFE_EXAMPLES.md) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-15-workflow-publishing-to-git-repositories.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-15-workflow-publishing-to-git-repositories.md new file mode 100644 index 0000000..e41673e --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-15-workflow-publishing-to-git-repositories.md @@ -0,0 +1,58 @@ +--- +layout: post +title: Workflow - Publishing to Git Repositories +category: chef_automate_1 +tags: [chef, workflow, git, chef automate, automate] +summary: Ever wanted to copy your master to a remote master in Automate? Find out how!? +--- + +## Problem Summary +Would you like to browse code in an interface you are familiar with but isn't supported as a Source Code Provider for Chef Automate? Look no further! This guide will teach you how to publish your Git master branch to a remote Git master branch during the Publish phase of the Chef Automate pipeline. + +## Publish Phase +The Publish phase is intended to be used to "publish" the code/artifacts from your pipeline to a location that other phases or stages can consume. The default publish recipe can be found in your project here `.delivery/build_cookbook/recipes/publish.rb`. + +As you can see, the actions that take place in this phase are defined in the `delivery-truck` cookbook's [publish recipe](https://github.com/chef-cookbooks/delivery-truck/blob/master/recipes/publish.rb) and the places that your code/artifacts are published are defined in your `.delivery/config.json` file. For a full list of these options see [here](https://github.com/chef-cookbooks/delivery-truck#publish). + + +## Methods of Publishing to Git Repositories + +### Method 1 - Using `config.json` and `delivery-secrets` +This method uses your `config.json` and encrypted data bags. Since this is already well documented in the `delivery-truck`'s [README](https://github.com/chef-cookbooks/delivery-truck/blob/master/README.md), if you would like to use this method see [here](https://github.com/chef-cookbooks/delivery-truck#publish) + +> WARNING: This method uses encrypted data bags and by extension shared key encryption + +### Method 2 - Using Chef Vault and `delivery_github` +Inside of `delivery-truck`'s publish recipe we can see that the custom resource `delivery_github` is [called](https://github.com/chef-cookbooks/delivery-truck#publish#L106). Since we include `delivery-truck` in our recipe this custom resource is available for us to use as well. + +We can see from [line 107](https://github.com/chef-cookbooks/delivery-truck/blob/master/recipes/publish.rb#L107) that the `secrets` hash is passed into the `deploy_key` attribute. If we look at where this variable is set on [line 103](https://github.com/chef-cookbooks/delivery-truck/blob/master/recipes/publish.rb#L103) we can see it is set by the `get_project_secrets` method. Since we do not want to use shared key encryption or by extension encrypted data bags we will need to find another way to get this `deploy_key` value. One way of achieving this is via Chef Vault. + +If you follow the recommendations in my [blog post about using Chef Vaults in Automate](http://blog.jerryaldrichiii.com/chef_automate/2016/12/12/workflow-using-chef-vaults-in-workflow.html) you will have everything you need to add this `deploy_key` attribute to your project's Chef Vault. + +Just add the following key/value pairs to the `ent_name-org_name-project_name` vault under the `workflow-vaults` data bag on the Automate Chef Server: + +```none +"git_repo_url": "ssh://git@some.git.host//", +"git_private_key": "PRIVATE KEY OF YOUR GIT USER", +``` + +Then you would add the following to your publish recipe (after the code snippet from my blog post): + +```ruby +# INSERT CODE SNIPPET FROM BLOG POST HERE + +delivery_github git_repo do + deploy_key vault_data['git_private_key'] + branch node['delivery']['change']['pipeline'] + remote_url vault_data['git_repo_url'] + repo_path node['delivery']['workspace']['repo'] + cache_path node['delivery']['workspace']['cache'] + action :push +end +``` + +Doing so will allow you to publish your code to a Git repository without the need of relying on shared key encryption. + +## Extra Resources + - [Chef Vault](https://github.com/chef/chef-vault) + - [delivery-truck](https://github.com/chef-cookbooks/delivery-truck) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-19-workflow-deploying-to-multiple-chef-servers.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-19-workflow-deploying-to-multiple-chef-servers.md new file mode 100644 index 0000000..6342b85 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2016-12-19-workflow-deploying-to-multiple-chef-servers.md @@ -0,0 +1,167 @@ +--- +layout: post +title: Workflow - Deploying to Multiple Chef Servers +category: chef_automate_1 +tags: [chef, workflow, git, chef automate, automate, deploy] +summary: Have more than more Chef server/organization? Want to deploy to those? Read this. +--- + +## Problem Summary +By default Automate is setup to deploy to a single Chef organization/server. This deployment usually occurs during the Publish phase. This is fine for most users, if all of your nodes are in the same Chef organization as your Automate infrastructure and version pinning is done correctly then there is no issue with this model. + +For other users, they would like to have the Delivered stage deploy a cookbook to a separate Chef organization instead of converging on their production infrastructure. This guide is directed to that group of users. + +## Deploy Phase +The Deploy phase in Automate is intended to "deploy" the artifact created in the Publish phase to node(s) prior to testing. For the purpose of this guide we are only concerned with what happens during the Deploy phase of the Delivered stage. + +## Summary of Approach +The following items have to occur prior to deploying cookbooks to other Chef organizations: + + - A user must exist on each Chef organization you want to deploy to + - The private keys of those users must be stored in a secure way + - The private keys of those users must be written to disk + - Knife configuration files (`knife.rb`) must be created and written to disk + +## Creating Keys For Chef +Before we can access another Chef organization we must have have a user and a key that have been granted access. + +### Creating a Chef User +Chef users can be created either from your workstation with `knife` or on the Chef Server with `chef-server-ctl`. This guide covers the latter. + +Run the following command substituting your values where appropriate + +```none +chef-server-ctl user-create \ + USER_NAME \ + FIRST_NAME \ + [OPTIONAL_MIDDLE_NAME] \ + LAST_NAME \ + EMAIL \ + 'PASSWORD' \ + --filename /path/to/output/key/keep_me.pem +``` + +> After creating this user make sure you take note of where the key is saved. It will be needed later. + +### Adding the Chef User to an Organization +After creating the user above it needs to be added to the organization(s) you wish to deploy to. + +```none +chef-server-ctl org-user-add USER_NAME ORGANIZATION_NAME +``` + +### Safely Storing Your Key(s) +Secrets are hard. There are many solutions on how to store your private keys. One method is covered in my blog post about [using Chef Vault in Workflow](http://blog.jerryaldrichiii.com/chef_automate/2016/12/12/workflow-using-chef-vaults-in-workflow.html). + +If you wish to use the code snippet at the bottom of this guide you must add the following to your project vault (or your organization vault/your enterprise vault if the info is to be shared over multiple projects): + +```none +... +"deploy": { + "chef_servers": [ + { + "url": "https://my.chef.server/organizations/my_org", + "user": "chefuser", + "key": "RSA_PRIVATE_KEY\nALL_ONE_LINE\nWITH_NEWLINES_ESCAPED" + }, + { + "url": "https://my.chef.server/organizations/my_other_org", + "user": "anotherchefuser", + "key": "RSA_PRIVATE_KEY\nALL_ONE_LINE\nWITH_NEWLINES_ESCAPED" + } + ] +}, +... +``` + +### Doing the Deploy +Place the following code below `include_recipe 'delivery-truck::deploy'` in your `.delivery/build_cookbook/recipes/deploy.rb` + +```ruby +case workflow_stage + + # Ensure the following actions only occur in the Delivered stage +when 'delivered' + # Get a hash of the data from the appropriate Chef Vault + vault_data = get_workflow_vault_data + + # Iterate through Chef Servers + vault_data['deploy']['chef_servers'].each do |server_info| + # Set file paths inside project cache + client_key_path = File.join(workflow_workspace_cache, 'delete_me.pem') + knife_rb_path = File.join(workflow_workspace_cache, 'knife.rb') + + # Create directory to hold trusted certs + trusted_certs_path = File.join(workflow_workspace_repo, 'trusted_certs') + directory trusted_certs_path do + action :create + end + + # Create key for Knife to use (gets overwritten by each deploy) + file client_key_path do + content server_info['key'] + sensitive true + action :create + end + + # Create knife.rb file (gets overwritten by each deploy) + file knife_rb_path do + # Set file content and strip leading white space + content <<-EOF.gsub(/^\s+/, '') + log_location STDOUT + node_name "#{server_info['user']}" + client_key "#{client_key_path}" + chef_server_url "#{server_info['url']}" + trusted_certs_dir "#{trusted_certs_path}" + EOF + action :create + end + + # Perform a `knife ssl fetch` if certificate does not exist + execute 'Perform a `knife ssl fetch` if certificate does not exist' do + command "knife ssl fetch #{server_info['url']}" + live_stream true + cwd workflow_workspace_cache + not_if File.exist?("#{trusted_certs_path}/#{server_info['url']}.crt") + end + + # Create the upload directory where cookbooks to be uploaded will be staged + cookbook_vendor = File.join(workflow_workspace_repo, 'cookbook-vendor') + directory cookbook_vendor do + recursive true + # We delete the cookbook upload staging directory each time to ensure we + # don't have out-of-date cookbooks hanging around from a previous deploy. + action [:delete, :create] + end + + # Perform a `berks install` and set path to vendor directory + execute "do berks install in #{workflow_change_project} cookbook" do + command 'berks install' + live_stream true + environment BERKSHELF_PATH: cookbook_vendor + cwd workflow_workspace_repo + end + + # Perform a `berks upload` using the Knife config generated earlier + execute "do berks upload in #{workflow_change_project} cookbook" do + command 'berks upload' + live_stream true + environment( + BERKSHELF_CHEF_CONFIG: knife_rb_path, + BERKSHELF_PATH: cookbook_vendor + ) + cwd workflow_workspace_repo + end + + # Ensure keys are deleted after deploy is done + [client_key_path, knife_rb_path].each do |file_path| + file file_path do + action :delete + end + end + end +end +``` + +## Extra Resources + - [Using Chef Vaults in Workflow](http://blog.jerryaldrichiii.com/chef_automate/2016/12/12/workflow-using-chef-vaults-in-workflow.html) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-01-31-chef-writing-wrapper-cookbooks.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-01-31-chef-writing-wrapper-cookbooks.md new file mode 100644 index 0000000..64657f3 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-01-31-chef-writing-wrapper-cookbooks.md @@ -0,0 +1,170 @@ +--- +layout: post +title: Writing Wrapper Cookbooks +category: chef_infra +tags: [chef, cookbooks] +summary: It's been a while since a blog post was released regarding wrapper cookbooks. Let's revisit the topic. +--- + +## What is a Wrapper Cookbook? +Simply put, a wrapper cookbook is just a regular cookbook that includes recipes from other cookbooks. + +Common use cases for wrapper cookbooks include: + + - Modifying the behavior of a community cookbook from the [Chef Supermarket](https://supermarket.chef.io) + - Bundling several base cookbooks into a single cookbook + - Version controlling a node's run list and attribute definitions + +--- + +## Writing a Wrapper Cookbook +To include another cookbook in your wrapper cookbook you must do a minimum of two things: + + - Add dependencies to your wrapper cookbook's `metadata.rb` + - Add an `include_recipe` line to your wrapper cookbook's `recipes/default.rb` + +### Including Dependencies +Including dependencies is a simple as adding the following to your `metadata.rb`: + +```ruby +depends 'public_cookbook' +``` + +You can also optionally perform version pinning like so: + +```ruby +depends 'public_cookbook', '= 1.4.5' +``` + +For more information about version pinning see the `metadata.rb` page on the [Chef Docs site](https://docs.chef.io/config_rb_metadata.html). + +### Setting Attributes +Setting attributes in your wrapper cookbook is a common way to modify the behavior of the cookbook you are wrapping. Well written community cookbooks support modifying their behavior in this manner and will document its attributes within their `README.md`. + +These attributes can be added in your wrapper cookbook's `attributes/default.rb` and/or in your default recipe before your `include_recipe` line. + +> I decide where to place the attributes as follows: If the attributes are computed using other attributes or set via logic (e.g `case`, `if`, `unless`) place them in `recipes/default.rb` otherwise place them in `attributes/default.rb` + +### Completing the Wrap +In order to add the functionality from your wrapped cookbook, you will need to include that cookbook in your wrapper cookbook's default recipe. + +This is usually done with the help of the `include_recipe` method, like so: + +```ruby +include_recipe 'public_cookbook::default' +``` + +Once you have completed this your cookbook is ready for use. + +--- + +## Sample Use Cases +For the examples below let's assume we want to use the [IIS cookbook](https://supermarket.chef.io/cookbooks/iis) from the [Chef Supermarket](https://supermarket.chef.io) + +### Creating the wrapper +By running the following `chef` [command](https://docs.chef.io/ctl_chef.html#chef-generate-cookbook) we can generate our wrapper cookbook: + +```bash +chef generate cookbook my_company_iis +``` + +From here we add the following to our `metadata.rb` + +```ruby +depends 'iis' +``` + +Then we can add the necessary `include_recipe` line to our `recipes/default.rb` + +```ruby +include_recipe 'iis::default' +``` + +Doing the actions above will create a wrapper cookbook that will use the IIS cookbook to: + + - Install IIS + - Ensure the `w3svc` is enabled and started + - Serve the `Default Web Site` + +### Modifying Public Cookbook Behavior +The above example is great, but let's assume that your company hosts its websites on `D:` instead of `C:`. We can change this by modifying the attributes that the IIS cookbook consumes. + +To host websites out of `D:` add the following to your wrapper cookbook's `attributes/default.rb` + +```ruby +default['iis']['pubroot'] = 'D:\\inetpub' +default['iis']['docroot'] = 'D:\\inetpub\\wwwroot' +default['iis']['log_dir'] = 'D:\\inetpub\\logs\\LogFiles' +default['iis']['cache_dir'] = 'D:\\inetpub\\temp' +``` + +Adding this to your wrapper cookbook's attributes file will modify the behavior of the IIS cookbook. + +### Application Cookbooks +By completing the above you have now created a base cookbook that will install IIS in the fashion that your company desires. Now we can expand on this by utilizing an additional wrapper cookbook. + +Let's say we did the same as above but also created a `my_company_app` cookbook and included our `my_company_iis` cookbook with a hard version pinning. By doing this we can give the developer of `my_company_app` the freedom to have IIS installed to company specifications, but without worrying about how things work behind the scenes. + +This allows one team to focus on coding the logic that deploys their web application without also having to code the logic for installing IIS to company specifications. + +### Role Cookbooks +Eventually you will have multiple base cookbooks and you may want to combine them into a single logical unit, so that can be tested together. Take for example a cookbook called `role_my_company_website`. This cookbook's default recipe might look like the following: + +```ruby +include_recipe 'my_company_windows_base::default' +include_recipe 'my_company_audit::default' +include_recipe 'my_company_iis::default' +include_recipe 'my_company_website::default' +``` + +Then in this cookbook's `metadata.rb` you would have hard version pinnings for each of the dependant cookbooks. + +By doing this you can now apply `role_my_company_website` to a node and test it as a cumulative collection of all its underlying cookbooks. Then, if all the dependant cookbooks have proper tests, you only have to worry about testing the output of `role_my_company_website` without having to test each of its underlying components. + +This reduces the amount of repeated work and produces an artifact that is: + + - Easy to understand + - Version controlled + - Independently testable + +This also leads to a cookbook that succinctly describes a particular node in your Chef managed ecosystem. You could use this succinct description of node function to your advantage. For example, your load balancer cookbook could find all nodes that have the `run_list` of `recipes['role_my_company_website']` and automatically add them to it's backend server list. + +--- + +## Advanced Use Cases +You may run into a scenario where a community cookbook performs 99% of what you require, but also does something you don't want it to do, as well. + +Ideally, you should submit a pull request to the cookbook's maintainer that makes the default behavior tunable, but in a pinch you can do things such as modifying the resource collection during the compile phase. + +### Modifying the Resource Collection +Take for example, a cookbook that lays down a file on the file system via a template, but that cookbook's template doesn't suit your needs. + +In your recipe you can use the `edit_resource` helper method provided by Chef's [Recipe DSL](https://docs.chef.io/dsl_recipe.html#edit-resource) to modify their template resource to point to a template in your wrapper cookbook instead. + +In practice it looks like this: + +```ruby +include_recipe 'bad_cookbook::default' + +edit_resource(:template, 'C:\\important\\template\\path.ini') do + source 'my_beautiful_template.erb' + cookbook 'my_awesome_wrapper' +end +``` + +Adding this to your wrapper cookbook's default recipe would allow you to use their cookbook as intended with the exception that your template will be used and not theirs. + +--- + +## Summary +While simple on the surface, wrapper cookbooks provide critical functions to healthy Chef adoption. With the building blocks of attributes, includes, and version pinning you are able to perform many functions in a safe, repeatable, and efficient manner. + +With wrapper cookbooks, you can modify the default behavior of community cookbooks without writing any additional code than a mere variable assignment. You can create reusable base cookbooks that can be consumed by developers' application cookbooks without requiring them to have in-depth operations knowledge. You can even condense multiple independent cookbooks into a single version controlled, and independently testable, artifact that succinctly describes a specific node's function in your ecosystem. + +Now take this knowledge of wrapper cookbooks and go create something beautiful! + +## Extra Resources + - [Doing Wrapper Cookbooks Right](https://blog.chef.io/2013/12/03/doing-wrapper-cookbooks-right/) + - [Example Audit Cookbook Wrapper](http://blog.jerryaldrichiii.com/chef/2017/03/20/using-the-audit-cookbook.html) + - [Changing Chef Resources at Runtime](https://sethvargo.com/changing-chef-resources-at-runtime/) + - [RIP chef-rewind](https://coderanger.net/rewind/) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-03-20-chef-using-the-audit-cookbook.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-03-20-chef-using-the-audit-cookbook.md new file mode 100644 index 0000000..9f4da19 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-03-20-chef-using-the-audit-cookbook.md @@ -0,0 +1,110 @@ +--- +layout: post +title: DEPRECATED - Using the Audit Cookbook +category: deprecated +tags: [chef, cookbooks, compliance, inspec] +summary: THIS IS DEPRECATED +--- + +## NOTE: THIS POST IS DEPRECATED. + +Updated version can be found here: + +[http://blog.jerryaldrichiii.com/chef_automate/2017/08/04/compliance-using-the-audit-cookbook.html](http://blog.jerryaldrichiii.com/chef_automate/2017/08/04/compliance-using-the-audit-cookbook.html) + +## The Audit Cookbook +Tired of running scans from your [Chef Compliance](https://docs.chef.io/compliance.html) server? Want to run InSpec/Compliance scans in a distributed manner like the Chef Client and have the output forwarded to Chef Automate and/or Chef Compliance? Then the `audit` cookbook is just the tool you need. + +The `audit` cookbook can be found on both [Chef Supermarket](https://supermarket.chef.io/cookbooks/audit) and [GitHub](https://github.com/chef-cookbooks/audit). + +--- + +## Using the Audit Cookbook +The `audit` cookbook functions can be broken down into a few simple decisions: + + - What collector(s) will I use? + - What profiles will I use for my scans? + - How will I configure my Chef managed node to do all the things? + + +> NOTE: For a more detailed breakdown of how you can use the `audit` cookbook see the [README.md](https://github.com/chef-cookbooks/audit) on GitHub. + +--- + +## Collectors +The first decision to make is where will your InSpec profiles will be loaded from and where the scan results will be sent. This is decided by the `collector` variable. + +Below is a table that should help you decide which to use; these can be combined or used individually: + +| Collector | Profile Location | Data Endpoint | +| ---------------------- | ---------------------------- | --------------------------- | +| chef-compliance | Compliance | Compliance | +| chef-visibility | Automate/GitHub/Supermarket | Automate | +| chef-server-compliance | Compliance (via Chef Server) | Compliance (via Chef Server | +| chef-server-visibility | Automate (via Chef Server) | Automate (via Chef Server) | + +In order to use the `chef-server-*` collectors you must pair your Automate/Compliance servers with Chef Server. Info on integrating with Compliance with Chef Server can be found [here](https://docs.chef.io/integrate_compliance_chef_server.html) and info on integrating with Automate can be found [here](https://docs.chef.io/integrate_compliance_chef_automate.html). + +--- + +## Combining Collectors/Using a Fetcher +The approach I use most often in the field is to use both the `chef-server-compliance` and the `chef-server-visibility` collectors. I also define a `fetcher` with the value of `chef-server`. This will send data to both Chef Compliance and Automate Visibility but use Chef Compliance as the profile store. + +> NOTE: Don't worry if this use case is confusing. This blog post uses this method below for it's example scenario. + +--- + +## Profiles +Deciding which InSpec profiles to use to scan your nodes is a decision that is likely an individual business decision and outside the scope of this blog post. However, the Chef Compliance server comes with many profiles bundled with it and it is recommended that you start there. For this example we will use the `cis/cis-centos7-level1` profile. + +--- + +## Configuring a Node +After deciding on a collector (or collectors) and a set of profiles to use, there are a few options for defining how a Chef managed node will use the Audit cookbook. For the scope of this blog post, we will cover the option I most frequently use in the field, the wrapper cookbook method. + +### Creating a Wrapper Cookbook +If you are unfamiliar with what a wrapper cookbook is, you can read my blog post on the subject [here](http://localhost:4000/chef/2017/01/31/chef-writing-wrapper-cookbooks.html). + +> TL;DR: A wrapper cookbook is a regular cookbook that includes recipes from other cookbooks. In this case we are going to include `audit::default`. + +For this example, let's assume we have created a wrapper cookbook by executing `chef generate cookbook mycorp_audit`. Before we include the `audit` cookbook in our wrapper cookbook, we must first set some attributes within the `mycorp_audit/attributes/default.rb` file. + +Here is a sample of an attribute file that I use frequently: + +```ruby +default['audit']['collector'] = ['chef-server-compliance', 'chef-server-visibility'] +default['audit']['fetcher'] = 'chef-server' +default['audit']['profiles'] = [ + { + 'name': 'cis-centos7-level1', + 'compliance': 'cis/cis-centos7-level1' + } +] +``` + +This configures the Audit cookbook to do the following: + + - Send data to both the Chef Compliance server and Chef Automate + - Fetch profiles from the Chef Compliance server + - Run the `cis/cis-centos7-level1` InSpec profile on each Chef Client run + + +--- + +## Putting it All Together + +After doing the above, all that is left is the following: + + - Put `depends 'audit'` in your `mycorp_audit/metadata.rb` + - Put `include_recipe 'audit::default'` in your `mycorp_audit/recipes/default.rb` + - Upload your cookbook to your Chef Server with `berks upload` + - Add `mycorp_audit::default` to a node's run_list. + +Once that is complete, Chef Client will finish it's converge phase and then use a [handler](https://docs.chef.io/handlers.html) to run your Audit/InSpec scan. + +--- + +## Extra Resources + - [Audit Cookbook on GitHub](https://github.com/chef-cookbooks/audit) + - [Audit Cookbook on Supermarket](https://supermarket.chef.io/cookbooks/audit) + - [Relevent reveal.js Presentation](https://github.com/jerryaldrichiii/revealjs-chef-compliance-class-supplement) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-08-04-compliance-using-the-audit-cookbook.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-08-04-compliance-using-the-audit-cookbook.md new file mode 100644 index 0000000..54e91ef --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-08-04-compliance-using-the-audit-cookbook.md @@ -0,0 +1,146 @@ +--- +layout: post +title: Compliance - Using the Audit Cookbook +category: chef_automate_1 +tags: [chef, cookbooks, compliance, inspec] +summary: Ever wondered how to get Compliance data from chef-client runs? +--- + +## The Audit Cookbook +Want to gather compliance data via `chef-client` and have the output forwarded to Chef Automate? Then the `audit` cookbook ([Supermarket](https://supermarket.chef.io/cookbooks/audit)/[GitHub](https://github.com/chef-cookbooks/audit)) is just the tool you need. + +The `audit` cookbook supports a myriad of configurations. This blog post intends to provide the most commonly used method and is best suited for customers who are using Chef Automate. + +The only decision that you need to make is what InSpec profiles you will run. + +--- + +## Deciding Which Profiles to Run +Deciding which InSpec profiles to use to scan your nodes is an individual business decision and outside the scope of this blog post. However, the Chef Automate server comes with many profiles bundled with it and it is recommended that you start there. + +More information can be found [here](https://docs.chef.io/profile_store.html). + +--- + +## Configuring Data Collection/Profile Storage +This guide uses the Chef Server as a proxy between the chef-client nodes and Automate. In order to enable this functionality do the following. + +### Configure Data Collection + + 1. Add the following to `/etc/delivery.rb` on the Automate server: + + ```ruby + data_collector['token'] = 'SOMETOKENVALUE' + ``` + > NOTE: The token can be whatever you like, default is `93a49a4f2482c64126f7b6015e6b0f30284287ee4054ff8807fb63d9cbd1c506` + + 2. Reconfigure the Automate server by running: + + ```ruby + sudo automate-ctl reconfigure + ``` + + 3. Add the following to `/etc/opscode/chef-server.rb` on all Chef Servers: + + ```ruby + data_collector['root_url'] = 'https://AUTOMATE_SERVER_FQDN/data-collector/v0/' + data_collector['token'] = 'SOMETOKENVALUE' + profiles['root_url'] = 'https://AUTOMATE_SERVER_FQDN' + ``` + > NOTE: The token must match what you set on the Automate server + + 4. Reconfigure all the Chef Servers: + + ```ruby + sudo chef-server-ctl reconfigure + ``` + +### Download the Necessary Profiles +This guide uses the Profile Store on the Automate server as the location where InSpec Profiles are fetched from. In order to use these profiles do the following: + + 1. Login to the Automate UI as the `admin` user (created during setup). + 2. Click on the Compliance tab. + 3. Click on the Profile Store button on the left of the screen. + 4. Click Available. + 5. Using arrow and `Get` button inside the orange box. Get the following Profiles: + - DevSec Linux Security Baseline + - DevSec Windows Security Baseline + +--- + +## Using the Audit Cookbook +The recommended method for using the `audit` cookbook is via a wrapper cookbook. If you are unfamiliar with what a wrapper cookbook is, you can read my blog post on the subject [here](http://blog.jerryaldrichiii.com/chef/2017/01/31/chef-writing-wrapper-cookbooks.html). + +> TL;DR: A wrapper cookbook is a regular cookbook that includes recipes from other cookbooks. In this case we are going to include `audit::default`. + +### Creating the Wrapper Cookbook + + 1. Generate the wrapper cookbook: + + + ```ruby + chef generate cookbook mycorp_audit + ``` + + 2. Place the following in `mycorp_audit/metadata.rb`: + + + ```ruby + depends 'audit' + ``` + + 3. Add the following in `mycorp_audit/recipes/default.rb`: + + ```ruby + include_recipe 'audit::default' + ``` + + 4. Generate the default attributes file: + + ```ruby + chef generate attribute default + ``` + + 4. Add the following in `mycorp_audit/attributes/default.rb`: + + ```ruby + default['audit']['reporter'] = 'chef-server-automate' + + default['audit']['profiles']['linux-baseline'] = {} + + case node['os'] + when 'linux' + default['audit']['profiles']['linux-baseline'] = { + 'compliance': 'admin/linux-baseline' + } + when 'windows' + default['audit']['profiles']['windows-bseline'] = { + 'compliance': 'admin/windows-baseline' + } + end + ``` + + > NOTE: This will run the baseline profile for Windows or Linux depending on the OS the cookbook is ran on + + 5. Upload the cookbook to all Chef Servers. + +--- + +## Gathering Data + + 1. Add `mycorp_audit::default` to a node's `run_list` + 2. Run `chef-client` + +Once that is complete, `chef-client` will perform it's converge phase and then use a [handler](https://docs.chef.io/handlers.html) to run your InSpec profiles. + +--- + +## Viewing Data + +Once the above is complete you should now have Converge and Compliance data in the Automate UI. + +--- + +## Extra Resources + - [Audit Cookbook on GitHub](https://github.com/chef-cookbooks/audit) + - [Audit Cookbook on Supermarket](https://supermarket.chef.io/cookbooks/audit) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-08-30-chef-installing-supermarket-without-a-wrapper-cookbook.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-08-30-chef-installing-supermarket-without-a-wrapper-cookbook.md new file mode 100644 index 0000000..2dbfd37 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2017-08-30-chef-installing-supermarket-without-a-wrapper-cookbook.md @@ -0,0 +1,86 @@ +--- +layout: post +title: Installing Supermarket Without a Wrapper Cookbook +category: chef_infra +tags: [chef, supermarket, installation] +summary: Need a quick guide to setup a private Supermarket, but don't want to hassle with making a wrapper cookbook? Read this. +--- + +## Installing Supermarket +The current way of setting up a private Supermarket uses the wrapper cookbook pattern. This method has its benefits. It's repeatable, automated, makes customization easy, etc. If you would like to use this method visit: + +[https://docs.chef.io/install_supermarket.html](https://docs.chef.io/install_supermarket.html) + +This guide is for those of you want to setup a private Supermarket but don't want the benefits of using a cookbook. + +--- + +## Guide + +### Install the Package +1. Install the Supermarket package: + + ``` + curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -P chef-server + ``` + +2. Reconfigure: + + ``` + sudo supermarket-ctl reconfigure + ``` + +### Configure Authentication via Chef Server +1. On your Chef server add the following to `/etc/opscode/chef-server.rb`: + + ```ruby + oc_id['applications'] ||= {} + oc_id['applications']['supermarket'] = { + 'redirect_uri' => 'https://YOUR_SUPERMARKET_FQDN/auth/chef_oauth2/callback' + } + ``` + +2. Run the following on your Chef server: + + ``` + sudo chef-server-ctl reconfigure + ``` + +3. Save the contents of `/etc/opscode/oc-id-applications/supermarket.json`: + +4. On the Supermarket server, create `/etc/supermarket/supermarket.json` using: + + ```text + { + "chef_server_url": "https://YOUR_CHEF_SERVER_FQDN", + "chef_oauth2_app_id": "UID FROM SUPERMARKET JSON (STEP 3)", + "chef_oauth2_secret": "SECRET FROM SUPERMARKET JSON (STEP 3)", + "chef_oauth2_verify_ssl": false + } + ``` + +5. Reconfigure: + + ``` + sudo supermarket-ctl reconfigure + ``` + +6. Test the login by going to your Supermarket FQDN and logging in as a Chef user. + +7. Authorize Supermarket to use that account. + +### Configuring SSL + +1. Place the following in `/etc/supermarket/supermarket.rb`: + + ``` + default['supermarket']['nginx']['force_ssl'] = true + default['supermarket']['ssl']['certificate'] = '/var/opt/supermarket/ssl/ca/your-host.crt' + default['supermarket']['ssl']['certificate_key'] = '/var/opt/supermarket/ssl/ca/your-host.key' + ``` + +2. Run the following: + + ``` + sudo supermarket-ctl reconfigure + ``` diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-05-28-using-policyfile-cookbooks.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-05-28-using-policyfile-cookbooks.md new file mode 100644 index 0000000..85f596f --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-05-28-using-policyfile-cookbooks.md @@ -0,0 +1,284 @@ +--- +layout: post +title: Using Policyfile Cookbooks +category: chef_infra +tags: [chef, cookbooks, policyfiles] +summary: Policy...what is it good for? +--- + +## Policyfile? What is that? + +A Policyfile (aka Policyfile.rb) is a file that contains information about a +node's: + - Default source for fetching cookbooks + - Run list (or multiple run lists via `named_run_list`) + - Cookbook dependencies and sources + - Optional cookbook attributes + +Here is an example Policyfile.rb: + +```ruby +name 'mycorp_audit' +default_source :supermarket +cookbook 'mycorp_audit', path: '.' +run_list 'mycorp_audit::default' +``` + +This file is a key component in Policyfile cookbooks. + +## What are Policyfile cookbooks and why should I use them? + +Essentially, a Policyfile cookbook is a cookbook that uses a Policyfile.rb to +combine the functions of Berkshelf, Environments, and Roles into a single +artifact that can be promoted safely through the software development +lifecycle. + +Without using Policyfiles, special care is needed in order to use Chef safely. +This is due to the shortcomings of runtime dependency solving. + +Take for example the following scenario: + - You have 3 cookbooks: `cookbook_a`, `cookbook_b`, and `cookbook_c` + - `cookbook_a` is deployed and depends on `cookbook_b` with version `~>1.0.0` + - `cookbook_c` is created and depends on `cookbook_b` with version `~> 1.0.0` + - `cookbook_c` is tested/deployed (which deploys newest 1.X.X of `cookbook_b`) + - `cookbook_a` runs and breaks due to a bug in `cookbook_b` version `1.1.1` + +Now, ideally, strict version pinning and adhering to [Semantic Versioning](https://semver.org/) +would prevent any mishaps...but that is a lot to trust to place on the +developer, the pipeline, and the upstream cookbook maintainer. + +With Policyfile cookbooks, this is prevented because cookbooks are referenced +by hash and not version at runtime. In order to run a new set of cookbooks a +new Policyfile.lock must be deployed. + +--- + +## Policyfile.lock + +The Policyfile.lock (aka Policyfile.lock.json) is generated from a +Policyfile.rb and contains all the same information in it as the Policyfile.rb +in addition to a few other key items needed for safely deploying cookbooks. + +For the sake of this section of the article, the two most important sections of +the Policyfile.lock are the `revision_id` which contains the hash of the entire +lock file and the `cookbook_locks` section. + +These two items together ensure that cookbooks and recipes are applied +consistently regardless of the environment that Chef Infra is deployed/ran in. + +Below is an example `cookbook_locks` section: + +```json +"audit": { + "version": "7.5.0", + "identifier": "27e6ea8e7bc82f5ba44b77834f5472c96da9c27a", + "dotted_decimal_identifier": "11231419178928175.25794866915266388.126209453834874", + "cache_key": "audit-7.5.0-supermarket.chef.io", + "origin": "https://supermarket.chef.io:443/api/v1/cookbooks/audit/versions/7.5.0/download", + "source_options": { + "artifactserver": "https://supermarket.chef.io:443/api/v1/cookbooks/audit/versions/7.5.0/download", + "version": "7.5.0" + } +} +``` + +As you can see above, not only is useful information such as version and origin +of the cookbook provided, but also referenced is the exact hash of the upstream +cookbook that is being used. + +> In this case, the `audit` cookbook with hash +> `27e6ea8e7bc82f5ba44b77834f5472c96da9c27a` + +This is critical as it ensures that not only are we running the correct version +of the cookbook, but also that the content of that cookbook has not changed +since the Policyfile.lock was created. + +## Benefits over Berkshelf (i.e. runtime dependency solving) + +Since the Policyfile.lock is computed prior to uploading to the Chef Infra +Server there is no need to compute cookbook dependencies at runtime. This has +several emergent benefits. Firstly, by moving this computation to the +workstation (or pipeline), Chef Infra is saved from having to do the same +computation(s) on each run on every node. + +More importantly, since dependency resolution has already been completed and +cookbooks are referenced via hash, it is impossible to unintentionally run a +cookbook in production. + +## Deploying/Promoting Policyfiles + +Policyfiles are deployed to the Chef Infra Server into what are known as Policy +Groups. Conceptually, these Policy Groups take the place of Environments. + +This is best illustrated with the output from `chef show-policy`: + +```text +mycorp_audit +======= +* dev: 98ed3a52a5 +* staging: 98ed3a52a5 +* production: 98ed3a52a5 +``` + +We can see here that the `mycorp_audit` policy with the revision ID +`98ed3a52a5` is currently deployed in the dev, staging, and production policy +groups. + +When bootstrapping a node, the `policy_name` and `policy_group` are specified, +this ensures that the correct policy is applied during runtime. + +### Promoting Policyfiles through your environments (Policy Groups) + +This is done like via `chef push POLICY_GROUP POLICY_NAME`. + +See: + +```text +$ chef update # This updates the Policyfile.lock to use the latest deps +OUTPUT REMOVED TO SAVE SPACE + +$ chef push dev mycorp_audit +Uploading policy mycorp_audit (bfd3af4697) to policy group dev +Using mycorp_audit 0.3.0 (f37cdfc3) +Using audit 7.5.0 (27e6ea8e) + +$ chef show-policy +mycorp_audit +======= +* dev: bfd3af4697 +* staging: 98ed3a52a5 +* production: 98ed3a52a5 + +$ chef push staging mycorp_audit +Uploading policy mycorp_audit (bfd3af4697) to policy group staging +Using mycorp_audit 0.3.0 (f37cdfc3) +Using audit 7.5.0 (27e6ea8e) + +$ chef show-policy +mycorp_audit +======= +* dev: bfd3af4697 +* staging: bfd3af4697 +* production: 98ed3a52a5 + +$ chef push production mycorp_audit +Uploading policy mycorp_audit (bfd3af4697) to policy group production +Using mycorp_audit 0.3.0 (f37cdfc3) +Using audit 7.5.0 (27e6ea8e) + +$ chef show-policy +mycorp_audit +======= +* dev: bfd3af4697 +* staging: bfd3af4697 +* production: bfd3af4697 +``` + +As you can see the policy with a `revision_id` of `bfd3af4697` is being moved +through dev, staging, and production. + +For more info see: [https://docs.chef.io/ctl_chef.html#policyfile-commands](https://docs.chef.io/ctl_chef.html#policyfile-commands) + +--- + +## FAQ + +### How can I create a Policyfile cookbook? + +Older versions of the ChefDK/Chef Workstation support generating Policyfile +cookbooks using `chef generate cookbook mycorp_app -P`. Newer versions will +generate Policyfile cookbooks by default. + +An easy way to tell if you are using a Policyfile cookbook is that it will not +contain a Berksfile. + +### How can I migrate from the current way I'm doing cookbooks? + +At a high level, if you are using a Berksfile: + - Swap it out for a Policyfile.rb + - Use `chef install/push` instead of `berks install/upload` + - Run `chef-client` on your nodes with `policy_name`/`policy_group` specified + - Example: `chef-client -j policy.json` + - Search [here](https://docs.chef.io/ctl_chef_client.html) for `Specify a policy` + +This is a safe migration since only nodes bootstrapped to use Policyfiles will +consume them. Also, since cookbooks used via Policyfiles are stored in a +different way than other cookbooks, you cannot accidentally break the old way +of using Chef. + +### Why don't I see Policyfile cookbooks with `knife cookbook list`? + +Cookbooks consumed by Policyfiles are stored differently on Chef Infra Server +and thus do not show when using Knife. Instead you should use: + +`chef show-policy POLICY_NAME POLICY_GROUP` + +### Policyfile cookbooks vs plain Policyfiles, which is better? + +Ultimately, the Policyfile.lock is the source of truth. With that in mind, it +is possible to build a Policyfile.lock using only a Policyfile.rb. + +In theory, you would build the top level role cookbook as described in +[this](https://blog.chef.io/2017/02/14/writing-wrapper-cookbooks/) blog post on +writing wrapper cookbooks, then call that cookbook (and set any desired +attributes) via a Policyfile.rb, and upload the resulting lock to the Chef +Infra Server. This removes the need for a top level cookbook entirely. + +That being said, I personally prefer that the top level artifact be a +Policyfile cookbook. This way, those that are not familiar with Policyfiles can +acclimate to the new pattern and you can set attributes via logic (which cannot +be done in a Policyfile.rb) + +### Attributes, should I set them in the Policyfile.rb? + +I personally prefer only specifying dependencies and a `run_list` in the +Policyfile.rb. I prefer this for many reasons. + +Mainly: + - It matches the older Chef patterns so those who usually look in + recipes/attribute files for attributes will not be surprised + - It sets the attributes near where they are used + - It's more intuitive than methods such as hoisting (personal opinion) + +Also, since the Policyfile.lock.json is compiled before runtime it is not +possible to set dyanmic attributes that you would normally set during a Chef +Infra run (e.g. changing behavior based on the domain, region, or Ohai). + +An example of how I do this is as follows: + +```ruby +case node.policy_group +when 'dev' + node.default['my_cookbook']['api_url'] = 'https://dev.example.com/api' +when 'staging' + node.default['my_cookbook']['api_url'] = 'https://staging.example.com/api' +when 'production' + node.default['my_cookbook']['api_url'] = 'https://prod.example.com/api' +end +``` + +### Chef Infra Server, do I need it if I'm using Policyfiles? + +Moving dependency resolution out of runtime has one other major benefit. If +you are not relying on state stored in the Chef Infra Server (e.g. data bags, +chef search, etc) then you can remove the need for the Chef Infra Server all +together. + +By using `chef export` you can create an artifact that contains the policy and +all dependent cookbooks. This artifact can then be distributed and executed via +`chef-client`. In fact, this is a core factor in how Effortless Infra and +Test Kitchen (when using Policyfiles) functions. + +### How do I test Policyfile cookbooks in Test Kitchen + +By default, the generated kitchen.yml will do what you need. If you'd like to +test multiple suites though, please see the following section of the Chef docs: + +[https://docs.chef.io/policyfile.html#test-w-kitchen](https://docs.chef.io/policyfile.html#test-w-kitchen) + +--- + +## Supporting Resources + - [More justification for Policyfiles](https://docs.chef.io/policyfile.html) + - [Policyfile.rb documentation](https://docs.chef.io/config_rb_policyfile.html) + - [Chef Policyfile commands](https://docs.chef.io/ctl_chef.html#policyfile-commands) diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-06-03-using-chef-infra-attributes-in-chef-inspec.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-06-03-using-chef-infra-attributes-in-chef-inspec.md new file mode 100644 index 0000000..a09de14 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-06-03-using-chef-infra-attributes-in-chef-inspec.md @@ -0,0 +1,149 @@ +--- +layout: post +title: Using Chef Infra Node Attributes in Chef InSpec +category: chef_infra +tags: [chef, cookbooks, attributes, inspec] +summary: Don't use Chef Infra attributes in Chef InSpec +--- + +## Chef Infra, Chef InSpec, Node Attributes, what are they!?! + +Chef Infra and Chef InSpec are open source products made by Chef Software and +each fulfill separate needs in their respective problem spaces. That doesn't +mean they shouldn't be used together though. Pairing configuration management +(Chef Infra) and infrastructure/application testing (Chef InSpec) is a +wonderful thing. It is made even more delightful when the same company (and in +most cases the same humans) work on the tools to pair them. + +That being said, convenience and in some cases developer intuition can lead to +unintended and sometimes dangerous consequences. This blog post was created to +highlight those consequences. + +## Chef Infra Node Attributes + +In order to understand the potential consequences, we must first understand +Chef Infra node attributes and their purpose. + +Chef Infra utilizes the concept of a node object. This node object is a data +store for both information about a system (provided by Ohai) and user defined +information (variables, metadata, etc). It is very common to use this node +object to drive the behavior of a Chef Infra cookbook (the collection of code +used to define the desired state of a system). + +Here is an example that creates users based on a list defined as a node +attribute: + +```ruby +# attributes/default.rb +default['my_cookbook']['users'] = %w(jerryaldrichiii bobsmith janedoe) +``` + +```ruby +# recipies/default.rb +node['my_cookbook']['users'].each do |my_user| + user my_user +end +``` + +## Testing the Results of Chef Infra + +Trusting Chef Infra to do what Chef Infra does is great and all, but how would +you verify it actually did what you expected? + +Using ChefSpec you could test that the run_list compiled correctly (and the +correct attributes were set), but how do you verify it actually created the +users you specified? + +Chef InSpec! + +Chef InSpec is built for testing just that. Below is the Chef InSpec to test +the example above: + +```ruby +users = %w(jerryaldrichiii bobsmith janedoe) +users.each do |my_user| + describe user(my_user) do + it { should exist } + end +end +``` + +### DRY Code + +Now, some of you reading the above might notice that the list of users is +repeated between Chef Infra and Chef InSpec. In order to follow the DRY (Don't +Repeat Yourself) methodology you might look to remove this repetition. + +Couldn't we just use the node object from Chef Infra in Chef InSpec? You might +ask. + +In short, you absolutely can! There are even patterns defined in the community +to do just that! See: + +http://www.hurryupandwait.io/blog/accessing-chef-node-attributes-from-kitchen-tests +https://github.com/chef-cookbooks/audit#using-chef-node-data + +In practice, while seemingly counter intuitive, you might want to avoid doing +using the Chef Infra node attribute data source in Chef InSpec. + +## Perils of Persistence + +Persisting (or saving) the data sources from Chef Infra and using those same +data sources in Chef InSpec can have perilous consequences. + +Before we dive in, I would like to take a moment to say that using the Chef +Infra node object's data in Chef InSpec isn't categorically wrong. In fact, +there may be very valid use cases to do just that! Just keep the potential +problems below in mind if you choose to go down that path. + +### Asking Yourself, "What am I actually testing?" + +When sharing the same data source between Chef Infra and Chef InSpec you have +to ask yourself, "What am I actually testing?" + +To use the example from above, are you testing that Chef Infra can create users +or that a certain list of users are created? While these two questions may seem +the same on the surface, they are different. + +Using our example above we can demonstrate the difference. Let's say that +another developer comes along and tries to modifies the list of users. + +Here is an example of these changes: + +```ruby +# attributes/default.rb +default['my_cookbook']['users'] = %w( + jerryaldrichiii + bobsmith + janedoe + awesomee_developer +) +``` + +As you can see, `awesome` is spelled incorrectly. If we had used the same data +source (the Chef Infra node object) between Chef InSpec and Chef Infra, Chef +InSpec would not have caught this, Chef Infra would have created the user +`awesomee_developer` and Chef InSpec would have verified that the +`awesomee_developer` user existed. + +In this case Chef InSpec would be testing that Chef Infra can create a set of +users, not testing if Chef Infra actually created the users you want. Chef +Infra is perfectly capable of creating users. You most likely were intending +that the test would test that a defined set of a users were created. Thus, you +should hard code those values both in the Chef Infra cookbook and the Chef +Infra tests. + +## Summary + +Persisting the node object from Chef Infra to Chef InSpec may seem like the +most efficient way to test the results of Chef Infra on the surface. In some +cases, it may be, but if you choose to do that you must keep in mind the +dangers that come with it. Mainly, it allows for potentially dangerous code +changes that won't be caught by your automated testing. + +Instead of persisting the node object, consider other methods of getting the +data. For example: Using `inspec.command('command').stdout`, hardcoding the +input attributes in your test framework (e.g. Test Kitchen), and/or moving +attribute related tests to ChefSpec and using Chef InSpec for testing higher +level performance (e.g. "Does this web service return a HTTP 200?" vs "Is NGINX +installed?"). diff --git a/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-06-07-writing-inspec-wrapper-profiles.md b/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-06-07-writing-inspec-wrapper-profiles.md new file mode 100644 index 0000000..1c52a94 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_posts/2019-06-07-writing-inspec-wrapper-profiles.md @@ -0,0 +1,164 @@ +--- +layout: post +title: Writing InSpec Wrapper Profiles +category: chef_inspec +tags: [inspec, cis, security] +summary: No one is fully compliant, here's how you write a profile fits your environment +--- + +## What is a wrapper profile? + +Chef InSpec groups controls and tests in a standalone artifact known as a +profile. These profiles can include other profiles and bundle/vendor those +profiles to be executed at runtime. + +A wrapper profile is just that, a profile that includes controls/resources from +another profile. + +## Why would I use a wrapper profile? + +In addition to adding custom resources, wrapping profiles allows you to +customize the exact set of controls that are executed during runtime. +Additionally, it is possible to modify the included controls to reduce the +severity/impact or redefine/modify tests. Most commonly, wrapper profiles are +used to implement a strict compliance posture in a way that allows you to +audit/track only the items you care about. + +For example, it is very difficult to comply entirely with DISA/NIST/CIS +standards. By using wrapper profiles you can take advantage of the majority of +the security benefits being offered without cluttering up your reports with +items that are not relevant to you or your organization. + +--- + +## Creating a Wrapper Profile + +Creating a wrapper profile is a simple as adding a dependency to your +profile's `inspec.yml` file and using `include_controls` or `require_controls`. + +## Defining dependencies + +When defining dependencies two things are needed: + 1. A name, this is used when referencing a dependent profile in your profile + 2. A source to fetch the dependent profile + +As of the time of this writing, sources can be any of the following: + - A local path on disk (`path:`) + - A URL to a tar/zip (`url:`) + - A GitHub repository (`github:`) + - A Chef Automate server (`compliance:`) + +For more information on how to use each of these see: + +[https://www.inspec.io/docs/reference/profiles/#defining-the-dependencies](https://www.inspec.io/docs/reference/profiles/#defining-the-dependencies) + +## Including/Requiring controls + +Controls are included from dependant profiles by using either +`include_controls` or `require_controls`. The main difference between these two +is that `include_controls` includes all controls from the dependent profile +whereas `require_controls` only includes the controls specified within the +`do`/`end` block. + +### `include_controls` + +Using `include_controls` will include all controls from the referenced profile. +Certain controls can be excluded from this inclusion by using: `skip_control`. + +For example, let's say you wanted to include all controls from `some-profile` +but skip the `some-strict-control` (defined via `control +'some-strict-control`). + +Do the following: + +```ruby +# `some_profile` corresponds to `name:` in the `inspec.yml` `depends:` section +include_controls 'some-profile' do + skip_control 'some-strict-control' +end +``` + +### `require_controls` + +Using `require_conrols` will only execute the controls you specify from the +dependant profile. + +For example, let's say you want to include some specific controls from a +dependent profile, but not include all the controls from that profile. + +Do the following: + +```ruby +# `some_profile` corresponds to `name:` in the `inspec.yml` `depends:` section +require_controls 'some-profile' do + control 'some-strict-control' +end +``` + +## Modifying Included Controls + +Whether you are using `include_controls` or `require_controls`, the included +controls can be modified. + +For example, let's say you want to include all the controls from `some-profile` +but the `telnet` control from the included profile only specifies that the +package `telnetd` is not installed and does not account for the fact that +CentOS's package is called `telnet-server`. + +Do the following: + +```ruby +# `some_profile` corresponds to `name:` in the `inspec.yml` `depends:` section +include_control 'some-profile' do + control 'telnet' do + telnet_server_packages = %w(telnetd telnet-server) + telnet_server_packages do |telnet_package| + package telnet_package do + it { should_not be_installed } + end + end + end +end +``` + +This will overwrite the tests in the `some-profile` control named `telnet` but +will not modify things such as `impact`, `title`, or `desc`. + +## Example: Wrapping a CIS Profile + +Chef Automate includes several built in Chef InSpec profiles for a variety of +platforms. + +The example will: + - Include all controls from the `cis-centos7-level2` profile + - Modify the impact of the SSHD control to be informational + - Justification: You would like to have a banner but it needn't be a 'critical' failure + - Modify the HTTP server control to not execute/fail if a web server is running + - Justification: You want to run this profile, but don't want web servers to fail + +First, add the following to your profile's `inspec.yml`: + +```yaml +depends: + - name: 'cis-centos7-level2' + compliance: 'secteam/cis-centos7-level2' +``` + +Then add the following to one of your controls: + +```ruby +include_controls 'cis-centos7-level2' do + control 'xccdf_org.cisecurity.benchmarks_rule_6.2.14_Set_SSH_Banner' do + impact 0.0 + end + + control 'xccdf_org.cisecurity.benchmarks_rule_3.11_Remove_HTTP_Server' do + # TODO: Remove me when/if InSpec add support for `not_if` + only_if('This server is a webserver') do + !service('httpd').running? || !service('apache2').running? + end + end +end +``` + +> NOTE: Message after the `only_if` will only show if the control is skipped diff --git a/old_chef_blog/jerryaldrichiii.github.io/_sass/_mixins.scss b/old_chef_blog/jerryaldrichiii.github.io/_sass/_mixins.scss new file mode 100644 index 0000000..e635ce2 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_sass/_mixins.scss @@ -0,0 +1,41 @@ +@mixin vendor-property($property, $value) { + @each $vendor in ('-moz-', '-webkit-', '-o-', '-ms-', '') { + #{$vendor}#{$property}: #{$value}; + } +} + +@mixin vendor-value($property, $value) { + @each $vendor in ('-moz-', '-webkit-', '-o-', '-ms-', '') { + #{$property}: #{$vendor}#{$value}; + } +} + +@mixin vendor($property, $value) { + @each $vendor in ('-moz-', '-webkit-', '-o-', '-ms-', '') { + #{$vendor}#{$property}: #{$vendor}#{$value}; + } +} + +@mixin vendor-keyframes($name) { + @-moz-keyframes #{$name} { @content; } + @-webkit-keyframes #{$name} { @content; } + @-o-keyframes #{$name} { @content; } + @-ms-keyframes #{$name} { @content; } + @keyframes #{$name} { @content; } +} + +@mixin icon($content: false) { + text-decoration: none; + + &:before { + @if $content { + content: $content; + } + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + text-transform: none !important; + } +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/_sass/_syntax_highlighting.scss b/old_chef_blog/jerryaldrichiii.github.io/_sass/_syntax_highlighting.scss new file mode 100644 index 0000000..ab75e08 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_sass/_syntax_highlighting.scss @@ -0,0 +1,105 @@ +pre { + -webkit-overflow-scrolling: touch; + font-family: 'Courier New', monospace; + font-size: 0.9em; + + code { + display: block; + line-height: 1.75em; + padding: 1em 1.5em; + margin-bottom: 1em; + overflow-x: auto; + } +} + +code[class*=highlighter-rouge] { + background: #eeeeee; + border-radius: 0.35em; + font-family: 'Courier New', monospace; + font-size: 1em; + font-style: italic; + padding: .1em; + color: #000000; +} + +code[class*=language-none] { + background: #eeeeee; + margin: 0 0 1em 0; + border-radius: 0.35em; + font-family: 'Courier New', monospace; + font-size: 1em; + font-style: italic; + padding: 0.25em 0.65em; + color: #000000; +} + +.highlight .hll { background-color: #49483e } +.highlight { background: #272822; color: #f8f8f2 } +.highlight .c { color: #00ff00 } /* Comment */ +.highlight .err { color: #960050; background-color: #1e0010 } /* Error */ +.highlight .k { color: #66d9ef } /* Keyword */ +.highlight .l { color: #ae81ff } /* Literal */ +.highlight .n { color: #f8f8f2 } /* Name */ +.highlight .o { color: #f92672 } /* Operator */ +.highlight .p { color: #f8f8f2 } /* Punctuation */ +.highlight .ch { color: #00ff00 } /* Comment.Hashbang */ +.highlight .cm { color: #00ff00 } /* Comment.Multiline */ +.highlight .cp { color: #00ff00 } /* Comment.Preproc */ +.highlight .cpf { color: #00ff00 } /* Comment.PreprocFile */ +.highlight .c1 { color: #00ff00 } /* Comment.Single */ +.highlight .cs { color: #00ff00 } /* Comment.Special */ +.highlight .gd { color: #f92672 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gi { color: #a6e22e } /* Generic.Inserted */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #00ff00 } /* Generic.Subheading */ +.highlight .kc { color: #66d9ef } /* Keyword.Constant */ +.highlight .kd { color: #66d9ef } /* Keyword.Declaration */ +.highlight .kn { color: #f92672 } /* Keyword.Namespace */ +.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ +.highlight .kr { color: #66d9ef } /* Keyword.Reserved */ +.highlight .kt { color: #66d9ef } /* Keyword.Type */ +.highlight .ld { color: #e6db74 } /* Literal.Date */ +.highlight .m { color: #ae81ff } /* Literal.Number */ +.highlight .s { color: #e6db74 } /* Literal.String */ +.highlight .na { color: #a6e22e } /* Name.Attribute */ +.highlight .nb { color: #f8f8f2 } /* Name.Builtin */ +.highlight .nc { color: #a6e22e } /* Name.Class */ +.highlight .no { color: #66d9ef } /* Name.Constant */ +.highlight .nd { color: #a6e22e } /* Name.Decorator */ +.highlight .ni { color: #f8f8f2 } /* Name.Entity */ +.highlight .ne { color: #a6e22e } /* Name.Exception */ +.highlight .nf { color: #a6e22e } /* Name.Function */ +.highlight .nl { color: #f8f8f2 } /* Name.Label */ +.highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +.highlight .nx { color: #a6e22e } /* Name.Other */ +.highlight .py { color: #f8f8f2 } /* Name.Property */ +.highlight .nt { color: #f92672 } /* Name.Tag */ +.highlight .nv { color: #f8f8f2 } /* Name.Variable */ +.highlight .ow { color: #f92672 } /* Operator.Word */ +.highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */ +.highlight .mf { color: #ae81ff } /* Literal.Number.Float */ +.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ +.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ +.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ +.highlight .sa { color: #e6db74 } /* Literal.String.Affix */ +.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ +.highlight .sc { color: #e6db74 } /* Literal.String.Char */ +.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */ +.highlight .sd { color: #e6db74 } /* Literal.String.Doc */ +.highlight .s2 { color: #e6db74 } /* Literal.String.Double */ +.highlight .se { color: #ae81ff } /* Literal.String.Escape */ +.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ +.highlight .si { color: #e6db74 } /* Literal.String.Interpol */ +.highlight .sx { color: #e6db74 } /* Literal.String.Other */ +.highlight .sr { color: #e6db74 } /* Literal.String.Regex */ +.highlight .s1 { color: #e6db74 } /* Literal.String.Single */ +.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ +.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #a6e22e } /* Name.Function.Magic */ +.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ +.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ +.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ +.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */ +.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ diff --git a/old_chef_blog/jerryaldrichiii.github.io/_sass/_vars.scss b/old_chef_blog/jerryaldrichiii.github.io/_sass/_vars.scss new file mode 100644 index 0000000..71fcbc2 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/_sass/_vars.scss @@ -0,0 +1,41 @@ +// Duration. +$duration-transition: 0.2s; + +// Size. +$size-border-radius: 0.35em; +$size-element-height: 2.75em; +$size-element-margin: 1em; + +// Font. +$font-family: 'Source Sans Pro', Helvetica, sans-serif; +$font-family-fixed: 'Courier New', monospace; +$font-weight: 400; +$font-weight-bold: 700; + +// Color. +$color-bg: #fff; +$color-fg: #000000; +$color-fg-bold: #000000; +$color-fg-light: #b2b2b2; +$color-border: #efefef; +$color-border-bg: #f7f7f7; +$color-border2: #dfdfdf; +$color-border2-bg: #e7e7e7; + +$color-accent-bg: #49bf9d; +$color-accent-fg: mix($color-accent-bg, #ffffff, 25%); +$color-accent-fg-bold: #ffffff; +$color-accent-fg-light: mix($color-accent-bg, #ffffff, 40%); +$color-accent-border: rgba(255,255,255,0.25); +$color-accent-border-bg: rgba(255,255,255,0.075); +$color-accent-border2: rgba(255,255,255,0.5); +$color-accent-border2-bg: rgba(255,255,255,0.2); + +$color-accent2-bg: #1f1815; +$color-accent2-fg: rgba(255,255,255,0.5); +$color-accent2-fg-bold: #ffffff; +$color-accent2-fg-light: rgba(255,255,255,0.4); +$color-accent2-border: rgba(255,255,255,0.25); +$color-accent2-border-bg: rgba(255,255,255,0.075); +$color-accent2-border2: rgba(255,255,255,0.5); +$color-accent2-border2-bg: rgba(255,255,255,0.2); diff --git a/old_chef_blog/jerryaldrichiii.github.io/about.html b/old_chef_blog/jerryaldrichiii.github.io/about.html new file mode 100644 index 0000000..9b7f60f --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/about.html @@ -0,0 +1,25 @@ +--- +layout: default +--- + +
+
+
+

{{ page.title }}

+ +
+ +
+

About Jerry

+

+ Psychology degree holder, former tractor restorer, and pre-law student turned Linux sysadmin, Jerry is the definition of an eclectic. +

+ Having cut his teeth in tech support, then as a network admin, then a sysadmin, Jerry now works at Chef Software as a Customer Success Engineer. He is the one who comes on-site and helps you make the awesome sauce. +

+ When not talking about himself in the third person or writing code/blogs to help the community, Jerry enjoys dark rooms, stereotypical green on black text terminals, and DEF CON Radio on SomaFM. Strong spoken, but soft hearted, Jerry believes face-to-face communication and empathy to be the key factors to "the DevOps" and will not hesitate to give you his unadulterated and honest opinion. Likewise, he is always seeking feedback from others, anywhere, anytime, and anyplace no matter how brutal. +

+ He is primarily focused on achieving the most he can in life, but he will not do so at the expense of others and will not pass up an opportunity to lend a helping hand. If you see him in the wild, do not be afraid to approach him; he is always willing to hear your story and share his. +

+
+
+
diff --git a/old_chef_blog/jerryaldrichiii.github.io/categories/chef_automate_1.md b/old_chef_blog/jerryaldrichiii.github.io/categories/chef_automate_1.md new file mode 100644 index 0000000..2e29ef9 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/categories/chef_automate_1.md @@ -0,0 +1,19 @@ +--- +layout: default +title: Chef Automate 1 +category: chef_automate_1 +--- + +
+ {% assign posts = site.posts | where:'category', 'chef_automate_1' %} + {% for post in posts %} +
+
+

{{ post.title }}

+
+ +

{{ post.summary }}

+
+
+ {% endfor %} +
diff --git a/old_chef_blog/jerryaldrichiii.github.io/categories/chef_infra.md b/old_chef_blog/jerryaldrichiii.github.io/categories/chef_infra.md new file mode 100644 index 0000000..3857ce7 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/categories/chef_infra.md @@ -0,0 +1,19 @@ +--- +layout: default +title: Chef Infra +category: chef_infra +--- + +
+ {% assign posts = site.posts | where:'category', 'chef_infra'%} + {% for post in posts %} +
+
+

{{ post.title }}

+
+ +

{{ post.summary }}

+
+
+ {% endfor %} +
diff --git a/old_chef_blog/jerryaldrichiii.github.io/categories/chef_inspec.md b/old_chef_blog/jerryaldrichiii.github.io/categories/chef_inspec.md new file mode 100644 index 0000000..e79a0af --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/categories/chef_inspec.md @@ -0,0 +1,19 @@ +--- +layout: default +title: Chef InSpec +category: chef_inspec +--- + +
+ {% assign posts = site.posts | where:'category', 'chef_inspec'%} + {% for post in posts %} +
+
+

{{ post.title }}

+
+ +

{{ post.summary }}

+
+
+ {% endfor %} +
diff --git a/old_chef_blog/jerryaldrichiii.github.io/categories/other.md b/old_chef_blog/jerryaldrichiii.github.io/categories/other.md new file mode 100644 index 0000000..a506fad --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/categories/other.md @@ -0,0 +1,19 @@ +--- +layout: default +title: Other +category: other +--- + +
+ {% assign posts = site.posts | where:'category', 'other'%} + {% for post in posts %} +
+
+

{{ post.title }}

+
+ +

{{ post.summary }}

+
+
+ {% endfor %} +
diff --git a/old_chef_blog/jerryaldrichiii.github.io/categories/ruby.md b/old_chef_blog/jerryaldrichiii.github.io/categories/ruby.md new file mode 100644 index 0000000..e7752da --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/categories/ruby.md @@ -0,0 +1,19 @@ +--- +layout: default +title: Ruby +category: ruby +--- + +
+ {% assign posts = site.posts | where:'category', 'ruby'%} + {% for post in posts %} +
+
+

{{ post.title }}

+
+ +

{{ post.summary }}

+
+
+ {% endfor %} +
diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/font-awesome.min.css b/old_chef_blog/jerryaldrichiii.github.io/css/font-awesome.min.css new file mode 100644 index 0000000..9a9a108 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../images/fontawesome/fontawesome-webfont.eot?v=4.2.0');src:url('../images/fontawesome/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../images/fontawesome/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../images/fontawesome/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../images/fontawesome/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/ie/v8.scss b/old_chef_blog/jerryaldrichiii.github.io/css/ie/v8.scss new file mode 100644 index 0000000..4f05b50 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/ie/v8.scss @@ -0,0 +1,70 @@ +--- +# Comment added for Front Matter +--- + +@import 'vars'; +@import 'mixins'; + +input[type="submit"], +input[type="reset"], +input[type="button"], +.button { + position: relative; + -ms-behavior: url('css/ie/PIE.htc'); +} + +input[type="text"], +input[type="password"], +input[type="email"], +select, +textarea { + position: relative; + -ms-behavior: url('css/ie/PIE.htc'); +} + +input[type="text"], +input[type="password"], +input[type="email"], +select { + height: $size-element-height; + line-height: $size-element-height; +} + +input[type="checkbox"], +input[type="radio"] { + & + label { + &:before { + display: none; + } + } +} + +.image { + position: relative; + -ms-behavior: url('css/ie/PIE.htc'); + + &:before, &:after { + display: none !important; + } + + img { + position: relative; + -ms-behavior: url('css/ie/PIE.htc'); + } +} + +#header { + -ms-behavior: url('css/ie/backgroundsize.min.htc'); + + h1 { + color: $color-accent2-fg-bold; + } +} + +#footer { + .icons { + a { + color: $color-accent2-fg-bold; + } + } +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/style-large.scss b/old_chef_blog/jerryaldrichiii.github.io/css/style-large.scss new file mode 100644 index 0000000..70155d4 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/style-large.scss @@ -0,0 +1,42 @@ +--- +# Comment added for Front Matter +--- + +@import 'vars'; +@import 'mixins'; + +$size-header-width: 30%; +$size-header-pad: 3em; + +#header { + padding: ($size-header-pad * 2) $size-header-pad $size-header-pad $size-header-pad; + width: $size-header-width; + h1 { + font-size: 1.25em; + br { + display: none; + } + } +} + +#footer { + padding: 0 $size-header-pad ($size-header-pad + $size-element-margin) $size-header-pad; + width: $size-header-width; + + .copyright { + li { + border-left-width: 0; + display: block; + line-height: 2.25em; + margin-left: 0; + padding-left: 0; + } + } +} + +#main { + margin-left: $size-header-width; + max-width: none; + padding: ($size-header-pad * 2) $size-header-pad $size-header-pad $size-header-pad; + width: calc(100% - #{$size-header-width}); +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/style-medium.scss b/old_chef_blog/jerryaldrichiii.github.io/css/style-medium.scss new file mode 100644 index 0000000..f491ece --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/style-medium.scss @@ -0,0 +1,72 @@ +--- +# Comment added for Front Matter +--- + +@import 'vars'; +@import 'mixins'; + +$size-header-pad: 4em; + +h1, h2, h3, h4, h5, h6 { + br { + display: none; + } +} + +ul { + &.icons { + li { + .icon { + font-size: 1.25em; + } + } + } +} + +#header { + left: auto; + padding: ($size-header-pad * 1.5) $size-header-pad; + position: relative; + text-align: center; + top: auto; + width: 100%; + + h1 { + font-size: 1.75em; + + br { + display: inline; + } + } +} + +#footer { + bottom: auto; + left: auto; + padding: $size-header-pad $size-header-pad ($size-header-pad * 1.5) $size-header-pad; + position: relative; + text-align: center; + width: 100%; + + .icons { + margin: 0 0 ($size-element-margin * 0.5) 0; + } + + .copyright { + margin: 0 0 ($size-element-margin * 0.5) 0; + + li { + border-left-width: 1px; + display: inline-block; + line-height: 1em; + margin-left: 0.75em; + padding-left: 0.75em; + } + } +} + +#main { + margin: 0; + padding: ($size-header-pad * 1.5) $size-header-pad; + width: 100%; +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/style-small.scss b/old_chef_blog/jerryaldrichiii.github.io/css/style-small.scss new file mode 100644 index 0000000..cbb6c91 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/style-small.scss @@ -0,0 +1,78 @@ +--- +# Comment added for Front Matter +--- + +@import 'vars'; +@import 'mixins'; + +$size-header-pad: 1.5em; + +h1 { + font-size: 1.5em; +} + +h2 { + font-size: 1.2em; +} + +h3 { + font-size: 1em; +} + +section, article { + &.special { + text-align: center; + } +} + +header { + &.major { + h2 { + font-size: 1.35em; + } + } +} + +ul { + &.labeled-icons { + li { + padding-left: 2em; + + h3 { + line-height: 1.75em; + } + } + } +} + +#header { + padding: ($size-header-pad * 1.5) $size-header-pad; + + h1 { + font-size: 1.35em; + } +} + +#footer { + padding: ($size-header-pad * 1.5) $size-header-pad; +} + +#main { + padding: ($size-header-pad * 1.5) $size-header-pad (($size-header-pad * 1.5) - $size-element-margin) $size-header-pad; + + > section { + margin: ($size-header-pad * 1.5) 0 0 0; + padding: ($size-header-pad * 1.5) 0 0 0; + } +} + +.poptrox-popup { + border-radius: 0; + + .nav-next, + .nav-previous { + &:before { + margin-top: -1em; + } + } +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/style-xlarge.scss b/old_chef_blog/jerryaldrichiii.github.io/css/style-xlarge.scss new file mode 100644 index 0000000..9339843 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/style-xlarge.scss @@ -0,0 +1,10 @@ +--- +# Comment added for Front Matter +--- + +@import 'vars'; +@import 'mixins'; + +body, input, select, textarea { + font-size: 12pt; +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/style-xsmall.scss b/old_chef_blog/jerryaldrichiii.github.io/css/style-xsmall.scss new file mode 100644 index 0000000..837cdf7 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/style-xsmall.scss @@ -0,0 +1,68 @@ +--- +# Comment added for Front Matter +--- + +@import 'vars'; +@import 'mixins'; + +$size-header-pad: 1.5em; + +ul { + &.actions { + margin: 0 0 $size-element-margin 0; + + li { + display: block; + padding: ($size-element-margin * 0.5) 0 0 0; + text-align: center; + width: 100%; + + &:first-child { + padding-top: 0; + } + + > * { + margin: 0 !important; + width: 100%; + + &.icon { + &:before { + margin-left: -2em; + } + } + } + } + + &.small { + li { + padding: ($size-element-margin * 0.25) 0 0 0; + + &:first-child { + padding-top: 0; + } + } + } + } +} + +#header { + padding: ($size-header-pad * 3) $size-header-pad; + + h1 { + br { + display: none; + } + } +} + +#footer { + .copyright { + li { + border-left-width: 0; + display: block; + line-height: 2.25em; + margin-left: 0; + padding-left: 0; + } + } +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/css/style.scss b/old_chef_blog/jerryaldrichiii.github.io/css/style.scss new file mode 100644 index 0000000..48a7933 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/css/style.scss @@ -0,0 +1,1086 @@ +--- +# Comment added for Front Matter +--- + +@import 'vars'; +@import 'mixins'; +@import 'syntax_highlighting'; +@import url(font-awesome.min.css); + +$size-header-width: 25%; +$size-header-pad: 4em; + +body { + background: $color-bg; + + &.is-loading { + *, *:before, *:after { + @include vendor-property('animation', 'none !important'); + @include vendor-property('transition', 'none !important'); + } + } +} + +body, input, select, textarea { + color: $color-fg; + font-family: $font-family; + font-size: 16pt; + font-weight: $font-weight; + line-height: 1.75em; +} + +a { + @include vendor-property('transition', 'color #{$duration-transition} ease-in-out, border-color #{$duration-transition} ease-in-out'); + border-bottom: dotted 1px; + color: $color-accent-bg; + text-decoration: none; + + &:hover { + border-bottom-color: transparent; + color: $color-accent-bg !important; + text-decoration: none; + } +} + +strong, b { + color: $color-fg-bold; + font-weight: $font-weight-bold; +} + +em, i { + font-style: italic; +} + +p { + margin: 0 0 $size-element-margin 0; + line-height: 1.5em; +} + +h1, h2, h3, h4, h5, h6 { + color: $color-fg-bold; + font-weight: $font-weight-bold; + line-height: 1em; + margin: 0 0 ($size-element-margin * 0.5) 0; + + a { + color: inherit; + text-decoration: none; + } +} + +h1 { + font-size: 2em; + line-height: 1.5em; +} + +h2 { + margin: 1em 0 ($size-element-margin * 0.5) 0; + font-size: 1.5em; + line-height: 1.5em; +} + +h3 { + margin: 1em 0 ($size-element-margin * 0.5) 0; + font-size: 1.25em; + line-height: 1.5em; +} + +h4 { + font-size: 1.1em; + line-height: 1.5em; +} + +h5 { + font-size: 0.9em; + line-height: 1.5em; +} + +h6 { + font-size: 0.7em; + line-height: 1.5em; +} + +sub { + font-size: 0.8em; + position: relative; + top: 0.5em; +} + +sup { + font-size: 0.8em; + position: relative; + top: -0.5em; +} + +hr { + border: 0; + border-bottom: solid 2px $color-border; + + // This is the *only* instance where we need to rely on margin collapse. + margin: $size-element-margin 0; + + &.major { + margin: ($size-element-margin * 1.5) 0; + } +} + +blockquote { + border-left: solid 6px $color-border; + font-style: italic; + margin: 0 0 $size-element-margin 0; + padding: 0.5em 0 0.5em 1.5em; + + p { + margin: 0 + } +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +section, article { + &.special { + text-align: center; + } +} + +header { + p { + color: $color-fg-light; + position: relative; + margin: 0 0 ($size-element-margin * 0.75) 0; + } + + h2 + p { + font-size: 1.25em; + margin-top: ($size-element-margin * -0.5); + line-height: 1.5em; + } + + h3 + p { + font-size: 1.1em; + margin-top: ($size-element-margin * -0.4); + line-height: 1.5em; + } + + h4 + p, + h5 + p, + h6 + p { + font-size: 0.9em; + margin-top: ($size-element-margin * -0.3); + line-height: 1.5em; + } + + &.major { + h2 { + font-size: 2em; + } + } +} + +form { + margin: 0 0 $size-element-margin 0; +} + +label { + color: $color-fg-bold; + display: block; + font-size: 0.9em; + font-weight: $font-weight-bold; + margin: 0 0 ($size-element-margin * 0.5) 0; +} + +input[type="text"], +input[type="password"], +input[type="email"], +select, +textarea { + @include vendor-property('appearance', 'none'); + background: $color-border-bg; + border-radius: $size-border-radius; + border: solid 2px transparent; + color: inherit; + display: block; + outline: 0; + padding: 0 0.75em; + text-decoration: none; + width: 100%; + + &:invalid { + box-shadow: none; + } + + &:focus { + border-color: $color-accent-bg; + } +} + +.select-wrapper { + @include icon; + display: block; + position: relative; + + &:before { + color: $color-border2; + content: '\f078'; + display: block; + height: $size-element-height; + line-height: $size-element-height; + pointer-events: none; + position: absolute; + right: 0; + text-align: center; + top: 0; + width: $size-element-height; + } + + select::-ms-expand { + display: none; + } +} + +input[type="text"], +input[type="password"], +input[type="email"], +select { + height: $size-element-height; +} + +textarea { + padding: 0.75em; +} + +input[type="checkbox"], +input[type="radio"] { + @include vendor-property('appearance', 'none'); + display: block; + float: left; + margin-right: -2em; + opacity: 0; + width: 1em; + z-index: -1; + + & + label { + @include icon; + color: $color-fg; + cursor: pointer; + display: inline-block; + font-size: 1em; + font-weight: $font-weight; + padding-left: ($size-element-height * 0.6) + 0.75em; + padding-right: 0.75em; + position: relative; + + &:before { + background: $color-border-bg; + border-radius: $size-border-radius; + border: solid 2px transparent; + content: ''; + display: inline-block; + height: ($size-element-height * 0.6); + left: 0; + line-height: ($size-element-height * 0.575); + position: absolute; + text-align: center; + top: 0; + width: ($size-element-height * 0.6); + } + } + + &:checked + label { + &:before { + background: $color-fg-bold; + border-color: $color-fg-bold; + color: $color-bg; + content: '\f00c'; + } + } + + &:focus + label { + &:before { + border-color: $color-accent-bg; + } + } +} + +input[type="checkbox"] { + & + label { + &:before { + border-radius: $size-border-radius; + } + } +} + +input[type="radio"] { + & + label { + &:before { + border-radius: 100%; + } + } +} + +::-webkit-input-placeholder { + color: $color-fg-light !important; + opacity: 1.0; +} + +:-moz-placeholder { + color: $color-fg-light !important; + opacity: 1.0; +} + +::-moz-placeholder { + color: $color-fg-light !important; + opacity: 1.0; +} + +:-ms-input-placeholder { + color: $color-fg-light !important; + opacity: 1.0; +} + +.formerize-placeholder { + color: $color-fg-light !important; + opacity: 1.0; +} + +.box { + border-radius: $size-border-radius; + border: solid 2px $color-border; + margin-bottom: $size-element-margin; + padding: 1.5em; + + > :last-child, + > :last-child > :last-child, + > :last-child > :last-child > :last-child { + margin-bottom: 0; + } + + &.alt { + border: 0; + border-radius: 0; + padding: 0; + } +} + +.icon { + @include icon; + border-bottom: none; + position: relative; + + > .label { + display: none; + } +} + +.image { + border-radius: $size-border-radius; + border: 0; + display: inline-block; + position: relative; + + &:before { + @include vendor-property('transition', 'opacity #{$duration-transition} ease-in-out'); + border-radius: $size-border-radius; + content: ''; + display: block; + height: 100%; + left: 0; + opacity: 0.5; + position: absolute; + top: 0; + width: 100%; + } + + &.thumb { + text-align: center; + + &:after { + @include vendor-property('transition', 'opacity #{$duration-transition} ease-in-out'); + border-radius: $size-border-radius; + border: solid 3px rgba(255,255,255,0.5); + color: #fff; + content: 'View'; + display: inline-block; + font-size: 0.8em; + font-weight: $font-weight-bold; + left: 50%; + line-height: 2.25em; + margin: -1.25em 0 0 -3em; + opacity: 0; + padding: 0 1.5em; + position: absolute; + text-align: center; + text-decoration: none; + top: 50%; + white-space: nowrap; + } + + &:hover { + &:after { + opacity: 1.0; + } + + &:before { + opacity: 1.0; + } + } + } + + img { + border-radius: $size-border-radius; + display: block; + } + + &.left { + float: left; + margin: 0 1.5em 1em 0; + top: 0.25em; + } + + &.right { + float: right; + margin: 0 0 1em 1.5em; + top: 0.25em; + } + + &.left, + &.right { + max-width: 40%; + + img { + width: 100%; + } + } + + &.fit { + display: block; + margin: 0 0 $size-element-margin 0; + width: 100%; + + img { + width: 100%; + } + } + + &.avatar { + border-radius: 100%; + + &:before { + display: none; + } + + img { + border-radius: 100%; + width: 100%; + } + } +} + +ol { + list-style: decimal; + margin: 0 0 $size-element-margin 0; + padding-left: 2em; + + li { + padding-left: 0.25em; + } +} + +ul { + list-style: disc; + margin: 0 0 $size-element-margin 0; + padding-left: 2em; + + li { + padding-left: 0.5em; + + ul { + margin-bottom: 0em; + } + } + + &.alt { + list-style: none; + padding-left: 0; + + li { + border-top: solid 2px $color-border; + padding: 0.5em 0; + + &:first-child { + border-top: 0; + padding-top: 0; + } + } + } + + &.icons { + cursor: default; + list-style: none; + padding-left: 0; + + li { + display: inline-block; + padding: 0 1em 0 0; + + &:last-child { + padding-right: 0; + } + + .icon { + &:before { + font-size: 1.5em; + } + } + } + } + + &.actions { + cursor: default; + list-style: none; + padding-left: 0; + + li { + display: inline-block; + padding: 0 ($size-element-margin * 0.5) 0 0; + vertical-align: middle; + + &:last-child { + padding-right: 0; + } + } + + &.small { + li { + padding: 0 ($size-element-margin * 0.25) 0 0; + } + } + + &.vertical { + li { + display: block; + padding: ($size-element-margin * 0.5) 0 0 0; + + &:first-child { + padding-top: 0; + } + + > * { + margin-bottom: 0; + } + } + + &.small { + li { + padding: ($size-element-margin * 0.25) 0 0 0; + + &:first-child { + padding-top: 0; + } + } + } + } + + &.fit { + display: table; + margin-left: ($size-element-margin * -0.5); + padding: 0; + table-layout: fixed; + width: calc(100% + #{($size-element-margin * 0.5)}); + + li { + display: table-cell; + padding: 0 0 0 ($size-element-margin * 0.5); + + > * { + margin-bottom: 0; + } + } + + &.small { + margin-left: ($size-element-margin * -0.25); + width: calc(100% + #{($size-element-margin * 0.25)}); + + li { + padding: 0 0 0 ($size-element-margin * 0.25); + } + } + } + } + + &.labeled-icons { + list-style: none; + padding: 0; + + li { + line-height: 1.75em; + margin: 1.5em 0 0 0; + padding-left: 2.25em; + position: relative; + + &:first-child { + margin-top: 0; + } + + a { + color: inherit; + } + + h3 { + color: $color-fg-light; + left: 0; + position: absolute; + text-align: center; + top: 0; + width: 1em; + } + } + } +} + +dl { + margin: 0 0 $size-element-margin 0; +} + +.table-wrapper { + -webkit-overflow-scrolling: touch; + overflow-x: auto; +} + +table { + margin: 0 0 $size-element-margin 0; + width: 100%; + + tbody { + tr { + border: solid 1px $color-border; + border-left: 0; + border-right: 0; + + } + } + + td { + padding: 0.75em 0.75em; + } + + th { + color: $color-fg-bold; + font-size: 0.9em; + font-weight: $font-weight-bold; + padding: 0 0.75em 0.75em 0.75em; + text-align: left; + } + + thead { + border-bottom: solid 2px $color-border; + } + + tfoot { + border-top: solid 2px $color-border; + } + + &.alt { + border-collapse: separate; + + tbody { + tr { + td { + border: solid 2px $color-border; + border-left-width: 0; + border-top-width: 0; + + &:first-child { + border-left-width: 2px; + } + } + + &:first-child { + td { + border-top-width: 2px; + } + } + } + } + + thead { + border-bottom: 0; + } + + tfoot { + border-top: 0; + } + } +} + +input[type="submit"], +input[type="reset"], +input[type="button"], +.button { + @include vendor-property('appearance', 'none'); + @include vendor-property('transition', 'background-color #{$duration-transition} ease-in-out, color #{$duration-transition} ease-in-out, border-color #{$duration-transition} ease-in-out'); + background-color: transparent; + border-radius: $size-border-radius; + border: solid 3px $color-border; + color: $color-fg-bold !important; + cursor: pointer; + display: inline-block; + font-weight: $font-weight-bold; + height: 3.15em; + height: calc(2.75em + 6px); + line-height: 2.75em; + min-width: 10em; + padding: 0 1.5em; + text-align: center; + text-decoration: none; + white-space: nowrap; + + &:hover { + border-color: $color-accent-bg; + color: $color-accent-bg !important; + } + + &:active { + background-color: transparentize($color-accent-bg, 0.9); + border-color: $color-accent-bg; + color: $color-accent-bg !important; + } + + &.icon { + padding-left: 1.35em; + + &:before { + margin-right: 0.5em; + } + } + + &.fit { + display: block; + margin: 0 0 ($size-element-margin * 0.5) 0; + min-width: 0; + width: 100%; + } + + &.small { + font-size: 0.8em; + } + + &.big { + font-size: 1.35em; + } + + &.special { + background-color: $color-accent-bg; + border-color: $color-accent-bg; + color: $color-accent-fg-bold !important; + + &:hover { + background-color: lighten($color-accent-bg, 5); + border-color: lighten($color-accent-bg, 5); + } + + &:active { + background-color: darken($color-accent-bg, 5); + border-color: darken($color-accent-bg, 5); + } + } + + &.disabled, + &:disabled { + background-color: $color-border2-bg !important; + border-color: $color-border2-bg !important; + color: $color-fg-light !important; + cursor: default; + } +} + +.work-item { + margin: 0 0 $size-element-margin 0; + + .image { + margin: 0 0 ($size-element-margin * 0.75) 0; + } + + h3 { + font-size: 1em; + margin: 0 0 ($size-element-margin * 0.25) 0; + } + + p { + font-size: 0.8em; + line-height: 1.5em; + margin: 0; + } +} + +#header { + background-color: $color-accent2-bg; + color: $color-accent2-fg; + height: 100%; + left: 0; + padding: ($size-header-pad * 2) $size-header-pad 0 0; + position: fixed; + text-align: right; + top: 0; + width: $size-header-width; + + strong, b { + color: $color-accent2-fg-bold; + } + + h2, h3, h4, h5, h6 { + color: $color-accent2-fg-bold; + } + + h1 { + color: $color-accent2-fg; + font-size: 1.35em; + line-height: 1.75em; + margin: 0; + } + + .image.avatar { + margin: 0 0 ($size-element-margin * 0.5) 0; + width: 6.25em; + } +} + +#footer { + background-color: $color-accent2-bg; + bottom: 0; + left: 0; + padding: 0 $size-header-pad ($size-header-pad + $size-element-margin) 0; + position: fixed; + text-align: right; + width: $size-header-width; + + .icons { + margin: ($size-element-margin * 0.5) 0 0 0; + + a { + color: $color-accent2-fg-light; + } + } + + .copyright { + color: $color-accent2-fg-light; + font-size: 0.8em; + list-style: none; + margin: ($size-element-margin * 0.5) 0 0 0; + padding: 0; + + li { + border-left: solid 1px $color-accent2-border; + display: inline-block; + line-height: 1em; + margin-left: 0.75em; + padding-left: 0.75em; + + &:first-child { + border-left: 0; + margin-left: 0; + padding-left: 0; + } + + a { + color: inherit; + } + } + } +} + +#main { + margin-left: $size-header-width; + max-width: 50em + $size-header-pad; + padding: ($size-header-pad * 2) $size-header-pad $size-header-pad $size-header-pad; + width: calc(100% - #{$size-header-width}); + + > section { + border-top: solid 2px $color-border; + margin: $size-header-pad 0 0 0; + padding: $size-header-pad 0 0 0; + &:first-child { + border-top: 0; + margin-top: 0; + padding-top: 0; + } + } +} + +@include vendor-keyframes('spin') { + 0% { @include vendor-property('transform', 'rotate(0deg)'); } + 100% { @include vendor-property('transform', 'rotate(360deg)'); } +}; + +.poptrox-popup { + @include vendor-property('box-sizing', 'content-box'); + -webkit-tap-highlight-color: rgba(255,255,255,0); + background: #fff; + border-radius: $size-border-radius; + box-shadow: 0 0.1em 0.15em 0 rgba(0,0,0,0.15); + overflow: hidden; + padding-bottom: 3em; + + .loader { + @include icon; + @include vendor-property('animation', 'spin 1s linear infinite'); + font-size: 1.5em; + height: 1em; + left: 50%; + line-height: 1em; + margin: -0.5em 0 0 -0.5em; + position: absolute; + top: 50%; + width: 1em; + + &:before { + content: '\f1ce'; + } + } + + .caption { + background: #fff; + bottom: 0; + cursor: default; + font-size: 0.9em; + height: 3em; + left: 0; + line-height: 2.8em; + position: absolute; + text-align: center; + width: 100%; + z-index: 1; + } + + .nav-next, + .nav-previous { + @include icon; + @include vendor-property('transition', 'opacity #{$duration-transition} ease-in-out'); + -webkit-tap-highlight-color: rgba(255,255,255,0); + background: rgba(0,0,0,0.01); + cursor: pointer; + height: 100%; + opacity: 0; + position: absolute; + top: 0; + width: 50%; + + &:before { + color: #fff; + font-size: 2.5em; + height: 1em; + line-height: 1em; + margin-top: -0.75em; + position: absolute; + text-align: center; + top: 50%; + width: 1.5em; + } + } + + .nav-next { + right: 0; + + &:before { + content: '\f105'; + right: 0; + } + } + + .nav-previous { + left: 0; + + &:before { + content: '\f104'; + left: 0; + } + } + + .closer { + @include icon; + @include vendor-property('transition', 'opacity #{$duration-transition} ease-in-out'); + -webkit-tap-highlight-color: rgba(255,255,255,0); + color: #fff; + height: 4em; + line-height: 4em; + opacity: 0; + position: absolute; + right: 0; + text-align: center; + top: 0; + width: 4em; + z-index: 2; + + &:before { + @include vendor-property('box-sizing', 'content-box'); + border-radius: 100%; + border: solid 3px rgba(255,255,255,0.5); + content: '\f00d'; + display: block; + font-size: 1em; + height: 1.75em; + left: 50%; + line-height: 1.75em; + margin: -0.875em 0 0 -0.875em; + position: absolute; + top: 50%; + width: 1.75em; + } + } + + &:hover { + .nav-next, + .nav-previous { + opacity: 0.5; + + &:hover { + opacity: 1.0; + } + } + + .closer { + opacity: 0.5; + + &:hover { + opacity: 1.0; + } + } + } +} + +body.is-touch { + .image { + &.thumb { + &:before { + opacity: 0.5 !important; + } + + &:after { + display: none !important; + } + } + } + + #header { + background-attachment: scroll; + background-size: auto, cover; + } + + .poptrox-popup { + .nav-next, + .nav-previous, + .closer { + opacity: 1.0 !important; + } + } +} diff --git a/old_chef_blog/jerryaldrichiii.github.io/images/avatar.jpg b/old_chef_blog/jerryaldrichiii.github.io/images/avatar.jpg new file mode 100644 index 0000000..38396f8 Binary files /dev/null and b/old_chef_blog/jerryaldrichiii.github.io/images/avatar.jpg differ diff --git a/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/FontAwesome.otf b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/FontAwesome.otf new file mode 100644 index 0000000..d4de13e Binary files /dev/null and b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/FontAwesome.otf differ diff --git a/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.eot b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.eot new file mode 100644 index 0000000..c7b00d2 Binary files /dev/null and b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.eot differ diff --git a/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.svg b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.svg new file mode 100644 index 0000000..8b66187 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.ttf b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.ttf new file mode 100644 index 0000000..f221e50 Binary files /dev/null and b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.ttf differ diff --git a/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.woff b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.woff new file mode 100644 index 0000000..6e7483c Binary files /dev/null and b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.woff differ diff --git a/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.woff2 b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.woff2 new file mode 100644 index 0000000..7eb74fd Binary files /dev/null and b/old_chef_blog/jerryaldrichiii.github.io/images/fontawesome/fontawesome-webfont.woff2 differ diff --git a/old_chef_blog/jerryaldrichiii.github.io/index.html b/old_chef_blog/jerryaldrichiii.github.io/index.html new file mode 100644 index 0000000..89c1963 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/index.html @@ -0,0 +1,17 @@ +--- +layout: default +--- + +
+ {% for page in site.pages %} + {% if page.title %} +
+

{{page.title}}

+ {% assign posts = site.posts | where:'category', page.category %} + {% for post in posts %} +

     {{post.title}}

+ {% endfor %} +
+ {% endif %} + {% endfor %} +
diff --git a/old_chef_blog/jerryaldrichiii.github.io/js/init.js b/old_chef_blog/jerryaldrichiii.github.io/js/init.js new file mode 100644 index 0000000..0c8acc1 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/js/init.js @@ -0,0 +1,125 @@ +/* + Strata by HTML5 UP + html5up.net | @n33co + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +(function($) { + + var settings = { + + // Parallax background effect? + parallax: true, + + // Parallax factor (lower = more intense, higher = less intense). + parallaxFactor: 20 + + }; + + skel.init({ + reset: 'full', + containers: '100%', + breakpoints: { + global: { href: '/css/style.css', grid: { gutters: ['2.5em', 0] } }, + xlarge: { media: '(max-width: 1800px)', href: '/css/style-xlarge.css' }, + large: { media: '(max-width: 1280px)', href: '/css/style-large.css', grid: { gutters: ['2em', 0] } }, + medium: { media: '(max-width: 980px)', href: '/css/style-medium.css'}, + small: { media: '(max-width: 736px)', href: '/css/style-small.css', grid: { gutters: ['1.5em', 0] }, viewport: { scalable: false } }, + xsmall: { media: '(max-width: 480px)', href: '/css/style-xsmall.css' } + } + }); + + $(function() { + + var $window = $(window), + $body = $('body'), + $header = $('#header'); + + // Disable animations/transitions until the page has loaded. + $body.addClass('is-loading'); + + $window.on('load', function() { + $body.removeClass('is-loading'); + }); + + // Touch? + if (skel.vars.isMobile) { + + // Turn on touch mode. + $body.addClass('is-touch'); + + // Height fix (mostly for iOS). + window.setTimeout(function() { + $window.scrollTop($window.scrollTop() + 1); + }, 0); + + } + + // Forms (IE<10). + + if (skel.vars.IEVersion < 10) { + + var $form = $('form'); + + if ($form.length > 0) { + + $.fn.n33_formerize=function(){var _fakes=new Array(),_form = $(this);_form.find('input[type=text],textarea').each(function() { var e = $(this); if (e.val() == '' || e.val() == e.attr('placeholder')) { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } }).blur(function() { var e = $(this); if (e.attr('name').match(/_fakeformerizefield$/)) return; if (e.val() == '') { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } }).focus(function() { var e = $(this); if (e.attr('name').match(/_fakeformerizefield$/)) return; if (e.val() == e.attr('placeholder')) { e.removeClass('formerize-placeholder'); e.val(''); } }); _form.find('input[type=password]').each(function() { var e = $(this); var x = $($('
').append(e.clone()).remove().html().replace(/type="password"/i, 'type="text"').replace(/type=password/i, 'type=text')); if (e.attr('id') != '') x.attr('id', e.attr('id') + '_fakeformerizefield'); if (e.attr('name') != '') x.attr('name', e.attr('name') + '_fakeformerizefield'); x.addClass('formerize-placeholder').val(x.attr('placeholder')).insertAfter(e); if (e.val() == '') e.hide(); else x.hide(); e.blur(function(event) { event.preventDefault(); var e = $(this); var x = e.parent().find('input[name=' + e.attr('name') + '_fakeformerizefield]'); if (e.val() == '') { e.hide(); x.show(); } }); x.focus(function(event) { event.preventDefault(); var x = $(this); var e = x.parent().find('input[name=' + x.attr('name').replace('_fakeformerizefield', '') + ']'); x.hide(); e.show().focus(); }); x.keypress(function(event) { event.preventDefault(); x.val(''); }); }); _form.submit(function() { $(this).find('input[type=text],input[type=password],textarea').each(function(event) { var e = $(this); if (e.attr('name').match(/_fakeformerizefield$/)) e.attr('name', ''); if (e.val() == e.attr('placeholder')) { e.removeClass('formerize-placeholder'); e.val(''); } }); }).bind("reset", function(event) { event.preventDefault(); $(this).find('select').val($('option:first').val()); $(this).find('input,textarea').each(function() { var e = $(this); var x; e.removeClass('formerize-placeholder'); switch (this.type) { case 'submit': case 'reset': break; case 'password': e.val(e.attr('defaultValue')); x = e.parent().find('input[name=' + e.attr('name') + '_fakeformerizefield]'); if (e.val() == '') { e.hide(); x.show(); } else { e.show(); x.hide(); } break; case 'checkbox': case 'radio': e.attr('checked', e.attr('defaultValue')); break; case 'text': case 'textarea': e.val(e.attr('defaultValue')); if (e.val() == '') { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } break; default: e.val(e.attr('defaultValue')); break; } }); window.setTimeout(function() { for (x in _fakes) _fakes[x].trigger('formerize_sync'); }, 10); }); return _form; }; + $form.n33_formerize(); + + } + + } + + // Header. + + // Parallax background. + + // Disable parallax on IE (smooth scrolling is jerky), and on mobile platforms (= better performance). + if (skel.vars.browser == 'ie' + || skel.vars.isMobile) + settings.parallax = false; + + if (settings.parallax) { + + skel.change(function() { + + if (skel.isActive('medium')) { + + $window.off('scroll.strata_parallax'); + $header.css('background-position', 'top left, center center'); + + } + else { + + $header.css('background-position', 'left 0px'); + + $window.on('scroll.strata_parallax', function() { + $header.css('background-position', 'left ' + (-1 * (parseInt($window.scrollTop()) / settings.parallaxFactor)) + 'px'); + }); + + } + + }); + + } + + // Main Sections: Two. + + // Lightbox gallery. + $('#two').poptrox({ + caption: function($a) { return $a.next('h3').text(); }, + overlayColor: '#2c2c2c', + overlayOpacity: 0.85, + popupCloserText: '', + popupLoaderText: '', + selector: '.work-item a', + usePopupCaption: true, + usePopupDefaultStyling: false, + usePopupEasyClose: false, + usePopupNav: true, + windowMargin: (skel.isActive('small') ? 0 : 50) + }); + + }); + +})(jQuery); \ No newline at end of file diff --git a/old_chef_blog/jerryaldrichiii.github.io/js/jquery.min.js b/old_chef_blog/jerryaldrichiii.github.io/js/jquery.min.js new file mode 100644 index 0000000..ab28a24 --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("',o=!1,u="stopPropagation",a="position",f="poptrox_close",l="fadeSpeed",h="length",p="text-align",d="popupNavPreviousSelector",v="poptrox_switch",m=!0,g="stopSpinning",y="popupCaptionSelector",b=null,w="popupHeight",E="popupNavNextSelector",S="click",x="popupCloserSelector",T="popupLoaderSelector",N="poptrox_previous",C="none",k="font-size",L="popupCaptionHeight",A="center",O="cursor",M="preventDefault",_="object",D="line-height",P="poptrox_reset",H="caption",B="overflow",j="poptrox_next",F="popupTextColor",I="text-indent",q="fadeIn",R="poptrox_disableSelection",U="pointer",z="absolute",W="auto",X="color",V="#000000",$="load",J="100%",K="usePopupNav",Q="px",G="",Y="relative",Z="0",et='
1){for(Rt=0;Rt
'),Vt=e(window),Kt=[],Qt=0,Gt=o,Yt=new Array,Ut.usePopupLoader||(Ut[T]=b),Ut.usePopupCloser||(Ut[x]=b),Ut.usePopupCaption||(Ut[y]=b),Ut[K]||(Ut[d]=b,Ut[E]=b),Ut[mt]?Zt=e(Ut[mt]):Zt=e(et+Ut.popupClass+'">'+(Ut[T]?'
'+Ut[ut]+G:"")+'
'+(Ut[y]?'
':"")+(Ut[x]?''+Ut[at]+"":"")+(Ut[d]?'':"")+(Ut[E]?'':"")+G),en=Zt.find(".pic"),tn=e(),nn=Zt.find(Ut[T]),rn=Zt.find(Ut[y]),sn=Zt.find(Ut[x]),on=Zt.find(Ut[E]),un=Zt.find(Ut[d]),an=on.add(un),Ut.usePopupDefaultStyling&&(Zt[i](st,Ut.popupBackgroundColor)[i](X,Ut[F])[i]("padding",Ut.popupPadding+Q),rn[h]>0&&(Zt[i]("padding-bottom",Ut[L]+Q),rn[i](a,z)[i](lt,Z)[i]("bottom",Z)[i](n,J)[i](p,A)[i](t,Ut[L]+Q)[i](D,Ut[L]+Q),Ut.popupCaptionTextSize&&rn[i](k,popupCaptionTextSize)),sn[h]>0&&sn.html(Ut[at])[i](k,Ut.popupCloserTextSize)[i](st,Ut.popupCloserBackgroundColor)[i](X,Ut.popupCloserTextColor)[i](wt,"block")[i](n,Ct)[i](t,Ct)[i](D,Ct)[i](p,A)[i](a,z)[i]("text-decoration",C)[i](rt,Z)[i]("top",Z)[i]("right","-40px"),nn[h]>0&&nn.html("")[i](a,Y)[i](k,Ut.popupLoaderTextSize).on(it,function(){var n=e("
"+Ut[ut]+G);n[i](t,Math.floor(Ut[w]/2)+Q)[i](B,"hidden")[i](D,Math.floor(Ut[w]/2)+Q)[i](p,A)[i]("margin-top",Math.floor((Zt[t]()-n[t]()+(rn[h]>0?rn[t]():0))/2))[i](X,Ut[F]?Ut[F]:"").on(Lt,function(){n.fadeTo(300,.5,function(){n[r]("xfout")})}).on("xfout",function(){n.fadeTo(300,.05,function(){n[r](Lt)})})[r](Lt),nn.append(n)}).on(g,function(){var e=nn.find("div");e.remove()}),an[h]==2&&(an[i](k,"75px")[i](p,A)[i](X,"#fff")[i]("text-shadow",C)[i](t,J)[i](a,z)[i]("top",Z)[i]("opacity","0.35")[i](O,U)[i]("box-shadow","inset 0px 0px 10px 0px rgba(0,0,0,0)")[R](),Ut[vt]?(fn="100px",ln="100px"):(fn="75%",ln="25%"),on[i]("right",Z)[i](n,fn).html('
>
'),un[i](lt,Z)[i](n,ln).html('
<
'))),Vt.on("resize orientationchange",function(){cn()}),rn.on(ft,function(e,t){if(!t||t[h]==0)t=Ut.popupBlankCaptionText;rn.html(t)}),sn[i](O,U).on(S,function(e){return e[M](),e[u](),Zt[r](f),m}),on.on(S,function(){Zt[r](j)}),un.on(S,function(){Zt[r](N)}),Xt[i](a,"fixed")[i](lt,0)[i]("top",0)[i](nt,Ut.baseZIndex)[i](n,J)[i](t,J)[i](p,A)[i](O,U).appendTo(Ut.parent).prepend('
').append('
')[Tt]().on("touchmove",function(){return o}).on(S,function(e){e[M](),e[u](),Zt[r](f)}),Ut[vt]&&en[i](O,U).on(S,function(e){e[M](),e[u](),Zt[r](f)}),Zt[i](wt,"inline-block")[i]("vertical-align","middle")[i](a,Y)[i](nt,1).appendTo(Xt)[Tt]().on(j,function(){var e=Qt+1;e>=Kt[h]&&(e=0),Zt[r](v,[e])}).on(N,function(){var e=Qt-1;e<0&&(e=Kt[h]-1),Zt[r](v,[e])}).on(P,function(){cn(),Zt.data(n,Ut[tt]).data(t,Ut[w]),nn[Tt]()[r](g),rn[Tt](),sn[Tt](),an[Tt](),en[Tt](),tn.detach()}).on(pt,function(e,t){if(Gt)return m;Gt=m,Ut[Nt]&&Wt[i](B,"hidden"),Ut.onPopupOpen&&Ut.onPopupOpen(),Xt.fadeTo(Ut[l],1,function(){Zt[r](v,[t,m])})}).on(v,function(s,u,f){var c;if(!f&&Gt)return m;Gt=m,Zt[i](n,Zt.data(n))[i](t,Zt.data(t)),rn[Tt](),tn[At]("src")&&tn[At]("src",""),tn.detach(),c=Kt[u],tn=c[_],tn.off($),en[i](I,"-9999px").show().append(tn),c[gt]=="ajax"?e.get(c.src,function(e){tn.html(e),tn[r]($)}):tn[At]("src",c.src),c[gt]!=bt&&tn[i](a,Y)[i](rt,Z)[i](nt,Ut.baseZIndex+100)[n](c[n])[t](c[t]),nn[r](it)[q](300),Zt.show(),Ut.popupIsFixed?(Zt[n](Ut[tt])[t](Ut[w]),tn[$](function(){tn.off($),nn[Tt]()[r](g),rn[r](ft,[c[ot]])[q](Ut[l]),sn[q](Ut[l]),en[i](I,0)[Tt]()[q](Ut[l],function(){Gt=o}),Qt=u,an[q](Ut[l])})):tn[$](function(){var e,s,a;cn(),tn.off($),nn[Tt]()[r](g),e=tn[n](),s=tn[t](),a=function(){rn[r](ft,[c[ot]])[q](Ut[l]),sn[q](Ut[l]),en[i](I,0)[Tt]()[q](Ut[l],function(){Gt=o}),Qt=u,an[q](Ut[l]),Zt.data(n,e).data(t,s)[i](n,W)[i](t,W)},e==Zt.data(n)&&s==Zt.data(t)?a():Zt.animate({width:e,height:s},Ut.popupSpeed,"swing",a)}),c[gt]!=bt&&tn[r]($)}).on(f,function(){if(Gt&&!Ut.usePopupForceClose)return m;Gt=m,Zt[Tt]()[r](P),Ut.onPopupClose&&Ut.onPopupClose(),Xt.fadeOut(Ut[l],function(){Ut[Nt]&&Wt[i](B,W),Gt=o})})[r](P),Vt.keydown(function(e){if(Zt.is(":visible"))switch(e.keyCode){case 37:case 32:if(Ut[K])return Zt[r](N),o;break;case 39:if(Ut[K])return Zt[r](j),o;break;case 27:return Zt[r](f),o}}),zt.find(Ut[yt]).each(function(a){var f,l,p,d,v,g=e(this),y=g.find("img"),w=g.data(ct);if(!g[At](kt))return;f={src:g[At](kt),captionText:y[At](Et),width:g[At](n),height:g[At](t),type:b,object:b},Ut[H]?typeof Ut[H]=="function"?c=Ut[H](g):yt in Ut[H]&&(p=g.find(Ut[H][yt]),"attribute"in Ut[H]?c=p[At](Ut[H].attribute):(c=p.html(),Ut[H].remove===m&&p.remove())):c=y[At](Et),f[ot]=c;if(w){v=w.split(",");for(d in v)l=v[d].match(/([0-9]+)x([0-9]+)/),l&&l[h]==3?(f[n]=l[1],f[t]=l[2]):f[gt]=v[d]}if(!f[gt]){l=f.src.match(/http[s]?:\/\/([a-z0-9\.]+)\/.*/);if(!l||l[h]<2)l=[o];switch(l[1]){case"api.soundcloud.com":f[gt]=St;break;case"youtu.be":f[gt]=Mt,f[n]=800,f[t]=480;break;case"vimeo.com":f[gt]="vimeo",f[n]=800,f[t]=480;break;case"wistia.net":f[gt]="wistia",f[n]=800,f[t]=480;break;case"bcove.me":f[gt]="bcove",f[n]=640,f[t]=360;break;default:f[gt]=bt}}l=f.src.match(/http([s]?):\/\/[a-z0-9\.]+\/(.*)/),l&&(f[ht]="http"+(l[1]=="s"?"s":""));switch(f[gt]){case dt:break;case"iframe":f[_]=e(''),f[_].on(S,function(e){e[u]()})[i](O,W);break;case"ajax":f[_]=e('
'),f[_].on(S,function(e){e[u]()})[i](O,W)[i](B,W);break;case St:f[_]=e(''),f.src=f[ht]+"://w.soundcloud.com/player/?url="+escape(f.src),f[n]="600",f[t]="166";break;case Mt:f[_]=e(''),f.src=f[ht]+"://www.youtube.com/embed/"+l[2];break;case"vimeo":f[_]=e(s),f.src=f[ht]+"://player.vimeo.com/video/"+l[2];break;case"wistia":f[_]=e(s),f.src=f[ht]+"://fast.wistia.net/"+l[2];break;case"bcove":f[_]=e(''),f.src=f[ht]+"://bcove.me/"+l[2];break;default:f[_]=e(''),Ut.preload&&(l=document.createElement("img"),l.src=f.src,Yt.push(l))}f[gt]!=dt&&Kt.push(f),y[At](Et,""),f[gt]!=dt&&g[At](kt,"")[i](rt,0).on(S,function(e){e[M](),e[u](),Zt[r](pt,[a])})}),e(this)}})(jQuery); \ No newline at end of file diff --git a/old_chef_blog/jerryaldrichiii.github.io/js/skel.min.js b/old_chef_blog/jerryaldrichiii.github.io/js/skel.min.js new file mode 100644 index 0000000..4753cff --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/js/skel.min.js @@ -0,0 +1,2 @@ +/* skel.js v2.2.1 | (c) n33 | getskel.com | MIT licensed */ +var skel=function(){var e="breakpoints",t="config",n="iterate",r="elements",i="stateId",s="stateElements",o="getElementsByClassName",u=!1,a="getElementsByTagName",f="length",l="gridLevelMax",c=null,h="getCachedElement",p="viewport",d=" 0 -1px ",v="cacheNewElement",m="config_breakpoint",g="createElement",y=!0,b="gutters",w="vars",E="insertBefore",S="newInline",x="substring",T="}",N="parentNode",C="cache",k="locations",L="gridLevelMap",A="orientationChange",O="deviceType",M="className",_=" 0 0 ",D="object",P="isArray",H="match",B="grid",j="+*,",F="replace",I="head",q="newElement",R="canUseProperty_element",U="indexOf",z="_skel_isReversed",W="push",X="extend",V="matchesMedia",$="DOMReady",J="containers",K="onorientationchange",Q="defaults",G="lock",Y="getComputedStyle",Z="addEventListener",et="^head",tt="{display:none!important}",nt="parseMeasurement",rt="isActive",it="charAt",st="registerLocation",ot="trigger",ut="IEVersion",at="documentElement",ft="events",lt="placeholder",ct="level",ht="attachElements",pt="isStatic",dt="attachElement",vt="plugins",mt="DOMContentLoaded",gt="text/css",yt="device-width",bt="states",wt="initial-scale=1",Et="_skel_attach",St="removeEventListener",xt="split",Tt="resize",Nt="attached",Ct="location",kt="change",Lt="normalize",At="collapse",Ot="applyRowTransforms",Mt="media",_t="previousSibling",Dt="(min-width: ",Pt="html",Ht="style",Bt="firstChild",jt="forceDefaultState",Ft="_skel_placeholder",It="querySelectorAll",qt="min-height",Rt="max-height",Ut="min-width",zt="innerHTML",Wt="prototype",Xt="max-width",Vt="nextSibling",$t="hasOwnProperty",Jt="domready",Kt="onresize",Qt="priority",Gt="href",Yt=".\\3$1 ",Zt="android",en="readyState",tn="height=",nn={breakpoints:[],breakpointList:[],cache:{elements:{},states:{},stateElements:{}},config:{breakpoints:{"*":{href:u,media:""}},containers:1140,defaultState:c,events:{},grid:{level:1,collapse:u,gutters:[40,0]},lock:{path:u,permanent:y},plugins:{},pollOnce:u,preload:u,reset:Lt,RTL:u,viewport:{width:yt,height:"",scalable:y}},css:{bm:"*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}",n:"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:700}dfn{font-style:italic}h1{font-size:2em;margin:.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:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-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]{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;-moz-box-sizing:content-box;-webkit-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 silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}",r:"html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}body{-webkit-text-size-adjust:none}",gc:function(e){return".\\31 2u"+e+",.\\31 2u\\24"+e+"{width:100%;clear:none;margin-left:0}"+".\\31 1u"+e+",.\\31 1u\\24"+e+"{width:91.6666666667%;clear:none;margin-left:0}"+".\\31 0u"+e+",.\\31 0u\\24"+e+"{width:83.3333333333%;clear:none;margin-left:0}"+".\\39 u"+e+",.\\39 u\\24"+e+"{width:75%;clear:none;margin-left:0}"+".\\38 u"+e+",.\\38 u\\24"+e+"{width:66.6666666667%;clear:none;margin-left:0}"+".\\37 u"+e+",.\\37 u\\24"+e+"{width:58.3333333333%;clear:none;margin-left:0}"+".\\36 u"+e+",.\\36 u\\24"+e+"{width:50%;clear:none;margin-left:0}"+".\\35 u"+e+",.\\35 u\\24"+e+"{width:41.6666666667%;clear:none;margin-left:0}"+".\\34 u"+e+",.\\34 u\\24"+e+"{width:33.3333333333%;clear:none;margin-left:0}"+".\\33 u"+e+",.\\33 u\\24"+e+"{width:25%;clear:none;margin-left:0}"+".\\32 u"+e+",.\\32 u\\24"+e+"{width:16.6666666667%;clear:none;margin-left:0}"+".\\31 u"+e+",.\\31 u\\24"+e+"{width:8.3333333333%;clear:none;margin-left:0}"+".\\31 2u\\24"+e+j+".\\31 1u\\24"+e+j+".\\31 0u\\24"+e+j+".\\39 u\\24"+e+j+".\\38 u\\24"+e+j+".\\37 u\\24"+e+j+".\\36 u\\24"+e+j+".\\35 u\\24"+e+j+".\\34 u\\24"+e+j+".\\33 u\\24"+e+j+".\\32 u\\24"+e+j+".\\31 u\\24"+e+"+*{"+"clear:left;"+T+".\\-11u"+e+"{margin-left:91.6666666667%}"+".\\-10u"+e+"{margin-left:83.3333333333%}"+".\\-9u"+e+"{margin-left:75%}"+".\\-8u"+e+"{margin-left:66.6666666667%}"+".\\-7u"+e+"{margin-left:58.3333333333%}"+".\\-6u"+e+"{margin-left:50%}"+".\\-5u"+e+"{margin-left:41.6666666667%}"+".\\-4u"+e+"{margin-left:33.3333333333%}"+".\\-3u"+e+"{margin-left:25%}"+".\\-2u"+e+"{margin-left:16.6666666667%}"+".\\-1u"+e+"{margin-left:8.3333333333%}"}},defaults:{breakpoint:{config:c,elements:c,test:c},config_breakpoint:{containers:"100%",grid:{},href:u,media:"",viewport:{}}},events:[],forceDefaultState:u,gridLevelMap:{k:{},v:{}},gridLevelMax:1,isInit:u,isStatic:u,locations:{body:c,head:c,html:c},lcn:"_skel_lock",me:c,plugins:{},sd:"/",stateId:"",vars:{},DOMReady:c,getElementsByClassName:c,indexOf:c,isArray:c,iterate:c,matchesMedia:c,extend:function(e,t){var r;nn[n](t,function(n){nn[P](t[n])?(nn[P](e[n])||(e[n]=[]),nn[X](e[n],t[n])):typeof t[n]==D?(typeof e[n]!=D&&(e[n]={}),nn[X](e[n],t[n])):e[n]=t[n]})},getArray:function(e){return nn[P](e)?e:[e]},parseMeasurement:function(e){var t,n;if(typeof e!="string")t=[e,"px"];else if(e=="fluid")t=[100,"%"];else{var n;n=e[H](/([0-9\.]+)([^\s]*)/),n[f]<3||!n[2]?t=[parseFloat(e),"px"]:t=[parseFloat(n[1]),n[2]]}return t},canUseProperty_element:c,canUse:function(t){return nn[e][t]&&nn[e][t].test()},canUseProperty:function(e){nn[R]||(nn[R]=document[g]("div"));var t=nn[R][Ht],n=e[it](0).toUpperCase()+e.slice(1);return e in t||"Moz"+n in t||"Webkit"+n in t||"O"+n in t||"ms"+n in t},hasActive:function(e){var t=u;return nn[n](e,function(n){t=t||nn[rt](e[n])}),t},isActive:function(e){return nn[U](nn[i],nn.sd+e)!==-1},isLocked:function(){return!!nn[w][G]&&nn[P](nn[w][G])},lock:function(e,n){nn[w][G]=[e,n],document.cookie=nn.lcn+"="+nn[w][G].join("_")+(nn[t][G].path?";path="+nn[t][G].path:"")+(nn[t][G].permanent?";expires=Tue, 19 Jan 2038 03:14:07 GMT":""),window[Ct].reload()},unlock:function(){nn[w][G]=c,document.cookie=nn.lcn+"="+(nn[t][G].path?";path="+nn[t][G].path:"")+";expires=Thu, 01 Jan 1970 01:02:03 GMT",window[Ct].reload()},useActive:function(e){if(typeof e!==D)return e;var t=c;return nn[n](e,function(n){if(t!==c)return;nn[rt](n)&&(t=e[n])}),t},wasActive:function(e){return nn[U](nn[w].lastStateId,nn.sd+e)!==-1},applyRowTransforms:function(e){nn[t].RTL&&(nn.unreverseRows(),e[t][B][At]&&nn.reverseRows());var r="_skel_important",i=[],s,a;for(s=1;s<=nn[l];s++)a=nn[o]("important("+nn[L].k[s]+")"),nn[n](a,function(e){i[W](a[e])});a=nn[o]("important(collapse)"),nn[n](a,function(e){i[W](a[e])}),nn[n](i,function(n){if(n===f)return;var s=i[n],o=s[N],a,l=u,c,h;if(!o)return;if(!s[$t](r)||s[r]===u){e[t][B][At]&&s[M][H](/important\(collapse\)/)?l="c":s[M][H](/important\((.+)\)/)&&(h=parseInt(nn[L].v[RegExp.$1]))<=e[t][B][ct]&&(l="l");if(!l)return;c=nn[t].RTL?Vt:_t,a=s[c];while(a&&a.nodeName=="#text")a=a[c];if(!a)return;o[E](s,nn[t].RTL&&l=="l"?o.lastChild:o[Bt]),s[r]={placeholder:a,mode:l,level:h}}else{a=s[r][lt],l=s[r].mode;if(l=="c"&&e[t][B][At]||l=="l"&&s[r][ct]<=e[t][B][ct])return;o[E](s,nn[t].RTL&&l=="l"?a[_t]:a[Vt]),s[r]=u}})},reverseRows:function(){var e=nn[o]("row");nn[n](e,function(t){if(t===f)return;var n=e[t];if(n[z])return;var r=n.children,i;for(i=1;i0&&nn[$](function(){nn[n](r,function(e){nn[dt](r[e])})})},cacheElement:function(e){return nn[C][r][e.id]=e,e},cacheNewElement:function(e,t,n,r){var i;return t[N]&&t[N].removeChild(t),i=nn[q](e,t,n,r),nn.cacheElement(i)},detachAllElements:function(e){var t,i,s={};nn[n](e,function(t){s[e[t].id]=y}),nn[n](nn[C][r],function(e){if(e in s)return;nn.detachElement(e)})},detachElement:function(e){var t=nn[C][r][e],n;if(!t[Nt])return;n=t[D];if(!n[N]||n[N]&&!n[N].tagName)return;n[N].removeChild(n),t[Nt]=u,t.onDetach&&t.onDetach()},getCachedElement:function(e){return nn[C][r][e]?nn[C][r][e]:c},newElement:function(e,t,n,r){return{id:e,object:t,location:n,priority:r,attached:u}},removeCachedElementFromBreakpoint:function(t,i){return nn[n](nn[e][t][r],function(n){nn[e][t][r][n].id==i&&delete nn[e][t][r][n]}),y},removeCachedElementFromState:function(e,t){return nn[n](nn[C][s][e],function(n){nn[C][s][e][n].id==t&&delete nn[C][s][e][n]}),y},uncacheElement:function(e){return e in nn[C][r]?(delete nn[C][r][e],y):u},changeState:function(o){var a,l,c,g,E,N,k,A,O;nn[w].lastStateId=nn[i],nn[i]=o;if(!nn[C][bt][nn[i]]){nn[C][bt][nn[i]]={config:{},elements:[],values:{}},c=nn[C][bt][nn[i]],nn[i]===nn.sd?a=[]:a=nn[i][x](1)[xt](nn.sd),nn[X](c[t],nn[Q][m]),nn[n](a,function(n){nn[X](c[t],nn[e][a[n]][t])}),k="mV"+nn[i],c[t][p].content?A=c[t][p].content:nn.isLocked()?(g=[],g[W]("user-scalable=yes"),nn[w][G][0]&&g[W]("width="+nn[w][G][0]),nn[w][G][1]&&g[W](tn+nn[w][G][1]),A=g.join(","),window.setTimeout(function(){nn.poll()},0)):(g=[],g[W]("user-scalable="+(c[t][p].scalable?"yes":"no")),c[t][p].width&&g[W]("width="+c[t][p].width),c[t][p].height&&g[W](tn+c[t][p].height),c[t][p].width==yt&&g[W](wt),A=g.join(",")),(E=nn[h](k))||(E=nn[v](k,nn.newMeta(p,A),et,4)),c[r][W](E);var M,D,P=u;g=nn[nt](c[t][J]),M=g[0],D=g[1],c.values[J]=M+D,k="iC"+c.values[J],D.substr(-1)=="!"&&(P=y,D=D.substr(0,D[f]-1)),(E=nn[h](k))||(E=nn[v](k,nn[S](".container{margin-left:auto;margin-right:auto;width:"+M*1+D+(P?"!important;max-width:none!important;min-width:0!important"+T:T+".container.\\31 25\\25{width:100%;max-width:"+M*1.25+D+";min-width:"+M+D+T+".container.\\37 5\\25{width:"+M*.75+D+T+".container.\\35 0\\25{width:"+M*.5+D+T+".container.\\32 5\\25{width:"+M*.25+D+T)),I,3)),c[r][W](E),k="iGG"+c[t][B][b][0]+"_"+c[t][B][b][1];if(!(E=nn[h](k))){var H,j;g=nn[nt](c[t][B][b][0]),H=g[0],j=g[1];var q,R;g=nn[nt](c[t][B][b][1]),q=g[0],R=g[1],E=nn[v]("iGG"+c[t][B][b][0]+"_"+c[t][B][b][1],nn[S](".row>*{padding:"+q*1+R+_+H*1+j+T+".row{margin:"+q*-1+R+d+H*-1+j+T+".row.uniform>*{padding:"+H*1+j+_+H*1+j+T+".row.uniform{margin:"+H*-1+j+d+H*-1+j+T+".row.\\32 00\\25>*{padding:"+q*2+R+_+H*2+j+T+".row.\\32 00\\25{margin:"+q*-2+R+d+H*-2+j+T+".row.uniform.\\32 00\\25>*{padding:"+H*2+j+_+H*2+j+T+".row.uniform.\\32 00\\25{margin:"+H*-2+j+d+H*-2+j+T+".row.\\31 50\\25>*{padding:"+q*1.5+R+_+H*1.5+j+T+".row.\\31 50\\25{margin:"+q*-1.5+R+d+H*-1.5+j+T+".row.uniform.\\31 50\\25>*{padding:"+H*1.5+j+_+H*1.5+j+T+".row.uniform.\\31 50\\25{margin:"+H*-1.5+j+d+H*-1.5+j+T+".row.\\35 0\\25>*{padding:"+q*.5+R+_+H*.5+j+T+".row.\\35 0\\25{margin:"+q*-0.5+R+d+H*-0.5+j+T+".row.uniform.\\35 0\\25>*{padding:"+H*.5+j+_+H*.5+j+T+".row.uniform.\\35 0\\25{margin:"+H*-0.5+j+d+H*-0.5+j+T+".row.\\32 5\\25>*{padding:"+q*.25+R+_+H*.25+j+T+".row.\\32 5\\25{margin:"+q*-0.25+R+d+H*-0.25+j+T+".row.uniform.\\32 5\\25>*{padding:"+H*.25+j+_+H*.25+j+T+".row.uniform.\\32 5\\25{margin:"+H*-0.25+j+d+H*-0.25+j+T+".row.\\30 \\25>*{padding:0}"+".row.\\30 \\25{margin:0 0 -1px 0}"),I,3)}c[r][W](E);if(c[t][B][ct]>1){k="igZ"+c[t][B][ct];if(!(E=nn[h](k))){A="";for(N=2;N<=c[t][B][ct];N++)A+=nn.css.gc("\\28 "+nn[L].k[N]+"\\29");E=nn[v](k,nn[S](A),I,3)}c[r][W](E)}c[t][B][At]&&(k="igC"+c[t][J],(E=nn[h](k))||(E=nn[v](k,nn[S](".row:not(.no-collapse)>*{width:100%!important;margin-left:0!important"+T),I,3)),c[r][W](E));if(!nn[pt]){k="iCd"+nn[i];if(!(E=nn[h](k))){A=[],O=[],nn[n](nn[e],function(e){nn[U](a,e)!==-1?A[W](".not-"+e):O[W](".only-"+e)});var z=(A[f]>0?A.join(",")+tt:"")+(O[f]>0?O.join(",")+tt:"");E=nn[v](k,nn[S](z[F](/\.([0-9])/,Yt)),I,3),c[r][W](E)}}nn[n](a,function(i){nn[e][a[i]][t][Gt]&&(k="ss"+a[i],(E=nn[h](k))||(E=nn[v](k,nn.newStyleSheet(nn[e][a[i]][t][Gt]),I,5)),c[r][W](E)),nn[e][a[i]][r][f]>0&&nn[n](nn[e][a[i]][r],function(t){c[r][W](nn[e][a[i]][r][t])})}),nn[C][s][nn[i]]&&(nn[n](nn[C][s][nn[i]],function(e){c[r][W](nn[C][s][nn[i]][e])}),nn[C][s][nn[i]]=[])}else c=nn[C][bt][nn[i]];nn.detachAllElements(c[r]),nn[ht](c[r]),nn[$](function(){nn[Ot](c)}),nn[w].state=nn[C][bt][nn[i]],nn[w][i]=nn[i],nn[ot](kt),nn[n](nn[e],function(e){nn[rt](e)?nn.wasActive(e)||nn[ot]("+"+e):nn.wasActive(e)&&nn[ot]("-"+e)})},getStateId:function(){if(nn[jt]&&nn[t].defaultState)return nn[t].defaultState;var r="";return nn[n](nn[e],function(t){nn[e][t].test()&&(r+=nn.sd+t)}),r},poll:function(){var e="";e=nn.getStateId(),e===""&&(e=nn.sd),e!==nn[i]&&(nn[pt]?nn.changeState(e):(nn[k][Pt][M]=nn[k][Pt][M][F](nn[i][x](1)[F](new RegExp(nn.sd,"g")," "),""),nn.changeState(e),nn[k][Pt][M]=nn[k][Pt][M]+" "+nn[i][x](1)[F](new RegExp(nn.sd,"g")," "),nn[k][Pt][M][it](0)==" "&&(nn[k][Pt][M]=nn[k][Pt][M][x](1))))},updateState:function(){var t,o,u,a,l=[];if(nn[i]==nn.sd)return;t=nn[i][x](1)[xt](nn.sd),nn[n](t,function(s){o=nn[e][t[s]];if(o[r][f]==0)return;nn[n](o[r],function(e){nn[C][bt][nn[i]][r][W](o[r][e]),l[W](o[r][e])})}),nn[C][s][nn[i]]&&(nn[n](nn[C][s][nn[i]],function(e){nn[C][bt][nn[i]][r][W](nn[C][s][nn[i]][e]),l[W](nn[C][s][nn[i]][e])}),nn[C][s][nn[i]]=[]),l[f]>0&&nn[ht](l)},newDiv:function(e){var t=document[g]("div");return t[zt]=e,t},newInline:function(e){var t;return t=document[g](Ht),t.type=gt,t[zt]=e,t},newMeta:function(e,t){var n=document[g]("meta");return n.name=e,n.content=t,n},newStyleSheet:function(e){var t=document[g]("link");return t.rel="stylesheet",t.type=gt,t[Gt]=e,t},initPlugin:function(e,n){typeof n==D&&nn[X](e[t],n),e.init&&e.init()},registerPlugin:function(e,t){if(!t)return u;nn[vt][e]=t,t._=this,t.register&&t.register()},init:function(e,r){nn.initConfig(e),nn.initElements(),nn.initEvents(),nn.poll(),r&&typeof r==D&&(nn[t][vt]=r),nn[n](nn[vt],function(e){nn.initPlugin(nn[vt][e],e in nn[t][vt]?nn[t][vt][e]:c)}),nn.isInit=y,nn[ot]("init")},initAPI:function(){var e,t,r=navigator.userAgent;nn[w][ut]=99,e="other",r[H](/Firefox/)?e="firefox":r[H](/Chrome/)?e="chrome":r[H](/Safari/)&&!r[H](/Chrome/)?e="safari":r[H](/(OPR|Opera)/)?e="opera":r[H](/MSIE ([0-9]+)/)?(e="ie",nn[w][ut]=RegExp.$1):r[H](/Trident\/.+rv:([0-9]+)/)&&(e="ie",nn[w][ut]=RegExp.$1),nn[w].browser=e,nn[w][O]="other",t={ios:"(iPad|iPhone|iPod)",android:"Android",mac:"Macintosh",wp:"Windows Phone",windows:"Windows NT"},nn[n](t,function(e){r[H](new RegExp(t[e],"g"))&&(nn[w][O]=e)});switch(nn[w][O]){case"ios":r[H](/([0-9_]+) like Mac OS X/),e=parseFloat(RegExp.$1[F]("_",".")[F]("_",""));break;case Zt:r[H](/Android ([0-9\.]+)/),e=parseFloat(RegExp.$1);break;case"mac":r[H](/Mac OS X ([0-9_]+)/),e=parseFloat(RegExp.$1[F]("_",".")[F]("_",""));break;case"wp":r[H](/IEMobile\/([0-9\.]+)/),e=parseFloat(RegExp.$1);break;case"windows":r[H](/Windows NT ([0-9\.]+)/),e=parseFloat(RegExp.$1);break;default:e=99}nn[w].deviceVersion=e,nn[w].isTouch=nn[w][O]=="wp"?navigator.msMaxTouchPoints>0:"ontouchstart"in window,nn[w].isMobile=nn[w][O]=="wp"||nn[w][O]==Zt||nn[w][O]=="ios",e=document.cookie[xt](";"),nn[n](e,function(t){var n=e[t][xt]("=");if(n[0][F](/^\s+|\s+$/g,"")==nn.lcn&&n[1][f]>0){nn[w][G]=n[1][xt]("_");return}})},initConfig:function(i){var s=[],o=[],c;if(!i||!(e in i))nn[pt]=y,nn[t][p].width="",nn[t][p].height="",nn[t][p].scalable=y;typeof i==D&&(i[e]&&(nn[t][e]={}),nn[X](nn[t],i)),B in nn[t]&&b in nn[t][B]&&!nn[P](nn[t][B][b])&&(nn[t][B][b]=[nn[t][B][b],nn[t][B][b]]),nn[X](nn[Q][m][B],nn[t][B]),nn[l]=Math.max(nn[l],nn[t][B][ct]),nn[X](nn[Q][m][p],nn[t][p]),nn[Q][m][J]=nn[t][J],nn[n](nn[t][e],function(n){var i,s={},u,a;nn[X](s,nn[t][e][n]),Gt in s||(s[Gt]=nn[Q][m][Gt]),Mt in s||(s[Mt]=nn[Q][m][Mt]),"range"in s&&(u=s.range,u=="*"?a="":u[it](0)=="-"?a="(max-width: "+parseInt(u[x](1))+"px)":u[it](u[f]-1)=="-"?a=Dt+parseInt(u[x](0,u[f]-1))+"px)":nn[U](u,"-")!=-1&&(u=u[xt]("-"),a=Dt+parseInt(u[0])+"px) and (max-width: "+parseInt(u[1])+"px)"),s[Mt]=a),B in s&&(b in s[B]&&!nn[P](s[B][b])&&(s[B][b]=[s[B][b],s[B][b]]),"zoom"in s[B]&&(s[B][ct]=s[B].zoom),ct in s[B]&&(nn[l]=Math.max(nn[l],s[B][ct]))),nn[t][e][n]=s,i={},nn[X](i,nn[Q].breakpoint),i[t]=nn[t][e][n],i.test=function(){return nn[V](s[Mt])},i[r]=[],nn[t].preload&&i[t][Gt]&&o[W](i[t][Gt]),nn[e][n]=i,nn.breakpointList[W](n)});if(nn[l]>1||nn[pt])for(c=2;c<=nn[l];c++)nn[L].k[c]=nn[L].v[c]=c;else nn[n](nn[t][e],function(n){var r=nn[t][e][n];nn[l]++,B in r||(r[B]={}),r[B][ct]=nn[l],nn[L].k[nn[l]]=n,nn[L].v[n]=nn[l]});nn[n](nn[t][ft],function(e){nn.on(e,nn[t][ft][e])}),o[f]>0&&window[Ct].protocol!="file:"&&nn[$](function(){var e,t=document[a](I)[0],r=new XMLHttpRequest;nn[n](o,function(e){r.open("GET",o[e],u),r.send("")})})},initElements:function(){var e=[];e[W](nn[q]("mV",nn.newMeta(p,wt),et,1));switch(nn[t].reset){case"full":e[W](nn[q]("iR",nn[S](nn.css.r),et,2));break;case Lt:e[W](nn[q]("iN",nn[S](nn.css.n),et,2))}e[W](nn[q]("iBM",nn[S](nn.css.bm),et,1)),e[W](nn[q]("iG",nn[S]('.row{border-bottom:solid 1px transparent}.row>*{float:left}.row:after,.row:before{content:"";display:block;clear:both;height:0}.row.uniform>*>:first-child{margin-top:0}.row.uniform>*>:last-child{margin-bottom:0}'+nn.css.gc("")),I,3)),nn[ht](e)},initEvents:function(){var e;!nn[t].pollOnce&&!nn[pt]&&(nn.on(Tt,function(){nn.poll()}),nn.on(A,function(){nn.poll()})),nn[w][O]=="ios"&&nn[$](function(){nn.on(A,function(){var e=document[a]("input");nn[n](e,function(t){e[t][Ft]=e[t][lt],e[t][lt]=""}),window.setTimeout(function(){nn[n](e,function(t){e[t][lt]=e[t][Ft]})},100)})}),nn[$](function(){nn[ot]("ready")}),window[Kt]&&nn.on(Tt,window[Kt]),window[Kt]=function(){nn[ot](Tt)},window[K]&&nn.on(A,window[K]),window[K]=function(){nn[ot](A)}},initUtilityMethods:function(){document[Z]?!function(e,t){nn[$]=t()}(Jt,function(){function e(e){s=1;while(e=t.shift())e()}var t=[],n,r=document,i=mt,s=/^loaded|^c/.test(r[en]);return r[Z](i,n=function(){r[St](i,n),e()}),function(e){s?e():t[W](e)}}):!function(e,t){nn[$]=t()}(Jt,function(e){function t(e){p=1;while(e=n.shift())e()}var n=[],r,i=!1,s=document,o=s[at],u=o.doScroll,a=mt,f=Z,l="onreadystatechange",c=en,h=u?/^loaded|^c/:/^loaded|c/,p=h.test(s[c]);return s[f]&&s[f](a,r=function(){s[St](a,r,i),t()},i),u&&s.attachEvent(l,r=function(){/^c/.test(s[c])&&(s.detachEvent(l,r),t())}),e=u?function(t){self!=top?p?t():n[W](t):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){e(t)},50)}t()}()}:function(e){p?e():n[W](e)}}),document[o]?nn[o]=function(e){return document[o](e)}:nn[o]=function(e){var t=document;return t[It]?t[It](("."+e[F](" "," ."))[F](/\.([0-9])/,Yt)):[]},Array[Wt][U]?nn[U]=function(e,t){return e[U](t)}:nn[U]=function(e,t){if(typeof e=="string")return e[U](t);var n,r=t?t:0,i;if(!this)throw new TypeError;i=this[f];if(i===0||r>=i)return-1;r<0&&(r=i-Math.abs(r));for(n=r;ns[Xt]||s[qt]!==c&&ls[Rt]?u:y})},preInit:function(){var e=document[a]("script");nn.me=e[e[f]-1],nn.initUtilityMethods(),nn.initAPI(),nn[st](Pt,document[a](Pt)[0]),nn[st](I,document[a](I)[0]),nn[$](function(){nn[st]("body",document[a]("body")[0])}),nn[w].browser=="ie"&&nn[w][ut]>=10&&nn[dt](nn[q]("msie-viewport-fix",nn[S]("@-ms-viewport{width:device-width}"),et,1))}};return nn.preInit(),nn[w][ut]<9&&(nn[Ot]=function(e){},nn[S]=function(e){var t;return t=document[g]("span"),t[zt]=' ",t}),nn}();(function(e,t){typeof define=="function"&&define.amd?define([],t):typeof exports=="object"?module.exports=t():e.skel=t()})(this,function(){return skel}); \ No newline at end of file diff --git a/old_chef_blog/jerryaldrichiii.github.io/keybase.txt b/old_chef_blog/jerryaldrichiii.github.io/keybase.txt new file mode 100644 index 0000000..4fc39cb --- /dev/null +++ b/old_chef_blog/jerryaldrichiii.github.io/keybase.txt @@ -0,0 +1,54 @@ +https://keybase.io/jerryaldrichiii +-------------------------------------------------------------------- + +I hereby claim: + + * I am an admin of https://blog.jerryaldrichiii.com + * I am jerryaldrichiii (https://keybase.io/jerryaldrichiii) on keybase. + * I have a public key ASAqhswziUx4wrflStNJPou4gm9MF3Ncn1dzXTnqnvPm8wo + +To do so, I am signing this object: + +{ + "body": { + "key": { + "eldest_kid": "01202a86cc33894c78c2b7e54ad3493e8bb8826f4c17735c9f57735d39ea9ef3e6f30a", + "host": "keybase.io", + "kid": "01202a86cc33894c78c2b7e54ad3493e8bb8826f4c17735c9f57735d39ea9ef3e6f30a", + "uid": "ab4ddccccb4adb3636563d624d51b919", + "username": "jerryaldrichiii" + }, + "merkle_root": { + "ctime": 1530142050, + "hash": "b287698ba23067f5398f43c5d2efd466e849dd17e89f78f59d15e49ee2566fc223212cb10358caf216f6723b2a7f359ddfb8f2f8d8e269e5f46c14c884eabd3a", + "hash_meta": "56305d696f0a85fce2832f117159d69c15c3e1a80920ea87cea08be0d86e5a87", + "seqno": 3161193 + }, + "service": { + "entropy": "R4GvOGFCj9d3MxiFU2sl0daF", + "hostname": "blog.jerryaldrichiii.com", + "protocol": "https:" + }, + "type": "web_service_binding", + "version": 2 + }, + "client": { + "name": "keybase.io go client", + "version": "2.3.0" + }, + "ctime": 1530141992, + "expire_in": 504576000, + "prev": "20b7348c7e28729900cda0d8effa5c7ecca6a0d10d52b558af7861f1fd71265d", + "seqno": 29, + "tag": "signature" +} + +which yields the signature: + +hKRib2R5hqhkZXRhY2hlZMOpaGFzaF90eXBlCqNrZXnEIwEgKobMM4lMeMK35UrTST6LuIJvTBdzXJ9Xc1056p7z5vMKp3BheWxvYWTESpcCHcQgILc0jH4ocpkAzaDY7/pcfsymoNENUrVYr3hh8f1xJl3EILapsi8MyJ5Qf/IAmGE2NHJUD7sLmOKPjEqYJeEK4v1dAgHCo3NpZ8RAFfP9rT32aM75KUxseuTyZHNFB1KzFuuV63ZAAbr+AQBSZBrlr0PjjtBYcFTx6+JZexUs6voN8zHSB3EZyYZeCahzaWdfdHlwZSCkaGFzaIKkdHlwZQildmFsdWXEIOPos2ZitGL0JAED901FsFE7Yuvb9xujcbeingU2j4vmo3RhZ80CAqd2ZXJzaW9uAQ== + +And finally, I am proving ownership of this host by posting or +appending to this document. + +View my publicly-auditable identity here: https://keybase.io/jerryaldrichiii +