summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis <dennis@kobert.dev>2022-09-08 16:14:30 +0200
committerDennis <dennis@kobert.dev>2022-09-08 16:14:30 +0200
commit3b142d88942757722fdbd7b7a027b30b00056903 (patch)
tree633bcb1e55448c733975ac8f63bcf35128ab2660
Initial commit
-rw-r--r--config.toml32
-rw-r--r--content/_index.md6
-rw-r--r--content/bridging_the_gap.md89
-rw-r--r--public/.gitkeep0
-rw-r--r--public/elasticlunr.min.js10
-rw-r--r--public/search_index.en.js1
-rw-r--r--public/site.css1
-rw-r--r--templates/base.html17
-rw-r--r--templates/blog-page.html9
-rw-r--r--templates/blog.html13
-rw-r--r--themes/after-dark/.gitignore2
-rw-r--r--themes/after-dark/LICENSE21
-rw-r--r--themes/after-dark/README.md87
-rw-r--r--themes/after-dark/config.toml19
-rw-r--r--themes/after-dark/content/_index.md3
-rw-r--r--themes/after-dark/content/some-article.md18
-rw-r--r--themes/after-dark/content/some-other-article.md19
-rw-r--r--themes/after-dark/netlify.toml8
-rw-r--r--themes/after-dark/sass/_theme.scss100
-rw-r--r--themes/after-dark/sass/_vendor.scss1002
-rw-r--r--themes/after-dark/sass/site.scss2
-rw-r--r--themes/after-dark/screenshot.pngbin0 -> 134161 bytes
-rw-r--r--themes/after-dark/static/.gitkeep0
-rw-r--r--themes/after-dark/templates/categories/list.html19
-rw-r--r--themes/after-dark/templates/categories/single.html14
-rw-r--r--themes/after-dark/templates/index.html68
-rw-r--r--themes/after-dark/templates/page.html54
-rw-r--r--themes/after-dark/templates/post_macros.html33
-rw-r--r--themes/after-dark/templates/tags/list.html17
-rw-r--r--themes/after-dark/templates/tags/single.html13
-rw-r--r--themes/after-dark/theme.toml18
31 files changed, 1695 insertions, 0 deletions
diff --git a/config.toml b/config.toml
new file mode 100644
index 0000000..a36c07d
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,32 @@
+# The URL the site will be built for
+base_url = "https://kobert.dev/blog"
+
+# Whether to automatically compile all Sass files in the sass directory
+compile_sass = true
+
+# Whether to build a search index to be used later on by a JavaScript library
+build_search_index = true
+
+theme = "after-dark"
+
+taxonomies = [
+ # You can enable/disable RSS
+ {name = "categories", feed = true},
+ {name = "tags", feed = true},
+]
+
+[markdown]
+# Whether to do syntax highlighting
+# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
+highlight_code = true
+
+[extra]
+# Put all your custom variables here
+author = "Dennis Kobert"
+
+after_dark_menu = [
+ {url = "$BASE_URL", name = "Home"},
+ {url = "$BASE_URL/categories", name = "Categories"},
+ {url = "$BASE_URL/tags", name = "Tags"},
+ {url = "https://kobert.dev", name = "Website"},
+]
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..4a1c79a
--- /dev/null
+++ b/content/_index.md
@@ -0,0 +1,6 @@
+ +++
+title = "List of blog posts"
+sort_by = "date"
+paginate_by = 5
+insert_anchor_links = "heading"
++++
diff --git a/content/bridging_the_gap.md b/content/bridging_the_gap.md
new file mode 100644
index 0000000..db61800
--- /dev/null
+++ b/content/bridging_the_gap.md
@@ -0,0 +1,89 @@
++++
+title = "On Briding the Gap"
+date = 2022-08-30
+
+[taxonomies]
+categories = ["Graphite"]
++++
+
+In our current node graph design there exist a sort of disconnect between our pure mathematical concept and, to be frank, reality.
+Let me start by introducing you to Graphene the node based "programming language" which constitutes the heart of the [Graphite Editor]("https://graphite.rs").
+<!-- more -->
+
+## Node based editing
+
+*If you already have experience with node based editing, feel free to jump to the [next section](#nodes-in-graphene)*
+
+Tradiditional graphic editors always limit themselves by the chosen layer of abstraction.
+Photoshop for example uses layers (images) which are composited on top of each other.
+For most usages, this is a good abstraction that fits the use case of image editing well, until it doesn't.
+Let's say you want to create a blur that is dependent on the average brightness of an input image, that is something that you can't easily represent using the layer abstraction.
+
+But someone already came up with a solution to that exact problem: node based editing.
+In node based editors, the smallest functional unit is called a `node`, in the context of image editing, you can for example think of and image node that outputs an image, a greyscale node that takes an image as input and outputs a greyscale version of the same image, etc.
+
+// insert example picture to illustrate this concept
+
+Node based editing is employed by lots of popular software such as blender, houdini, davinci resolve and many others, but not so much 2D image editors.
+// add Nuke and Natron as examples
+
+## Nodes in `Graphene`
+
+But even when designing a node based editor, you still have to choose a set of fundamental building blocks from which you build your application.
+One example would be the set of fundamental data types to build your application out of.
+And even the nodes themselves are limited in some way, often these node systems allow you to write custom code to extend the application with your own nodes, but you are still limited by the choice of data types and the `node-runtime`.
+The runtime describes the process through which data is passed from node to node and when nodes are scheduled for execution.
+
+Ideally, we'd like to:
+- **Choose a sensible level of abstraction.**<br>
+ This is mainly a question of granularity, let's illustrate this using childrens toys.
+ As a Kid I loved playing with LEGO bricks, they provide a fundamental building block from which you can construct pretty much everything you can imagine by combining small atomic units to build more complex structures.
+ Playmobil for example chooses a bigger level of abstraction, instead of a set of `composable` fundamental bulding blocks it uses people, trees, animals, houses, cars, etc.
+ This allows "user" to quickly get going and build a world, but it limits them as soon as they wan to build something that the playmobil company didn't forsee.
+ Building your own house would likely not be possible using playmobil but possible although labor intensive using LEGO.
+ It is of course always an option to 3D print your own parts (this would be akin to writing a custom node) but this process is labor intensive and the final part always kinda looks out of place if you don't use the same philosophy as the playmobil developers to design that part.<br>
+ So the goal of a good system is to both provide sufficiently small composable building blocks to allow you to build everything as well as providing sensible abstractions (groups/modules) to quickly get work done.
+ Programming languages had a very similar problem to solve, first there was machine code which made it possible to theoretically write every program imaginable, but for larger projects this was immensly labour intensive.
+ Hence so called higher level programming languages were created to combat this problem of scalability.
+ This brings us to a prime example for such a language: `Rust` provides so called zero cost abstractions, which brings us to the next point.
+
+- **Minimize overhead:**<br>
+ For reasons that warrent their own blog post, Graphite will need to squeeze out the last bit of performance, because every performance improvement directly impacts the user experiance.
+ To continue the analogy from before, lets talk about python, it provides great abstractions which allows fast prototyping and it is (for the most part) an interpreted language. This means that we need a runtime that keeps track of the current state and then reads the program line by line executing it along the way. This is very similar to how a human would read through a program while debugging.<br>
+ Manually piping the data to each functional unit comes with a runtime overhead which is one of the reasons why interpreted languages usually tend to be slower that compiled ones.
+ So ideally we could "compile" our network of useful abstract nodes to more fundamental execution units which no longer need a runtime to work.
+ Lets say you want to reenact a scene from a james bond movie in which 007 holds on to a rocket which accends into space. With Playmobil you would need to coulple the movement of your character to the movement of the rocket with two hands, whenever the rocket moves, you have to move the figure as well. If they were made out of lego, you could stick both parts to gether in order to couple their movement. To translate this terrible analogy into the real world this is the difference between manually passing the output of the image node to the input for the greyscale node or fusing image node and greyscale node into a single functional unit.
+
+This brings us to the current design envisioned for Graphene.
+We wanted ultimately build something that limits the user as little as possible while still providing sensible defaults to make it easier to get started.
+The solution to the first problem the solution was pretty simple, we just allow the usage of the entire rust type system as data and rust code to define nodes.
+Only a few core nodes should suffice to solve any computational problem by just combining these fundamental nodes, this can be achieved by implementing the lamda calculus using nodes an hence achieving Turing-completeness.
+(If you have no idea what those last two concepts where don't worry it's not required for understanding this article.)<br>
+Fundamentally we split the concept of a node graph in two parts, on the one hand, there is the so called `document graph` this provides the high level abstractions that user interacts with on a day to day basis, this is also where your image nodes, brush nodes, blur node etc. live.
+Each of the nodes in the document graph is then compiled to a set of fundamental nodes, that's what we call the protograph.
+
+// picture illustrating the transition from document graph to node graph
+
+This is analogous to how programming languages work, the document graph, which is bijective to what the user sees and interacts with in the editor, is equivalent to the syntax of a programming language.
+The protograph would then be the compiled result of our document graph syntax and represents the actual execution performed by the processing hardware.
+
+## Protograph
+Let's take a short detour and talk in more detail about this ominous protograph.
+While working on the fundamental design for the node graph, I studied some category theory with a [friend of mine](https://atomyka.com) using the excellent course [Category Theory for Programmers](https://www.youtube.com/watch?v=I8LbkfSSR58&list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_) by Bartosz Milewski and got hooked on functional programming concepts.
+There is is certain beauty in rigorously defining programming concepts from the ground up through math and abstract it to absurd levels.
+It definitely elevates computer science from being an engineering discipline to a more theoretical plane and at the same time grounds it in user chosen fundamental axioms.
+Instead of trying to form our programming languages and mental models to fit reality, we create our own system to describe computation from the ground up, which generally allows us much higher levels of abstraction.
+This mindset has been hugely influential in the conception of the graphene language.
+Every node in our protograph is just a quasi side effect free (=`pure`) function which allows us to employ extensive caching schemes and never recompute parts of a graph that we have already evaluated.
+
+These nodes are themselves just implemented as rust functions which means that we can actually translate a visual representation of a node graph into rust source code which can then be compiled into a single optimized binary.
+This has quite a few advantages, we don't have to implement our own type checking and the compiler can strip away all of our fancy abstractions and make them actually zero cost.
+
+However one fundamental constraint for the design of the node system is that it has to support real time updates, any delay between modification of the node graph and visual updates in the user interface should be imperceptible.
+Spinning up rustc every time the user adds a brush stroke is just not viable.
+But if we take a look at programming languages, this is already a solved problem: Wasm also consists of a "high level" level language that has to be executed with as little of a delay as possible and also as fast as possible.
+This is achieved by leveraging tiered compilation and initially just "interpreting" the binary and starting the compiler in the background to compute a more optimized binary that can be swapped out on the fly.
+We want to build something similar for graphite by using a mix of interpretation (executing instruction after instruction using a runtime to pass data from node to node)
+
+
+
diff --git a/public/.gitkeep b/public/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/public/.gitkeep
diff --git a/public/elasticlunr.min.js b/public/elasticlunr.min.js
new file mode 100644
index 0000000..79dad65
--- /dev/null
+++ b/public/elasticlunr.min.js
@@ -0,0 +1,10 @@
+/**
+ * elasticlunr - http://weixsong.github.io
+ * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6
+ *
+ * Copyright (C) 2017 Oliver Nightingale
+ * Copyright (C) 2017 Wei Song
+ * MIT Licensed
+ * @license
+ */
+!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u<s.length;u++){var a=s[u];r[a]=this.pipeline.run(t.tokenizer(e[a]))}var l={};for(var c in o){var d=r[c]||r.any;if(d){var f=this.fieldSearch(d,c,o),h=o[c].boost;for(var p in f)f[p]=f[p]*h;for(var p in f)p in l?l[p]+=f[p]:l[p]=f[p]}}var v,g=[];for(var p in l)v={ref:p,score:l[p]},this.documentStore.hasDoc(p)&&(v.doc=this.documentStore.getDoc(p)),g.push(v);return g.sort(function(e,t){return t.score-e.score}),g},t.Index.prototype.fieldSearch=function(e,t,n){var i=n[t].bool,o=n[t].expand,r=n[t].boost,s=null,u={};return 0!==r?(e.forEach(function(e){var n=[e];1==o&&(n=this.index[t].expandToken(e));var r={};n.forEach(function(n){var o=this.index[t].getDocs(n),a=this.idf(n,t);if(s&&"AND"==i){var l={};for(var c in s)c in o&&(l[c]=o[c]);o=l}n==e&&this.fieldSearchStats(u,n,o);for(var c in o){var d=this.index[t].getTermFrequency(n,c),f=this.documentStore.getFieldLength(c,t),h=1;0!=f&&(h=1/Math.sqrt(f));var p=1;n!=e&&(p=.15*(1-(n.length-e.length)/n.length));var v=d*a*h*p;c in r?r[c]+=v:r[c]=v}},this),s=this.mergeScores(s,r,i)},this),s=this.coordNorm(s,u,e.length)):void 0},t.Index.prototype.mergeScores=function(e,t,n){if(!e)return t;if("AND"==n){var i={};for(var o in t)o in e&&(i[o]=e[o]+t[o]);return i}for(var o in t)o in e?e[o]+=t[o]:e[o]=t[o];return e},t.Index.prototype.fieldSearchStats=function(e,t,n){for(var i in n)i in e?e[i].push(t):e[i]=[t]},t.Index.prototype.coordNorm=function(e,t,n){for(var i in e)if(i in t){var o=t[i].length;e[i]=e[i]*o/n}return e},t.Index.prototype.toJSON=function(){var e={};return this._fields.forEach(function(t){e[t]=this.index[t].toJSON()},this),{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),index:e,pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},t.DocumentStore=function(e){this._save=null===e||void 0===e?!0:e,this.docs={},this.docInfo={},this.length=0},t.DocumentStore.load=function(e){var t=new this;return t.length=e.length,t.docs=e.docs,t.docInfo=e.docInfo,t._save=e.save,t},t.DocumentStore.prototype.isDocStored=function(){return this._save},t.DocumentStore.prototype.addDoc=function(t,n){this.hasDoc(t)||this.length++,this.docs[t]=this._save===!0?e(n):null},t.DocumentStore.prototype.getDoc=function(e){return this.hasDoc(e)===!1?null:this.docs[e]},t.DocumentStore.prototype.hasDoc=function(e){return e in this.docs},t.DocumentStore.prototype.removeDoc=function(e){this.hasDoc(e)&&(delete this.docs[e],delete this.docInfo[e],this.length--)},t.DocumentStore.prototype.addFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&(this.docInfo[e]||(this.docInfo[e]={}),this.docInfo[e][t]=n)},t.DocumentStore.prototype.updateFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&this.addFieldLength(e,t,n)},t.DocumentStore.prototype.getFieldLength=function(e,t){return null===e||void 0===e?0:e in this.docs&&t in this.docInfo[e]?this.docInfo[e][t]:0},t.DocumentStore.prototype.toJSON=function(){return{docs:this.docs,docInfo:this.docInfo,length:this.length,save:this._save}},t.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,u="^("+o+")?"+r+o+"("+r+")?$",a="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,c=new RegExp(s),d=new RegExp(a),f=new RegExp(u),h=new RegExp(l),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,x=new RegExp("([^aeiouylsz])\\1$"),w=new RegExp("^"+o+i+"[^aeiouwxy]$"),I=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,D=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,_=/^(.+?)e$/,P=/ll$/,k=new RegExp("^"+o+i+"[^aeiouwxy]$"),z=function(n){var i,o,r,s,u,a,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,u=v,s.test(n)?n=n.replace(s,"$1$2"):u.test(n)&&(n=n.replace(u,"$1$2")),s=g,u=m,s.test(n)){var z=s.exec(n);s=c,s.test(z[1])&&(s=y,n=n.replace(s,""))}else if(u.test(n)){var z=u.exec(n);i=z[1],u=h,u.test(i)&&(n=i,u=S,a=x,l=w,u.test(n)?n+="e":a.test(n)?(s=y,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=I,s.test(n)){var z=s.exec(n);i=z[1],n=i+"i"}if(s=b,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+e[o])}if(s=E,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+t[o])}if(s=D,u=F,s.test(n)){var z=s.exec(n);i=z[1],s=d,s.test(i)&&(n=i)}else if(u.test(n)){var z=u.exec(n);i=z[1]+z[2],u=d,u.test(i)&&(n=i)}if(s=_,s.test(n)){var z=s.exec(n);i=z[1],s=d,u=f,a=k,(s.test(i)||u.test(i)&&!a.test(i))&&(n=i)}return s=P,u=d,s.test(n)&&u.test(n)&&(s=y,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return z}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==!0?e:void 0},t.clearStopWords=function(){t.stopWordFilter.stopWords={}},t.addStopWords=function(e){null!=e&&Array.isArray(e)!==!1&&e.forEach(function(e){t.stopWordFilter.stopWords[e]=!0},this)},t.resetStopWords=function(){t.stopWordFilter.stopWords=t.defaultStopWords},t.defaultStopWords={"":!0,a:!0,able:!0,about:!0,across:!0,after:!0,all:!0,almost:!0,also:!0,am:!0,among:!0,an:!0,and:!0,any:!0,are:!0,as:!0,at:!0,be:!0,because:!0,been:!0,but:!0,by:!0,can:!0,cannot:!0,could:!0,dear:!0,did:!0,"do":!0,does:!0,either:!0,"else":!0,ever:!0,every:!0,"for":!0,from:!0,get:!0,got:!0,had:!0,has:!0,have:!0,he:!0,her:!0,hers:!0,him:!0,his:!0,how:!0,however:!0,i:!0,"if":!0,"in":!0,into:!0,is:!0,it:!0,its:!0,just:!0,least:!0,let:!0,like:!0,likely:!0,may:!0,me:!0,might:!0,most:!0,must:!0,my:!0,neither:!0,no:!0,nor:!0,not:!0,of:!0,off:!0,often:!0,on:!0,only:!0,or:!0,other:!0,our:!0,own:!0,rather:!0,said:!0,say:!0,says:!0,she:!0,should:!0,since:!0,so:!0,some:!0,than:!0,that:!0,the:!0,their:!0,them:!0,then:!0,there:!0,these:!0,they:!0,"this":!0,tis:!0,to:!0,too:!0,twas:!0,us:!0,wants:!0,was:!0,we:!0,were:!0,what:!0,when:!0,where:!0,which:!0,"while":!0,who:!0,whom:!0,why:!0,will:!0,"with":!0,would:!0,yet:!0,you:!0,your:!0},t.stopWordFilter.stopWords=t.defaultStopWords,t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(e){if(null===e||void 0===e)throw new Error("token should not be undefined");return e.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.InvertedIndex=function(){this.root={docs:{},df:0}},t.InvertedIndex.load=function(e){var t=new this;return t.root=e.root,t},t.InvertedIndex.prototype.addToken=function(e,t,n){for(var n=n||this.root,i=0;i<=e.length-1;){var o=e[i];o in n||(n[o]={docs:{},df:0}),i+=1,n=n[o]}var r=t.ref;n.docs[r]?n.docs[r]={tf:t.tf}:(n.docs[r]={tf:t.tf},n.df+=1)},t.InvertedIndex.prototype.hasToken=function(e){if(!e)return!1;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return!1;t=t[e[n]]}return!0},t.InvertedIndex.prototype.getNode=function(e){if(!e)return null;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return null;t=t[e[n]]}return t},t.InvertedIndex.prototype.getDocs=function(e){var t=this.getNode(e);return null==t?{}:t.docs},t.InvertedIndex.prototype.getTermFrequency=function(e,t){var n=this.getNode(e);return null==n?0:t in n.docs?n.docs[t].tf:0},t.InvertedIndex.prototype.getDocFreq=function(e){var t=this.getNode(e);return null==t?0:t.df},t.InvertedIndex.prototype.removeToken=function(e,t){if(e){var n=this.getNode(e);null!=n&&t in n.docs&&(delete n.docs[t],n.df-=1)}},t.InvertedIndex.prototype.expandToken=function(e,t,n){if(null==e||""==e)return[];var t=t||[];if(void 0==n&&(n=this.getNode(e),null==n))return t;n.df>0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e<arguments.length;e++)t=arguments[e],~this.indexOf(t)||this.elements.splice(this.locationFor(t),0,t);this.length=this.elements.length},lunr.SortedSet.prototype.toArray=function(){return this.elements.slice()},lunr.SortedSet.prototype.map=function(e,t){return this.elements.map(e,t)},lunr.SortedSet.prototype.forEach=function(e,t){return this.elements.forEach(e,t)},lunr.SortedSet.prototype.indexOf=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]<u[i]?n++:s[n]>u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o<r.length;o++)i.add(r[o]);return i},lunr.SortedSet.prototype.toJSON=function(){return this.toArray()},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.elasticlunr=t()}(this,function(){return t})}();
diff --git a/public/search_index.en.js b/public/search_index.en.js
new file mode 100644
index 0000000..5958385
--- /dev/null
+++ b/public/search_index.en.js
@@ -0,0 +1 @@
+window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"7":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"2":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.605551275463989}},"df":1}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"d":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}},"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.6457513110645907}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"i":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"z":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.6457513110645907}},"df":1},"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}},"g":{"docs":{"http://127.0.0.1:1111/":{"tf":1.0},"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.4641016151377544}},"df":1}}},"l":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.8284271247461903}},"df":1}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"x":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.6457513110645907}},"df":1}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}}}}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1,"o":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}},"x":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.6457513110645907}},"df":1}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"w":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.3166247903554}},"df":1}}}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.4641016151377544}},"df":1,"e":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"/":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.4641016151377544}},"df":1,"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"'":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1},"u":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.4641016151377544}},"df":1}}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"'":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.8284271247461903}},"df":1},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}}},"n":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"v":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"k":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"n":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"s":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"x":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"f":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}},"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"x":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":6.6332495807108}},"df":1}}},"u":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1},"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1},"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.6457513110645907}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}},"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}}},"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}}}}}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}}}},"t":{"docs":{"http://127.0.0.1:1111/":{"tf":1.0},"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.4641016151377544}},"df":1,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}}}}},"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.6457513110645907}},"df":1}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1},"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.449489742783178}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}},"p":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"v":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}}}},"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"z":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"x":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"l":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"'":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}},"o":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1},"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}},"e":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"o":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}},"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.23606797749979}},"df":1}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":3.605551275463989}},"df":1,"a":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"e":{"docs":{},"df":0,"r":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.8284271247461903}},"df":1}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"m":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"y":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"e":{"docs":{},"df":0,"'":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":2.0}},"df":1},"l":{"docs":{},"df":0,"d":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"i":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.7320508075688772}},"df":1}}}}},"z":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.4142135623730951}},"df":1}}}}}},"title":{"root":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"http://127.0.0.1:1111/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"http://127.0.0.1:1111/bridging-the-gap/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://127.0.0.1:1111/":{"tf":1.0}},"df":1}}}}}}},"documentStore":{"save":true,"docs":{"http://127.0.0.1:1111/":{"body":"","id":"http://127.0.0.1:1111/","title":"List of blog posts"},"http://127.0.0.1:1111/bridging-the-gap/":{"body":"In our current node graph design there exist a sort of disconnect between our pure mathematical concept and, to be frank, reality.\nLet me start by introducing you to Graphene the node based \"programming language\" which constitutes the heart of the Graphite Editor.\nNode based editing\nIf you already have experience with node based editing, feel free to jump to the next section\nTradiditional graphic editors always limit themselves by the chosen layer of abstraction.\nPhotoshop for example uses layers (images) which are composited on top of each other.\nFor most usages, this is a good abstraction that fits the use case of image editing well, until it doesn't.\nLet's say you want to create a blur that is dependent on the average brightness of an input image, that is something that you can't easily represent using the layer abstraction.\nBut someone already came up with a solution to that exact problem: node based editing.\nIn node based editors, the smallest functional unit is called a node, in the context of image editing, you can for example think of and image node that outputs an image, a greyscale node that takes an image as input and outputs a greyscale version of the same image, etc.\n// insert example picture to illustrate this concept\nNode based editing is employed by lots of popular software such as blender, houdini, davinci resolve and many others, but not so much 2D image editors.\n// add Nuke and Natron as examples\nNodes in Graphene\nBut even when designing a node based editor, you still have to choose a set of fundamental building blocks from which you build your application.\nOne example would be the set of fundamental data types to build your application out of.\nAnd even the nodes themselves are limited in some way, often these node systems allow you to write custom code to extend the application with your own nodes, but you are still limited by the choice of data types and the node-runtime.\nThe runtime describes the process through which data is passed from node to node and when nodes are scheduled for execution.\nIdeally, we'd like to: \n\n\nChoose a sensible level of abstraction.\nThis is mainly a question of granularity, let's illustrate this using childrens toys.\nAs a Kid I loved playing with LEGO bricks, they provide a fundamental building block from which you can construct pretty much everything you can imagine by combining small atomic units to build more complex structures.\nPlaymobil for example chooses a bigger level of abstraction, instead of a set of composable fundamental bulding blocks it uses people, trees, animals, houses, cars, etc.\nThis allows \"user\" to quickly get going and build a world, but it limits them as soon as they wan to build something that the playmobil company didn't forsee.\nBuilding your own house would likely not be possible using playmobil but possible although labor intensive using LEGO.\nIt is of course always an option to 3D print your own parts (this would be akin to writing a custom node) but this process is labor intensive and the final part always kinda looks out of place if you don't use the same philosophy as the playmobil developers to design that part.\nSo the goal of a good system is to both provide sufficiently small composable building blocks to allow you to build everything as well as providing sensible abstractions (groups/modules) to quickly get work done.\nProgramming languages had a very similar problem to solve, first there was machine code which made it possible to theoretically write every program imaginable, but for larger projects this was immensly labour intensive.\nHence so called higher level programming languages were created to combat this problem of scalability.\nThis brings us to a prime example for such a language: Rust provides so called zero cost abstractions, which brings us to the next point.\n\n\nMinimize overhead:\nFor reasons that warrent their own blog post, Graphite will need to squeeze out the last bit of performance, because every performance improvement directly impacts the user experiance.\nTo continue the analogy from before, lets talk about python, it provides great abstractions which allows fast prototyping and it is (for the most part) an interpreted language. This means that we need a runtime that keeps track of the current state and then reads the program line by line executing it along the way. This is very similar to how a human would read through a program while debugging.\nManually piping the data to each functional unit comes with a runtime overhead which is one of the reasons why interpreted languages usually tend to be slower that compiled ones.\nSo ideally we could \"compile\" our network of useful abstract nodes to more fundamental execution units which no longer need a runtime to work.\nLets say you want to reenact a scene from a james bond movie in which 007 holds on to a rocket which accends into space. With Playmobil you would need to coulple the movement of your character to the movement of the rocket with two hands, whenever the rocket moves, you have to move the figure as well. If they were made out of lego, you could stick both parts to gether in order to couple their movement. To translate this terrible analogy into the real world this is the difference between manually passing the output of the image node to the input for the greyscale node or fusing image node and greyscale node into a single functional unit.\n\n\nThis brings us to the current design envisioned for Graphene.\nWe wanted ultimately build something that limits the user as little as possible while still providing sensible defaults to make it easier to get started.\nThe solution to the first problem the solution was pretty simple, we just allow the usage of the entire rust type system as data and rust code to define nodes.\nOnly a few core nodes should suffice to solve any computational problem by just combining these fundamental nodes, this can be achieved by implementing the lamda calculus using nodes an hence achieving Turing-completeness.\n(If you have no idea what those last two concepts where don't worry it's not required for understanding this article.)\nFundamentally we split the concept of a node graph in two parts, on the one hand, there is the so called document graph this provides the high level abstractions that user interacts with on a day to day basis, this is also where your image nodes, brush nodes, blur node etc. live.\nEach of the nodes in the document graph is then compiled to a set of fundamental nodes, that's what we call the protograph.\n// picture illustrating the transition from document graph to node graph\nThis is analogous to how programming languages work, the document graph, which is bijective to what the user sees and interacts with in the editor, is equivalent to the syntax of a programming language.\nThe protograph would then be the compiled result of our document graph syntax and represents the actual execution performed by the processing hardware.\nProtograph\nLet's take a short detour and talk in more detail about this ominous protograph.\nWhile working on the fundamental design for the node graph, I studied some category theory with a friend of mine using the excellent course Category Theory for Programmers by Bartosz Milewski and got hooked on functional programming concepts.\nThere is is certain beauty in rigorously defining programming concepts from the ground up through math and abstract it to absurd levels.\nIt definitely elevates computer science from being an engineering discipline to a more theoretical plane and at the same time grounds it in user chosen fundamental axioms.\nInstead of trying to form our programming languages and mental models to fit reality, we create our own system to describe computation from the ground up, which generally allows us much higher levels of abstraction.\nThis mindset has been hugely influential in the conception of the graphene language.\nEvery node in our protograph is just a quasi side effect free (=pure) function which allows us to employ extensive caching schemes and never recompute parts of a graph that we have already evaluated.\nThese nodes are themselves just implemented as rust functions which means that we can actually translate a visual representation of a node graph into rust source code which can then be compiled into a single optimized binary.\nThis has quite a few advantages, we don't have to implement our own type checking and the compiler can strip away all of our fancy abstractions and make them actually zero cost.\nHowever one fundamental constraint for the design of the node system is that it has to support real time updates, any delay between modification of the node graph and visual updates in the user interface should be imperceptible.\nSpinning up rustc every time the user adds a brush stroke is just not viable.\nBut if we take a look at programming languages, this is already a solved problem: Wasm also consists of a \"high level\" level language that has to be executed with as little of a delay as possible and also as fast as possible.\nThis is achieved by leveraging tiered compilation and initially just \"interpreting\" the binary and starting the compiler in the background to compute a more optimized binary that can be swapped out on the fly.\nWe want to build something similar for graphite by using a mix of interpretation (executing instruction after instruction using a runtime to pass data from node to node)\n","id":"http://127.0.0.1:1111/bridging-the-gap/","title":"On Briding the Gap"}},"docInfo":{"http://127.0.0.1:1111/":{"body":0,"title":3},"http://127.0.0.1:1111/bridging-the-gap/":{"body":890,"title":2}},"length":2},"lang":"English"}; \ No newline at end of file
diff --git a/public/site.css b/public/site.css
new file mode 100644
index 0000000..23ca4be
--- /dev/null
+++ b/public/site.css
@@ -0,0 +1 @@
+html{font-size:12px}*{box-sizing:border-box;text-rendering:geometricPrecision}body{font-size:1rem;line-height:1.5rem;margin:0;font-family:Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;word-wrap:break-word}h1,h2,h3,h4,h5,h6{line-height:1.3em}fieldset{border:none;padding:0;margin:0}pre{padding:2rem;margin:1.75rem 0;background-color:#fff;border:1px solid #ccc;overflow:auto}code[class*=language-],pre[class*=language-],pre code{font-weight:100;text-shadow:none;margin:1.75rem 0}a{cursor:pointer;color:#ff2e88;text-decoration:none;border-bottom:1px solid #ff2e88}a:hover{background-color:#ff2e88;color:#fff}.grid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.grid.\-top{-ms-flex-align:start;-ms-grid-row-align:flex-start;align-items:flex-start}.grid.\-middle{-ms-flex-align:center;-ms-grid-row-align:center;align-items:center}.grid.\-bottom{-ms-flex-align:end;-ms-grid-row-align:flex-end;align-items:flex-end}.grid.\-stretch{-ms-flex-align:stretch;-ms-grid-row-align:stretch;align-items:stretch}.grid.\-baseline{-ms-flex-align:baseline;-ms-grid-row-align:baseline;align-items:baseline}.grid.\-left{-ms-flex-pack:start;justify-content:flex-start}.grid.\-center{-ms-flex-pack:center;justify-content:center}.grid.\-right{-ms-flex-pack:end;justify-content:flex-end}.grid.\-between{-ms-flex-pack:justify;justify-content:space-between}.grid.\-around{-ms-flex-pack:distribute;justify-content:space-around}.cell{-ms-flex:1;flex:1;box-sizing:border-box}@media screen and (min-width: 768px){.cell.\-1of12{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%}.cell.\-2of12{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%}.cell.\-3of12{-ms-flex:0 0 25%;flex:0 0 25%}.cell.\-4of12{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%}.cell.\-5of12{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%}.cell.\-6of12{-ms-flex:0 0 50%;flex:0 0 50%}.cell.\-7of12{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%}.cell.\-8of12{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%}.cell.\-9of12{-ms-flex:0 0 75%;flex:0 0 75%}.cell.\-10of12{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%}.cell.\-11of12{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%}}@media screen and (max-width: 768px){.grid{-ms-flex-direction:column;flex-direction:column}.cell{-ms-flex:0 0 auto;flex:0 0 auto}}.hack,.hack blockquote,.hack code,.hack em,.hack h1,.hack h2,.hack h3,.hack h4,.hack h5,.hack h6,.hack strong{font-size:1rem;font-style:normal;font-family:Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif}.hack blockquote,.hack code,.hack em,.hack strong{line-height:20px}.hack em{color:#888;font-style:italic}.hack blockquote,.hack code,.hack footer,.hack h1,.hack h2,.hack h3,.hack h4,.hack h5,.hack h6,.hack header,.hack li,.hack ol,.hack p,.hack section,.hack ul{float:none;margin:0;padding:0}.hack header+article{margin-top:20px}.hack blockquote,.hack h1,.hack ol,.hack p,.hack ul{margin-top:20px;margin-bottom:20px}.hack h1{position:relative;display:inline-block;display:table-cell;padding:20px 0 30px;margin:0;overflow:hidden}.hack h1:after{content:"====================================================================================================";position:absolute;bottom:10px;left:0}.hack h1+*{margin-top:0}.hack h2,.hack h3,.hack h4,.hack h5,.hack h6{position:relative;margin-bottom:1.75rem}.hack h2:before,.hack h3:before,.hack h4:before,.hack h5:before,.hack h6:before{display:inline}.hack h2:before{content:"## "}.hack h3:before{content:"### "}.hack h4:before{content:"#### "}.hack h5:before{content:"##### "}.hack h6:before{content:"###### "}.hack li{position:relative;display:block;padding-left:20px}.hack li:after{position:absolute;top:0;left:0}.hack ul>li:after{content:"-"}.hack ol{counter-reset:a}.hack ol>li:after{content:counter(a) ".";counter-increment:a}.hack blockquote{position:relative;padding-left:17px;padding-left:2ch;overflow:hidden}.hack blockquote:after{content:">\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>";white-space:pre;position:absolute;top:0;left:0;line-height:20px}.hack em:after,.hack em:before{content:"*";display:inline}.hack pre code:after,.hack pre code:before{content:none}.hack code{font-weight:700}.hack code:after,.hack code:before{content:"`";display:inline}.hack hr{position:relative;height:20px;overflow:hidden;border:0;margin:20px 0}.hack hr:after{content:"----------------------------------------------------------------------------------------------------";position:absolute;top:0;left:0;line-height:20px;width:100%;word-wrap:break-word}@-moz-document url-prefix(){.hack h1{display:block}}.hack-ones ol>li:after{content:"1."}p{margin:0 0 1.75rem}.container{max-width:70rem}.container,.container-fluid{margin:0 auto;padding:0 1rem}.inner{padding:1rem}.inner2x{padding:2rem}.pull-left{float:left}.pull-right{float:right}.progress-bar{height:8px;opacity:.8;background-color:#ccc;margin-top:12px}.progress-bar.progress-bar-show-percent{margin-top:38px}.progress-bar-filled{background-color:gray;height:100%;transition:width .3s ease;position:relative;width:0}.progress-bar-filled:before{content:'';border:6px solid transparent;border-top-color:gray;position:absolute;top:-12px;right:-6px}.progress-bar-filled:after{color:gray;content:attr(data-filled);display:block;font-size:12px;white-space:nowrap;position:absolute;border:6px solid transparent;top:-38px;right:0;-ms-transform:translateX(50%);transform:translateX(50%)}table{width:100%;border-collapse:collapse;margin:1.75rem 0;color:#778087}table td,table th{vertical-align:top;border:1px solid #ccc;line-height:15px;padding:10px}table thead th{font-size:10px}table tbody td:first-child{font-weight:700;color:#333}.form{width:30rem}.form-group{margin-bottom:1.75rem;overflow:auto}.form-group label{border-bottom:2px solid #ccc;color:#333;width:10rem;display:inline-block;height:38px;line-height:38px;padding:0;float:left;position:relative}.form-group.form-success label{color:#4caf50 !important;border-color:#4caf50 !important}.form-group.form-warning label{color:#ff9800 !important;border-color:#ff9800 !important}.form-group.form-error label{color:#f44336 !important;border-color:#f44336 !important}.form-control{outline:none;border:none;border-bottom:2px solid #ccc;padding:.5rem 0;width:20rem;height:38px;background-color:transparent}.form-control:focus{border-color:#555}.form-group.form-textarea label:after{position:absolute;content:'';width:2px;background-color:#fff;right:-2px;top:0;bottom:0}textarea.form-control{height:auto;resize:none;padding:1rem 0;border-bottom:2px solid #ccc;border-left:2px solid #ccc;padding:.5rem}select.form-control{border-radius:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none}.help-block{color:#999;margin-top:.5rem}.form-actions{margin-bottom:1.75rem}.btn{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;cursor:pointer;outline:none;padding:.65rem 2rem;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;z-index:1}.btn:active{box-shadow:inset 0 1px 3px rgba(0,0,0,0.12)}.btn.btn-ghost{border-color:#757575;color:#757575;background-color:transparent}.btn.btn-ghost:focus,.btn.btn-ghost:hover{border-color:#424242;color:#424242;z-index:2}.btn.btn-ghost:hover{background-color:transparent}.btn-block{width:100%;display:-ms-flexbox;display:flex}.btn-default{color:#fff;background-color:#e0e0e0;border:1px solid #e0e0e0;color:#333}.btn-default:focus:not(.btn-ghost),.btn-default:hover{background-color:#dcdcdc;border-color:#dcdcdc}.btn-success{color:#fff;background-color:#4caf50;border:1px solid #4caf50}.btn-success:focus:not(.btn-ghost),.btn-success:hover{background-color:#43a047;border-color:#43a047}.btn-success.btn-ghost{border-color:#4caf50;color:#4caf50}.btn-success.btn-ghost:focus,.btn-success.btn-ghost:hover{border-color:#388e3c;color:#388e3c;z-index:2}.btn-error{color:#fff;background-color:#f44336;border:1px solid #f44336}.btn-error:focus:not(.btn-ghost),.btn-error:hover{background-color:#e53935;border-color:#e53935}.btn-error.btn-ghost{border-color:#f44336;color:#f44336}.btn-error.btn-ghost:focus,.btn-error.btn-ghost:hover{border-color:#d32f2f;color:#d32f2f;z-index:2}.btn-warning{color:#fff;background-color:#ff9800;border:1px solid #ff9800}.btn-warning:focus:not(.btn-ghost),.btn-warning:hover{background-color:#fb8c00;border-color:#fb8c00}.btn-warning.btn-ghost{border-color:#ff9800;color:#ff9800}.btn-warning.btn-ghost:focus,.btn-warning.btn-ghost:hover{border-color:#f57c00;color:#f57c00;z-index:2}.btn-info{color:#fff;background-color:#00bcd4;border:1px solid #00bcd4}.btn-info:focus:not(.btn-ghost),.btn-info:hover{background-color:#00acc1;border-color:#00acc1}.btn-info.btn-ghost{border-color:#00bcd4;color:#00bcd4}.btn-info.btn-ghost:focus,.btn-info.btn-ghost:hover{border-color:#0097a7;color:#0097a7;z-index:2}.btn-primary{color:#fff;background-color:#2196f3;border:1px solid #2196f3}.btn-primary:focus:not(.btn-ghost),.btn-primary:hover{background-color:#1e88e5;border-color:#1e88e5}.btn-primary.btn-ghost{border-color:#2196f3;color:#2196f3}.btn-primary.btn-ghost:focus,.btn-primary.btn-ghost:hover{border-color:#1976d2;color:#1976d2;z-index:2}.btn-group{overflow:auto}.btn-group .btn{float:left}.btn-group .btn-ghost:not(:first-child){margin-left:-1px}.card{border:1px solid #ccc}.card .card-header{color:#333;text-align:center;background-color:#ddd;padding:.5rem 0}.alert{color:#ccc;padding:1rem;border:1px solid #ccc;margin-bottom:1.75rem}.alert-success{color:#4caf50;border-color:#4caf50}.alert-error{color:#f44336;border-color:#f44336}.alert-info{color:#00bcd4;border-color:#00bcd4}.alert-warning{color:#ff9800;border-color:#ff9800}.media:not(:last-child){margin-bottom:1.25rem}.media-left{padding-right:1rem}.media-left,.media-right{display:table-cell;vertical-align:top}.media-right{padding-left:1rem}.media-body{display:table-cell;vertical-align:top}.media-heading{font-size:1.16667rem;font-weight:700}.media-content{margin-top:.3rem}.avatarholder,.placeholder{background-color:#f0f0f0;text-align:center;color:#b9b9b9;font-size:1rem;border:1px solid #f0f0f0}.avatarholder{width:48px;height:48px;line-height:46px;font-size:2rem;background-size:cover;background-position:50%;background-repeat:no-repeat}.avatarholder.rounded{border-radius:33px}.loading{display:inline-block;content:'&nbsp;';height:20px;width:20px;margin:0 .5rem;animation:a .6s infinite linear;border:2px solid #e91e63;border-right-color:transparent;border-radius:50%}.btn .loading{margin-bottom:0;width:14px;height:14px}.btn div.loading{float:left}.alert .loading{margin-bottom:-5px}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.menu{width:100%}.menu .menu-item{display:block;color:#616161;border-color:#616161}.menu .menu-item.active,.menu .menu-item:hover{color:#000;border-color:#000;background-color:transparent}@media screen and (max-width: 768px){.form-group label{display:block;border-bottom:none;width:100%}.form-group.form-textarea label:after{display:none}.form-control{width:100%}textarea.form-control{border-left:none;padding:.5rem 0}pre::-webkit-scrollbar{height:3px}}@media screen and (max-width: 480px){.form{width:100%}}.dark{color:#ccc}.dark,.dark pre{background-color:#000}.dark pre{padding:10px;border:none}.dark pre code{color:#00bcd4}.dark h1 a,.dark h2 a,.dark h3 a,.dark h4 a,.dark h5 a{color:#ccc}.dark code,.dark strong{color:#fff}.dark code{font-weight:100}.dark table{color:#ccc}.dark table td,.dark table th{border-color:#444}.dark table tbody td:first-child{color:#fff}.dark .form-group label{color:#ccc;border-color:rgba(95,95,95,0.78)}.dark .form-group.form-textarea label:after{background-color:#000}.dark .form-control{color:#ccc;border-color:rgba(95,95,95,0.78)}.dark .form-control:focus{border-color:#ccc;color:#ccc}.dark textarea.form-control{color:#ccc}.dark .card{border-color:rgba(95,95,95,0.78)}.dark .card .card-header{background-color:transparent;color:#ccc;border-bottom:1px solid rgba(95,95,95,0.78)}.dark .btn.btn-ghost.btn-default{border-color:#ababab;color:#ababab}.dark .btn.btn-ghost.btn-default:focus,.dark .btn.btn-ghost.btn-default:hover{border-color:#9c9c9c;color:#9c9c9c;z-index:1}.dark .btn.btn-ghost.btn-default:focus,.dark .btn.btn-ghost.btn-default:hover{border-color:#e0e0e0;color:#e0e0e0}.dark .btn.btn-ghost.btn-primary:focus,.dark .btn.btn-ghost.btn-primary:hover{border-color:#64b5f6;color:#64b5f6}.dark .btn.btn-ghost.btn-success:focus,.dark .btn.btn-ghost.btn-success:hover{border-color:#81c784;color:#81c784}.dark .btn.btn-ghost.btn-info:focus,.dark .btn.btn-ghost.btn-info:hover{border-color:#4dd0e1;color:#4dd0e1}.dark .btn.btn-ghost.btn-error:focus,.dark .btn.btn-ghost.btn-error:hover{border-color:#e57373;color:#e57373}.dark .btn.btn-ghost.btn-warning:focus,.dark .btn.btn-ghost.btn-warning:hover{border-color:#ffb74d;color:#ffb74d}.dark .avatarholder,.dark .placeholder{background-color:transparent;border-color:#333}.dark .menu .menu-item{color:#ccc;border-color:rgba(95,95,95,0.78)}.dark .menu .menu-item.active,.dark .menu .menu-item:hover{color:#fff;border-color:#ccc}:root{--screen-size-small: 30em}@keyframes intro{0%{opacity:0}100%{opacity:1}}.muted{color:rgba(255,255,255,0.5)}.responsive-iframe{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.responsive-iframe iframe{position:absolute;top:0;left:0;width:100%;height:100%}iframe{border:0}main,footer{animation:intro 0.3s both;animation-delay:0.15s}footer time[datetime$="M"]:before{content:"\2013\0020"}@media only screen and (max-width: 30em){footer time[datetime$="M"]{display:none}}blockquote cite{display:block}blockquote cite::before{content:"\2014"}:target{color:#fff}.hack li ul{margin:0}.main{padding:20px 10px}nav a.active{background-color:#ff2e88;color:#fff}a[itemprop="url"]{color:#ff9800}a[itemprop="url"]:hover{color:#fff}a[href*="://"]::after,a[rel*="external"]{content:" " url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20class='i-external'%20viewBox='0%200%2032%2032'%20width='14'%20height='14'%20fill='none'%20stroke='%23ff9800'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='9.38%'%3E%3Cpath%20d='M14%209%20L3%209%203%2029%2023%2029%2023%2018%20M18%204%20L28%204%2028%2014%20M28%204%20L14%2018'/%3E%3C/svg%3E")}figure a[href*="://"]::after,figure a[rel*="external"]{content:""}html{font-size:13px}.hack pre{font-size:17px}article [itemprop="description"],article [itemprop="summary"]{margin-bottom:20px;margin-top:20px}article [itemprop="summary"] p{margin:0}@media screen and (min-width: 768px){html{font-size:1em}.container{max-width:50rem}}
diff --git a/templates/base.html b/templates/base.html
new file mode 100644
index 0000000..59eaaae
--- /dev/null
+++ b/templates/base.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <title>MyBlog</title>
+</head>
+
+<body>
+ <section class="section">
+ <div class="container">
+ {% block content %} {% endblock %}
+ </div>
+ </section>
+</body>
+
+</html>
diff --git a/templates/blog-page.html b/templates/blog-page.html
new file mode 100644
index 0000000..f0f638e
--- /dev/null
+++ b/templates/blog-page.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+
+{% block content %}
+<h1 class="title">
+ {{ page.title }}
+</h1>
+<p class="subtitle"><strong>{{ page.date }}</strong></p>
+{{ page.content | safe }}
+{% endblock content %}
diff --git a/templates/blog.html b/templates/blog.html
new file mode 100644
index 0000000..6e7d799
--- /dev/null
+++ b/templates/blog.html
@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+
+{% block content %}
+<h1 class="title">
+ {{ section.title }}
+</h1>
+<ul>
+ <!-- If you are using pagination, section.pages will be empty. You need to use the paginator object -->
+ {% for page in section.pages %}
+ <li><a href="{{ page.permalink | safe }}">{{ page.title }}</a></li>
+ {% endfor %}
+</ul>
+{% endblock content %}
diff --git a/themes/after-dark/.gitignore b/themes/after-dark/.gitignore
new file mode 100644
index 0000000..4139cd5
--- /dev/null
+++ b/themes/after-dark/.gitignore
@@ -0,0 +1,2 @@
+.idea/
+public
diff --git a/themes/after-dark/LICENSE b/themes/after-dark/LICENSE
new file mode 100644
index 0000000..93ab851
--- /dev/null
+++ b/themes/after-dark/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Vincent Prouillet
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/themes/after-dark/README.md b/themes/after-dark/README.md
new file mode 100644
index 0000000..0c43d93
--- /dev/null
+++ b/themes/after-dark/README.md
@@ -0,0 +1,87 @@
+# after-dark
+
+![after-dark screenshot](https://github.com/getzola/after-dark/blob/master/screenshot.png?raw=true)
+
+## Contents
+
+- [Installation](#installation)
+- [Options](#options)
+ - [Top menu](#top-menu)
+ - [Title](#title)
+ - [Author](#author)
+
+## Installation
+First download this theme to your `themes` directory:
+
+```bash
+cd themes
+git clone https://github.com/getzola/after-dark.git
+```
+and then enable it in your `config.toml`:
+
+```toml
+theme = "after-dark"
+```
+
+This theme requires your index section (`content/_index.md`) to be paginated to work:
+
+```toml
+paginate_by = 5
+```
+
+The posts should therefore be in directly under the `content` folder.
+
+The theme requires tags and categories taxonomies to be enabled in your `config.toml`:
+
+```toml
+taxonomies = [
+ # You can enable/disable RSS
+ {name = "categories", feed = true},
+ {name = "tags", feed = true},
+]
+```
+If you want to paginate taxonomies pages, you will need to overwrite the templates
+as it only works for non-paginated taxonomies by default.
+
+
+## Options
+
+### Top-menu
+Set a field in `extra` with a key of `after_dark_menu`:
+
+```toml
+after_dark_menu = [
+ {url = "$BASE_URL", name = "Home"},
+ {url = "$BASE_URL/categories", name = "Categories"},
+ {url = "$BASE_URL/tags", name = "Tags"},
+ {url = "https://google.com", name = "Google"},
+]
+```
+
+If you put `$BASE_URL` in a url, it will automatically be replaced by the actual
+site URL.
+
+### Title
+The site title is shown on the homepage. As it might be different from the `<title>`
+element that the `title` field in the config represents, you can set the `after_dark_title`
+instead.
+
+### Author
+You can set this on a per page basis or in the config file.
+
+`config.toml`:
+```toml
+[extra]
+author = "John Smith"
+```
+In a page (wrap this in +++):
+```toml
+title = "..."
+date = 1970-01-01
+
+[extra]
+author = "John Smith"
+```
+
+## Original
+This template is based on the Hugo template https://git.habd.as/comfusion/after-dark
diff --git a/themes/after-dark/config.toml b/themes/after-dark/config.toml
new file mode 100644
index 0000000..5aeb7ba
--- /dev/null
+++ b/themes/after-dark/config.toml
@@ -0,0 +1,19 @@
+base_url = "https://zola-after-dark.netlify.com"
+compile_sass = true
+title = "after-dark theme"
+description = ""
+generate_feed = true
+
+taxonomies = [
+ {name = "categories", feed = true},
+ {name = "tags", feed = true},
+]
+
+[extra]
+author = "Vincent"
+after_dark_menu = [
+ {url = "$BASE_URL", name = "Home"},
+ {url = "$BASE_URL/categories", name = "Categories"},
+ {url = "$BASE_URL/tags", name = "Tags"},
+]
+after_dark_title = "My blog"
diff --git a/themes/after-dark/content/_index.md b/themes/after-dark/content/_index.md
new file mode 100644
index 0000000..5ae57b8
--- /dev/null
+++ b/themes/after-dark/content/_index.md
@@ -0,0 +1,3 @@
++++
+paginate_by = 5
++++
diff --git a/themes/after-dark/content/some-article.md b/themes/after-dark/content/some-article.md
new file mode 100644
index 0000000..0630404
--- /dev/null
+++ b/themes/after-dark/content/some-article.md
@@ -0,0 +1,18 @@
++++
+title = "What is Gutenberg"
+date = 2017-09-24
+
+[taxonomies]
+categories = ["Hello world"]
++++
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu feugiat sapien. Aenean ligula nunc, laoreet id sem in, interdum bibendum felis. Donec vel dui neque. Praesent ac sem ut justo volutpat rutrum a imperdiet tellus. Nam lobortis massa non hendrerit hendrerit. Vivamus porttitor dignissim turpis, eget aliquam urna tincidunt non. Aliquam et fringilla turpis. Nullam eros est, eleifend in ornare sed, hendrerit eget est. Aliquam tellus felis, suscipit vitae ex vel, fringilla tempus massa. Nulla facilisi. Pellentesque lobortis consequat lectus. Maecenas ac libero elit.
+<!-- more -->
+Ut luctus dolor ut tortor hendrerit, sed hendrerit augue scelerisque. Suspendisse quis sodales dui, at tempus ante. Nulla at tempor metus. Aliquam vitae rutrum diam. Curabitur iaculis massa dui, quis varius nulla finibus a. Praesent eu blandit justo. Suspendisse pharetra, arcu in rhoncus rutrum, magna magna viverra erat, eget vestibulum enim tellus id dui. Nunc vel dui et arcu posuere maximus. Mauris quam quam, bibendum sed libero nec, tempus hendrerit arcu. Suspendisse sed gravida orci. Fusce tempor arcu ac est pretium porttitor. Aenean consequat risus venenatis sem aliquam, at sollicitudin nulla semper. Aenean bibendum cursus hendrerit. Nulla congue urna nec finibus bibendum. Donec porta tincidunt ligula non ultricies.
+
+
+Sed vulputate tristique elit, eget pharetra elit sodales sed. Proin dignissim ipsum lorem, at porta eros malesuada sed. Proin tristique eros eu quam ornare, suscipit luctus mauris lobortis. Phasellus ut placerat enim. Donec egestas faucibus maximus. Nam quis efficitur eros. Cras tincidunt, lacus ac pretium porta, dui dolor varius elit, eget laoreet justo justo vitae metus. Morbi eget nisi ut ex scelerisque lobortis ut in lorem. Vestibulum et lorem quis ipsum feugiat varius. Mauris nec nulla viverra nisi porttitor efficitur. Morbi vel purus eleifend, finibus erat non, placerat ipsum. Mauris et augue vel nisi volutpat aliquam. Curabitur malesuada tortor est, at condimentum neque eleifend in.
+
+Morbi id ornare lacus. Suspendisse ultrices rutrum posuere. Nullam porttitor libero quis ligula finibus semper. Mauris iaculis magna et nisl tristique, eget maximus ex feugiat. Nam eu felis leo. Quisque ultrices varius purus in molestie. Duis non accumsan ligula. Vivamus dignissim malesuada metus, vel hendrerit tellus viverra id. Curabitur posuere, mauris vitae dignissim dictum, velit mi condimentum lorem, nec varius velit arcu a mi. In dolor sapien, condimentum sed aliquam at, dignissim id purus. Cras lorem leo, vulputate ac ante sed, molestie tempus lectus. Curabitur efficitur libero quam, rhoncus faucibus libero pharetra nec. Curabitur lobortis ullamcorper nisl eu imperdiet. Duis porttitor interdum magna, ac eleifend orci consequat vitae. Aliquam augue felis, faucibus vel blandit sed, maximus non turpis.
+
+Quisque viverra a eros id auctor. Proin id nibh ut nisl dignissim pellentesque et ac mi. Nullam mattis urna quis consequat bibendum. Donec pretium dui elit, a semper purus tristique et. Mauris euismod nisl eu vehicula facilisis. Maecenas facilisis non massa non scelerisque. Integer malesuada cursus erat eu viverra. Duis ligula mi, eleifend vel justo id, laoreet porttitor ex. Etiam ultricies lacus lorem, sed aliquam nulla blandit in. Maecenas vel facilisis neque, vitae fringilla eros. In justo nibh, pellentesque sed faucibus nec, varius sit amet risus.
diff --git a/themes/after-dark/content/some-other-article.md b/themes/after-dark/content/some-other-article.md
new file mode 100644
index 0000000..7702021
--- /dev/null
+++ b/themes/after-dark/content/some-other-article.md
@@ -0,0 +1,19 @@
++++
+title = "A first theme for Gutenberg"
+date = 2017-09-25
+category = "Prog"
+
+[taxonomies]
+tags = ["rust", "ssg", "other"]
++++
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu feugiat sapien. Aenean ligula nunc, laoreet id sem in, interdum bibendum felis. Donec vel dui neque. Praesent ac sem ut justo volutpat rutrum a imperdiet tellus. Nam lobortis massa non hendrerit hendrerit. Vivamus porttitor dignissim turpis, eget aliquam urna tincidunt non. Aliquam et fringilla turpis. Nullam eros est, eleifend in ornare sed, hendrerit eget est. Aliquam tellus felis, suscipit vitae ex vel, fringilla tempus massa. Nulla facilisi. Pellentesque lobortis consequat lectus. Maecenas ac libero elit.
+<!-- more -->
+Ut luctus dolor ut tortor hendrerit, sed hendrerit augue scelerisque. Suspendisse quis sodales dui, at tempus ante. Nulla at tempor metus. Aliquam vitae rutrum diam. Curabitur iaculis massa dui, quis varius nulla finibus a. Praesent eu blandit justo. Suspendisse pharetra, arcu in rhoncus rutrum, magna magna viverra erat, eget vestibulum enim tellus id dui. Nunc vel dui et arcu posuere maximus. Mauris quam quam, bibendum sed libero nec, tempus hendrerit arcu. Suspendisse sed gravida orci. Fusce tempor arcu ac est pretium porttitor. Aenean consequat risus venenatis sem aliquam, at sollicitudin nulla semper. Aenean bibendum cursus hendrerit. Nulla congue urna nec finibus bibendum. Donec porta tincidunt ligula non ultricies.
+
+
+Sed vulputate tristique elit, eget pharetra elit sodales sed. Proin dignissim ipsum lorem, at porta eros malesuada sed. Proin tristique eros eu quam ornare, suscipit luctus mauris lobortis. Phasellus ut placerat enim. Donec egestas faucibus maximus. Nam quis efficitur eros. Cras tincidunt, lacus ac pretium porta, dui dolor varius elit, eget laoreet justo justo vitae metus. Morbi eget nisi ut ex scelerisque lobortis ut in lorem. Vestibulum et lorem quis ipsum feugiat varius. Mauris nec nulla viverra nisi porttitor efficitur. Morbi vel purus eleifend, finibus erat non, placerat ipsum. Mauris et augue vel nisi volutpat aliquam. Curabitur malesuada tortor est, at condimentum neque eleifend in.
+
+Morbi id ornare lacus. Suspendisse ultrices rutrum posuere. Nullam porttitor libero quis ligula finibus semper. Mauris iaculis magna et nisl tristique, eget maximus ex feugiat. Nam eu felis leo. Quisque ultrices varius purus in molestie. Duis non accumsan ligula. Vivamus dignissim malesuada metus, vel hendrerit tellus viverra id. Curabitur posuere, mauris vitae dignissim dictum, velit mi condimentum lorem, nec varius velit arcu a mi. In dolor sapien, condimentum sed aliquam at, dignissim id purus. Cras lorem leo, vulputate ac ante sed, molestie tempus lectus. Curabitur efficitur libero quam, rhoncus faucibus libero pharetra nec. Curabitur lobortis ullamcorper nisl eu imperdiet. Duis porttitor interdum magna, ac eleifend orci consequat vitae. Aliquam augue felis, faucibus vel blandit sed, maximus non turpis.
+
+Quisque viverra a eros id auctor. Proin id nibh ut nisl dignissim pellentesque et ac mi. Nullam mattis urna quis consequat bibendum. Donec pretium dui elit, a semper purus tristique et. Mauris euismod nisl eu vehicula facilisis. Maecenas facilisis non massa non scelerisque. Integer malesuada cursus erat eu viverra. Duis ligula mi, eleifend vel justo id, laoreet porttitor ex. Etiam ultricies lacus lorem, sed aliquam nulla blandit in. Maecenas vel facilisis neque, vitae fringilla eros. In justo nibh, pellentesque sed faucibus nec, varius sit amet risus.
diff --git a/themes/after-dark/netlify.toml b/themes/after-dark/netlify.toml
new file mode 100644
index 0000000..b1f6962
--- /dev/null
+++ b/themes/after-dark/netlify.toml
@@ -0,0 +1,8 @@
+[build]
+ command = "zola build"
+
+[build.environment]
+ ZOLA_VERSION = "0.16.0"
+
+[context.deploy-preview]
+ command = "zola build --base-url $DEPLOY_PRIME_URL" \ No newline at end of file
diff --git a/themes/after-dark/sass/_theme.scss b/themes/after-dark/sass/_theme.scss
new file mode 100644
index 0000000..34474e8
--- /dev/null
+++ b/themes/after-dark/sass/_theme.scss
@@ -0,0 +1,100 @@
+:root {
+ --screen-size-small: 30em; /* breakpoint reference only */
+}
+@keyframes intro {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+.muted {
+ color: rgba(255, 255, 255, 0.5);
+}
+.responsive-iframe {
+ position: relative;
+ padding-bottom: 56.25%; /* 16:9 */
+ padding-top: 25px;
+ height: 0;
+}
+.responsive-iframe iframe {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+iframe {
+ border: 0;
+}
+main, footer {
+ animation: intro 0.3s both;
+ animation-delay: 0.15s;
+}
+footer time[datetime$="M"]:before {
+ content: "\2013\0020";
+}
+@media only screen
+ and ( max-width: 30em ) {
+ footer time[datetime$="M"] {
+ display: none;
+ }
+}
+blockquote cite {
+ display: block;
+}
+blockquote cite::before {
+ content: "\2014";
+}
+:target {
+ color: #fff;
+}
+/* hack.css overrides and enhancements */
+.hack li ul {
+ margin: 0;
+}
+.main {
+ padding: 20px 10px;
+}
+nav a.active {
+ background-color: #ff2e88;
+ color: #fff;
+}
+a[itemprop="url"] {
+ color: #ff9800;
+}
+a[itemprop="url"]:hover {
+ color: #fff;
+}
+a[href*="://"]::after,
+a[rel*="external"] {
+ content: " " url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20class='i-external'%20viewBox='0%200%2032%2032'%20width='14'%20height='14'%20fill='none'%20stroke='%23ff9800'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='9.38%'%3E%3Cpath%20d='M14%209%20L3%209%203%2029%2023%2029%2023%2018%20M18%204%20L28%204%2028%2014%20M28%204%20L14%2018'/%3E%3C/svg%3E");
+}
+figure a[href*="://"]::after,
+figure a[rel*="external"] {
+ content: "";
+}
+html {
+ font-size: 13px;
+}
+.hack pre {
+ font-size: 17px;
+}
+article [itemprop="description"], article [itemprop="summary"] {
+ margin-bottom: 20px;
+ margin-top: 20px;
+}
+
+article [itemprop="summary"] p {
+ margin: 0;
+}
+
+@media screen and (min-width: 768px) {
+ html {
+ font-size: 1em;
+ }
+ .container {
+ max-width: 50rem;
+ }
+}
diff --git a/themes/after-dark/sass/_vendor.scss b/themes/after-dark/sass/_vendor.scss
new file mode 100644
index 0000000..fc2dff2
--- /dev/null
+++ b/themes/after-dark/sass/_vendor.scss
@@ -0,0 +1,1002 @@
+html {
+ font-size: 12px
+}
+
+* {
+ box-sizing: border-box;
+ text-rendering: geometricPrecision
+}
+
+body {
+ font-size: 1rem;
+ line-height: 1.5rem;
+ margin: 0;
+ font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
+ word-wrap: break-word
+}
+
+h1, h2, h3, h4, h5, h6 {
+ line-height: 1.3em
+}
+
+fieldset {
+ border: none;
+ padding: 0;
+ margin: 0
+}
+
+pre {
+ padding: 2rem;
+ margin: 1.75rem 0;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ overflow: auto
+}
+
+code[class*=language-], pre[class*=language-], pre code {
+ font-weight: 100;
+ text-shadow: none;
+ margin: 1.75rem 0
+}
+
+a {
+ cursor: pointer;
+ color: #ff2e88;
+ text-decoration: none;
+ border-bottom: 1px solid #ff2e88
+}
+
+a:hover {
+ background-color: #ff2e88;
+ color: #fff
+}
+
+.grid {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap
+}
+
+.grid.\-top {
+ -ms-flex-align: start;
+ -ms-grid-row-align: flex-start;
+ align-items: flex-start
+}
+
+.grid.\-middle {
+ -ms-flex-align: center;
+ -ms-grid-row-align: center;
+ align-items: center
+}
+
+.grid.\-bottom {
+ -ms-flex-align: end;
+ -ms-grid-row-align: flex-end;
+ align-items: flex-end
+}
+
+.grid.\-stretch {
+ -ms-flex-align: stretch;
+ -ms-grid-row-align: stretch;
+ align-items: stretch
+}
+
+.grid.\-baseline {
+ -ms-flex-align: baseline;
+ -ms-grid-row-align: baseline;
+ align-items: baseline
+}
+
+.grid.\-left {
+ -ms-flex-pack: start;
+ justify-content: flex-start
+}
+
+.grid.\-center {
+ -ms-flex-pack: center;
+ justify-content: center
+}
+
+.grid.\-right {
+ -ms-flex-pack: end;
+ justify-content: flex-end
+}
+
+.grid.\-between {
+ -ms-flex-pack: justify;
+ justify-content: space-between
+}
+
+.grid.\-around {
+ -ms-flex-pack: distribute;
+ justify-content: space-around
+}
+
+.cell {
+ -ms-flex: 1;
+ flex: 1;
+ box-sizing: border-box
+}
+
+@media screen and (min-width: 768px) {
+ .cell.\-1of12 {
+ -ms-flex: 0 0 8.33333%;
+ flex: 0 0 8.33333%
+ }
+ .cell.\-2of12 {
+ -ms-flex: 0 0 16.66667%;
+ flex: 0 0 16.66667%
+ }
+ .cell.\-3of12 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%
+ }
+ .cell.\-4of12 {
+ -ms-flex: 0 0 33.33333%;
+ flex: 0 0 33.33333%
+ }
+ .cell.\-5of12 {
+ -ms-flex: 0 0 41.66667%;
+ flex: 0 0 41.66667%
+ }
+ .cell.\-6of12 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%
+ }
+ .cell.\-7of12 {
+ -ms-flex: 0 0 58.33333%;
+ flex: 0 0 58.33333%
+ }
+ .cell.\-8of12 {
+ -ms-flex: 0 0 66.66667%;
+ flex: 0 0 66.66667%
+ }
+ .cell.\-9of12 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%
+ }
+ .cell.\-10of12 {
+ -ms-flex: 0 0 83.33333%;
+ flex: 0 0 83.33333%
+ }
+ .cell.\-11of12 {
+ -ms-flex: 0 0 91.66667%;
+ flex: 0 0 91.66667%
+ }
+}
+
+@media screen and (max-width: 768px) {
+ .grid {
+ -ms-flex-direction: column;
+ flex-direction: column
+ }
+ .cell {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto
+ }
+}
+
+.hack, .hack blockquote, .hack code, .hack em, .hack h1, .hack h2, .hack h3, .hack h4, .hack h5, .hack h6, .hack strong {
+ font-size: 1rem;
+ font-style: normal;
+ font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif
+}
+
+.hack blockquote, .hack code, .hack em, .hack strong {
+ line-height: 20px
+}
+
+.hack em {
+ color: #888;
+ font-style: italic;
+}
+
+.hack blockquote, .hack code, .hack footer, .hack h1, .hack h2, .hack h3, .hack h4, .hack h5, .hack h6, .hack header, .hack li, .hack ol, .hack p, .hack section, .hack ul {
+ float: none;
+ margin: 0;
+ padding: 0
+}
+
+.hack header + article {
+ margin-top: 20px;
+}
+
+.hack blockquote, .hack h1, .hack ol, .hack p, .hack ul {
+ margin-top: 20px;
+ margin-bottom: 20px
+}
+
+.hack h1 {
+ position: relative;
+ display: inline-block;
+ display: table-cell;
+ padding: 20px 0 30px;
+ margin: 0;
+ overflow: hidden
+}
+
+.hack h1:after {
+ content: "====================================================================================================";
+ position: absolute;
+ bottom: 10px;
+ left: 0
+}
+
+.hack h1 + * {
+ margin-top: 0
+}
+
+.hack h2, .hack h3, .hack h4, .hack h5, .hack h6 {
+ position: relative;
+ margin-bottom: 1.75rem
+}
+
+.hack h2:before, .hack h3:before, .hack h4:before, .hack h5:before, .hack h6:before {
+ display: inline
+}
+
+.hack h2:before {
+ content: "## "
+}
+
+.hack h3:before {
+ content: "### "
+}
+
+.hack h4:before {
+ content: "#### "
+}
+
+.hack h5:before {
+ content: "##### "
+}
+
+.hack h6:before {
+ content: "###### "
+}
+
+.hack li {
+ position: relative;
+ display: block;
+ padding-left: 20px
+}
+
+.hack li:after {
+ position: absolute;
+ top: 0;
+ left: 0
+}
+
+.hack ul > li:after {
+ content: "-"
+}
+
+.hack ol {
+ counter-reset: a
+}
+
+.hack ol > li:after {
+ content: counter(a) ".";
+ counter-increment: a
+}
+
+.hack blockquote {
+ position: relative;
+ padding-left: 17px;
+ padding-left: 2ch;
+ overflow: hidden
+}
+
+.hack blockquote:after {
+ content: ">\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>";
+ white-space: pre;
+ position: absolute;
+ top: 0;
+ left: 0;
+ line-height: 20px
+}
+
+.hack em:after, .hack em:before {
+ content: "*";
+ display: inline
+}
+
+.hack pre code:after, .hack pre code:before {
+ content: none
+}
+
+.hack code {
+ font-weight: 700
+}
+
+.hack code:after, .hack code:before {
+ content: "`";
+ display: inline
+}
+
+.hack hr {
+ position: relative;
+ height: 20px;
+ overflow: hidden;
+ border: 0;
+ margin: 20px 0
+}
+
+.hack hr:after {
+ content: "----------------------------------------------------------------------------------------------------";
+ position: absolute;
+ top: 0;
+ left: 0;
+ line-height: 20px;
+ width: 100%;
+ word-wrap: break-word
+}
+
+@-moz-document url-prefix() {
+ .hack h1 {
+ display: block
+ }
+}
+
+.hack-ones ol > li:after {
+ content: "1."
+}
+
+p {
+ margin: 0 0 1.75rem
+}
+
+.container {
+ max-width: 70rem
+}
+
+.container, .container-fluid {
+ margin: 0 auto;
+ padding: 0 1rem
+}
+
+.inner {
+ padding: 1rem
+}
+
+.inner2x {
+ padding: 2rem
+}
+
+.pull-left {
+ float: left
+}
+
+.pull-right {
+ float: right
+}
+
+.progress-bar {
+ height: 8px;
+ opacity: .8;
+ background-color: #ccc;
+ margin-top: 12px
+}
+
+.progress-bar.progress-bar-show-percent {
+ margin-top: 38px
+}
+
+.progress-bar-filled {
+ background-color: gray;
+ height: 100%;
+ transition: width .3s ease;
+ position: relative;
+ width: 0
+}
+
+.progress-bar-filled:before {
+ content: '';
+ border: 6px solid transparent;
+ border-top-color: gray;
+ position: absolute;
+ top: -12px;
+ right: -6px
+}
+
+.progress-bar-filled:after {
+ color: gray;
+ content: attr(data-filled);
+ display: block;
+ font-size: 12px;
+ white-space: nowrap;
+ position: absolute;
+ border: 6px solid transparent;
+ top: -38px;
+ right: 0;
+ -ms-transform: translateX(50%);
+ transform: translateX(50%)
+}
+
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 1.75rem 0;
+ color: #778087
+}
+
+table td, table th {
+ vertical-align: top;
+ border: 1px solid #ccc;
+ line-height: 15px;
+ padding: 10px
+}
+
+table thead th {
+ font-size: 10px
+}
+
+table tbody td:first-child {
+ font-weight: 700;
+ color: #333
+}
+
+.form {
+ width: 30rem
+}
+
+.form-group {
+ margin-bottom: 1.75rem;
+ overflow: auto
+}
+
+.form-group label {
+ border-bottom: 2px solid #ccc;
+ color: #333;
+ width: 10rem;
+ display: inline-block;
+ height: 38px;
+ line-height: 38px;
+ padding: 0;
+ float: left;
+ position: relative
+}
+
+.form-group.form-success label {
+ color: #4caf50 !important;
+ border-color: #4caf50 !important
+}
+
+.form-group.form-warning label {
+ color: #ff9800 !important;
+ border-color: #ff9800 !important
+}
+
+.form-group.form-error label {
+ color: #f44336 !important;
+ border-color: #f44336 !important
+}
+
+.form-control {
+ outline: none;
+ border: none;
+ border-bottom: 2px solid #ccc;
+ padding: .5rem 0;
+ width: 20rem;
+ height: 38px;
+ background-color: transparent
+}
+
+.form-control:focus {
+ border-color: #555
+}
+
+.form-group.form-textarea label:after {
+ position: absolute;
+ content: '';
+ width: 2px;
+ background-color: #fff;
+ right: -2px;
+ top: 0;
+ bottom: 0
+}
+
+textarea.form-control {
+ height: auto;
+ resize: none;
+ padding: 1rem 0;
+ border-bottom: 2px solid #ccc;
+ border-left: 2px solid #ccc;
+ padding: .5rem
+}
+
+select.form-control {
+ border-radius: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ -ms-appearance: none
+}
+
+.help-block {
+ color: #999;
+ margin-top: .5rem
+}
+
+.form-actions {
+ margin-bottom: 1.75rem
+}
+
+.btn {
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ cursor: pointer;
+ outline: none;
+ padding: .65rem 2rem;
+ font-size: 1rem;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ position: relative;
+ z-index: 1
+}
+
+.btn:active {
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, .12)
+}
+
+.btn.btn-ghost {
+ border-color: #757575;
+ color: #757575;
+ background-color: transparent
+}
+
+.btn.btn-ghost:focus, .btn.btn-ghost:hover {
+ border-color: #424242;
+ color: #424242;
+ z-index: 2
+}
+
+.btn.btn-ghost:hover {
+ background-color: transparent
+}
+
+.btn-block {
+ width: 100%;
+ display: -ms-flexbox;
+ display: flex
+}
+
+.btn-default {
+ color: #fff;
+ background-color: #e0e0e0;
+ border: 1px solid #e0e0e0;
+ color: #333
+}
+
+.btn-default:focus:not(.btn-ghost), .btn-default:hover {
+ background-color: #dcdcdc;
+ border-color: #dcdcdc
+}
+
+.btn-success {
+ color: #fff;
+ background-color: #4caf50;
+ border: 1px solid #4caf50
+}
+
+.btn-success:focus:not(.btn-ghost), .btn-success:hover {
+ background-color: #43a047;
+ border-color: #43a047
+}
+
+.btn-success.btn-ghost {
+ border-color: #4caf50;
+ color: #4caf50
+}
+
+.btn-success.btn-ghost:focus, .btn-success.btn-ghost:hover {
+ border-color: #388e3c;
+ color: #388e3c;
+ z-index: 2
+}
+
+.btn-error {
+ color: #fff;
+ background-color: #f44336;
+ border: 1px solid #f44336
+}
+
+.btn-error:focus:not(.btn-ghost), .btn-error:hover {
+ background-color: #e53935;
+ border-color: #e53935
+}
+
+.btn-error.btn-ghost {
+ border-color: #f44336;
+ color: #f44336
+}
+
+.btn-error.btn-ghost:focus, .btn-error.btn-ghost:hover {
+ border-color: #d32f2f;
+ color: #d32f2f;
+ z-index: 2
+}
+
+.btn-warning {
+ color: #fff;
+ background-color: #ff9800;
+ border: 1px solid #ff9800
+}
+
+.btn-warning:focus:not(.btn-ghost), .btn-warning:hover {
+ background-color: #fb8c00;
+ border-color: #fb8c00
+}
+
+.btn-warning.btn-ghost {
+ border-color: #ff9800;
+ color: #ff9800
+}
+
+.btn-warning.btn-ghost:focus, .btn-warning.btn-ghost:hover {
+ border-color: #f57c00;
+ color: #f57c00;
+ z-index: 2
+}
+
+.btn-info {
+ color: #fff;
+ background-color: #00bcd4;
+ border: 1px solid #00bcd4
+}
+
+.btn-info:focus:not(.btn-ghost), .btn-info:hover {
+ background-color: #00acc1;
+ border-color: #00acc1
+}
+
+.btn-info.btn-ghost {
+ border-color: #00bcd4;
+ color: #00bcd4
+}
+
+.btn-info.btn-ghost:focus, .btn-info.btn-ghost:hover {
+ border-color: #0097a7;
+ color: #0097a7;
+ z-index: 2
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #2196f3;
+ border: 1px solid #2196f3
+}
+
+.btn-primary:focus:not(.btn-ghost), .btn-primary:hover {
+ background-color: #1e88e5;
+ border-color: #1e88e5
+}
+
+.btn-primary.btn-ghost {
+ border-color: #2196f3;
+ color: #2196f3
+}
+
+.btn-primary.btn-ghost:focus, .btn-primary.btn-ghost:hover {
+ border-color: #1976d2;
+ color: #1976d2;
+ z-index: 2
+}
+
+.btn-group {
+ overflow: auto
+}
+
+.btn-group .btn {
+ float: left
+}
+
+.btn-group .btn-ghost:not(:first-child) {
+ margin-left: -1px
+}
+
+.card {
+ border: 1px solid #ccc
+}
+
+.card .card-header {
+ color: #333;
+ text-align: center;
+ background-color: #ddd;
+ padding: .5rem 0
+}
+
+.alert {
+ color: #ccc;
+ padding: 1rem;
+ border: 1px solid #ccc;
+ margin-bottom: 1.75rem
+}
+
+.alert-success {
+ color: #4caf50;
+ border-color: #4caf50
+}
+
+.alert-error {
+ color: #f44336;
+ border-color: #f44336
+}
+
+.alert-info {
+ color: #00bcd4;
+ border-color: #00bcd4
+}
+
+.alert-warning {
+ color: #ff9800;
+ border-color: #ff9800
+}
+
+.media:not(:last-child) {
+ margin-bottom: 1.25rem
+}
+
+.media-left {
+ padding-right: 1rem
+}
+
+.media-left, .media-right {
+ display: table-cell;
+ vertical-align: top
+}
+
+.media-right {
+ padding-left: 1rem
+}
+
+.media-body {
+ display: table-cell;
+ vertical-align: top
+}
+
+.media-heading {
+ font-size: 1.16667rem;
+ font-weight: 700
+}
+
+.media-content {
+ margin-top: .3rem
+}
+
+.avatarholder, .placeholder {
+ background-color: #f0f0f0;
+ text-align: center;
+ color: #b9b9b9;
+ font-size: 1rem;
+ border: 1px solid #f0f0f0
+}
+
+.avatarholder {
+ width: 48px;
+ height: 48px;
+ line-height: 46px;
+ font-size: 2rem;
+ background-size: cover;
+ background-position: 50%;
+ background-repeat: no-repeat
+}
+
+.avatarholder.rounded {
+ border-radius: 33px
+}
+
+.loading {
+ display: inline-block;
+ content: '&nbsp;';
+ height: 20px;
+ width: 20px;
+ margin: 0 .5rem;
+ animation: a .6s infinite linear;
+ border: 2px solid #e91e63;
+ border-right-color: transparent;
+ border-radius: 50%
+}
+
+.btn .loading {
+ margin-bottom: 0;
+ width: 14px;
+ height: 14px
+}
+
+.btn div.loading {
+ float: left
+}
+
+.alert .loading {
+ margin-bottom: -5px
+}
+
+@keyframes a {
+ 0% {
+ transform: rotate(0deg)
+ }
+ to {
+ transform: rotate(1turn)
+ }
+}
+
+.menu {
+ width: 100%
+}
+
+.menu .menu-item {
+ display: block;
+ color: #616161;
+ border-color: #616161
+}
+
+.menu .menu-item.active, .menu .menu-item:hover {
+ color: #000;
+ border-color: #000;
+ background-color: transparent
+}
+
+@media screen and (max-width: 768px) {
+ .form-group label {
+ display: block;
+ border-bottom: none;
+ width: 100%
+ }
+ .form-group.form-textarea label:after {
+ display: none
+ }
+ .form-control {
+ width: 100%
+ }
+ textarea.form-control {
+ border-left: none;
+ padding: .5rem 0
+ }
+ pre::-webkit-scrollbar {
+ height: 3px
+ }
+}
+
+@media screen and (max-width: 480px) {
+ .form {
+ width: 100%
+ }
+}
+
+.dark {
+ color: #ccc
+}
+
+.dark, .dark pre {
+ background-color: #000
+}
+
+.dark pre {
+ padding: 10px;
+ border: none
+}
+
+.dark pre code {
+ color: #00bcd4
+}
+
+.dark h1 a, .dark h2 a, .dark h3 a, .dark h4 a, .dark h5 a {
+ color: #ccc
+}
+
+.dark code, .dark strong {
+ color: #fff
+}
+
+.dark code {
+ font-weight: 100
+}
+
+.dark table {
+ color: #ccc
+}
+
+.dark table td, .dark table th {
+ border-color: #444
+}
+
+.dark table tbody td:first-child {
+ color: #fff
+}
+
+.dark .form-group label {
+ color: #ccc;
+ border-color: rgba(95, 95, 95, .78)
+}
+
+.dark .form-group.form-textarea label:after {
+ background-color: #000
+}
+
+.dark .form-control {
+ color: #ccc;
+ border-color: rgba(95, 95, 95, .78)
+}
+
+.dark .form-control:focus {
+ border-color: #ccc;
+ color: #ccc
+}
+
+.dark textarea.form-control {
+ color: #ccc
+}
+
+.dark .card {
+ border-color: rgba(95, 95, 95, .78)
+}
+
+.dark .card .card-header {
+ background-color: transparent;
+ color: #ccc;
+ border-bottom: 1px solid rgba(95, 95, 95, .78)
+}
+
+.dark .btn.btn-ghost.btn-default {
+ border-color: #ababab;
+ color: #ababab
+}
+
+.dark .btn.btn-ghost.btn-default:focus, .dark .btn.btn-ghost.btn-default:hover {
+ border-color: #9c9c9c;
+ color: #9c9c9c;
+ z-index: 1
+}
+
+.dark .btn.btn-ghost.btn-default:focus, .dark .btn.btn-ghost.btn-default:hover {
+ border-color: #e0e0e0;
+ color: #e0e0e0
+}
+
+.dark .btn.btn-ghost.btn-primary:focus, .dark .btn.btn-ghost.btn-primary:hover {
+ border-color: #64b5f6;
+ color: #64b5f6
+}
+
+.dark .btn.btn-ghost.btn-success:focus, .dark .btn.btn-ghost.btn-success:hover {
+ border-color: #81c784;
+ color: #81c784
+}
+
+.dark .btn.btn-ghost.btn-info:focus, .dark .btn.btn-ghost.btn-info:hover {
+ border-color: #4dd0e1;
+ color: #4dd0e1
+}
+
+.dark .btn.btn-ghost.btn-error:focus, .dark .btn.btn-ghost.btn-error:hover {
+ border-color: #e57373;
+ color: #e57373
+}
+
+.dark .btn.btn-ghost.btn-warning:focus, .dark .btn.btn-ghost.btn-warning:hover {
+ border-color: #ffb74d;
+ color: #ffb74d
+}
+
+.dark .avatarholder, .dark .placeholder {
+ background-color: transparent;
+ border-color: #333
+}
+
+.dark .menu .menu-item {
+ color: #ccc;
+ border-color: rgba(95, 95, 95, .78)
+}
+
+.dark .menu .menu-item.active, .dark .menu .menu-item:hover {
+ color: #fff;
+ border-color: #ccc
+}
diff --git a/themes/after-dark/sass/site.scss b/themes/after-dark/sass/site.scss
new file mode 100644
index 0000000..52f1ad0
--- /dev/null
+++ b/themes/after-dark/sass/site.scss
@@ -0,0 +1,2 @@
+@import "vendor";
+@import "theme";
diff --git a/themes/after-dark/screenshot.png b/themes/after-dark/screenshot.png
new file mode 100644
index 0000000..e34718d
--- /dev/null
+++ b/themes/after-dark/screenshot.png
Binary files differ
diff --git a/themes/after-dark/static/.gitkeep b/themes/after-dark/static/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/themes/after-dark/static/.gitkeep
diff --git a/themes/after-dark/templates/categories/list.html b/themes/after-dark/templates/categories/list.html
new file mode 100644
index 0000000..abca217
--- /dev/null
+++ b/themes/after-dark/templates/categories/list.html
@@ -0,0 +1,19 @@
+{% extends "index.html" %}
+
+{% block content %}
+ {% block header %}
+ {{ super() }}
+ {% endblock header %}
+
+ <h1>Categories</h1>
+
+ {% if terms %}
+ <ul>
+ {% for term in terms %}
+ <li>
+ <a href="{{ term.permalink | safe }}">{{ term.name }}</a>({{ term.pages | length }})
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+{% endblock content %}
diff --git a/themes/after-dark/templates/categories/single.html b/themes/after-dark/templates/categories/single.html
new file mode 100644
index 0000000..b7f9055
--- /dev/null
+++ b/themes/after-dark/templates/categories/single.html
@@ -0,0 +1,14 @@
+{% extends "index.html" %}
+{% import "post_macros.html" as post_macros %}
+
+{% block content %}
+ {% block header %}
+ {{ super() }}
+ {% endblock header %}
+
+ <h1>{{ term.name }}</h1>
+
+ {% for page in term.pages %}
+ {{ post_macros::page_in_list(page=page) }}
+ {% endfor %}
+{% endblock content %}
diff --git a/themes/after-dark/templates/index.html b/themes/after-dark/templates/index.html
new file mode 100644
index 0000000..cfb90a5
--- /dev/null
+++ b/themes/after-dark/templates/index.html
@@ -0,0 +1,68 @@
+{% import "post_macros.html" as post_macros %}
+
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
+
+ <!-- Enable responsiveness on mobile devices-->
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
+
+ <title>{% block title %}{{ config.title }}{% endblock title %}</title>
+
+ {% if config.generate_feed %}
+ <link rel="alternate" type={% if config.feed_filename == "atom.xml" %}"application/atom+xml"{% else %}"application/rss+xml"{% endif %} title="RSS" href="{{ get_url(path=config.feed_filename) | safe }}">
+ {% endif %}
+
+ {% block css %}
+ <link rel="stylesheet" href="{{ get_url(path="site.css", trailing_slash=false) | safe }}">
+ {% endblock css %}
+
+ {% block extra_head %}
+ {% endblock extra_head %}
+ </head>
+
+ <body class="hack dark main container">
+ {% block content %}
+ {% block header %}
+ {% if config.extra.after_dark_menu %}
+ <header>
+ <nav itemscope itemtype="http://schema.org/SiteNavigationElement">
+ {% for item in config.extra.after_dark_menu %}
+ <a itemprop="url"
+ class="{% if item.url | replace(from="$BASE_URL", to=config.base_url) == current_url %}active{% endif %}"
+ href="{{ item.url | safe | replace(from="$BASE_URL", to=config.base_url) }}">
+ <span itemprop="name">{{ item.name }}</span></a>
+ {% endfor %}
+ </nav>
+ </header>
+ {% endif %}
+ {% endblock header %}
+
+ <main>
+ {% if config.extra.after_dark_title %}
+ <header>
+ <h1>{{ config.extra.after_dark_title }}</h1>
+ </header>
+ {% endif %}
+ {% for page in paginator.pages %}
+ {{ post_macros::page_in_list(page=page) }}
+ {% endfor %}
+
+ <nav>
+ <p>
+ {% if paginator.previous %}
+ <a href="{{ paginator.previous }}">&laquo; Previous</a> |
+ {% endif %}
+ <span>Page {{ paginator.current_index }} of {{ paginator.number_pagers }}</span>
+ {% if paginator.next %}
+ | <a href="{{ paginator.next }}">Next &raquo;</a>
+ {% endif %}
+ </p>
+ </nav>
+ </main>
+ {% endblock content %}
+ </body>
+
+</html>
diff --git a/themes/after-dark/templates/page.html b/themes/after-dark/templates/page.html
new file mode 100644
index 0000000..afb949c
--- /dev/null
+++ b/themes/after-dark/templates/page.html
@@ -0,0 +1,54 @@
+{% extends "index.html" %}
+{% import "post_macros.html" as post_macros %}
+
+{% block content %}
+ {% block header %}
+ {{ super() }}
+ {% endblock header %}
+
+<article itemscope itemtype="http://schema.org/BlogPosting">
+ <header>
+ <h1 itemprop="headline">{{ page.title }}</h1>
+ <span class="muted">{{ post_macros::meta(page=page) }}</span>
+ </header>
+ <div itemprop="articleBody">
+ {{ page.content | safe }}
+ </div>
+
+ {% block page_footer %}
+ <footer>
+ <hr>
+ <p>
+ {% if page.extra.author %}
+ Published by {{ page.extra.author }}
+ {% elif config.extra.author %}
+ Published by {{ config.extra.author }}
+ {% endif %}
+ {% if page.taxonomies.categories %}
+ {% set category = page.taxonomies.categories[0] %}
+ in <a href="{{ get_taxonomy_url(kind="categories", name=category) | safe }}">{{ category }}</a>
+ {% endif %}
+ {% if page.taxonomies.tags %}
+ {% if page.taxonomies.categories %}and{% endif %}
+ tagged
+ {% for tag in page.taxonomies.tags %}
+ <a href="{{ get_taxonomy_url(kind="tags", name=tag) | safe }}">{{ tag }}</a>
+ {% if page.taxonomies.tags | length > 1 %}
+ {% if loop.index != page.taxonomies.tags | length %}
+ {% if loop.index == page.taxonomies.tags | length - 1 %}
+ and
+ {% else %}
+ ,
+ {% endif %}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+ </p>
+ {% block extra_footer %}
+ {% endblock extra_footer %}
+ </footer>
+ {% endblock page_footer %}
+</article>
+
+{% endblock content %}
diff --git a/themes/after-dark/templates/post_macros.html b/themes/after-dark/templates/post_macros.html
new file mode 100644
index 0000000..2a9566b
--- /dev/null
+++ b/themes/after-dark/templates/post_macros.html
@@ -0,0 +1,33 @@
+{% macro meta(page) %}
+ <svg style="margin-bottom:-3px" class="i-clock" viewBox="0 0 32 32"
+ width="16" height="16" fill="none" stroke="currentcolor"
+ stroke-linecap="round" stroke-linejoin="round" stroke-width="6.25%">
+ <circle cx="16" cy="16" r="14"/>
+ <path d="M16 8 L16 16 20 20"/>
+ </svg>
+ <span>{{ page.reading_time }} minute read</span>
+ <svg style="margin-bottom: -3px" class="i-edit" viewBox="0 0 32 32"
+ width="16" height="16" fill="none" stroke="currentcolor"
+ stroke-linecap="round" stroke-linejoin="round" stroke-width="6.25%">
+ <path d="M30 7 L25 2 5 22 3 29 10 27 Z M21 6 L26 11 Z M5 22 L10 27 Z"/>
+ </svg>
+
+ {% if page.date %}Published: {{ page.date | date(format="%F") }}{% endif %}
+{% endmacro meta %}
+
+{% macro page_in_list(page) %}
+ <article itemscope itemtype="http://schema.org/CreativeWork">
+ <header>
+ <h2 itemprop="name">
+ <a href="{{ page.permalink | safe }}">{{ page.title }}</a>
+ </h2>
+ <span class="muted">{{ self::meta(page=page) }}</span>
+ </header>
+ {% if page.summary %}
+ <div itemprop="summary">
+ {{ page.summary | safe }}
+ <nav class="readmore"><a itemprop="url" href="{{ page.permalink | safe }}">Read More&nbsp;&raquo;</a></nav>
+ </div>
+ {% endif %}
+ </article>
+{% endmacro page_in_list %}
diff --git a/themes/after-dark/templates/tags/list.html b/themes/after-dark/templates/tags/list.html
new file mode 100644
index 0000000..f3f7840
--- /dev/null
+++ b/themes/after-dark/templates/tags/list.html
@@ -0,0 +1,17 @@
+{% extends "index.html" %}
+
+{% block content %}
+ {% block header %}
+ {{ super() }}
+ {% endblock header %}
+
+ <h1>Tags</h1>
+
+ {% if terms %}
+ <ul>
+ {% for term in terms %}
+ <li><a href="{{ term.permalink | safe }}">{{ term.name }}</a> ({{ term.pages | length }})</li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+{% endblock content %}
diff --git a/themes/after-dark/templates/tags/single.html b/themes/after-dark/templates/tags/single.html
new file mode 100644
index 0000000..a611e56
--- /dev/null
+++ b/themes/after-dark/templates/tags/single.html
@@ -0,0 +1,13 @@
+{% extends "index.html" %}
+
+{% block content %}
+ {% block header %}
+ {{ super() }}
+ {% endblock header %}
+
+ <h1>{{ term.name }}</h1>
+
+ {% for page in term.pages %}
+ {{ post_macros::page_in_list(page=page) }}
+ {% endfor %}
+{% endblock content %}
diff --git a/themes/after-dark/theme.toml b/themes/after-dark/theme.toml
new file mode 100644
index 0000000..37a43df
--- /dev/null
+++ b/themes/after-dark/theme.toml
@@ -0,0 +1,18 @@
+name = "after-dark"
+description = "A robust, elegant dark theme"
+license = "MIT"
+homepage = "https://github.com/getzola/after-dark"
+min_version = "0.11.0"
+demo = "https://zola-after-dark.netlify.com"
+
+[extra]
+
+
+[author]
+name = "Vincent Prouillet"
+homepage = "https://www.vincentprouillet.com"
+
+[original]
+author = "comfusion"
+homepage = "https://git.habd.as/comfusion/after-dark/"
+repo = "https://git.habd.as/comfusion/after-dark/"