From d9a2890f05d191044668088f9e657de32ddeb5a3 Mon Sep 17 00:00:00 2001 From: Dragan Djuric Date: Sun, 19 May 2013 20:52:20 +0200 Subject: [PATCH 01/67] Empty pages for Fluokitten. --- index.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 index.html diff --git a/index.html b/index.html new file mode 100644 index 0000000..557db03 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +Hello World From 7c66cb5295211cb2812d23687535de2b08c038dc Mon Sep 17 00:00:00 2001 From: Dragan Djuric Date: Tue, 21 May 2013 16:23:15 +0200 Subject: [PATCH 02/67] Initial template. --- .gitignore | 13 + .ruby-version | 1 + Gemfile | 9 + README.md | 28 + _config.yml | 9 + _layouts/article.html | 67 ++ _layouts/default.html | 65 + _plugins/sitemap_generator.rb | 308 +++++ articles/community.md | 36 + articles/getting_started.md | 6 + articles/guides.md | 40 + assets/javascripts/jquery-1.9.1.min.js | 5 + assets/javascripts/toc.js | 46 + assets/stylesheets/bootstrap-docs.css | 1067 +++++++++++++++++ .../stylesheets/bootstrap-responsive.min.css | 9 + assets/stylesheets/bootstrap.min.css | 9 + assets/stylesheets/pygments.css | 61 + assets/stylesheets/sass/mixins.sass | 216 ++++ assets/stylesheets/sass/styles.css | 140 +++ assets/stylesheets/sass/styles.sass | 127 ++ index.html | 1 - 21 files changed, 2262 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 README.md create mode 100644 _config.yml create mode 100644 _layouts/article.html create mode 100644 _layouts/default.html create mode 100644 _plugins/sitemap_generator.rb create mode 100644 articles/community.md create mode 100644 articles/getting_started.md create mode 100644 articles/guides.md create mode 100644 assets/javascripts/jquery-1.9.1.min.js create mode 100644 assets/javascripts/toc.js create mode 100644 assets/stylesheets/bootstrap-docs.css create mode 100644 assets/stylesheets/bootstrap-responsive.min.css create mode 100644 assets/stylesheets/bootstrap.min.css create mode 100644 assets/stylesheets/pygments.css create mode 100644 assets/stylesheets/sass/mixins.sass create mode 100644 assets/stylesheets/sass/styles.css create mode 100644 assets/stylesheets/sass/styles.sass delete mode 100644 index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0e79b1a --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +.bundle +.DS_Store +.rvmrc +_site +bin +source/tmp/* +_site/* +.sass-cache/* +*.sassc +*\#* +~* +_source/* +_cache \ No newline at end of file diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..6ea7a22 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.0@docs diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..784a5e3 --- /dev/null +++ b/Gemfile @@ -0,0 +1,9 @@ +source "https://rubygems.org" + +gem "jekyll", ">= 1.0.0.rc1" +gem "redcarpet" +# with Ruby 2.0 on OS X, you may need to install +# it manually with --with-iconv-dir: +# +# gem install iconv -- --with-iconv-dir=~/.rvm/usr +gem "iconv" diff --git a/README.md b/README.md new file mode 100644 index 0000000..233bf70 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# Project Name Documentation + +This is a documentation site for [Project Name](). Copy or clone me and adapt for your project +that needs documentation guides similar to [rubyamqp.info](http://rubyamqp.info), [clojuremongodb.info](http://clojuremongodb.info) and so on. + + +## Install Dependencies + +With Bundler: + + bundle install --binstubs + +## How to run a development server + + ./bin/jekyll serve --watch + +then navigate to [localhost:4000](http://localhost:4000) + +## How to regenerate the site + + ./bin/jekyll build + + +## License & Copyright + +Copyright (C) 2013 Alexander Petrov, Michael S. Klishin. + +Distributed under the Eclipse Public License, the same as Clojure. diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..cc1fe5d --- /dev/null +++ b/_config.yml @@ -0,0 +1,9 @@ +source: . +destination: ./_site +plugins: ./_plugins +exclude: [bin, CNAME, Gemfile, Gemfile.lock, README.md] +permalink: /:title +pygments: true +markdown: redcarpet +redcarpet: + extensions: ["no_intra_emphasis", "fenced_code_blocks", "autolink", "tables", "with_toc_data"] diff --git a/_layouts/article.html b/_layouts/article.html new file mode 100644 index 0000000..e4725fd --- /dev/null +++ b/_layouts/article.html @@ -0,0 +1,67 @@ + + + + {{page.title}} + + + + + + + + + + + + + + + +
+
+
+ +
+
+ {{ content }} +
+
+
+ + + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..6d94279 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,65 @@ + + + + + {{page.title}} + + + + + + + + + + + + + + + + + +
+ {{ content }} +
+ + + diff --git a/_plugins/sitemap_generator.rb b/_plugins/sitemap_generator.rb new file mode 100644 index 0000000..51da8d3 --- /dev/null +++ b/_plugins/sitemap_generator.rb @@ -0,0 +1,308 @@ +# Sitemap.xml Generator is a Jekyll plugin that generates a sitemap.xml file by +# traversing all of the available posts and pages. +# +# How To Use: +# 1.) Copy source file into your _plugins folder within your Jekyll project. +# 2.) Change MY_URL to reflect your domain name. +# 3.) Change SITEMAP_FILE_NAME if you want your sitemap to be called something +# other than sitemap.xml. +# 4.) Change the PAGES_INCLUDE_POSTS list to include any pages that are looping +# through your posts (e.g. "index.html", "archive.html", etc.). This will +# ensure that right after you make a new post, the last modified date will +# be updated to reflect the new post. +# 5.) Run Jekyll: jekyll --server to re-generate your site. +# 6.) A sitemap.xml should be included in your _site folder. +# +# Customizations: +# 1.) If there are any files you don't want included in the sitemap, add them +# to the EXCLUDED_FILES list. The name should match the name of the source +# file. +# 2.) If you want to include the optional changefreq and priority attributes, +# simply include custom variables in the YAML Front Matter of that file. +# The names of these custom variables are defined below in the +# CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME and PRIORITY_CUSTOM_VARIABLE_NAME +# constants. +# +# Notes: +# 1.) The last modified date is determined by the latest from the following: +# system modified date of the page or post, system modified date of +# included layout, system modified date of included layout within that +# layout, ... +# +# Author: Michael Levin +# Site: http://www.kinnetica.com +# Distributed Under A Creative Commons License +# - http://creativecommons.org/licenses/by/3.0/ + +require 'rexml/document' + +module Jekyll + + # Change MY_URL to reflect the site you are using + MY_URL = "http://PROJECT.clojurewerkz.org" + + # Change SITEMAP_FILE_NAME if you would like your sitemap file + # to be called something else + SITEMAP_FILE_NAME = "sitemap.xml" + + # Any files to exclude from being included in the sitemap.xml + EXCLUDED_FILES = ["atom.xml", "deploy.sh"] + + # Any files that include posts, so that when a new post is added, the last + # modified date of these pages should take that into account + PAGES_INCLUDE_POSTS = ["index.html"] + + # Custom variable names for changefreq and priority elements + # These names are used within the YAML Front Matter of pages or posts + # for which you want to include these properties + CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME = "change_frequency" + PRIORITY_CUSTOM_VARIABLE_NAME = "priority" + + class Post + attr_accessor :name + + def full_path_to_source + File.join(@base, @name) + end + + def location_on_server + "#{MY_URL}#{url}" + end + end + + class Page + attr_accessor :name + + def full_path_to_source + File.join(@base, @dir, @name) + end + + def location_on_server + location = "#{MY_URL}#{@dir}#{url}" + location.gsub(/index.html$/, "") + end + end + + class Layout + def full_path_to_source + File.join(@base, @name) + end + end + + # Recover from strange exception when starting server without --auto + class SitemapFile < StaticFile + def write(dest) + begin + super(dest) + rescue + end + + true + end + end + + class SitemapGenerator < Generator + + # Valid values allowed by sitemap.xml spec for change frequencies + VALID_CHANGE_FREQUENCY_VALUES = ["always", "hourly", "daily", "weekly", + "monthly", "yearly", "never"] + + # Goes through pages and posts and generates sitemap.xml file + # + # Returns nothing + def generate(site) + sitemap = REXML::Document.new << REXML::XMLDecl.new("1.0", "UTF-8") + + urlset = REXML::Element.new "urlset" + urlset.add_attribute("xmlns", + "http://www.sitemaps.org/schemas/sitemap/0.9") + + @last_modified_post_date = fill_posts(site, urlset) + fill_pages(site, urlset) + + sitemap.add_element(urlset) + + # File I/O: create sitemap.xml file and write out pretty-printed XML + file = File.new(File.join(site.dest, SITEMAP_FILE_NAME), "w") + formatter = REXML::Formatters::Pretty.new(4) + formatter.compact = true + formatter.write(sitemap, file) + file.close + + # Keep the sitemap.xml file from being cleaned by Jekyll + site.static_files << Jekyll::SitemapFile.new(site, site.dest, "/", SITEMAP_FILE_NAME) + end + + # Create url elements for all the posts and find the date of the latest one + # + # Returns last_modified_date of latest post + def fill_posts(site, urlset) + last_modified_date = nil + site.posts.each do |post| + if !excluded?(post.name) + url = fill_url(site, post) + urlset.add_element(url) + end + + path = post.full_path_to_source + date = File.mtime(path) + last_modified_date = date if last_modified_date == nil or date > last_modified_date + end + + last_modified_date + end + + # Create url elements for all the normal pages and find the date of the + # index to use with the pagination pages + # + # Returns last_modified_date of index page + def fill_pages(site, urlset) + site.pages.each do |page| + if !excluded?(page.name) + path = page.full_path_to_source + if File.exists?(path) + url = fill_url(site, page) + urlset.add_element(url) + end + end + end + end + + # Fill data of each URL element: location, last modified, + # change frequency (optional), and priority. + # + # Returns url REXML::Element + def fill_url(site, page_or_post) + url = REXML::Element.new "url" + + loc = fill_location(page_or_post) + url.add_element(loc) + + lastmod = fill_last_modified(site, page_or_post) + url.add_element(lastmod) if lastmod + + if (page_or_post.data[CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME]) + change_frequency = + page_or_post.data[CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME].downcase + + if (valid_change_frequency?(change_frequency)) + changefreq = REXML::Element.new "changefreq" + changefreq.text = change_frequency + url.add_element(changefreq) + else + puts "ERROR: Invalid Change Frequency In #{page_or_post.name}" + end + end + + if (page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME]) + priority_value = page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME] + if valid_priority?(priority_value) + priority = REXML::Element.new "priority" + priority.text = page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME] + url.add_element(priority) + else + puts "ERROR: Invalid Priority In #{page_or_post.name}" + end + end + + url + end + + # Get URL location of page or post + # + # Returns the location of the page or post + def fill_location(page_or_post) + loc = REXML::Element.new "loc" + loc.text = page_or_post.location_on_server + + loc + end + + # Fill lastmod XML element with the last modified date for the page or post. + # + # Returns lastmod REXML::Element or nil + def fill_last_modified(site, page_or_post) + path = page_or_post.full_path_to_source + + lastmod = REXML::Element.new "lastmod" + date = File.mtime(path) + latest_date = find_latest_date(date, site, page_or_post) + + if @last_modified_post_date == nil + # This is a post + lastmod.text = latest_date.iso8601 + else + # This is a page + if posts_included?(page_or_post.name) + # We want to take into account the last post date + final_date = greater_date(latest_date, @last_modified_post_date) + lastmod.text = final_date.iso8601 + else + lastmod.text = latest_date.iso8601 + end + end + lastmod + end + + # Go through the page/post and any implemented layouts and get the latest + # modified date + # + # Returns formatted output of latest date of page/post and any used layouts + def find_latest_date(latest_date, site, page_or_post) + layouts = site.layouts + layout = layouts[page_or_post.data["layout"]] + while layout + path = layout.full_path_to_source + date = File.mtime(path) + + latest_date = date if (date > latest_date) + + layout = layouts[layout.data["layout"]] + end + + latest_date + end + + # Which of the two dates is later + # + # Returns latest of two dates + def greater_date(date1, date2) + if (date1 >= date2) + date1 + else + date2 + end + end + + # Is the page or post listed as something we want to exclude? + # + # Returns boolean + def excluded?(name) + EXCLUDED_FILES.include? name + end + + def posts_included?(name) + PAGES_INCLUDE_POSTS.include? name + end + + # Is the change frequency value provided valid according to the spec + # + # Returns boolean + def valid_change_frequency?(change_frequency) + VALID_CHANGE_FREQUENCY_VALUES.include? change_frequency + end + + # Is the priority value provided valid according to the spec + # + # Returns boolean + def valid_priority?(priority) + begin + priority_val = Float(priority) + return true if priority_val >= 0.0 and priority_val <= 1.0 + rescue ArgumentError + end + + false + end + end +end diff --git a/articles/community.md b/articles/community.md new file mode 100644 index 0000000..c8ba91d --- /dev/null +++ b/articles/community.md @@ -0,0 +1,36 @@ +--- +title: "Project Name: Community" +layout: article +--- + +## Mailing List + +[Project has a mailing list](). Feel free to join it and ask any questions you may have. + + +## News & Announcements on Twitter + +To subscribe for announcements of releases, important changes and so on, please follow [@ClojureWerkz](https://twitter.com/#!/clojurewerkz) on Twitter. + + +## What is ClojureWerkz? + +Project Name is part of the group of libraries known as ClojureWerkz, together with +[Monger](http://clojuremongodb.info), [Welle](http://clojureriak.info), [Quartzite](http://clojurequartz.info), [Neocons](https://github.com/michaelklishin/neocons), [Langohr](https://github.com/michaelklishin/langohr), [Elastisch](https://github.com/clojurewerkz/elastisch) and several others. + + +## Reporting Issues + +If you find a bug, poor default, missing feature or find any part of the API inconvenient, please [file an issue](github.com/.../issues) on Github. +If possible, try to explain what behavior you expected and why. Bonus points for contributing failing test cases. + + +## Contributing + +Project Name uses [Leiningen 2](https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md). Make sure you have it installed and then run tests against +supported Clojure versions using + + lein2 all test + +Then create a branch and make your changes on it. Once you are done with your changes and all tests pass, submit a pull request +on Github. diff --git a/articles/getting_started.md b/articles/getting_started.md new file mode 100644 index 0000000..f12a5d9 --- /dev/null +++ b/articles/getting_started.md @@ -0,0 +1,6 @@ +--- +title: "Getting Started" +layout: article +--- + +## This is a getting started guide diff --git a/articles/guides.md b/articles/guides.md new file mode 100644 index 0000000..3987090 --- /dev/null +++ b/articles/guides.md @@ -0,0 +1,40 @@ +--- +title: "Project Name: all documentation guides" +layout: article +--- + +## Guide list + +[Project Name documentation](https://github.com/clojurewerkz/) is organized as a number of guides, covering all kinds of topics. + +We recommend that you read these guides, if possible, in this order: + + +### [Getting started](/articles/getting_started.html) + +An overview of Project Name with a quick tutorial that helps you to get started with it. It should take about +10 minutes to read and study the provided code examples + +### [Another Guide](/) + +This guide covers: + + * This thing + * That thing + * This other thing + + +### [Yet another guide](/) + +This guide covers: + + * This awesome feature + * That common problem + * How to reach Web Scale + + +## Tell Us What You Think! + +Please take a moment to tell us what you think about this guide on Twitter or the [Project Name mailing list](/) + +Let us know what was unclear or what has not been covered. Maybe you do not like the guide style or grammar or discover spelling mistakes. Reader feedback is key to making the documentation better. diff --git a/assets/javascripts/jquery-1.9.1.min.js b/assets/javascripts/jquery-1.9.1.min.js new file mode 100644 index 0000000..006e953 --- /dev/null +++ b/assets/javascripts/jquery-1.9.1.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b(" + +
  • + +
  • + +
  • + +
  • + + +

    This website was developed by +  Dragan Djuric.

    +

    Copyright © 2013-2016 Dragan Djuric

    + + + diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..adbbd54 --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,26 @@ + + {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} + + + + + + + + + + + + + + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..6b81d51 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,33 @@ + diff --git a/_includes/scripts.html b/_includes/scripts.html new file mode 100644 index 0000000..28c11a1 --- /dev/null +++ b/_includes/scripts.html @@ -0,0 +1,21 @@ + + + + + + diff --git a/_layouts/article.html b/_layouts/article.html index c45f00a..97ed45e 100644 --- a/_layouts/article.html +++ b/_layouts/article.html @@ -1,94 +1,35 @@ - - - - {{page.title}} - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -
    -
    - - Are you a native English speaker? Please help us improve this page. Clone the source code of this website, make your changes, and issue a pull request on GitHub or, if you prefer, simply send us the changes in plain text files. -
    - {{ content }} -
    -
    -
    -

    This website was developed by -  Uncomplicate.

    -

    Copyright © 2013 Dragan Djuric

    -

    Follow us on Twitter for the announcements: -  Uncomplicate

    -
    - - diff --git a/_layouts/default.html b/_layouts/default.html index 604d729..74d11be 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,87 +1,22 @@ - + + - - - {{page.title}} - - - - - - - - - - - - - - - - - - - -
    - {{ content }} -
    -
    -

    This website was developed by -  Uncomplicate.

    -

    Copyright © 2013 Dragan Djuric

    -

    Follow us on Twitter for the announcements: -  Uncomplicate

    + + + {% include header.html %} + +
    + Source on Github +
    + {{ content }} +
    -
    - + + {% include footer.html %} + + + + {% include scripts.html %} diff --git a/articles/clojure_core_extensions.md b/articles/clojure_core_extensions.md index c6597ba..d57bb53 100644 --- a/articles/clojure_core_extensions.md +++ b/articles/clojure_core_extensions.md @@ -3,8 +3,6 @@ title: "Fluokitten Extensions of Clojure Core" layout: article --- -# Fluokitten Extensions of Clojure Core - This article is a guide to using Clojure core artifacts as implementations of Fluokitten protocols. By requiring `org.uncomplicate.fluokitten.jvm` namespace in your namespace, you activate Fluokitten's extensions to Clojure core types so they can act as functors, applicatives, monads etc. To be able to follow this article, you'll have to have Clojure installed and Fluokitten library included as a dependency in your project, as described in [Getting Started Guide](/articles/getting_started.html). Obviously, you'll need a reasonable knowledge of Clojure (you don't have to be an expert, though). So, after checking out [Getting Started Guide](/articles/getting_started.html), start up Clojure REPL and open this article and we are ready to go. @@ -18,7 +16,7 @@ Generally, any data structure can be considered as a specific context that can h ### Functor -`fmap` behaves in the same way as `map` for most data structures, but takes care that the resulting data structure is of the same type as the first argument after the function. You have to provide as many additional arguments as the function support. +`fmap` behaves in the same way as `map` for most data structures, but takes care that the resulting data structure is of the same type as the first argument after the function. The number of arguments that the function can accept have to match the number of functors. ```clojure (fmap inc []) @@ -102,12 +100,15 @@ Finally, Clojure's [reducibles](http://clojure.com/blog/2012/05/15/anatomy-of-re ### Applicative -For most core structures, `pure` produces a collection of the required type, with the supplied value as its only element: +For most core structures, `pure` produces a collection of the required type, with the supplied value(s) as its element(s): ```clojure (pure [4 5] 1) ;=> [1] +(pure [4 5] 1 2 3) +;=> [1 2 3] + (pure (list) 1) ;=> (list 1) @@ -129,6 +130,14 @@ For maps and map entries, `pure` uses nil to generate the default key for the pu (pure (first {1 1}) 1) ;=> (first {nil 1}) + +``` + +If you provide enough elements to pure, it will put them in the appropriate structure. + +``` clojure +(pure {} 1 2 3 4) +;=> {1 2 3 4} ``` `pure` handles Clojure [reducibles](http://clojure.com/blog/2012/05/15/anatomy-of-reducer.html): @@ -151,7 +160,7 @@ We can establish an implicit context with the `utils/with-context macro`, and us ``` -`fapply` is pretty straightforward for most structures (except for maps and map entries, where it has a more complex behavior). It expect two structures of the same type as arguments: a function(s) structure and a data structure. Then it applies the functions to the data. The actual matching of the functions and the data depends on the data structure. For most core structures, it applies all combinations of functions and data: +`fapply` is pretty straightforward for most structures, except for maps and map entries, where it has a more complex behavior. It expect two structures of the same type as arguments: a function(s) structure and a data structure. Then it applies the functions to the data. The actual matching of the functions and the data depends on the data structure. For most core structures, it applies all combinations of functions and data: ```clojure (fapply [] []) @@ -266,7 +275,7 @@ In the case of maps and map entries, it matches the functions and the data by ma ### Monad -Similarily to the previous examples, `bind` behaves in a straightforward way for most core data structures, except maps and map entries that are a bit specific. It requires one or more data structures, and a function as the last parameter. That function should accept elements extracted from all provided data structures (one by one), and wrap the result(s) in the same type of structure. +Similarly to the previous examples, `bind` works as expected for most core data structures, except maps and map entries that are a bit specific. It requires one or more data structures, and a function as the last parameter. That function should accept elements extracted from all provided data structures (one by one), and wrap the result(s) in the same type of structure. The bind function is automatically and transparently aware of the implicit context, so we can use `return` or `unit` to create agnostic monadic functions that can be applied to any monad. In the following example, the `increment` and `add` functions' results will be packaged in appropriate contexts transparently. Here are typical examples of sequences and friends: @@ -451,7 +460,7 @@ The `join` function flattens one nesting level of the the data structure if it c ### Foldable -The `fold` function aggregates the content of the core data structures into one value. All elements in the data structure must belong to the same monoid, i.e. they have the same type that implements Monoid protocol, or of types compatible with the first element's type for the Magma's `op` function. +The `fold` function aggregates the content of the core data structures into one value. All elements in the data structure must belong to the same monoid, i.e. they have the same type that implements Monoid protocol, or of types compatible with the first element's type for the Magma's `op` function. It is similar to Clojure's reduce, but does not require the reduction function (since Monoid's `op` is used). ```clojure (fold [1 2 3 4 5 6]) @@ -476,6 +485,56 @@ The `fold` function aggregates the content of the core data structures into one ;=> 1 ``` +The `fold` function does not have to use `op` for folding (reducing). If you supply the function and an init value, it works as you'd expect from `reduce`. + +``` clojure +(fold + 3 [1 2 3]) +;=> 9 +``` + +`fold` can handle multiple foldable data structures. In that case, it works as Clojure's `reduce` on steroids - the folding (reduction) function is applied to the result of applying `op` to the corresponding elements of supplied collections. + + +``` clojure + (fold + 0 [1 2 3] [4 5 6]) + ;=> 21 + + (fold * 1 [1 2 3] [4 5 6]) + ;=> 315 + + (fold * 2 [1 2 3] [4 5 6] [7 8 9] [1 2 1] [3 2 1]) + ;=> 12160 +``` + +Sometimes the collection(s) that we would like to fold hold elements that are not Magmas - they do not have `op`. In that case, we can fold them with `foldmap`, which is a variant of `fold` that accept an additional function, which is applied to the elements of the collection being folded before folding. Of course, foldmap is useful even when elements have `op` - when we need to use some alternative function instead of `op`. + +``` clojure +(foldmap str [1 2 3 4 5 6]) +;=> "123456" + + (foldmap (fn [^String s] (.toUpperCase s)) + (list "a" "b" "c")) + ;=> "ABC" + + (foldmap str (seq [:a :b :c])) + ;=> ":a:b:c" + + (foldmap str {:a 1 :b 2 :c 3}) + ;=> "123" + + (foldmap str (first {:a 1})) + ;=> "1" + + (foldmap + 3 inc [1 2 3]) + ;=> 12 + + (foldmap * 5 / [1 2 3] [4 5 6]) + ;=> 1/4 + + (foldmap * 2 / [1 2 3] [4 5 6] [7 8 9] [1 2 1] [3 2 1]) + ;=> 1/60480 +``` + ## Objects Each Java object is a trivial implementation of `Functor` and `Foldable`, where the object is its own trivial context, unless there is a more specific implementation. @@ -620,7 +679,9 @@ Numbers are functors, magmas, monoids and foldables. ## Functions -In Haskell, functions are functors, monads, and many other categorical types. However, with Clojure functions, there is one big caveat: ordinary Clojure functions are not automatically [curried](http://en.wikipedia.org/wiki/Currying), so the well known implementations of most categorical types, when translated to Clojure, do not obey the necessary laws that monads, applicatives, etc. have to observe. Fortunately, Fluokitten provides the `curried` function that creates a curried version of any Clojure function. Such curried functions implement all categorical protocols, while plain Clojure functions implement only some, which will be noted explicitly in the following text. +In Haskell, functions are functors, monads, and many other categorical types. However, with Clojure functions, there is one big caveat: ordinary Clojure functions are not automatically [curried](http://en.wikipedia.org/wiki/Currying), so the well known implementations of most categorical types, when translated to Clojure, do not obey all laws that monads, applicatives, etc. have to observe. Fortunately, Fluokitten provides the `curry` function that creates a curried version of any Clojure function. + +While both ordinary Clojure functions and those curried by `curry` implement Fluokitten protocols, and can be used with all appropriate functions from Fluokitten core, only curried functions satisfy all appropriate laws. Most of the time, you can use fluokitten on ordinary functions regardless. However, be warned that those are not "kosher" and "halal" from the point of view of Haskellers, and may not be able to give the full benefit of "monadic" programming. The most obvious case would be if you translate examples that rely on Haskell's currying. ### Functor @@ -631,6 +692,13 @@ Both plain and curried functions implement the `Functor` protocol. `fmap` compos ;=> ((comp inc +) 1 2 3) ``` +What's more, when used with multiple arguments, fmap offers a more advanced composition unavailable in Clojure: + +``` clojure +((fmap + * /) 1 2 3) +;=> (+ (* 1 2 3) (/ 1 2 3)) +``` + Curried functions work in the following way, compared to plain functions: ```clojure @@ -641,7 +709,7 @@ Curried functions work in the following way, compared to plain functions: ;=> a curried inc function ``` -In the following example, we create two functions by using `fmap`. `inc+` is a plain Clojure function created by appling the `inc` function to the result of applying the `+` function, in context. It first sums its arguments and then increments the sum. `cinc+` does the same thing, but if called with insufficient number of arguments (two in this example, may be created with any arity) it fixes the provided arguments and creates a new curried function that expects the missing ones. This is in contrast with the plain function, which either accepts any number of arguments, or throws a Clojure compiler exception if called with less than minimal number of arguments. +In the following example, we create two functions by using `fmap`. `inc+` is a plain Clojure function created by applying the `inc` function to the result of applying the `+` function, in context. It first sums its arguments and then increments the sum. `cinc+` does the same thing, but if called with insufficient number of arguments (two in this example, may be created with any arity) it fixes the provided arguments and creates a new curried function that expects the missing ones. This is in contrast with the plain function, which either accepts any number of arguments, or throws a Clojure compiler exception if called with less than minimal number of arguments. ```clojure (let [inc+ (fmap inc +) @@ -684,9 +752,26 @@ Called with multiple arguments, `fmap` creates appropriate compositions, dependi ### Applicative -Plain functions are not applicative functors, but curried functions are. The behavior is a bit tricky to understand, so we give a simple example that is clear once you understand how `fapply` works with (curried) functions, but if this is the first time you are reading about this, we recommend that you check out a chapter 11 from [Learn You a Haskell for Great Good](/articles/learnyouahaskell.html), which is dedicated to this topic. + +`pure` creates a function that ignores its arguments and returns the content of its context. ```clojure + +(((pure identity inc)) 1) +;=> 2 + +((pure curried c+) 13 2) +;=> c+ + +``` + +The behavior of funciton as Applicatives is a bit tricky to understand, so we give a simple example that is clear once you understand how `fapply` works with (curried) functions, but if this is the first time you are reading about this, we recommend that you check out a chapter 11 from [Learn You a Haskell for Great Good](/articles/learnyouahaskell.html), which is dedicated to this topic. + +```clojure + +((<*> (pure identity inc) (pure identity 1))) +;=> 2 + (((pure curried inc) 100) 1) ;=> 2 @@ -697,16 +782,9 @@ Plain functions are not applicative functors, but curried functions are. The beh ;=> 609 ``` -`pure` creates a function that ignores its arguments and returns the content of its context. - -```clojure -((pure curried c+) 13 2) -;=> c+ -``` - ### Monad -Plain functions are not monads, but curried functions are. As in the case of applicatives, the behavior of bind, you need some experience to understand how it works with (curried) functions, so we recommend that you check out [Learn You a Haskell for Great Good](/articles/learnyouahaskell.html), and just give an example here for the reference. +As in the case of applicatives, the behavior of bind, you need some experience to understand how it works with (curried) functions, so we recommend that you check out [Learn You a Haskell for Great Good](/articles/learnyouahaskell.html), and just give an example here for the reference. ```clojure ((bind (curry +) (curry *)) 3 4) @@ -715,7 +793,7 @@ Plain functions are not monads, but curried functions are. As in the case of app ### Magma -Both plain and curried functions are magmas - `op` composes its arguments, just as fmap does. +Both plain and curried functions are magmas - `op` composes its arguments. ### Monoid @@ -727,11 +805,13 @@ Plain functions are foldable just as any object is - `fold` returns its argument ## References -Clojure synchronous references (atoms and refs) implement all categorical protocols. The reference is the (mutable!) context that hold an imutable value. Keep in mind that in this case, the functions that work on the content are mutable, since they change the reference, instead of producing a new one. +Clojure synchronous references (atoms and refs) implement all categorical protocols. The reference is the (mutable!) context that hold an immutable value. Keep in mind that in this case, the preferred functions that work on the content are mutable (`fmap!`, `fapply!` etc.) , since they change the reference, instead of producing a new one (`fmap` etc.). + +First, we describe regular `fmap`, `fapply` etc., but keep in mind that these do not make much sense with references, since the point of references is that they should mutate instead of producing new instances. ### Functor -With refs and atoms, `fmap` is analoguous to `alter` and `swap!`. The main difference from these, reference specific methods is that it returns the updated reference (context) itself, not tne new value, consistently with other `fmap` implementations described earlier. +With refs and atoms, `fmap` is analogous to `alter` and `swap!`. The main difference from these, reference specific methods is that it returns the updated reference (context) itself, not the new value, consistently with other `fmap` implementations described earlier. ```clojure (fmap inc (atom 3)) @@ -760,7 +840,7 @@ With refs and atoms, `fmap` is analoguous to `alter` and `swap!`. The main diffe ;=> (ref 2) ``` -`fapply` expects a function and its argument to be inside references, extracts thir contents, and updates the first value reference with the result of applying the function to the values. +`fapply` expects a function and its argument to be inside references, extracts their contents, and updates the first value reference with the result of applying the function to the values. ```clojure (fapply (atom inc) (atom 1)) @@ -846,6 +926,45 @@ Both refs and atoms form a semigroup with `op` working on their contents, as in ;=> 2 ``` -## Tell Us What You Think! +### Mutable functions + +``` clojure + + (let [a (atom 3)] + (fmap! inc a) => a) + + (let [r (ref 5)] + (dosync + (fmap! inc r) => r)) + + (fmap! + (atom 3) (atom 4) (ref 5)) => (check-eq (atom 12)) + + (dosync + (fmap! + (ref 5) (atom 6) (ref 7)) => (check-eq (ref 18))) + + (fapply! (atom inc) (atom 1)) => (check-eq (atom 2)) + + (dosync (fapply! (ref inc) (ref 2))) => (check-eq (ref 3)) + + (fapply! (atom +) (atom 1) (ref 2) (atom 3)) => (check-eq (atom 6)) -Please take some time to tell us about your experience with the library and this site. [Let us know](/articles/community.html) what we should be explaining or is not clear enough. If you are willing to contribute improvements, even better! + (dosync (fapply! (ref +) (ref 1) (atom 2) (atom 3))) + => (check-eq (ref 6)) + + (join! (atom (ref (atom 33)))) => (check-eq (atom (atom 33))) + + (dosync (join! (ref (ref (atom 33))))) + => (check-eq (ref (atom 33))) + + (bind! (atom 8) increment) => (check-eq (atom 9)) + + (dosync (bind! (ref 8) increment)) + => (check-eq (ref 9)) + + (bind! (atom 8) (ref 9) (atom 10) add) + => (check-eq (atom 27)) + + (dosync (bind! (ref 18) (ref 19) (atom 20) add)) + => (check-eq (ref 57) + +``` diff --git a/articles/community.md b/articles/community.md index 0455368..1fc6ffb 100644 --- a/articles/community.md +++ b/articles/community.md @@ -3,7 +3,9 @@ title: "Fluokitten: Community" layout: article --- -## Mailing List +## Where to contact me + +[I hang around at Slack Clojurians Uncomplicate](https://clojurians.slack.com/messages/uncomplicate/details/) [Fluokitten has a mailing list](https://groups.google.com/forum/#!forum/uncomplicate). Feel free to join it and ask any questions you may have. @@ -13,9 +15,14 @@ To subscribe for announcements of releases, important changes and so on, please ## What is Uncomplicate? -Fluokitten is currently the only part of the future group of Uncomplicate libraries. +A collection of Clojure libraries, currently containing: + +* [ClojureCL](http://clojurecl.uncomplicate.org) - a Clojure library for parallell computations with OpenCL. +* [Neanderthal](http://neanderthal.uncomplicate.org) - Fast matrix computations and linear algebra in Clojure (CPU and GPU). +* [Fluokitten](http://fluokitten.uncomplicate.org) - Category Theory in idiomatic Clojure. + -# Get Involved +## Get Involved I welcome anyone who is willing to contribute, no mather the level of experience. Please contact me through the [Uncomplicate mailing list](https://groups.google.com/forum/#!forum/uncomplicate). Here are some ways in which you can help: diff --git a/articles/functors_applicatives_monads_in_pictures.md b/articles/functors_applicatives_monads_in_pictures.md index e23aeb9..17d74c4 100644 --- a/articles/functors_applicatives_monads_in_pictures.md +++ b/articles/functors_applicatives_monads_in_pictures.md @@ -3,8 +3,6 @@ title: "Fluokitten: Functors, Applicatives and Monads in Pictures - in Clojure" layout: article --- -# Functors, Applicatives and Monads in Pictures - in Clojure - This tutorial is a Clojure version of the article [Functors, Applicatives and Monads in Pictures](http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html). The original article was written in Haskell, and is an excellent introduction to the very basics of functors, applicatives, and monads. This article is not self-contained: it is ment to be read side-by-side with the [original article](http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html), and used as a commentary and reference for the Clojure version of the examples. Due to the differences in typing, data structures, support for varargs and currying, there are differences in how the concepts that the original article explains are implemented in Haskell and Clojure. To be able to follow this article, you'll have to have Clojure installed and Fluokitten library included as a dependency in your project, as described in [Getting Started Guide](/articles/getting_started.html). Obviously, you'll need a reasonable knowledge of Clojure (you don't have to be an expert, though), and being familiar with the basics of Haskell is helpful, but not a necessity. So, after checking out [Getting Started Guide](/articles/getting_started.html), start up Clojure REPL and open this article and the [original article](http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html) and we are ready to go. @@ -214,7 +212,3 @@ The last example in the original article (reading a file and printing) is not re To continue with the spirit of the original article, we continue by providing the [Clojure version](/articles/learnyouahaskell.html) of the [Learn you a Haskell for Great Good](http://learnyouahaskell.com) book. [Continue here](/articles/learnyouahaskell.html) Of course, while reading these guides, you should check [Fluokitten reference documentation and tutorials](/articles/guides.html#fluokitten_documentation_and_tutorials) out as needed. - -## Tell Us What You Think! - -Please take some time to tell us about your experience with the library and this site. [Let us know](/articles/community.html) what we should be explaining or is not clear enough. If you are willing to contribute improvements, even better! diff --git a/articles/getting_started.md b/articles/getting_started.md index 237c7fb..4f5a4e8 100644 --- a/articles/getting_started.md +++ b/articles/getting_started.md @@ -3,7 +3,7 @@ title: "Getting Started" Author: Dragan Djuric layout: article --- -# Get Started + This is a brief introductory guide to Fluokitten that aims to give you the necessary information to get up and running, as well as a brief overview of some available resources for learning key category theory concepts and how to apply them in Clojure with Fluokitten. ## How to get started @@ -24,41 +24,13 @@ Fluokitten is a Clojure library that enables programming paradigms derived from ## Installation -Fluokitten is a Clojure library packaged in a `jar` file, distributed through [Clojars](http://clojars.org). It follows [maven](http://www.maven.org) (and [leiningen](http://www.leiningen.org)) naming conventions: `groupId` is `uncomplicate` and `artifactId` is `fluokitten`. - -### With Leiningen - -The most straightforward way to include Fluokitten in your project is with leiningen. Add the following dependency to your `project.clj`: - -```clojure -[uncomplicate/fluokitten "0.3.0"] -``` - -### With Maven - -Add Clojars repository definition to your pom.xml: - -```xml - - clojars.org - http://clojars.org/repo - -``` - -And then the dependency: +The most straightforward way to include Fluokitten in your project is with Leiningen. Add the following dependency to nyour `project.clj`: -```xml - - uncomplicate - fluokitten - 0.3.0 - -``` +![](http://clojars.org/uncomplicate/clojurecl/latest-version.svg) ### Requirements -Fluokitten requires at least Clojure `1.5`, as it uses the reducers library. -Reducers use java fork/join, which requires Java 7+ jdk, or Java 6 with `jsr166y.jar` included in project dependencies (see [Clojure's POM] (https://github.com/clojure/clojure/blob/master/pom.xml) for the dependency info). Fluokitten has no other dependencies or requirements, excepting some non-mandatory test helpers that need the [midje](https://github.com/marick/Midje) library to pass the testing suite. +Fluokitten requires Java `1.8`, and at least Clojure `1.7`, as it uses transducers. ## Usage @@ -75,7 +47,7 @@ What functions does this make available? Not many (which is a good thing), becau ### Functors and fmap -The basic categorical concepts concern contexts for data. One familiar data context is a sequence, for example one that represents several numbers. Suppuse we have a vanilla function that operates on numbers and we want to apply it to data without regard to the wrapper (context) that contains it. Of course, Clojure already has a function that can reach inside the sequence and apply a function to each element -- the ubiquitous `map` function: +The basic categorical concepts concern contexts for data. One familiar data context is a sequence, for example one that represents several numbers. Suppose we have a vanilla function that operates on numbers and we want to apply it to data without regard to the wrapper (context) that contains it. Of course, Clojure already has a function that can reach inside the sequence and apply a function to each element -- the ubiquitous `map` function: ```clojure (map inc [1 2 3]) @@ -99,7 +71,7 @@ Fluokitten extends all standard Clojure collections with the `Functor` protocol, (fmap + [1 2 3] [1 2 3 4]) ;=> [2 4 6] -(fmap + (list 1 2 3) [1 2] #{1 2 3 4}) +(fmap + (list 1 2 3) [1 2] (sorted-set 5 3 1 2)) ;=> (3 6) (fmap + {:a 1 :b 2} {:a 3 :c 4} {:d 5}) @@ -128,7 +100,7 @@ Starting with the same idea of data inside a context, we can extend it to the fu ``` `fapply` reaches inside any `Applicative` context (in this case, vector), applies function(s) wrapped in the same type of context (vector) and produces a similarly wrapped result. As an `Applicative`, vector produces a context wrapping results of applying all wrapped functions to all wrapped data. -More simple examples: +Simpler examples: ```clojure (fapply [+ -] [1 2] [3 4]) @@ -148,11 +120,11 @@ More simple examples: ;=> (atom 5) ``` -Are these function definitions and implementations arbitrary? NO! All these functions have to satisfy mathematical laws, ensuring they mesh seemlessly with the rest of the framework. Discussion of these laws is well beuond our scope, but you may rest assured that they are rigoroufly followed in the Fluokitten implementation. When you move beyond using the provided contexts and functions to writing youw own CT inplementations, you'll have to become familiar with these laws, which are covered in the advanced guides. +Are these function definitions and implementations arbitrary? NO! All these functions have to satisfy mathematical laws, ensuring they mesh seamlessly with the rest of the framework. Discussion of these laws is well beyond our scope, but you may rest assured that they are rigorously followed in the Fluokitten implementation. When you move beyond using the provided contexts and functions to writing your own CT implementations, you'll have to become familiar with these laws, which are covered in the advanced guides. ### Monads and bind -Monads are certainly the most discussed programming concept to come from category theory. Like functors and applicatives, monads deal with data in contexts. However, in addition to applying funtions contextually, monads can also transform context by unwrapping data, applying functions to it and rewrapping it, possibly in a completely different context. Sound confusing? Until you gain some practical experience, it is -- that is why monad tutorials are written every day. Don't be daunted, however. If you take a step-by-step approach and don't try to swallow everything in one sitting, it's really not hard at all. This tutorial only scratches the surface; please check out the further reading for deeper comprehension. +Monads are certainly the most discussed programming concept to come from category theory. Like functors and applicatives, monads deal with data in contexts. However, in addition to applying functions contextually, monads can also transform context by unwrapping data, applying functions to it and rewrapping it, possibly in a completely different context. Sound confusing? Until you gain some practical experience, it is -- that is why monad tutorials are written every day. Don't be daunted, however. If you take a step-by-step approach and don't try to swallow everything in one sitting, it's really not hard at all. This tutorial only scratches the surface; please check out the further reading for deeper comprehension. The core monad function is `bind`, and in the case of vector, it is trivially used as follows. ```clojure @@ -211,10 +183,20 @@ With more than one value though, fold aggregates. If the data are subject to a m ;=> 31 ``` -## Where to go next +Fold is similar to Clojure's reduce, but more powerful. It can work without explicitly supplied function, and it can acept multiple foldables. If you need to transform entries before folding, there is the `foldmap` function: -Hopefully this guide got you started and now you'd like to learn more. I expect to build a comprehensive base of articles and references for exploring this daunting topic, so please check the [All Guides](/articles/guides.html) page from time to time. More importantly, I will post articles with Clojure code for related articles, tutorials and videos, which use another reference language (Haskell) to discuss category theory. Of course, you should also check Fluokitten API for specific details, and feel free to take a gander at the source while you are there. +``` clojure + + (fold (fold [[1 2 3] [3 4 5 4 3] [3 2 1]])) + ;=> 31 -## Tell us what you think! + (fold op [] [[1] [2] [3 4]] [[4] [5 6] [6 66]] [[22 33]]) + ;=> [1 4 22 33 2 5 6 3 4 6 66] -Please take some time to tell us about your experience with the library and this site. [Let us know](/articles/community.html) what we should be explaining or is not clear enough. If you are willing to contribute improvements, even better! + (foldmap + 0 count [[1] [2] [3 4]]) + ;=> 4 +``` + +## Where to go next + +Hopefully this guide got you started and now you'd like to learn more. I expect to build a comprehensive base of articles and references for exploring this daunting topic, so please check the [All Guides](/articles/guides.html) page from time to time. More importantly, I will post articles with Clojure code for related articles, tutorials and videos, which use another reference language (Haskell) to discuss category theory. Of course, you should also check Fluokitten API for specific details, and feel free to take a gander at the source while you are there. diff --git a/articles/guides.md b/articles/guides.md index c3beb1e..dbb48d6 100644 --- a/articles/guides.md +++ b/articles/guides.md @@ -1,10 +1,8 @@ --- -title: "Fluokitten: all documentation guides" +title: "Fluokitten: Guide List" layout: article --- -# Guide list - Fluokitten documentation is organized as a number of guides, articles and API docs. The recommended way to use it is: * Read [Getting Started](/articles/getting_started.html) guide first @@ -43,7 +41,3 @@ A Fluokitten version of an excellent visual introductory article [Functors, Appl ### [Learn You a Haskell for Great Good](/articles/learnyouahaskell.html) A Fluokitten Clojure code version of the sections of [Learn You A Haskell for Great Good](http://learnyouahaskell.com) dedicated to Functors, Applicatives, Monads, etc. with comments and directions on how to use them together. - -## Tell Us What You Think! - -Please take some time to tell us about your experience with the library and this site. [Let us know](/articles/community.html) what we should be explaining or is not clear enough. If you are willing to contribute improvements, even better! diff --git a/articles/implementing_protocols.md b/articles/implementing_protocols.md index 0173d74..d9fe376 100644 --- a/articles/implementing_protocols.md +++ b/articles/implementing_protocols.md @@ -5,8 +5,6 @@ layout: article FIXME - To be written -# Implementing Fluokitten Protocols - ## Functor ## Applicative @@ -18,9 +16,3 @@ FIXME - To be written ## Monoid ## Foldable - -## Tell Us What You Think! - -Please take a moment to tell us what you think about this guide on Twitter or the [Fluokitten community resources](/articles/community) - -Let us know what was unclear or what has not been covered. Maybe you do not like the guide style or grammar or discover spelling mistakes. Reader feedback is key to making the documentation better. diff --git a/articles/learnyouahaskell.md b/articles/learnyouahaskell.md index b9afe42..6eb99ce 100644 --- a/articles/learnyouahaskell.md +++ b/articles/learnyouahaskell.md @@ -5,8 +5,6 @@ layout: article FIXME - To be written. LOTS OF CODE IS ALREADY [HERE](https://github.com/uncomplicate/fluokitten/blob/master/test/uncomplicate/fluokitten/articles) -# Learn You a Haskell for Great Good - in Clojure - This tutorial is a Clojure version of the book [Learn You a Haskell for Great Good](http://learnyouahaskell.com). This article is not self-contained: it is ment to be read side-by-side with the [book](http://learnyouahaskell.com), and used as a commentary and reference for the Clojure version of the examples. Due to the differences in typing, data structures, support for varargs and currying, there are differences in how the concepts that the original article explains are implemented in Haskell and Clojure. It is recommended that you first read the article [Functors, Applicatives, and Monads in Pictures - in Clojure](/articles/functors_applicatives_monads_in_pictures.html) before reading this article. diff --git a/assets/css/docs.css b/assets/css/docs.css new file mode 100644 index 0000000..6e7a718 --- /dev/null +++ b/assets/css/docs.css @@ -0,0 +1,1658 @@ +/*! + * Bootstrap Docs (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the Creative Commons Attribution 3.0 Unported License. For + * details, see https://creativecommons.org/licenses/by/3.0/. + */ + + +/* + * Bootstrap Documentation + * Special styles for presenting Bootstrap's documentation and code examples. + */ + + +/* + * Scaffolding + * + * Update the basics of our documents to prep for docs content. + */ + +body { + position: relative; /* For scrollspy */ +} + +/* Keep code small in tables on account of limited space */ +.table code { + font-size: 13px; + font-weight: normal; +} + +/* Inline code within headings retain the heading's background-color */ +h2 code, +h3 code, +h4 code { + background-color: inherit; +} + +/* Outline button for use within the docs */ +.btn-outline { + color: #563d7c; + background-color: transparent; + border-color: #563d7c; +} +.btn-outline:hover, +.btn-outline:focus, +.btn-outline:active { + color: #fff; + background-color: #563d7c; + border-color: #563d7c; +} + +/* Inverted outline button (white on dark) */ +.btn-outline-inverse { + color: #fff; + background-color: transparent; + border-color: #cdbfe3; +} +.btn-outline-inverse:hover, +.btn-outline-inverse:focus, +.btn-outline-inverse:active { + color: #563d7c; + text-shadow: none; + background-color: #fff; + border-color: #fff; +} + +/* Bootstrap "B" icon */ +.bs-docs-booticon { + display: block; + font-weight: 500; + color: #fff; + text-align: center; + cursor: default; + background-color: #563d7c; + border-radius: 15%; +} +.bs-docs-booticon-sm { + width: 30px; + height: 30px; + font-size: 20px; + line-height: 28px; +} +.bs-docs-booticon-lg { + width: 144px; + height: 144px; + font-size: 108px; + line-height: 140px; +} +.bs-docs-booticon-inverse { + color: #563d7c; + background-color: #fff; +} +.bs-docs-booticon-outline { + background-color: transparent; + border: 1px solid #cdbfe3; +} + + +/* + * Fancy skip link + * + * Make it look a bit less "bare bones" + * Also includes focus suppression for the Chrome tabindex="-1" workaround + */ + +#skippy { + display: block; + padding: 1em; + color: #fff; + background-color: #6f5499; + outline: 0; +} + +#skippy .skiplink-text { + padding: .5em; + outline: 1px dotted; +} + +#content:focus { + outline: none; +} + + +/* + * Main navigation + * + * Turn the `.navbar` at the top of the docs purple. + */ + +.bs-docs-nav { + margin-bottom: 0; + background-color: #fff; + border-bottom: 0; +} +.bs-home-nav .bs-nav-b { + display: none; +} +.bs-docs-nav .navbar-brand, +.bs-docs-nav .navbar-nav > li > a { + font-weight: 500; + color: #563d7c; +} +.bs-docs-nav .navbar-nav > li > a:hover, +.bs-docs-nav .navbar-nav > .active > a, +.bs-docs-nav .navbar-nav > .active > a:hover { + color: #463265; + background-color: #f9f9f9; +} +.bs-docs-nav .navbar-toggle .icon-bar { + background-color: #563d7c; +} +.bs-docs-nav .navbar-header .navbar-toggle { + border-color: #fff; +} +.bs-docs-nav .navbar-header .navbar-toggle:hover, +.bs-docs-nav .navbar-header .navbar-toggle:focus { + background-color: #f9f9f9; + border-color: #f9f9f9; +} + + +/* + * Footer + * + * Separated section of content at the bottom of all pages, save the homepage. + */ + +.bs-docs-footer { + padding-top: 50px; + padding-bottom: 50px; + margin-top: 100px; + color: #99979c; + text-align: center; + background-color: #2a2730; +} +.bs-docs-footer a { + color: #fff; +} +.bs-docs-footer-links { + padding-left: 0; + margin-bottom: 20px; +} +.bs-docs-footer-links li { + display: inline-block; +} +.bs-docs-footer-links li + li { + margin-left: 15px; +} + +@media (min-width: 768px) { + .bs-docs-footer { + text-align: left; + } + .bs-docs-footer p { + margin-bottom: 0; + } +} + + +/* + * Homepage + * + * Tweaks to the custom homepage and the masthead (main jumbotron). + */ + +/* Share masthead with page headers */ +.bs-docs-masthead, +.bs-docs-header { + position: relative; + padding: 30px 0; + color: #cdbfe3; + text-align: center; + text-shadow: 0 1px 0 rgba(0,0,0,.1); + background-color: #6f5499; + background-image: -webkit-gradient(linear, left top, left bottom, from(#563d7c), to(#6f5499)); + background-image: -webkit-linear-gradient(top, #563d7c 0%, #6f5499 100%); + background-image: -o-linear-gradient(top, #563d7c 0%, #6f5499 100%); + background-image: linear-gradient(to bottom, #563d7c 0%, #6f5499 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#563d7c', endColorstr='#6F5499', GradientType=0); + background-repeat: repeat-x; +} + +/* Masthead (headings and download button) */ +.bs-docs-masthead .bs-docs-booticon { + margin: 0 auto 30px; +} +.bs-docs-masthead h1 { + font-weight: 300; + line-height: 1; + color: #fff; +} +.bs-docs-masthead .lead { + margin: 0 auto 30px; + font-size: 20px; + color: #fff; +} +.bs-docs-masthead .version { + margin-top: -15px; + margin-bottom: 30px; + color: #9783b9; +} +.bs-docs-masthead .btn { + width: 100%; + padding: 15px 30px; + font-size: 20px; +} + +@media (min-width: 480px) { + .bs-docs-masthead .btn { + width: auto; + } +} + +@media (min-width: 768px) { + .bs-docs-masthead { + padding: 80px 0; + } + .bs-docs-masthead h1 { + font-size: 60px; + } + .bs-docs-masthead .lead { + font-size: 24px; + } +} + +@media (min-width: 992px) { + .bs-docs-masthead .lead { + width: 80%; + font-size: 30px; + } +} + + +/* + * Page headers + * + * Jumbotron-esque headers at the top of every page that's not the homepage. + */ + +/* Page headers */ +.bs-docs-header { + margin-bottom: 40px; + font-size: 20px; +} +.bs-docs-header h1 { + margin-top: 0; + color: #fff; +} +.bs-docs-header p { + margin-bottom: 0; + font-weight: 300; + line-height: 1.4; +} +.bs-docs-header .container { + position: relative; +} + +@media (min-width: 768px) { + .bs-docs-header { + padding-top: 60px; + padding-bottom: 60px; + font-size: 24px; + text-align: left; + } + .bs-docs-header h1 { + font-size: 60px; + line-height: 1; + } +} + +@media (min-width: 992px) { + .bs-docs-header h1, + .bs-docs-header p { + margin-right: 380px; + } +} + + +/* + * Carbon ads + * + * Single display ad that shows on all pages (except homepage) in page headers. + * The hella `!important` is required for any pre-set property. + */ + +.carbonad { + width: auto !important; + height: auto !important; + padding: 20px !important; + margin: 30px -15px -31px !important; + overflow: hidden; /* clearfix */ + font-size: 13px !important; + line-height: 16px !important; + text-align: left; + background: transparent !important; + border: solid #866ab3 !important; + border-width: 1px 0 !important; +} +.carbonad-img { + margin: 0 !important; +} +.carbonad-text, +.carbonad-tag { + display: block !important; + float: none !important; + width: auto !important; + height: auto !important; + margin-left: 145px !important; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important; +} +.carbonad-text { + padding-top: 0 !important; +} +.carbonad-tag { + color: inherit !important; + text-align: left !important; +} +.carbonad-text a, +.carbonad-tag a { + color: #fff !important; +} +.carbonad #azcarbon > img { + display: none; /* hide what I assume are tracking images */ +} + +@media (min-width: 480px) { + .carbonad { + width: 330px !important; + margin: 20px auto !important; + border-width: 1px !important; + border-radius: 4px; + } + .bs-docs-masthead .carbonad { + margin: 50px auto 0 !important; + } +} + +@media (min-width: 768px) { + .carbonad { + margin-right: 0 !important; + margin-left: 0 !important; + } +} + +@media (min-width: 992px) { + .carbonad { + position: absolute; + top: 0; + right: 15px; /* 15px instead of 0 since box-sizing */ + width: 330px !important; + padding: 15px !important; + margin: 0 !important; + } + .bs-docs-masthead .carbonad { + position: static; + } +} + + +/* + * Homepage featurettes + * + * Reasons to use Bootstrap, entries from the Expo, and more. + */ + +.bs-docs-featurette { + padding-top: 40px; + padding-bottom: 40px; + font-size: 16px; + line-height: 1.5; + color: #555; + text-align: center; + background-color: #fff; + border-bottom: 1px solid #e5e5e5; +} +.bs-docs-featurette + .bs-docs-footer { + margin-top: 0; + border-top: 0; +} + +.bs-docs-featurette-title { + margin-bottom: 5px; + font-size: 30px; + font-weight: normal; + color: #333; +} +.half-rule { + width: 100px; + margin: 40px auto; +} +.bs-docs-featurette h3 { + margin-bottom: 5px; + font-weight: normal; + color: #333; +} +.bs-docs-featurette-img { + display: block; + margin-bottom: 20px; + color: #333; +} +.bs-docs-featurette-img:hover { + color: #337ab7; + text-decoration: none; +} +.bs-docs-featurette-img img { + display: block; + margin-bottom: 15px; +} + +@media (min-width: 480px) { + .bs-docs-featurette .img-responsive { + margin-top: 30px; + } +} +@media (min-width: 768px) { + .bs-docs-featurette { + padding-top: 100px; + padding-bottom: 100px; + } + .bs-docs-featurette-title { + font-size: 40px; + } + .bs-docs-featurette .lead { + max-width: 80%; + margin-right: auto; + margin-left: auto; + } + .bs-docs-featurette .img-responsive { + margin-top: 0; + } +} + + +/* + * Featured sites + * + * Homepage thumbnails from the Expo. + */ + +.bs-docs-featured-sites { + margin-right: -1px; + margin-left: -1px; +} +.bs-docs-featured-sites .col-xs-6 { + padding: 1px; +} +.bs-docs-featured-sites .img-responsive { + margin-top: 0; +} + +@media (min-width: 768px) { + .bs-docs-featured-sites .col-sm-3:first-child img { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + .bs-docs-featured-sites .col-sm-3:last-child img { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } +} + + +/* + * Examples + * + * Linked docs examples. + */ + +.bs-examples .thumbnail { + margin-bottom: 10px; +} +.bs-examples h4 { + margin-bottom: 5px; +} +.bs-examples p { + margin-bottom: 20px; +} + +@media (max-width: 480px) { + .bs-examples { + margin-right: -10px; + margin-left: -10px; + } + .bs-examples > [class^="col-"] { + padding-right: 10px; + padding-left: 10px; + } +} + + +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ + +/* By default it's not affixed in mobile views, so undo that */ +.bs-docs-sidebar.affix { + position: static; +} +@media (min-width: 768px) { + .bs-docs-sidebar { + padding-left: 20px; + } +} + +/* First level of nav */ +.bs-docs-sidenav { + margin-top: 20px; + margin-bottom: 20px; +} + +/* All levels of nav */ +.bs-docs-sidebar .nav > li > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; +} +.bs-docs-sidebar .nav > li > a:hover, +.bs-docs-sidebar .nav > li > a:focus { + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; +} +.bs-docs-sidebar .nav > .active > a, +.bs-docs-sidebar .nav > .active:hover > a, +.bs-docs-sidebar .nav > .active:focus > a { + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; +} + +/* Nav: second level (shown on .active) */ +.bs-docs-sidebar .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} +.bs-docs-sidebar .nav .nav > li > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; +} +.bs-docs-sidebar .nav .nav > li > a:hover, +.bs-docs-sidebar .nav .nav > li > a:focus { + padding-left: 29px; +} +.bs-docs-sidebar .nav .nav > .active > a, +.bs-docs-sidebar .nav .nav > .active:hover > a, +.bs-docs-sidebar .nav .nav > .active:focus > a { + padding-left: 28px; + font-weight: 500; +} + +/* Back to top (hidden on mobile) */ +.back-to-top, +.bs-docs-theme-toggle { + display: none; + padding: 4px 10px; + margin-top: 10px; + margin-left: 10px; + font-size: 12px; + font-weight: 500; + color: #999; +} +.back-to-top:hover, +.bs-docs-theme-toggle:hover { + color: #563d7c; + text-decoration: none; +} +.bs-docs-theme-toggle { + margin-top: 0; +} + +@media (min-width: 768px) { + .back-to-top, + .bs-docs-theme-toggle { + display: block; + } +} + +/* Show and affix the side nav when space allows it */ +@media (min-width: 992px) { + .bs-docs-sidebar .nav > .active > ul { + display: block; + } + /* Widen the fixed sidebar */ + .bs-docs-sidebar.affix, + .bs-docs-sidebar.affix-bottom { + width: 213px; + } + .bs-docs-sidebar.affix { + position: fixed; /* Undo the static from mobile first approach */ + top: 20px; + } + .bs-docs-sidebar.affix-bottom { + position: absolute; /* Undo the static from mobile first approach */ + } + .bs-docs-sidebar.affix-bottom .bs-docs-sidenav, + .bs-docs-sidebar.affix .bs-docs-sidenav { + margin-top: 0; + margin-bottom: 0; + } +} +@media (min-width: 1200px) { + /* Widen the fixed sidebar again */ + .bs-docs-sidebar.affix-bottom, + .bs-docs-sidebar.affix { + width: 263px; + } +} + + +/* + * Docs sections + * + * Content blocks for each component or feature. + */ + +/* Space things out */ +.bs-docs-section { + margin-bottom: 60px; +} +.bs-docs-section:last-child { + margin-bottom: 0; +} + +h1[id] { + padding-top: 20px; + margin-top: 0; +} + + +/* + * Callouts + * + * Not quite alerts, but custom and helpful notes for folks reading the docs. + * Requires a base and modifier class. + */ + +/* Common styles for all types */ +.bs-callout { + padding: 20px; + margin: 20px 0; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 3px; +} +.bs-callout h4 { + margin-top: 0; + margin-bottom: 5px; +} +.bs-callout p:last-child { + margin-bottom: 0; +} +.bs-callout code { + border-radius: 3px; +} + +/* Tighten up space between multiple callouts */ +.bs-callout + .bs-callout { + margin-top: -5px; +} + +/* Variations */ +.bs-callout-danger { + border-left-color: #ce4844; +} +.bs-callout-danger h4 { + color: #ce4844; +} +.bs-callout-warning { + border-left-color: #aa6708; +} +.bs-callout-warning h4 { + color: #aa6708; +} +.bs-callout-info { + border-left-color: #1b809e; +} +.bs-callout-info h4 { + color: #1b809e; +} + + +/* + * Color swatches + * + * Color swatches and associated values for our grayscale and brand colors. + */ + +.color-swatches { + margin: 0 -5px; + overflow: hidden; /* clearfix */ +} +.color-swatch { + float: left; + width: 60px; + height: 60px; + margin: 0 5px; + border-radius: 3px; +} + +@media (min-width: 768px) { + .color-swatch { + width: 100px; + height: 100px; + } +} + +/* Framework colors */ +.color-swatches .gray-darker { + background-color: #222; +} +.color-swatches .gray-dark { + background-color: #333; +} +.color-swatches .gray { + background-color: #555; +} +.color-swatches .gray-light { + background-color: #999; +} +.color-swatches .gray-lighter { + background-color: #eee; +} +.color-swatches .brand-primary { + background-color: #337ab7; +} +.color-swatches .brand-success { + background-color: #5cb85c; +} +.color-swatches .brand-warning { + background-color: #f0ad4e; +} +.color-swatches .brand-danger { + background-color: #d9534f; +} +.color-swatches .brand-info { + background-color: #5bc0de; +} + +/* Docs colors */ +.color-swatches .bs-purple { + background-color: #563d7c; +} +.color-swatches .bs-purple-light { + background-color: #c7bfd3; +} +.color-swatches .bs-purple-lighter { + background-color: #e5e1ea; +} +.color-swatches .bs-gray { + background-color: #f9f9f9; +} + + +/* + * Team members + * + * Avatars, names, and usernames for core team. + */ + +.bs-team .team-member { + line-height: 32px; + color: #555; +} +.bs-team .team-member:hover { + color: #333; + text-decoration: none; +} +.bs-team .github-btn { + float: right; + width: 180px; + height: 20px; + margin-top: 6px; +} +.bs-team img { + float: left; + width: 32px; + margin-right: 10px; + border-radius: 4px; +} + + +/* + * Wall of Browser Bugs + * + * Better display for the responsive table on the Wall of Browser Bugs. + */ + +.bs-docs-browser-bugs td p { + margin-bottom: 0; +} + +.bs-docs-browser-bugs th:first-child { + width: 18%; +} + + +/* + * Grid examples + * + * Highlight the grid columns within the docs so folks can see their padding, + * alignment, sizing, etc. + */ + +.show-grid { + margin-bottom: 15px; +} +.show-grid [class^="col-"] { + padding-top: 10px; + padding-bottom: 10px; + background-color: #eee; + background-color: rgba(86,61,124,.15); + border: 1px solid #ddd; + border: 1px solid rgba(86,61,124,.2); +} + + +/* + * Examples + * + * Isolated sections of example content for each component or feature. Usually + * followed by a code snippet. + */ + +.bs-example { + position: relative; + padding: 45px 15px 15px; + margin: 0 -15px 15px; + border-color: #e5e5e5 #eee #eee; + border-style: solid; + border-width: 1px 0; + -webkit-box-shadow: inset 0 3px 6px rgba(0,0,0,.05); + box-shadow: inset 0 3px 6px rgba(0,0,0,.05); +} +/* Echo out a label for the example */ +.bs-example:after { + position: absolute; + top: 15px; + left: 15px; + font-size: 12px; + font-weight: bold; + color: #959595; + text-transform: uppercase; + letter-spacing: 1px; + content: "Example"; +} + +.bs-example-padded-bottom { + padding-bottom: 24px; +} + +/* Tweak display of the code snippets when following an example */ +.bs-example + .highlight, +.bs-example + .zero-clipboard + .highlight { + margin: -15px -15px 15px; + border-width: 0 0 1px; + border-radius: 0; +} + +/* Make the examples and snippets not full-width */ +@media (min-width: 768px) { + .bs-example { + margin-right: 0; + margin-left: 0; + background-color: #fff; + border-color: #ddd; + border-width: 1px; + border-radius: 4px 4px 0 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .bs-example + .highlight, + .bs-example + .zero-clipboard + .highlight { + margin-top: -16px; + margin-right: 0; + margin-left: 0; + border-width: 1px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + } + .bs-example-standalone { + border-radius: 4px; + } +} + +/* Undo width of container */ +.bs-example .container { + width: auto; +} + +/* Tweak content of examples for optimum awesome */ +.bs-example > p:last-child, +.bs-example > ul:last-child, +.bs-example > ol:last-child, +.bs-example > blockquote:last-child, +.bs-example > .form-control:last-child, +.bs-example > .table:last-child, +.bs-example > .navbar:last-child, +.bs-example > .jumbotron:last-child, +.bs-example > .alert:last-child, +.bs-example > .panel:last-child, +.bs-example > .list-group:last-child, +.bs-example > .well:last-child, +.bs-example > .progress:last-child, +.bs-example > .table-responsive:last-child > .table { + margin-bottom: 0; +} +.bs-example > p > .close { + float: none; +} + +/* Typography */ +.bs-example-type .table .type-info { + color: #767676; + vertical-align: middle; +} +.bs-example-type .table td { + padding: 15px 0; + border-color: #eee; +} +.bs-example-type .table tr:first-child td { + border-top: 0; +} +.bs-example-type h1, +.bs-example-type h2, +.bs-example-type h3, +.bs-example-type h4, +.bs-example-type h5, +.bs-example-type h6 { + margin: 0; +} + +/* Contextual background colors */ +.bs-example-bg-classes p { + padding: 15px; +} + +/* Images */ +.bs-example > .img-circle, +.bs-example > .img-rounded, +.bs-example > .img-thumbnail { + margin: 5px; +} + +/* Tables */ +.bs-example > .table-responsive > .table { + background-color: #fff; +} + +/* Buttons */ +.bs-example > .btn, +.bs-example > .btn-group { + margin-top: 5px; + margin-bottom: 5px; +} +.bs-example > .btn-toolbar + .btn-toolbar { + margin-top: 10px; +} + +/* Forms */ +.bs-example-control-sizing select, +.bs-example-control-sizing input[type="text"] + input[type="text"] { + margin-top: 10px; +} +.bs-example-form .input-group { + margin-bottom: 10px; +} +.bs-example > textarea.form-control { + resize: vertical; +} + +/* List groups */ +.bs-example > .list-group { + max-width: 400px; +} + +/* Navbars */ +.bs-example .navbar:last-child { + margin-bottom: 0; +} +.bs-navbar-top-example, +.bs-navbar-bottom-example { + z-index: 1; + padding: 0; + overflow: hidden; /* cut the drop shadows off */ +} +.bs-navbar-top-example .navbar-header, +.bs-navbar-bottom-example .navbar-header { + margin-left: 0; +} +.bs-navbar-top-example .navbar-fixed-top, +.bs-navbar-bottom-example .navbar-fixed-bottom { + position: relative; + margin-right: 0; + margin-left: 0; +} +.bs-navbar-top-example { + padding-bottom: 45px; +} +.bs-navbar-top-example:after { + top: auto; + bottom: 15px; +} +.bs-navbar-top-example .navbar-fixed-top { + top: -1px; +} +.bs-navbar-bottom-example { + padding-top: 45px; +} +.bs-navbar-bottom-example .navbar-fixed-bottom { + bottom: -1px; +} +.bs-navbar-bottom-example .navbar { + margin-bottom: 0; +} +@media (min-width: 768px) { + .bs-navbar-top-example .navbar-fixed-top, + .bs-navbar-bottom-example .navbar-fixed-bottom { + position: absolute; + } +} + +/* Pagination */ +.bs-example .pagination { + margin-top: 10px; + margin-bottom: 10px; +} + +/* Pager */ +.bs-example > .pager { + margin-top: 0; +} + +/* Example modals */ +.bs-example-modal { + background-color: #f5f5f5; +} +.bs-example-modal .modal { + position: relative; + top: auto; + right: auto; + bottom: auto; + left: auto; + z-index: 1; + display: block; +} +.bs-example-modal .modal-dialog { + left: auto; + margin-right: auto; + margin-left: auto; +} + +/* Example dropdowns */ +.bs-example > .dropdown > .dropdown-toggle { + float: left; +} +.bs-example > .dropdown > .dropdown-menu { + position: static; + display: block; + margin-bottom: 5px; + clear: left; +} + +/* Example tabbable tabs */ +.bs-example-tabs .nav-tabs { + margin-bottom: 15px; +} + +/* Tooltips */ +.bs-example-tooltips { + text-align: center; +} +.bs-example-tooltips > .btn { + margin-top: 5px; + margin-bottom: 5px; +} +.bs-example-tooltip .tooltip { + position: relative; + display: inline-block; + margin: 10px 20px; + opacity: 1; +} + +/* Popovers */ +.bs-example-popover { + padding-bottom: 24px; + background-color: #f9f9f9; +} +.bs-example-popover .popover { + position: relative; + display: block; + float: left; + width: 260px; + margin: 20px; +} + +/* Scrollspy demo on fixed height div */ +.scrollspy-example { + position: relative; + height: 200px; + margin-top: 10px; + overflow: auto; +} + +.bs-example > .nav-pills-stacked-example { + max-width: 300px; +} + +/* Simple collapse example */ +#collapseExample .well { + margin-bottom: 0; +} + +/* Don't wrap event names in Events tables in JS plugin docs */ +.bs-events-table > thead > tr > th:first-child, +.bs-events-table > tbody > tr > td:first-child { + white-space: nowrap; +} + +.bs-events-table > thead > tr > th:first-child { + width: 150px; +} + +.js-options-table > thead > tr > th:nth-child(1), +.js-options-table > thead > tr > th:nth-child(2) { + width: 100px; +} + +.js-options-table > thead > tr > th:nth-child(3) { + width: 50px; +} + +/* + * Code snippets + * + * Generated via Pygments and Jekyll, these are snippets of HTML, CSS, and JS. + */ + +.highlight { + padding: 9px 14px; + margin-bottom: 14px; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; + border-radius: 4px; +} +.highlight pre { + padding: 0; + margin-top: 0; + margin-bottom: 0; + word-break: normal; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.highlight pre code { + font-size: inherit; + color: #333; /* Effectively the base text color */ +} +.highlight pre code:first-child { + display: inline-block; + padding-right: 45px; +} + + +/* + * Responsive tests + * + * Generate a set of tests to show the responsive utilities in action. + */ + +/* Responsive (scrollable) doc tables */ +.table-responsive .highlight pre { + white-space: normal; +} + +/* Utility classes table */ +.bs-table th small, +.responsive-utilities th small { + display: block; + font-weight: normal; + color: #999; +} +.responsive-utilities tbody th { + font-weight: normal; +} +.responsive-utilities td { + text-align: center; +} +.responsive-utilities td.is-visible { + color: #468847; + background-color: #dff0d8 !important; +} +.responsive-utilities td.is-hidden { + color: #ccc; + background-color: #f9f9f9 !important; +} + +/* Responsive tests */ +.responsive-utilities-test { + margin-top: 5px; +} +.responsive-utilities-test .col-xs-6 { + margin-bottom: 10px; +} +.responsive-utilities-test span { + display: block; + padding: 15px 10px; + font-size: 14px; + font-weight: bold; + line-height: 1.1; + text-align: center; + border-radius: 4px; +} +.visible-on .col-xs-6 .hidden-xs, +.visible-on .col-xs-6 .hidden-sm, +.visible-on .col-xs-6 .hidden-md, +.visible-on .col-xs-6 .hidden-lg, +.hidden-on .col-xs-6 .hidden-xs, +.hidden-on .col-xs-6 .hidden-sm, +.hidden-on .col-xs-6 .hidden-md, +.hidden-on .col-xs-6 .hidden-lg { + color: #999; + border: 1px solid #ddd; +} +.visible-on .col-xs-6 .visible-xs-block, +.visible-on .col-xs-6 .visible-sm-block, +.visible-on .col-xs-6 .visible-md-block, +.visible-on .col-xs-6 .visible-lg-block, +.hidden-on .col-xs-6 .visible-xs-block, +.hidden-on .col-xs-6 .visible-sm-block, +.hidden-on .col-xs-6 .visible-md-block, +.hidden-on .col-xs-6 .visible-lg-block { + color: #468847; + background-color: #dff0d8; + border: 1px solid #d6e9c6; +} + + +/* + * Glyphicons + * + * Special styles for displaying the icons and their classes in the docs. + */ + +.bs-glyphicons { + margin: 0 -10px 20px; + overflow: hidden; +} +.bs-glyphicons-list { + padding-left: 0; + list-style: none; +} +.bs-glyphicons li { + float: left; + width: 25%; + height: 115px; + padding: 10px; + font-size: 10px; + line-height: 1.4; + text-align: center; + background-color: #f9f9f9; + border: 1px solid #fff; +} +.bs-glyphicons .glyphicon { + margin-top: 5px; + margin-bottom: 10px; + font-size: 24px; +} +.bs-glyphicons .glyphicon-class { + display: block; + text-align: center; + word-wrap: break-word; /* Help out IE10+ with class names */ +} +.bs-glyphicons li:hover { + color: #fff; + background-color: #563d7c; +} + +@media (min-width: 768px) { + .bs-glyphicons { + margin-right: 0; + margin-left: 0; + } + .bs-glyphicons li { + width: 12.5%; + font-size: 12px; + } +} + + +/* + * Customizer + * + * Since this is so form control heavy, we have quite a few styles to customize + * the display of inputs, headings, and more. Also included are all the download + * buttons and actions. + */ + +.bs-customizer .toggle { + float: right; + margin-top: 25px; +} + +/* Headings and form contrls */ +.bs-customizer label { + margin-top: 10px; + font-weight: 500; + color: #555; +} +.bs-customizer h2 { + padding-top: 30px; + margin-top: 0; + margin-bottom: 5px; +} +.bs-customizer h3 { + margin-bottom: 0; +} +.bs-customizer h4 { + margin-top: 15px; + margin-bottom: 0; +} +.bs-customizer .bs-callout h4 { + margin-top: 0; /* lame, but due to specificity we have to duplicate */ + margin-bottom: 5px; +} +.bs-customizer input[type="text"] { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + background-color: #fafafa; +} +.bs-customizer .help-block { + margin-bottom: 5px; + font-size: 12px; +} + +/* For the variables, use regular weight */ +#less-section label { + font-weight: normal; +} + +/* Downloads */ +.bs-customize-download .btn-outline { + padding: 20px; +} + +/* Error handling */ +.bs-customizer-alert { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; + padding: 15px 0; + color: #fff; + background-color: #d9534f; + border-bottom: 1px solid #b94441; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.25); + box-shadow: inset 0 1px 0 rgba(255,255,255,.25); +} +.bs-customizer-alert .close { + margin-top: -4px; + font-size: 24px; +} +.bs-customizer-alert p { + margin-bottom: 0; +} +.bs-customizer-alert .glyphicon { + margin-right: 5px; +} +.bs-customizer-alert pre { + margin: 10px 0 0; + color: #fff; + background-color: #a83c3a; + border-color: #973634; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); + box-shadow: inset 0 2px 4px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); +} + +.bs-dropzone { + position: relative; + padding: 20px; + margin-bottom: 20px; + color: #777; + text-align: center; + border: 2px dashed #eee; + border-radius: 4px; +} +.bs-dropzone .import-header { + margin-bottom: 5px; +} +.bs-dropzone .glyphicon-download-alt { + font-size: 40px; +} +.bs-dropzone hr { + width: 100px; +} +.bs-dropzone .lead { + margin-bottom: 10px; + font-weight: normal; + color: #333; +} +/*.bs-dropzone*/ #import-manual-trigger { + cursor: pointer; +} +.bs-dropzone p:last-child { + margin-bottom: 0; +} + +/* + * Brand guidelines + * + * Extra styles for displaying wordmarks, logos, etc. + */ + +/* Logo series wrapper */ +.bs-brand-logos { + display: table; + width: 100%; + margin-bottom: 15px; + overflow: hidden; + color: #563d7c; + background-color: #f9f9f9; + border-radius: 4px; +} + +/* Individual items */ +.bs-brand-item { + padding: 60px 0; + text-align: center; +} +.bs-brand-item + .bs-brand-item { + border-top: 1px solid #fff; +} +.bs-brand-logos .inverse { + color: #fff; + background-color: #563d7c; +} + +/* Heading content within */ +.bs-brand-item h1, +.bs-brand-item h3 { + margin-top: 0; + margin-bottom: 0; +} +.bs-brand-item .bs-docs-booticon { + margin-right: auto; + margin-left: auto; +} + +/* Make the icons stand out on what is/isn't okay */ +.bs-brand-item .glyphicon { + width: 30px; + height: 30px; + margin: 10px auto -10px; + line-height: 30px; + color: #fff; + border-radius: 50%; +} +.bs-brand-item .glyphicon-ok { + background-color: #5cb85c; +} +.bs-brand-item .glyphicon-remove { + background-color: #d9534f; +} + +@media (min-width: 768px) { + .bs-brand-item { + display: table-cell; + width: 1%; + } + .bs-brand-item + .bs-brand-item { + border-top: 0; + border-left: 1px solid #fff; + } + .bs-brand-item h1 { + font-size: 60px; + } +} + + +/* + * ZeroClipboard styles + */ + +.zero-clipboard { + position: relative; + display: none; +} +.btn-clipboard { + position: absolute; + top: 0; + right: 0; + z-index: 10; + display: block; + padding: 5px 8px; + font-size: 12px; + color: #767676; + cursor: pointer; + background-color: #fff; + border: 1px solid #e1e1e8; + border-radius: 0 4px 0 4px; +} +.btn-clipboard-hover { + color: #fff; + background-color: #563d7c; + border-color: #563d7c; +} + +@media (min-width: 768px) { + .zero-clipboard { + display: block; + } + .bs-example + .zero-clipboard .btn-clipboard { + top: -16px; + border-top-right-radius: 0; + } +} + +/* + * AnchorJS Styles + */ +.anchorjs-link { + color: inherit; +} + +@media (max-width: 480px) { + .anchorjs-link { + display: none; + } +} + +*:hover > .anchorjs-link { + opacity: .75; + -webkit-transition: color .16s linear; + -o-transition: color .16s linear; + transition: color .16s linear; +} + +*:hover > .anchorjs-link:hover, +.anchorjs-link:focus { + text-decoration: none; + opacity: 1; +} + +/* + * Miscellaneous + * + * Odds and ends for optimum docs display. + */ + +/* Pseudo :focus state for showing how it looks in the docs */ +#focusedInput { + border-color: rgb(204,204,204); /* Restate unfocused value to make CSSLint happy that there's a pre-CSS3 fallback*/ + border-color: rgba(82,168,236,.8); + outline: 0; + outline: thin dotted \9; /* IE6-9 */ + -webkit-box-shadow: 0 0 8px rgba(82,168,236,.6); + box-shadow: 0 0 8px rgba(82,168,236,.6); +} + +/* v4 notice above main navbar */ +.v4-tease { + display: block; + padding: 15px 20px; + font-weight: bold; + color: #fff; + text-align: center; + background-color: #0275d8; +} +.v4-tease:hover { + color: #fff; + text-decoration: none; + background-color: #0269c2; +} + + +/* + * Social buttons + * + * Twitter and GitHub social action buttons (for homepage and footer). + */ + +.bs-docs-social { + margin-bottom: 20px; + text-align: center; +} +.bs-docs-social-buttons { + display: inline-block; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.bs-docs-social-buttons li { + display: inline-block; + padding: 5px 8px; + line-height: 1; +} +.bs-docs-social-buttons .twitter-follow-button { + width: 225px !important; +} +.bs-docs-social-buttons .twitter-share-button { + width: 98px !important; +} +/* Style the GitHub buttons via CSS instead of inline attributes */ +.github-btn { + overflow: hidden; + border: 0; +} diff --git a/assets/stylesheets/pygments.css b/assets/css/pygments.css similarity index 100% rename from assets/stylesheets/pygments.css rename to assets/css/pygments.css diff --git a/assets/css/styles.css b/assets/css/styles.css new file mode 100644 index 0000000..419131b --- /dev/null +++ b/assets/css/styles.css @@ -0,0 +1,133 @@ +/* Mixins.scss + * Snippets of reusable CSS to develop faster and keep code readable + * ----------------------------------------------------------------- */ +body { + position: relative; +} + +.clearfix { + zoom: 1; +} + +.clearfix:before, .clearfix:after { + display: table; + content: ""; + zoom: 1; + *display: inline; +} +.clearfix:after { + clear: both; +} + +.fixed-container { + width: 1200px; + margin-left: auto; + margin-right: auto; + zoom: 1; +} +.fixed-container:before, .fixed-container:after { + display: table; + content: ""; + zoom: 1; + *display: inline; +} +.fixed-container:after { + clear: both; +} + +article pre { + font-size: 13px !important; +} + +.container > section { + margin-top: 60px; +} + +strong { + color: #cb4b16; +} + +.marketing h2 { + margin: 36px 0 27px; + text-align: center; +} + +.sidebar-nav { + padding: 9px 0; +} + +.headline { + padding: 50px; + text-align: center; +} +.headline h1 { + font-size: 100px; + line-height: 150px; + font-family: "Signika Negative", "Helvetica Neue", Helvetica, Arial, sans-serif; + padding-bottom: 20px; +} +.headline p { + padding-bottom: 10px; + font-family: "Signika Negative", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} +.headline .logo { + margin-left: auto; + margin-right: auto; +} + +.clear { + clear: both; +} + +code { + line-height: 2em; +} + +h2 { + line-height: 2em; +} + +@media (min-width: 767px) and (max-width: 979px) { + + .headline h1 { + font-size: 65px; + } + + .container-fluid footer { + padding-left: 0px; + border-top: 1px solid #e5e5e5; + } +} +@media (max-width: 767px) { + + .headline h1 { + font-size: 60px; + } + + .container-fluid footer { + padding-left: 0px; + border-top: 1px solid #e5e5e5; + } +} +@media (max-width: 480px) { + body { + background: none; + } + + .headline { + padding: 0; + } + .headline h1 { + line-height: 60px; + padding-top: 85px; + font-size: 30px; + } + + .container-fluid footer { + padding-left: 0px; + border-top: 1px solid #e5e5e5; + } +} diff --git a/assets/javascripts/bootstrap.min.js b/assets/javascripts/bootstrap.min.js deleted file mode 100644 index f9cbdae..0000000 --- a/assets/javascripts/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -* Bootstrap.js by @fat & @mdo -* Copyright 2012 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('
    a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; -return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
    ",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) -}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b(" +
  • - +
  • This website was developed by -  Dragan Djuric.

    -

    Copyright © 2013-2016 Dragan Djuric

    +  Dragan Djuric.

    +

    Copyright © 2013-2016 Dragan Djuric

    diff --git a/_includes/head.html b/_includes/head.html index adbbd54..3445ef6 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -10,7 +10,7 @@ - +

    Fluokitten 0.6.1

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.6.1"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +Fluokitten 0.7.0

    Fluokitten 0.7.0

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.7.0"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
    @@ -8,7 +8,7 @@
     contain the implementations of the protocols, by default jvm.

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
    -run on JVM platform.

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
     You need to use or require this namespace and provide your implementations
     of these protocols if you want to extend Fluokitten with specific instances
     of categorical concepts beyond those from Clojure core that Fluokitten
    diff --git a/codox/uncomplicate.fluokitten.core.html b/codox/uncomplicate.fluokitten.core.html
    index 6fa666b..a23fdf4 100644
    --- a/codox/uncomplicate.fluokitten.core.html
    +++ b/codox/uncomplicate.fluokitten.core.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
    diff --git a/codox/uncomplicate.fluokitten.jvm.html b/codox/uncomplicate.fluokitten.jvm.html
    index aa13ab7..e5e5a80 100644
    --- a/codox/uncomplicate.fluokitten.jvm.html
    +++ b/codox/uncomplicate.fluokitten.jvm.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
    +uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
    -run on JVM platform.

    curried-arity

    (curried-arity cf)

    curried-curry

    (curried-curry cf)(curried-curry cf arity)

    curried-fapply

    (curried-fapply cf cg)(curried-fapply cf cg chs)

    curried-fmap

    (curried-fmap cf g)(curried-fmap cf g chs)

    curried-op

    (curried-op)(curried-op x)(curried-op x y)(curried-op x y z)(curried-op x y z w)(curried-op x y z w ws)

    curried-uncurry

    (curried-uncurry cf)

    fn-curry

    (fn-curry f)(fn-curry f arity)

    just-pure

    (just-pure x v)

    nil-fapply

    (nil-fapply _ _)(nil-fapply _ _ _)
    \ No newline at end of file +run on JVM platform.

    aget*

    macro

    (aget* atype a i)

    alength*

    macro

    (alength* atype a)

    alength**

    macro

    (alength** atype & as)

    array-copy

    macro

    (array-copy atype etype a b offset n)

    array-fapply

    macro

    (array-fapply atype etype)(array-fapply atype etype eclass)(array-fapply atype etype res gs & as)

    array-fmap

    macro

    (array-fmap atype etype)(array-fmap atype etype eclass)(array-fmap atype etype res f & as)

    array-op

    macro

    (array-op atype etype eclass)

    array-pure

    macro

    (array-pure atype etype eclass)

    aset*

    macro

    (aset* atype a i etype v)

    curried-arity

    (curried-arity cf)

    curried-curry

    (curried-curry cf)(curried-curry cf arity)

    curried-fapply

    (curried-fapply cf cg)(curried-fapply cf cg chs)

    curried-fmap

    (curried-fmap cf g)(curried-fmap cf g chs)

    curried-op

    (curried-op)(curried-op x)(curried-op x y)(curried-op x y z)(curried-op x y z w)(curried-op x y z w ws)

    curried-uncurry

    (curried-uncurry cf)

    eval-fn

    macro

    (eval-fn atype f i & as)

    extend-array

    macro

    (extend-array t atype etype eclass)

    extend-num-array

    macro

    (extend-num-array t atype etype eclass)

    fn-curry

    (fn-curry f)(fn-curry f arity)

    just-pure

    (just-pure x v)

    nil-fapply

    (nil-fapply _ _)(nil-fapply _ _ _)

    num-array-bind

    (num-array-bind a g)(num-array-bind a g as)

    num-array-fold

    macro

    (num-array-fold atype etype)(num-array-fold atype etype f init a)

    num-array-foldmap

    macro

    (num-array-foldmap atype etype)(num-array-foldmap atype etype f g init & as)
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.protocols.html b/codox/uncomplicate.fluokitten.protocols.html index 573881e..9331da2 100644 --- a/codox/uncomplicate.fluokitten.protocols.html +++ b/codox/uncomplicate.fluokitten.protocols.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
    +uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
     You need to use or require this namespace and provide your implementations
     of these protocols if you want to extend Fluokitten with specific instances
     of categorical concepts beyond those from Clojure core that Fluokitten
    diff --git a/codox/uncomplicate.fluokitten.test.html b/codox/uncomplicate.fluokitten.test.html
    index 89975fd..e0f05b1 100644
    --- a/codox/uncomplicate.fluokitten.test.html
    +++ b/codox/uncomplicate.fluokitten.test.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
    +uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
     categorical concepts have to satisfy. You should use these tests
     to check if your implementations of clojure protocols are valid
     beyond what the compiler can assert.

    applicative-law1

    macro

    (applicative-law1 f x & xs)
    Generates a test that checks if the applicative functor x
    diff --git a/codox/uncomplicate.fluokitten.utils.html b/codox/uncomplicate.fluokitten.utils.html
    index 4ba357d..c2e37a3 100644
    --- a/codox/uncomplicate.fluokitten.utils.html
    +++ b/codox/uncomplicate.fluokitten.utils.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
    +uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
     

    deref?

    (deref? x)
    Checks whether x is dereferencible. On JVM it checks if it is
     an instance of clojure.lang.IDeref, on other platforms it may
     be implemented in a similar or a completely different way.

    get-context

    (get-context)

    realize

    (realize c cr)

    reducible

    (reducible c)
    Creates an identity reducible function from the collection c.
    
    From 5f194641444b2b1d87be452e82f2b245d8413f0c Mon Sep 17 00:00:00 2001
    From: Dragan Djuric 
    Date: Thu, 5 Jul 2018 23:38:16 +0200
    Subject: [PATCH 51/67] Add a couple of Fluokitten links to dragan.rocks.
    
    ---
     articles/guides.md | 5 +++++
     1 file changed, 5 insertions(+)
    
    diff --git a/articles/guides.md b/articles/guides.md
    index 011f0f0..8a71562 100644
    --- a/articles/guides.md
    +++ b/articles/guides.md
    @@ -26,6 +26,11 @@ Automatically generated reference API documentation.
     
     This guide explains in detail how various Clojure core artifacts (collections, functions, references, etc.) implement Fluokitten protocols (`Functor`, `Applicative`, `Monad`, `Monoid`, `Foldable` etc)
     
    +### [Map and Reduce Primitive Arrays Without Clojure Macros](https://dragan.rocks/articles/18/Fluokitten-070-map-reduce-primitive-arrays-without-macros)
    +
    +### [Fast Map and Reduce for Primitive Vectors](https://neanderthal.uncomplicate.org/articles/fast-map-and-reduce-for-primitive-vectors.html)
    +
    +
     ### [Implementing Fluokitten Protocols](/articles/implementing_protocols.html)
     
     This guide explains how you can make your own implementations of Fluokitten protocols.
    
    From cf04649103bdea55330cacb89b12f446de02bced Mon Sep 17 00:00:00 2001
    From: Dragan Djuric 
    Date: Sun, 8 Jul 2018 19:49:43 +0200
    Subject: [PATCH 52/67] Release 0.8.0.
    
    ---
     codox/index.html                             |  6 +++---
     codox/uncomplicate.fluokitten.core.html      | 10 ++++++----
     codox/uncomplicate.fluokitten.jvm.html       |  4 ++--
     codox/uncomplicate.fluokitten.protocols.html |  2 +-
     codox/uncomplicate.fluokitten.test.html      |  2 +-
     codox/uncomplicate.fluokitten.utils.html     |  2 +-
     6 files changed, 14 insertions(+), 12 deletions(-)
    
    diff --git a/codox/index.html b/codox/index.html
    index 47bd19e..c276d08 100644
    --- a/codox/index.html
    +++ b/codox/index.html
    @@ -1,14 +1,14 @@
     
    -Fluokitten 0.7.0

    Fluokitten 0.7.0

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.7.0"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +Fluokitten 0.8.0

    Fluokitten 0.8.0

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.8.0"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
     Intended use: use or require this namespace and other namespaces that
    -contain the implementations of the protocols, by default jvm.

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
    +contain the implementations of the protocols, by default jvm.

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
    -run on JVM platform.

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
     You need to use or require this namespace and provide your implementations
     of these protocols if you want to extend Fluokitten with specific instances
     of categorical concepts beyond those from Clojure core that Fluokitten
    diff --git a/codox/uncomplicate.fluokitten.core.html b/codox/uncomplicate.fluokitten.core.html
    index a23fdf4..8b78f59 100644
    --- a/codox/uncomplicate.fluokitten.core.html
    +++ b/codox/uncomplicate.fluokitten.core.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
    @@ -27,7 +27,8 @@
     
     bind maintains an implicit context, so >>= too supports
     functions that depend on it, such are return and unit.
    -

    arity

    (arity f)

    bind

    (bind f)(bind monadic f)(bind monadic monadic2 & args)
    Takes a value inside the context of a monad (monadic value)
    +

    arity

    (arity cf)
    The number of parameters that this function curries up to.
    +

    bind

    (bind f)(bind monadic f)(bind monadic monadic2 & args)
    Takes a value inside the context of a monad (monadic value)
     and a function f that takes a normal value (without the
     context) and produces the result inside of a context
     of the monadic type.
    @@ -132,7 +133,7 @@
     It is enough if the implementation of av can handle the similar
     context for af. For example, av could be a ref while ag is an atom,
     or av is a primitive array, while af is an array of function objects.
    -Be warned, Haskell people will complain mercilessly.

    fmap

    (fmap f functor)(fmap f)(fmap f functor & functors)
    Applies a function f to the value(s) inside functor's context
    +Be warned, Haskell people will complain mercilessly.

    fmap

    (fmap f functor)(fmap f functor & functors)(fmap f)
    Applies a function f to the value(s) inside functor's context
     while preserving the context. More about Functors can be found
     in the doc for uncomplicate.fluokitten.protocols/Functor.
     
    @@ -191,7 +192,7 @@
     ---- Example 3: lifting a function
     ((fmap str) [1 2 3])
     => ["1" "2" "3"]
    -

    fmap!

    (fmap! f x)(fmap! f x y)(fmap! f x y z)(fmap! f x y z w)(fmap! f x y z w & ws)
    Impure, possibly destructive, version of fmap.
    +

    fmap!

    (fmap! f x)(fmap! f x y)(fmap! f x y z)(fmap! f x y z w)(fmap! f x y z w & ws)(fmap! f)
    Impure, possibly destructive, version of fmap.
     Typically reuses the argument functor for the result.
     Convenient for functors such as Java arrays,
     primitive vectors, matrices, etc.
    @@ -365,5 +366,6 @@
     (with-context []
       (return 1 2 3))
     => [1 2 3]
    +

    uncurry

    (uncurry cf)
    The original function that has been curried.
     

    unit

    The same as return.
     
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.jvm.html b/codox/uncomplicate.fluokitten.jvm.html index e5e5a80..db6e84d 100644 --- a/codox/uncomplicate.fluokitten.jvm.html +++ b/codox/uncomplicate.fluokitten.jvm.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
    +uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
    -run on JVM platform.

    aget*

    macro

    (aget* atype a i)

    alength*

    macro

    (alength* atype a)

    alength**

    macro

    (alength** atype & as)

    array-copy

    macro

    (array-copy atype etype a b offset n)

    array-fapply

    macro

    (array-fapply atype etype)(array-fapply atype etype eclass)(array-fapply atype etype res gs & as)

    array-fmap

    macro

    (array-fmap atype etype)(array-fmap atype etype eclass)(array-fmap atype etype res f & as)

    array-op

    macro

    (array-op atype etype eclass)

    array-pure

    macro

    (array-pure atype etype eclass)

    aset*

    macro

    (aset* atype a i etype v)

    curried-arity

    (curried-arity cf)

    curried-curry

    (curried-curry cf)(curried-curry cf arity)

    curried-fapply

    (curried-fapply cf cg)(curried-fapply cf cg chs)

    curried-fmap

    (curried-fmap cf g)(curried-fmap cf g chs)

    curried-op

    (curried-op)(curried-op x)(curried-op x y)(curried-op x y z)(curried-op x y z w)(curried-op x y z w ws)

    curried-uncurry

    (curried-uncurry cf)

    eval-fn

    macro

    (eval-fn atype f i & as)

    extend-array

    macro

    (extend-array t atype etype eclass)

    extend-num-array

    macro

    (extend-num-array t atype etype eclass)

    fn-curry

    (fn-curry f)(fn-curry f arity)

    just-pure

    (just-pure x v)

    nil-fapply

    (nil-fapply _ _)(nil-fapply _ _ _)

    num-array-bind

    (num-array-bind a g)(num-array-bind a g as)

    num-array-fold

    macro

    (num-array-fold atype etype)(num-array-fold atype etype f init a)

    num-array-foldmap

    macro

    (num-array-foldmap atype etype)(num-array-foldmap atype etype f g init & as)
    \ No newline at end of file +run on JVM platform.

    aget*

    macro

    (aget* atype a i)

    alength*

    macro

    (alength* atype a)

    alength**

    macro

    (alength** atype & as)

    array-copy

    macro

    (array-copy atype etype a b offset n)

    array-fapply

    macro

    (array-fapply atype etype)(array-fapply atype etype eclass)(array-fapply atype etype res gs & as)

    array-fmap

    macro

    (array-fmap atype etype)(array-fmap atype etype eclass)(array-fmap atype etype res f & as)

    array-op

    macro

    (array-op atype etype eclass)

    array-pure

    macro

    (array-pure atype etype eclass)

    aset*

    macro

    (aset* atype a i etype v)

    create-curried

    (create-curried f arity)

    curried-constructor

    (curried-constructor arity)

    curried-fapply

    (curried-fapply cf cg)(curried-fapply cf cg chs)

    curried-fmap

    (curried-fmap cf g)(curried-fmap cf g chs)

    curried-op

    (curried-op)(curried-op x)(curried-op x y)(curried-op x y z)(curried-op x y z w)(curried-op x y z w ws)

    eval-fn

    macro

    (eval-fn atype f i & as)

    extend-array

    macro

    (extend-array t atype etype eclass)

    extend-num-array

    macro

    (extend-num-array t atype etype eclass)

    fn-curry

    (fn-curry f)(fn-curry f arity)

    just-pure

    (just-pure x v)

    nil-fapply

    (nil-fapply _ _)(nil-fapply _ _ _)

    num-array-bind

    (num-array-bind a g)(num-array-bind a g as)

    num-array-fold

    macro

    (num-array-fold atype etype)(num-array-fold atype etype f init a)

    num-array-foldmap

    macro

    (num-array-foldmap atype etype)(num-array-foldmap atype etype f g init & as)
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.protocols.html b/codox/uncomplicate.fluokitten.protocols.html index 9331da2..ee27f1c 100644 --- a/codox/uncomplicate.fluokitten.protocols.html +++ b/codox/uncomplicate.fluokitten.protocols.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
    +uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
     You need to use or require this namespace and provide your implementations
     of these protocols if you want to extend Fluokitten with specific instances
     of categorical concepts beyond those from Clojure core that Fluokitten
    diff --git a/codox/uncomplicate.fluokitten.test.html b/codox/uncomplicate.fluokitten.test.html
    index e0f05b1..0c6d53a 100644
    --- a/codox/uncomplicate.fluokitten.test.html
    +++ b/codox/uncomplicate.fluokitten.test.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
    +uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
     categorical concepts have to satisfy. You should use these tests
     to check if your implementations of clojure protocols are valid
     beyond what the compiler can assert.

    applicative-law1

    macro

    (applicative-law1 f x & xs)
    Generates a test that checks if the applicative functor x
    diff --git a/codox/uncomplicate.fluokitten.utils.html b/codox/uncomplicate.fluokitten.utils.html
    index c2e37a3..52129de 100644
    --- a/codox/uncomplicate.fluokitten.utils.html
    +++ b/codox/uncomplicate.fluokitten.utils.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
    +uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
     

    deref?

    (deref? x)
    Checks whether x is dereferencible. On JVM it checks if it is
     an instance of clojure.lang.IDeref, on other platforms it may
     be implemented in a similar or a completely different way.

    get-context

    (get-context)

    realize

    (realize c cr)

    reducible

    (reducible c)
    Creates an identity reducible function from the collection c.
    
    From 41b2c3ea484c876cd9bb54a2ce54a8621c8665de Mon Sep 17 00:00:00 2001
    From: Dragan Djuric 
    Date: Sun, 8 Jul 2018 19:51:55 +0200
    Subject: [PATCH 53/67] Added link to the currying article to the guides page.
    
    ---
     articles/guides.md | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/articles/guides.md b/articles/guides.md
    index 8a71562..85ab5a7 100644
    --- a/articles/guides.md
    +++ b/articles/guides.md
    @@ -30,6 +30,8 @@ This guide explains in detail how various Clojure core artifacts (collections, f
     
     ### [Fast Map and Reduce for Primitive Vectors](https://neanderthal.uncomplicate.org/articles/fast-map-and-reduce-for-primitive-vectors.html)
     
    +### [Fast Function Currying in Clojure (Without Macros)](https://dragan.rocks/articles/18/Fluokitten-080-Fast-function-currying-in-Clojure)
    +
     
     ### [Implementing Fluokitten Protocols](/articles/implementing_protocols.html)
     
    
    From 3c2475112d82c0a5e75ad70c0ccc56d09db6beae Mon Sep 17 00:00:00 2001
    From: paullucas 
    Date: Sun, 8 Jul 2018 20:41:10 -0700
    Subject: [PATCH 54/67] Update getting_started.md
    
    ---
     articles/getting_started.md | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/articles/getting_started.md b/articles/getting_started.md
    index c9bb737..9a59186 100644
    --- a/articles/getting_started.md
    +++ b/articles/getting_started.md
    @@ -132,7 +132,7 @@ The core monad function is `bind`, and in the case of vector, it is trivially us
     ;=> [2 0 3 1 4 2]
     ```
     
    -If the function produces minimal context, it does even need to know which context it is. The return function is going to create the right context for the value, in this case atom.
    +If the function produces minimal context, it does not need to know which context it is. The return function is going to create the right context for the value, in this case atom.
     
     ```clojure
     (bind (atom 1) (comp return inc))
    @@ -183,7 +183,7 @@ With more than one value though, fold aggregates. If the data are subject to a m
     ;=> 31
     ```
     
    -Fold is similar to Clojure's reduce, but more powerful. It can work without explicitly supplied function, and it can acept multiple foldables. If you need to transform entries before folding, there is the `foldmap` function:
    +Fold is similar to Clojure's reduce, but more powerful. It can work without explicitly supplied function, and it can accept multiple foldables. If you need to transform entries before folding, there is the `foldmap` function:
     
     ``` clojure
     
    
    From 4c8aea2a3fe7f8a17c4f2108673dcd39d75f5b2e Mon Sep 17 00:00:00 2001
    From: paullucas 
    Date: Sun, 8 Jul 2018 21:12:00 -0700
    Subject: [PATCH 55/67] Update functors_applicatives_monads_in_pictures.md
    
    ---
     articles/functors_applicatives_monads_in_pictures.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/articles/functors_applicatives_monads_in_pictures.md b/articles/functors_applicatives_monads_in_pictures.md
    index 4f59a91..e8c91c7 100644
    --- a/articles/functors_applicatives_monads_in_pictures.md
    +++ b/articles/functors_applicatives_monads_in_pictures.md
    @@ -99,7 +99,7 @@ And, let's see a slightly more complex box - Clojure vector:
     Functions are functors, too:
     
     ```clojure
    -(def foo (fmap (partial + 3) (partial + 2))
    +(def foo (fmap (partial + 3) (partial + 2)))
     
     (foo 10)
     ;=> 15)
    
    From cf048659d823097c12d4b0d0a3da777ce2147bb8 Mon Sep 17 00:00:00 2001
    From: paullucas 
    Date: Sun, 8 Jul 2018 21:17:03 -0700
    Subject: [PATCH 56/67] Update functors_applicatives_monads_in_pictures.md
    
    ---
     articles/functors_applicatives_monads_in_pictures.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/articles/functors_applicatives_monads_in_pictures.md b/articles/functors_applicatives_monads_in_pictures.md
    index e8c91c7..29f827d 100644
    --- a/articles/functors_applicatives_monads_in_pictures.md
    +++ b/articles/functors_applicatives_monads_in_pictures.md
    @@ -110,7 +110,7 @@ Functions are functors, too:
     A slightly more powerful kind of box is a box that can accept function(s) to be applied not only bare, but also boxed. Every box that can be applicative can also be a functor.
     
     ```clojure
    -(def add3 (partial + 3)
    +(def add3 (partial + 3))
     
     (just add3)
     ;=> (just add3)
    
    From cf0d6a85660a621ee6e1db2c500031846060c775 Mon Sep 17 00:00:00 2001
    From: Dragan Djuric 
    Date: Tue, 24 Jul 2018 00:08:06 +0200
    Subject: [PATCH 57/67] Release 0.9.0.
    
    ---
     codox/index.html                             |  8 +++----
     codox/uncomplicate.fluokitten.core.html      | 24 ++++++++++++++++----
     codox/uncomplicate.fluokitten.jvm.html       |  2 +-
     codox/uncomplicate.fluokitten.protocols.html | 24 ++++++++++++++++----
     codox/uncomplicate.fluokitten.test.html      |  4 ++--
     codox/uncomplicate.fluokitten.utils.html     |  2 +-
     6 files changed, 47 insertions(+), 17 deletions(-)
    
    diff --git a/codox/index.html b/codox/index.html
    index c276d08..a4d817d 100644
    --- a/codox/index.html
    +++ b/codox/index.html
    @@ -1,11 +1,11 @@
     
    -Fluokitten 0.8.0

    Fluokitten 0.8.0

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.8.0"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +Fluokitten 0.9.0

    Fluokitten 0.9.0

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.9.0"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
     Intended use: use or require this namespace and other namespaces that
    -contain the implementations of the protocols, by default jvm.

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
    +contain the implementations of the protocols, by default jvm.

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
     run on JVM platform.

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
    @@ -16,7 +16,7 @@
     to use or require the namespace where you define the implementations
     from the calling code's namespace, as well as to use or require Fluokitten
     core. Your implementations are normally not called directly from the client
    -code. The client code should call the generic functions from Fluokitten core.

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
    +code. The client code should call the generic functions from Fluokitten core.

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
     categorical concepts have to satisfy. You should use these tests
     to check if your implementations of clojure protocols are valid
    -beyond what the compiler can assert.
    \ No newline at end of file +beyond what the compiler can assert.
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.core.html b/codox/uncomplicate.fluokitten.core.html index 8b78f59..ce2b8b9 100644 --- a/codox/uncomplicate.fluokitten.core.html +++ b/codox/uncomplicate.fluokitten.core.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
    @@ -12,11 +12,18 @@
     If only two arguments are supplied, it is equivalent to fapply.
     When called with one argument, creates a function
     that can accept the rest of the arguments and apply <*>.
    +

    <<=

    (<<= wa)(<<= wa g)(<<= wa wb & args)
    Performs a right-associative unbind on its arguments. It always uses a two-argument unbind.
     

    <=<

    (<=< f)(<=< f g)(<=< f g & hs)
    Composes monadic functions from right to left, same as comp,
     in the reverse order than >=>.
    +

    =<<

    (=<< f)(=<< f monadic)(=<< f g & args)
    Flipped >>=. Performs a right-associative bind on its arguments.
    +

    =>>

    (=>> g)(=>> g wa)(=>> g wa & was)
    Performs a left-associative unbind on its arguments. It always uses a two-argument unbind.
    +
    +If only two arguments are supplied, it is equivalent to unbind.
    +When called with one argument, creates a function that can accept the rest of the arguments
    +and apply =>>.
     

    >=>

    (>=> f)(>=> f g)(>=> f g & hs)
    Composes monadic functions from left to right, in the reverse
     order from comp. The composed functions threads the calls
    -through >>=.
    +through >>=. Pronounced 'fish'.
     

    >>=

    (>>= monadic)(>>= monadic f)(>>= monadic f & fs)
    Performs a Haskell-style left-associative bind
     on its arguments. (>>= f g h) is equivalent to
     (bind (bind f g) h). It always uses a two-argument bind.
    @@ -28,7 +35,7 @@
     bind maintains an implicit context, so >>= too supports
     functions that depend on it, such are return and unit.
     

    arity

    (arity cf)
    The number of parameters that this function curries up to.
    -

    bind

    (bind f)(bind monadic f)(bind monadic monadic2 & args)
    Takes a value inside the context of a monad (monadic value)
    +

    bind

    (bind monadic)(bind monadic f)(bind monadic monadic2 & args)
    Takes a value inside the context of a monad (monadic value)
     and a function f that takes a normal value (without the
     context) and produces the result inside of a context
     of the monadic type.
    @@ -67,7 +74,7 @@
     ---- Example with atoms:
     (bind (atom 1) (comp atom inc))
     => #<Atom: 2>
    -

    bind!

    (bind! f)(bind! monadic f)(bind! monadic monadic2 & args)
    An impure, heretic variant of bind that sacrifices kittens to C++ gods.
    +

    bind!

    (bind! monadic)(bind! monadic f)(bind! monadic monadic2 & args)
    An impure, heretic variant of bind that sacrifices kittens to C++ gods.
     

    curry

    (curry f)(curry f arity)
    Creates an automatically curried version of the function f.
     If arity is supplied, the function will be automatically
     curried when called with less arguments. If arity is not
    @@ -84,6 +91,11 @@
     
     ((curry +) 3 5 7)
     => 15
    +

    extract

    (extract wa)
    Dual of pure. Extracts the first available value out of context.
    +
    +---- Example 1: extracting a number from a vector context.
    +(extract [1 2 3])
    +=> 1
     

    fapply

    (fapply af)(fapply af av)(fapply af av & avs)
    Applies the function(s) inside af's context to the value(s)
     inside av's context while preserving the context. Both contexts
     should be of the same (or compatible) type, and the type of
    @@ -366,6 +378,10 @@
     (with-context []
       (return 1 2 3))
     => [1 2 3]
    +

    unbind

    (unbind g)(unbind g wa)(unbind g wa was)
    Dual of bind. Function g have opposite types of arguments than the one used in bind.
    +Monadic value is the input, and naked value the output.
    +

    unbind!

    (unbind! g)(unbind! g wa)(unbind! g wa was)
    Dual of bind!. Function g have opposite types of arguments than the one used in bind.
    +Monadic value is the input, and naked value the output.
     

    uncurry

    (uncurry cf)
    The original function that has been curried.
     

    unit

    The same as return.
     
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.jvm.html b/codox/uncomplicate.fluokitten.jvm.html index db6e84d..a5a3461 100644 --- a/codox/uncomplicate.fluokitten.jvm.html +++ b/codox/uncomplicate.fluokitten.jvm.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
    +uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
     run on JVM platform.

    aget*

    macro

    (aget* atype a i)

    alength*

    macro

    (alength* atype a)

    alength**

    macro

    (alength** atype & as)

    array-copy

    macro

    (array-copy atype etype a b offset n)

    array-fapply

    macro

    (array-fapply atype etype)(array-fapply atype etype eclass)(array-fapply atype etype res gs & as)

    array-fmap

    macro

    (array-fmap atype etype)(array-fmap atype etype eclass)(array-fmap atype etype res f & as)

    array-op

    macro

    (array-op atype etype eclass)

    array-pure

    macro

    (array-pure atype etype eclass)

    aset*

    macro

    (aset* atype a i etype v)

    create-curried

    (create-curried f arity)

    curried-constructor

    (curried-constructor arity)

    curried-fapply

    (curried-fapply cf cg)(curried-fapply cf cg chs)

    curried-fmap

    (curried-fmap cf g)(curried-fmap cf g chs)

    curried-op

    (curried-op)(curried-op x)(curried-op x y)(curried-op x y z)(curried-op x y z w)(curried-op x y z w ws)

    eval-fn

    macro

    (eval-fn atype f i & as)

    extend-array

    macro

    (extend-array t atype etype eclass)

    extend-num-array

    macro

    (extend-num-array t atype etype eclass)

    fn-curry

    (fn-curry f)(fn-curry f arity)

    just-pure

    (just-pure x v)

    nil-fapply

    (nil-fapply _ _)(nil-fapply _ _ _)

    num-array-bind

    (num-array-bind a g)(num-array-bind a g as)

    num-array-fold

    macro

    (num-array-fold atype etype)(num-array-fold atype etype f init a)

    num-array-foldmap

    macro

    (num-array-foldmap atype etype)(num-array-foldmap atype etype f g init & as)
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.protocols.html b/codox/uncomplicate.fluokitten.protocols.html index ee27f1c..ec6df23 100644 --- a/codox/uncomplicate.fluokitten.protocols.html +++ b/codox/uncomplicate.fluokitten.protocols.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
    +uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
     You need to use or require this namespace and provide your implementations
     of these protocols if you want to extend Fluokitten with specific instances
     of categorical concepts beyond those from Clojure core that Fluokitten
    @@ -60,7 +60,19 @@
     the value a in the same type of context. a should be put
     in the most minimal context possible that has appropriate
     type. av is needed only for proper dispatching and is
    -not changed in any way.

    Curry

    protocol

    members

    arity

    (arity f)

    curry

    (curry f)(curry f arity)

    uncurry

    (uncurry f)

    Foldable

    protocol

    Foldable is an abstraction for a context (box, container,
    +not changed in any way.

    Comonad

    protocol

    Categorical dual of Monad. It is like Monad, but with all function arrows reversed.
    +While monads put things in context, comonads extract things from context.
    +
    +Everything in Comonad is a dual (reverse) of Monad.
    +extract is a dual of pure, and unbind of =<< (reversed bind).
    +

    members

    extract

    (extract wa)
    Takes the first available value out of context. Dual of pure.
    +

    unbind

    (unbind wa g)(unbind wa g was)
    Applies the function g to the value(s) inside wa's context.
    +Function g takes monadic values inside the context w, and produces the result without context.
    +If more comonadic values are supplied in a, uses them as arguments for a vararg g.
    +This method is intended to be used by fluokitten core's extend, not directly by clients.
    +The third argument, was, contains a sequence of all additional arguments, normally
    +supplied by core unbind's varargs (protocol methods do not support varargs).
    +

    Curry

    protocol

    members

    arity

    (arity f)

    curry

    (curry f)(curry f arity)

    uncurry

    (uncurry f)

    Foldable

    protocol

    Foldable is an abstraction for a context (box, container,
     computation) along with the ability to extract the summary
     value of its contents. Foldable implementations  do not
     have to implement other categorical protocols, although
    @@ -152,14 +164,14 @@
     (and optionally z, w, ...) into an element of the same type.
     When that function is called with no arguments, it should return
     the id element of the monoid (if the magma is also a Monoid).
    -

    Maybe

    protocol

    members

    value

    (value m)

    Monad

    protocol

    Monad is an abstraction for a context (box, container,
    +

    Maybe

    protocol

    members

    value

    (value m)

    Monad

    protocol

    Monad is an abstraction of a context (box, container,
     computation) along with the ability to apply a function
     that accepts the value without the context and produces
     the result in a context. The resulting context may be
     different than the starting context. While the main idea
     with functors and applicatives is modifying the values
     inside the context, monad is more oriented towards modifying
    -the context.  Every Monad should also implement
    +the context. Every Monad should also implement
     Applicative and Functor protocols, although this can not be
     automatically forced by Clojure compiler.
     
    @@ -182,7 +194,7 @@
     from the implementation of this protocol if needed from
     other methods.
     

    members

    bind

    (bind mv g)(bind mv g mvs)
    Applies the function g to the value(s) inside mv's context.
    -Function g produces the result inside with the context,
    +Function g produces the result inside altered context,
     in contrast to fmap where function g is expect to produce
     normal values. If more monadic values are supplied in a
     sequence mvs, uses them as arguments for a vararg g.
    @@ -215,6 +227,8 @@
     In a puritan sense, it is not an applicative functor, but it behaves in
     an analog way. Typical use case is fapply-ing a Java array and overwriting
     each element with the result of g.

    members

    fapply!

    (fapply! av ag)(fapply! av ag avs)
    An impure version of fapply.
    +

    PseudoComonad

    protocol

    Dirty variant of monad that may be destructively changed during the unbind! 
    +

    members

    unbind!

    (unbind! wa g)(unbind! wa g was)
    Impure variant of unbind.
     

    PseudoFunctor

    protocol

    A variant of Functor that may be changed during the fmap!.
     In a puritan sense, it is not a functor, but it behaves in
     the analog way as proper functors. Typical use case is
    diff --git a/codox/uncomplicate.fluokitten.test.html b/codox/uncomplicate.fluokitten.test.html
    index 0c6d53a..8d0313f 100644
    --- a/codox/uncomplicate.fluokitten.test.html
    +++ b/codox/uncomplicate.fluokitten.test.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
    +uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
     categorical concepts have to satisfy. You should use these tests
     to check if your implementations of clojure protocols are valid
     beyond what the compiler can assert.

    applicative-law1

    macro

    (applicative-law1 f x & xs)
    Generates a test that checks if the applicative functor x
    @@ -27,7 +27,7 @@
     

    check-eq

    (check-eq expected)(check-eq expected actual)
    Midje checker that check for the equality of contents in contexts such
     as references and reducibles.

    data-structures-should-preserve-metadata

    macro

    (data-structures-should-preserve-metadata f1 f2 builder x y)
    Generates the tests that check whether the implementations
     of functions defined in Fluokitten protocols that extend
    -Clojure core data structures preserve metadata.

    fapply-keeps-type

    macro

    (fapply-keeps-type f x & xs)
    Generates a test that checks if the applicative functor x's
    +Clojure core data structures preserve metadata.

    extract-is-dual-of-pure

    macro

    (extract-is-dual-of-pure m v)

    fapply-keeps-type

    macro

    (fapply-keeps-type f x & xs)
    Generates a test that checks if the applicative functor x's
     implementation of fapply keeps the type of x when the function
     inside f is applied to its content.

    fmap-keeps-type

    macro

    (fmap-keeps-type f x & xs)
    Generates a test that checks if the functor x's implementation of
     fmap keeps the type of x when f is applied to its content.

    functor-law2

    macro

    (functor-law2 f x)(functor-law2 f g x & xs)
    Generates a test that checks if the functor x satisfies
    diff --git a/codox/uncomplicate.fluokitten.utils.html b/codox/uncomplicate.fluokitten.utils.html
    index 52129de..2e267b9 100644
    --- a/codox/uncomplicate.fluokitten.utils.html
    +++ b/codox/uncomplicate.fluokitten.utils.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
    +uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
     

    deref?

    (deref? x)
    Checks whether x is dereferencible. On JVM it checks if it is
     an instance of clojure.lang.IDeref, on other platforms it may
     be implemented in a similar or a completely different way.

    get-context

    (get-context)

    realize

    (realize c cr)

    reducible

    (reducible c)
    Creates an identity reducible function from the collection c.
    
    From e7a909658aa06b0719e2395843fa9e1ca73cbf3a Mon Sep 17 00:00:00 2001
    From: Dragan Djuric 
    Date: Wed, 25 Jul 2018 10:16:50 +0200
    Subject: [PATCH 58/67] Fix the broken 3rd party link.
    
    ---
     articles/functors_applicatives_monads_in_pictures.md | 4 ++--
     articles/guides.md                                   | 2 +-
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/articles/functors_applicatives_monads_in_pictures.md b/articles/functors_applicatives_monads_in_pictures.md
    index 29f827d..ba83205 100644
    --- a/articles/functors_applicatives_monads_in_pictures.md
    +++ b/articles/functors_applicatives_monads_in_pictures.md
    @@ -3,9 +3,9 @@ title: "Fluokitten: Functors, Applicatives and Monads in Pictures - in Clojure"
     layout: article
     ---
     
    -This tutorial is a Clojure version of the article [Functors, Applicatives and Monads in Pictures](https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html). The original article was written in Haskell, and is an excellent introduction to the very basics of functors, applicatives, and monads. This article is not self-contained: it is ment to be read side-by-side with the [original article](https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html), and used as a commentary and reference for the Clojure version of the examples. Due to the differences in typing, data structures, support for varargs and currying, there are differences in how the concepts that the original article explains are implemented in Haskell and Clojure.
    +This tutorial is a Clojure version of the article [Functors, Applicatives and Monads in Pictures](https://web.archive.org/web/20180218211616/http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html). The original article was written in Haskell, and is an excellent introduction to the very basics of functors, applicatives, and monads. This article is not self-contained: it is ment to be read side-by-side with the [original article](https://web.archive.org/web/20180218211616/http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html), and used as a commentary and reference for the Clojure version of the examples. Due to the differences in typing, data structures, support for varargs and currying, there are differences in how the concepts that the original article explains are implemented in Haskell and Clojure.
     
    -To be able to follow this article, you'll have to have Clojure installed and Fluokitten library included as a dependency in your project, as described in [Getting Started Guide](/articles/getting_started.html). Obviously, you'll need a reasonable knowledge of Clojure (you don't have to be an expert, though), and being familiar with the basics of Haskell is helpful, but not a necessity. So, after checking out [Getting Started Guide](/articles/getting_started.html), start up Clojure REPL and open this article and the [original article](https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html) and we are ready to go.
    +To be able to follow this article, you'll have to have Clojure installed and Fluokitten library included as a dependency in your project, as described in [Getting Started Guide](/articles/getting_started.html). Obviously, you'll need a reasonable knowledge of Clojure (you don't have to be an expert, though), and being familiar with the basics of Haskell is helpful, but not a necessity. So, after checking out [Getting Started Guide](/articles/getting_started.html), start up Clojure REPL and open this article and the [original article](https://web.archive.org/web/20180218211616/http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html) and we are ready to go.
     
     The complete source code of the examples used in this article is available [here](https://github.com/uncomplicate/fluokitten/blob/master/test/uncomplicate/fluokitten/articles/functors_applicatives_monads_pictures_test.clj) in the form of [midje](https://github.com/marick/Midje) tests.
     
    diff --git a/articles/guides.md b/articles/guides.md
    index 85ab5a7..53ed1a5 100644
    --- a/articles/guides.md
    +++ b/articles/guides.md
    @@ -43,7 +43,7 @@ These are the learning resources available for free on the Web that we think are
     
     ### [Functors, Applicatives and Monads in Pictures](/articles/functors_applicatives_monads_in_pictures.html)
     
    -A Fluokitten version of an excellent visual introductory article [Functors, Applicatives and Monads in Pictures](https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html).
    +A Fluokitten version of an excellent visual introductory article [Functors, Applicatives and Monads in Pictures](https://web.archive.org/web/20180218211616/http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html).
     
     ### [Learn You a Haskell for Great Good](/articles/learnyouahaskell.html)
     
    
    From 838ec89bfe12cf6d378cc64cc227fa462d612119 Mon Sep 17 00:00:00 2001
    From: Dragan Djuric 
    Date: Thu, 18 Oct 2018 22:34:11 +0200
    Subject: [PATCH 59/67] Add Patreon.
    
    ---
     _includes/header.html | 3 +++
     index.html            | 2 ++
     2 files changed, 5 insertions(+)
    
    diff --git a/_includes/header.html b/_includes/header.html
    index 38616dc..91dd381 100644
    --- a/_includes/header.html
    +++ b/_includes/header.html
    @@ -12,6 +12,9 @@
             
    - From c09b545b251db853144ffd7d93c3e35e50275ea7 Mon Sep 17 00:00:00 2001 From: Dragan Djuric Date: Sat, 20 Jun 2020 23:32:40 +0200 Subject: [PATCH 64/67] Rearrange book links. --- index.html | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index d19e240..49dbed4 100644 --- a/index.html +++ b/index.html @@ -48,20 +48,14 @@

    Free and Open Source

    Browse the source code on GitHub

    Licensed under the Eclipse Public License, same as Clojure.

    -
    - - New book available for subscription. - + - From 1b6e5d66e03db314d5bd90d97cf5eeb4e3214f16 Mon Sep 17 00:00:00 2001 From: Dragan Djuric Date: Sun, 21 Jun 2020 02:39:55 +0200 Subject: [PATCH 65/67] Revert. --- index.html | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index 49dbed4..e9a830b 100644 --- a/index.html +++ b/index.html @@ -49,13 +49,8 @@

    Free and Open Source

    Licensed under the Eclipse Public License, same as Clojure.

    - - - -
    -
    - - - +

    Latest News

    +

    +

    Follow the news on the Uncomplicate mailing list or @Uncomplicateorg Twitter account.

    From faa559c9427cab754c5dbd5ede29b3e3bcacb857 Mon Sep 17 00:00:00 2001 From: Dragan Djuric Date: Tue, 6 Feb 2024 12:23:26 +0100 Subject: [PATCH 66/67] Release 0.9.2. --- codox/index.html | 2 +- codox/uncomplicate.fluokitten.core.html | 5 +++-- codox/uncomplicate.fluokitten.jvm.html | 2 +- codox/uncomplicate.fluokitten.protocols.html | 2 +- codox/uncomplicate.fluokitten.test.html | 2 +- codox/uncomplicate.fluokitten.utils.html | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/codox/index.html b/codox/index.html index a4d817d..8cf0972 100644 --- a/codox/index.html +++ b/codox/index.html @@ -1,6 +1,6 @@ -Fluokitten 0.9.0

    Fluokitten 0.9.0

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.9.0"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +Fluokitten 0.9.2

    Fluokitten 0.9.2

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.9.2"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
    diff --git a/codox/uncomplicate.fluokitten.core.html b/codox/uncomplicate.fluokitten.core.html
    index ce2b8b9..ee3f861 100644
    --- a/codox/uncomplicate.fluokitten.core.html
    +++ b/codox/uncomplicate.fluokitten.core.html
    @@ -1,11 +1,12 @@
     
    -uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
     Intended use: use or require this namespace and other namespaces that
    -contain the implementations of the protocols, by default jvm.

    <*>

    (<*> af)(<*> af av)(<*> af av & avs)
    Performs a Haskell-style left-associative fapply
    +contain the implementations of the protocols, by default jvm.
    +

    <*>

    (<*> af)(<*> af av)(<*> af av & avs)
    Performs a Haskell-style left-associative fapply
     on its arguments. (<*> f g h) is equivalent to
     (fapply (fapply f g) h). It always uses a two-argument fapply.
     
    diff --git a/codox/uncomplicate.fluokitten.jvm.html b/codox/uncomplicate.fluokitten.jvm.html
    index a5a3461..6067a51 100644
    --- a/codox/uncomplicate.fluokitten.jvm.html
    +++ b/codox/uncomplicate.fluokitten.jvm.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
    +uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
     run on JVM platform.

    aget*

    macro

    (aget* atype a i)

    alength*

    macro

    (alength* atype a)

    alength**

    macro

    (alength** atype & as)

    array-copy

    macro

    (array-copy atype etype a b offset n)

    array-fapply

    macro

    (array-fapply atype etype)(array-fapply atype etype eclass)(array-fapply atype etype res gs & as)

    array-fmap

    macro

    (array-fmap atype etype)(array-fmap atype etype eclass)(array-fmap atype etype res f & as)

    array-op

    macro

    (array-op atype etype eclass)

    array-pure

    macro

    (array-pure atype etype eclass)

    aset*

    macro

    (aset* atype a i etype v)

    create-curried

    (create-curried f arity)

    curried-constructor

    (curried-constructor arity)

    curried-fapply

    (curried-fapply cf cg)(curried-fapply cf cg chs)

    curried-fmap

    (curried-fmap cf g)(curried-fmap cf g chs)

    curried-op

    (curried-op)(curried-op x)(curried-op x y)(curried-op x y z)(curried-op x y z w)(curried-op x y z w ws)

    eval-fn

    macro

    (eval-fn atype f i & as)

    extend-array

    macro

    (extend-array t atype etype eclass)

    extend-num-array

    macro

    (extend-num-array t atype etype eclass)

    fn-curry

    (fn-curry f)(fn-curry f arity)

    just-pure

    (just-pure x v)

    nil-fapply

    (nil-fapply _ _)(nil-fapply _ _ _)

    num-array-bind

    (num-array-bind a g)(num-array-bind a g as)

    num-array-fold

    macro

    (num-array-fold atype etype)(num-array-fold atype etype f init a)

    num-array-foldmap

    macro

    (num-array-foldmap atype etype)(num-array-foldmap atype etype f g init & as)
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.protocols.html b/codox/uncomplicate.fluokitten.protocols.html index ec6df23..5f4f762 100644 --- a/codox/uncomplicate.fluokitten.protocols.html +++ b/codox/uncomplicate.fluokitten.protocols.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
    +uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
     You need to use or require this namespace and provide your implementations
     of these protocols if you want to extend Fluokitten with specific instances
     of categorical concepts beyond those from Clojure core that Fluokitten
    diff --git a/codox/uncomplicate.fluokitten.test.html b/codox/uncomplicate.fluokitten.test.html
    index 8d0313f..448b992 100644
    --- a/codox/uncomplicate.fluokitten.test.html
    +++ b/codox/uncomplicate.fluokitten.test.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
    +uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
     categorical concepts have to satisfy. You should use these tests
     to check if your implementations of clojure protocols are valid
     beyond what the compiler can assert.

    applicative-law1

    macro

    (applicative-law1 f x & xs)
    Generates a test that checks if the applicative functor x
    diff --git a/codox/uncomplicate.fluokitten.utils.html b/codox/uncomplicate.fluokitten.utils.html
    index 2e267b9..0188516 100644
    --- a/codox/uncomplicate.fluokitten.utils.html
    +++ b/codox/uncomplicate.fluokitten.utils.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
    +uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
     

    deref?

    (deref? x)
    Checks whether x is dereferencible. On JVM it checks if it is
     an instance of clojure.lang.IDeref, on other platforms it may
     be implemented in a similar or a completely different way.

    get-context

    (get-context)

    realize

    (realize c cr)

    reducible

    (reducible c)
    Creates an identity reducible function from the collection c.
    
    From d63d8f8fed0c90a38b8d00dd752d1a51b8970bce Mon Sep 17 00:00:00 2001
    From: Dragan Djuric 
    Date: Thu, 16 May 2024 13:16:37 +0200
    Subject: [PATCH 67/67] Release 0.10.0.
    
    ---
     codox/index.html                             | 2 +-
     codox/uncomplicate.fluokitten.core.html      | 2 +-
     codox/uncomplicate.fluokitten.jvm.html       | 2 +-
     codox/uncomplicate.fluokitten.protocols.html | 2 +-
     codox/uncomplicate.fluokitten.test.html      | 2 +-
     codox/uncomplicate.fluokitten.utils.html     | 2 +-
     6 files changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/codox/index.html b/codox/index.html
    index 8cf0972..a111dbe 100644
    --- a/codox/index.html
    +++ b/codox/index.html
    @@ -1,6 +1,6 @@
     
    -Fluokitten 0.9.2

    Fluokitten 0.9.2

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.9.2"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +Fluokitten 0.10.0

    Fluokitten 0.10.0

    Released under the Eclipse Public License

    Category theory concepts in Clojure - Functors, Applicatives, Monads, Monoids and more.

    Installation

    To install, add the following dependency to your project or build file:

    [uncomplicate/fluokitten "0.10.0"]

    Namespaces

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
    diff --git a/codox/uncomplicate.fluokitten.core.html b/codox/uncomplicate.fluokitten.core.html
    index ee3f861..ec6ea81 100644
    --- a/codox/uncomplicate.fluokitten.core.html
    +++ b/codox/uncomplicate.fluokitten.core.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
    +uncomplicate.fluokitten.core documentation

    uncomplicate.fluokitten.core

    Contains core Fluokitten categorical functions. This is the
     namespace that you want to use or require in your projects that use
     Fluokitten built-in functionality or the functionality of various other
     libraries that implement Fluokitten protocols.
    diff --git a/codox/uncomplicate.fluokitten.jvm.html b/codox/uncomplicate.fluokitten.jvm.html
    index 6067a51..aa7639e 100644
    --- a/codox/uncomplicate.fluokitten.jvm.html
    +++ b/codox/uncomplicate.fluokitten.jvm.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
    +uncomplicate.fluokitten.jvm documentation

    uncomplicate.fluokitten.jvm

    Extends Clojure core with the implementations of
     fluokitten protocols. Defines curried functions. Need to be
     used or required for enabling Fluokitten on projects that
     run on JVM platform.

    aget*

    macro

    (aget* atype a i)

    alength*

    macro

    (alength* atype a)

    alength**

    macro

    (alength** atype & as)

    array-copy

    macro

    (array-copy atype etype a b offset n)

    array-fapply

    macro

    (array-fapply atype etype)(array-fapply atype etype eclass)(array-fapply atype etype res gs & as)

    array-fmap

    macro

    (array-fmap atype etype)(array-fmap atype etype eclass)(array-fmap atype etype res f & as)

    array-op

    macro

    (array-op atype etype eclass)

    array-pure

    macro

    (array-pure atype etype eclass)

    aset*

    macro

    (aset* atype a i etype v)

    create-curried

    (create-curried f arity)

    curried-constructor

    (curried-constructor arity)

    curried-fapply

    (curried-fapply cf cg)(curried-fapply cf cg chs)

    curried-fmap

    (curried-fmap cf g)(curried-fmap cf g chs)

    curried-op

    (curried-op)(curried-op x)(curried-op x y)(curried-op x y z)(curried-op x y z w)(curried-op x y z w ws)

    eval-fn

    macro

    (eval-fn atype f i & as)

    extend-array

    macro

    (extend-array t atype etype eclass)

    extend-num-array

    macro

    (extend-num-array t atype etype eclass)

    fn-curry

    (fn-curry f)(fn-curry f arity)

    just-pure

    (just-pure x v)

    nil-fapply

    (nil-fapply _ _)(nil-fapply _ _ _)

    num-array-bind

    (num-array-bind a g)(num-array-bind a g as)

    num-array-fold

    macro

    (num-array-fold atype etype)(num-array-fold atype etype f init a)

    num-array-foldmap

    macro

    (num-array-foldmap atype etype)(num-array-foldmap atype etype f g init & as)
    \ No newline at end of file diff --git a/codox/uncomplicate.fluokitten.protocols.html b/codox/uncomplicate.fluokitten.protocols.html index 5f4f762..8cc897f 100644 --- a/codox/uncomplicate.fluokitten.protocols.html +++ b/codox/uncomplicate.fluokitten.protocols.html @@ -1,6 +1,6 @@ -uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
    +uncomplicate.fluokitten.protocols documentation

    uncomplicate.fluokitten.protocols

    Defines Fluokitten protocols for various categorical concepts.
     You need to use or require this namespace and provide your implementations
     of these protocols if you want to extend Fluokitten with specific instances
     of categorical concepts beyond those from Clojure core that Fluokitten
    diff --git a/codox/uncomplicate.fluokitten.test.html b/codox/uncomplicate.fluokitten.test.html
    index 448b992..2948e42 100644
    --- a/codox/uncomplicate.fluokitten.test.html
    +++ b/codox/uncomplicate.fluokitten.test.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
    +uncomplicate.fluokitten.test documentation

    uncomplicate.fluokitten.test

    Macros that generate Midje tests for various laws that
     categorical concepts have to satisfy. You should use these tests
     to check if your implementations of clojure protocols are valid
     beyond what the compiler can assert.

    applicative-law1

    macro

    (applicative-law1 f x & xs)
    Generates a test that checks if the applicative functor x
    diff --git a/codox/uncomplicate.fluokitten.utils.html b/codox/uncomplicate.fluokitten.utils.html
    index 0188516..f5ed5da 100644
    --- a/codox/uncomplicate.fluokitten.utils.html
    +++ b/codox/uncomplicate.fluokitten.utils.html
    @@ -1,6 +1,6 @@
     
    -uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
    +uncomplicate.fluokitten.utils documentation

    uncomplicate.fluokitten.utils

    TODO
     

    deref?

    (deref? x)
    Checks whether x is dereferencible. On JVM it checks if it is
     an instance of clojure.lang.IDeref, on other platforms it may
     be implemented in a similar or a completely different way.

    get-context

    (get-context)

    realize

    (realize c cr)

    reducible

    (reducible c)
    Creates an identity reducible function from the collection c.