diff --git a/404.html b/404.html
new file mode 100644
index 0000000..bf20d63
--- /dev/null
+++ b/404.html
@@ -0,0 +1,24 @@
+---
+# The 404 page
+# © 2017-2019 Cotes Chung
+# MIT License
+layout: page
+title: "404: Page not found"
+
+permalink: /404.html
+
+redirect_from: # Same as site.blocklist
+- /norobots/
+- /assets/
+- /tabs/
+- /categories/
+- /tags/
+- /posts/
+
+dynamic_title: true
+---
+
+
+
Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.
+
Head back Home to try finding it again, or search for it on the Archives page .
+
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..73267dd
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,13 @@
+source 'https://rubygems.org'
+
+gem 'jekyll', '>=3.8.6'
+
+# Official Plugins
+group :jekyll_plugins do
+ gem 'jekyll-paginate'
+ gem 'jekyll-redirect-from'
+ gem 'jekyll-seo-tag'
+end
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..299d89f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 Cotes Chung
+
+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/_config.yml b/_config.yml
new file mode 100644
index 0000000..7c3b7e6
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,166 @@
+# The Site Settings
+# © 2017-2019 Cotes Chung
+# MIT licensed
+
+
+# jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
+#--------------------------
+
+title: Chirpy
+
+description: 'A text-based Jekyll theme.'
+
+# Replace with your domain, e.g. "https://username.github.io"
+url: 'https://www.example.com'
+
+author: Chirpy # change to your full name
+
+logo: /assets/img/sample/profile.jpg # Support network resources.
+
+github:
+ username: github_username # change to your github username
+
+twitter:
+ username: twitter_username # change to your twitter username
+
+social:
+ name: Chirpy # change to your full name
+ email: example@doamin.com # change to your email address
+ links:
+ - https://twitter.com/username # change to your twitter homepage
+ - https://github.com/username # change to your github homepage
+ # - https://www.facebook.com/username
+ # - https://www.linkedin.com/in/username
+
+google_site_verification: google_meta_tag_verification # change to your verification string
+
+#--------------------------
+
+# Change to your Google Analytics ID
+google_analytics:
+ id: 'UA-*********-*'
+ # Switch for Google Analytics pageviews. DO NOT enable it unless you know how to deploy the Google Analytics superProxy.
+ pv: false
+
+disqus:
+ shortname: 'disqus' # Change to your Disqus shortname.
+ comments: true # boolean type, the gobal switch of posts' comments.
+
+# The year your website was first run.
+first_run: 2019
+
+# boolean type, gobal switch for ToC in posts.
+toc: true
+
+
+# if your site type is Project Pages site, change below value to '/projectname'
+baseurl: ''
+
+paginate: 10
+
+markdown: kramdown
+
+highlighter: rouge
+
+kramdown:
+ input: GFM
+ syntax_highlighter: rouge
+ syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options
+ css_class: 'highlight'
+ # default_lang: console
+ span:
+ line_numbers: false
+ block:
+ line_numbers: true
+ start_line: 1
+
+permalink: /posts/:title/
+
+defaults:
+ -
+ scope:
+ path: "" # An empty string here means all files in the project
+ type: posts
+ values:
+ layout: post
+ comments: true # Enable comments in posts.
+ toc: true # Display TOC column in posts.
+ location: Post
+ breadcrumb:
+ -
+ label: Posts
+ url: /
+ -
+ scope:
+ path: _drafts
+ values:
+ comments: false
+ -
+ scope:
+ path: tags
+ values:
+ location: Tag
+ breadcrumb:
+ -
+ label: Home
+ url: /
+ -
+ label: Tags
+ url: /tabs/tags/
+ -
+ scope:
+ path: categories
+ values:
+ location: Category
+ breadcrumb:
+ -
+ label: Home
+ url: /
+ -
+ label: Categories
+ url: /tabs/categories/
+ -
+ scope:
+ path: tabs
+ values:
+ layout: page
+ dynamic_title: true # hide title in mobile screens.
+ breadcrumb:
+ -
+ label: Home
+ url: /
+
+timezone: Asia/Shanghai
+
+sass:
+ sass_dir: /assets/css
+ style: compressed
+
+compress_html:
+ clippings: all
+ comments: [""]
+ endings: [html, head, body, dt, dd, rt, rp, optgroup, option, colgroup, caption, thead, tbody, tfoot, tr, td, th]
+ profile: false
+ blanklines: false
+ ignore:
+ envs: []
+
+exclude:
+ - vendor/ # Avoid Jekyll mistakenly read the vender directory in Travis-CI's VM .
+ - Gemfile.lock
+ - Gemfile
+ - run.sh
+ - build.sh
+ - init.sh
+ - pv.sh
+
+sitemap_exclude: # Sitemap will exclude the following items.
+ - /norobots/
+ - /assets/
+ - /tabs/
+ - /categories/
+ - /tags/
+ - /posts/
+ - /404.html
+ - /redirects.json
+ - /search.json
diff --git a/_data/label.yml b/_data/label.yml
new file mode 100644
index 0000000..a53c2d9
--- /dev/null
+++ b/_data/label.yml
@@ -0,0 +1,17 @@
+# The label text of site.
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+
+tabs:
+ - { name: "Home" }
+ - { name: "Categories", path: tabs, url: categories }
+ - { name: "Tags", path: tabs, url: tags }
+ - { name: "Archives", path: tabs, url: archives }
+ - { name: "About", path: tabs, url: about }
+
+panel:
+ lastmod: "Recent Update"
+ trending_tags: "Trending Tags"
+ toc: "Contents"
+
+search_hint: "Search" # text show on search bar
\ No newline at end of file
diff --git a/_includes/date-format.html b/_includes/date-format.html
new file mode 100644
index 0000000..9c83b37
--- /dev/null
+++ b/_includes/date-format.html
@@ -0,0 +1,8 @@
+
+
+{% assign TOOLTIP_DATE = "%a, %b %e, %Y, %l:%M %p %z" %}
+{% assign POST_DATE = "%b %e, %Y" %}
\ No newline at end of file
diff --git a/_includes/disqus.html b/_includes/disqus.html
new file mode 100644
index 0000000..b97c809
--- /dev/null
+++ b/_includes/disqus.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_includes/favicons.html b/_includes/favicons.html
new file mode 100644
index 0000000..e21aece
--- /dev/null
+++ b/_includes/favicons.html
@@ -0,0 +1,34 @@
+
+
+{% capture icon_url %}{{ site.baseurl }}/assets/img/favicons{% endcapture %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/_includes/fixlinenos.html b/_includes/fixlinenos.html
new file mode 100644
index 0000000..2f88865
--- /dev/null
+++ b/_includes/fixlinenos.html
@@ -0,0 +1,9 @@
+
+{% if _content contains '' %}
+ {% assign _content = _content | replace: ' ', '' %}
+{% endif %}
\ No newline at end of file
diff --git a/_includes/footer.html b/_includes/footer.html
new file mode 100644
index 0000000..659f6df
--- /dev/null
+++ b/_includes/footer.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+ {% assign first = site.first_run | plus: 0 %}
+ {% assign last = 'now' | date: "%Y" | plus: 0 %}
+
+ © {% if last > first %}{{ first }}-{% endif %}{{-last-}}
+ {{ site.social.name }} .
+ Powered by Jekyll & Chirpy , hosted on GitHub Pages .
+
+
+
+
+
diff --git a/_includes/google-analytics.html b/_includes/google-analytics.html
new file mode 100644
index 0000000..983746b
--- /dev/null
+++ b/_includes/google-analytics.html
@@ -0,0 +1,14 @@
+
+
diff --git a/_includes/head.html b/_includes/head.html
new file mode 100644
index 0000000..b81ce0b
--- /dev/null
+++ b/_includes/head.html
@@ -0,0 +1,53 @@
+
+
+
+
+ {%- if page.layout == "home" -%}
+ {{- site.title -}}
+ {%- else -%}
+ {{ page.title }} | {{ site.title }}
+ {%- endif -%}
+
+
+
+
+ {% seo title=false %}
+
+ {% include favicons.html %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if jekyll.environment == 'production' %}
+ {% include google-analytics.html %}
+ {% endif %}
+
+
\ No newline at end of file
diff --git a/_includes/panel.html b/_includes/panel.html
new file mode 100644
index 0000000..2550816
--- /dev/null
+++ b/_includes/panel.html
@@ -0,0 +1,72 @@
+
+
+
+
+ {% assign lastmod_list = "" | split: "" %}
+
+ {% for post in site.posts %}
+ {% if post.date >= post.seo.date_modified or post.seo.date_modified == nil %}
+ {% continue %}
+ {% endif%}
+ {% capture item %}
+ {{ post.seo.date_modified }}::{{ post.title }}::{{ post.url }}
+ {% endcapture %}
+ {% assign lastmod_list = lastmod_list | push: item %}
+ {% endfor %}
+
+ {% if lastmod_list.size > 0 %}
+
+
+ {{ site.data.label.panel.lastmod }}
+
+
+ {% assign MAX_SIZE = 5 %}
+ {% assign sum = 0 %}
+ {% assign sorted_posts = lastmod_list | sort | reverse %}
+ {% for post in sorted_posts %}
+ {% assign meta = post | split: "::" %}
+ {{ meta[1] }}
+ {% assign sum = sum | plus: 1 %}
+ {% if sum >= MAX_SIZE %}
+ {% break %}
+ {% endif %}
+ {% endfor %}
+
+
+ {% endif %}
+
+
+
+
\ No newline at end of file
diff --git a/_includes/search-results.html b/_includes/search-results.html
new file mode 100644
index 0000000..d9a87f6
--- /dev/null
+++ b/_includes/search-results.html
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/_includes/search.html b/_includes/search.html
new file mode 100644
index 0000000..04ee7c3
--- /dev/null
+++ b/_includes/search.html
@@ -0,0 +1,13 @@
+
+
+
\ No newline at end of file
diff --git a/_includes/sidebar.html b/_includes/sidebar.html
new file mode 100644
index 0000000..6d609b1
--- /dev/null
+++ b/_includes/sidebar.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
{{ site.description }}
+
+
+ {% assign page_urls = page.url | split: "/" %}
+
+ {% for item in site.data.label.tabs %}
+ {% assign ref = site.baseurl | append: "/" %}
+
+ {% if item.path %}
+ {% assign ref = ref | append: item.path | append: "/" %}
+ {% if item.url %}
+ {% assign ref = ref | append: item.url | append: "/" %}
+ {% endif %}
+ {% endif %}
+
+
+
+ {{ item.name | upcase }}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% assign email = site.social.email | split: '@' %}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_includes/topbar.html b/_includes/topbar.html
new file mode 100644
index 0000000..a730ba4
--- /dev/null
+++ b/_includes/topbar.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ {% for item in page.breadcrumb %}
+ {% if item.url %}
+
+
+ {{ item.label }}
+
+
+ {% else %}
+ {{ item.label }}
+ {% endif %}
+ {% endfor %}
+
+ {% unless page.layout == "home" %}
+ {{ page.title }}
+ {% endunless %}
+
+
+
+
+
+
+ {% if page.location %}
+ {{- page.location -}}
+ {% elsif page.layout == "home" %}
+ {{- site.title -}}
+ {% else %}
+ {{- page.title -}}
+ {% endif %}
+
+
+
+
+
+
+
+
Cancel
+
+
+
\ No newline at end of file
diff --git a/_layouts/category.html b/_layouts/category.html
new file mode 100644
index 0000000..c633a65
--- /dev/null
+++ b/_layouts/category.html
@@ -0,0 +1,26 @@
+---
+layout: page
+# The Category layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+
+
+ {{ page.title }}
+ {{ site.categories[page.category] | size }}
+
+
+
+ {% for post in site.categories[page.category] %}
+
+ {{ post.title }}
+
+ {{ post.date | date: POST_DATE }}
+
+ {% endfor %}
+
+
\ No newline at end of file
diff --git a/_layouts/compress.html b/_layouts/compress.html
new file mode 100644
index 0000000..bb34487
--- /dev/null
+++ b/_layouts/compress.html
@@ -0,0 +1,10 @@
+---
+# Jekyll layout that compresses HTML
+# v3.1.0
+# http://jch.penibelst.de/
+# © 2014–2015 Anatol Broder
+# MIT License
+---
+
+{% capture _LINE_FEED %}
+{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains " " %}{% endif %}{% unless _pre_before contains " " and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ; ; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %} Step Bytes raw {{ content | size }}{% if _profile_endings %} endings {{ _profile_endings }}{% endif %}{% if _profile_startings %} startings {{ _profile_startings }}{% endif %}{% if _profile_comments %} comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %} collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %} clippings {{ _profile_clippings }}{% endif %}
{% endif %}{% endif %}
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 0000000..1cf913e
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,44 @@
+---
+layout: compress
+# Default layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+
+
+
+ {% include head.html %}
+
+
+
+ {% include sidebar.html %}
+
+
+ {% include topbar.html %}
+
+
+
+ {% capture _content %}
+ {{ content }}
+ {% endcapture %}
+
+ {% include fixlinenos.html %}
+ {{ _content }}
+
+
+ {% include footer.html %}
+
+ {% include search-results.html %}
+
+
+
+
+ {% include search.html %}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_layouts/home.html b/_layouts/home.html
new file mode 100644
index 0000000..03d7d96
--- /dev/null
+++ b/_layouts/home.html
@@ -0,0 +1,128 @@
+---
+layout: page
+# The Home page layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+ {% for post in paginator.posts %}
+
+
+
+
+ {{ post.content | strip_html | truncate: 200 }}
+
+
+
+
+
+
+
+ {{ post.date | date: POST_DATE }}
+ {{ post.date | date_to_xmlschema }}
+
+
+ {% if site.google_analytics.pv %}
+
+
+
+
+ {% endif %}
+
+
+ {% endfor %}
+
+
+{% if paginator.total_pages > 0 %}
+
+{% endif %}
+
+
+
+{% if site.google_analytics.pv %}
+
+
+{% endif %}
diff --git a/_layouts/page.html b/_layouts/page.html
new file mode 100644
index 0000000..660c96e
--- /dev/null
+++ b/_layouts/page.html
@@ -0,0 +1,29 @@
+---
+layout: default
+# The page layout
+# © 2017-2019 Cotes Chung
+# MIT License
+---
+
+
+
+
+ {% if page.dynamic_title %}
+
+
{{ page.title }}
+
+ {{ content }}
+
+
+ {% else %}
+
+ {{ content }}
+
+ {% endif %}
+
+
+
+
+
+ {% include panel.html %}
+
\ No newline at end of file
diff --git a/_layouts/post.html b/_layouts/post.html
new file mode 100644
index 0000000..83e4230
--- /dev/null
+++ b/_layouts/post.html
@@ -0,0 +1,117 @@
+---
+layout: default
+# The posts' layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+
+
+
{{ page.title }}
+
+
+
+
+ {{ page.date | date: POST_DATE }}
+ {{ page.date | date_to_xmlschema }}
+
+ {% if page.categories.size > 0 %}on{% endif %}
+ {% for category in page.categories %}
+
{{ category }}
+ {%- unless forloop.last -%}, {%- endunless -%}
+ {% endfor %}
+
+
+ {% if page.seo.date_modified > page.date %}
+
+ Updated
+
+ {{ page.seo.date_modified | date: POST_DATE }}
+ {{ page.seo.date_modified | date_to_xmlschema}}
+
+
+ {% endif %}
+
+ {% if site.google_analytics.pv %}
+
+ views
+
+ {% endif %}
+
+
+
+ {% if page.image %}
+
+ {% endif %}
+ {{ content }}
+
+
+
+
+ {% if page.tags.size > 0 %}
+
+ {% for tag in page.tags %}
+
+ {{- tag -}}
+ {%- if forloop.last != true -%} {%- endif -%}
+ {% endfor %}
+
+ {% endif %}
+
+
+
+
+
+
+
+ {% if site.disqus.comments and page.comments %}
+ {% include disqus.html %}
+ {% else %}
+
+ {% endif %}
+
+
+
+
+
+ {% include panel.html %}
+ {% if site.toc and page.toc %}
+
+
+ {{ site.data.label.panel.toc }}
+
+
+
+
+
+ {% endif %}
+
+
+
+
+{% if site.google_analytics.pv %}
+
+
+{% endif %}
diff --git a/_layouts/tag.html b/_layouts/tag.html
new file mode 100644
index 0000000..45993da
--- /dev/null
+++ b/_layouts/tag.html
@@ -0,0 +1,25 @@
+---
+layout: page
+# The layout for Tag page
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+
+
+ {{ page.title }}
+ {{ site.tags[page.tag] | size }}
+
+
+ {% for post in site.tags[page.tag] %}
+
+ {{ post.title }}
+
+ {{ post.date | date: POST_DATE }}
+
+ {% endfor %}
+
+
\ No newline at end of file
diff --git a/_scripts/py/init_all.py b/_scripts/py/init_all.py
new file mode 100755
index 0000000..1fb4544
--- /dev/null
+++ b/_scripts/py/init_all.py
@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Automatic invokes all initial scripts for project.
+© 2018-2019 Cotes Chung
+Licensed under MIT
+"""
+
+import update_posts_lastmod
+import pages_generator
+
+
+update_posts_lastmod
+
+pages_generator
diff --git a/_scripts/py/pages_generator.py b/_scripts/py/pages_generator.py
new file mode 100755
index 0000000..11baacb
--- /dev/null
+++ b/_scripts/py/pages_generator.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+'''
+Generates HTML pages for Categories and Tags in posts.
+
+Dependencies:
+ - git
+ - ruamel.yaml
+
+© 2018-2019 Cotes Chung
+MIT License
+'''
+
+
+import os
+import glob
+import shutil
+import sys
+import subprocess
+
+from ruamel.yaml import YAML
+from utils.common import get_yaml
+from utils.common import check_py_version
+
+
+DRAFTS_DIR = '_drafts'
+POSTS_DIR = ['_posts']
+
+CATEGORIES_DIR = 'categories'
+CATEGORY_LAYOUT = 'category'
+
+TAG_DIR = 'tags'
+TAG_LAYOUT = 'tag'
+
+LEVEL = 3 # Tree level for current script file.
+
+
+def help():
+ print("Usage: "
+ " python pages_generator.py [Option]\n\n"
+ "Options:\n"
+ " -d, --drafts Enable drafts\n"
+ " -v, --verbose Print verbose logs\n")
+
+
+def get_path(dir):
+ path = os.path.abspath(__file__)
+ count = LEVEL
+ r_index = len(path)
+ while r_index > 0:
+ r_index -= 1
+ if (path[r_index] == '/' or path[r_index] == '\\'):
+ count -= 1
+ if count == 0:
+ return path[:r_index + 1] + dir
+
+
+def get_categories():
+ all_categories = []
+ yaml = YAML()
+
+ for dir in POSTS_DIR:
+ path = get_path(dir)
+ for file in glob.glob(os.path.join(path, '*.md')):
+ meta = yaml.load(get_yaml(file)[0])
+
+ if 'category' in meta:
+ if type(meta['category']) == list:
+ err_msg = (
+ "[Error] File {} 'category' type"
+ " can not be LIST!").format(file)
+ raise Exception(err_msg)
+ else:
+ if meta['category'] not in all_categories:
+ all_categories.append(meta['category'])
+ else:
+ if 'categories' in meta:
+ if type(meta['categories']) == str:
+ error_msg = (
+ "[Error] File {} 'categories' type"
+ " can not be STR!").format(file)
+ raise Exception(error_msg)
+
+ for ctg in meta['categories']:
+ if ctg not in all_categories:
+ all_categories.append(ctg)
+ else:
+ err_msg = (
+ "[Error] File:{} at least "
+ "have one category.").format(file)
+ print(err_msg)
+
+ return all_categories
+
+
+def generate_category_pages(is_verbose):
+ categories = get_categories()
+ path = get_path(CATEGORIES_DIR)
+
+ if os.path.exists(path):
+ shutil.rmtree(path)
+
+ os.makedirs(path)
+
+ for category in categories:
+ new_page = path + '/' + category.replace(' ', '-').lower() + '.html'
+ with open(new_page, 'w+', encoding='utf-8') as html:
+ html.write("---\n")
+ html.write("layout: {}\n".format(CATEGORY_LAYOUT))
+ html.write("title: {}\n".format(category))
+ html.write("category: {}\n".format(category))
+ html.write("---")
+
+ if is_verbose:
+ print("[INFO] Created page: " + new_page)
+
+ change = subprocess.getoutput("git status categories -s")
+ if change:
+ print("[INFO] Succeed! {} category-pages created."
+ .format(len(categories)))
+
+
+def get_all_tags():
+ all_tags = []
+ yaml = YAML()
+
+ for dir in POSTS_DIR:
+ path = get_path(dir)
+ for file in glob.glob(os.path.join(path, '*.md')):
+ meta = yaml.load(get_yaml(file)[0])
+
+ if 'tags' in meta:
+ for tag in meta['tags']:
+ if tag not in all_tags:
+ all_tags.append(tag)
+ else:
+ raise Exception("Didn't find 'tags' in \
+ post '{}' !".format(file))
+
+ return all_tags
+
+
+def generate_tag_pages(is_verbose):
+ all_tags = get_all_tags()
+ tag_path = get_path(TAG_DIR)
+
+ if os.path.exists(tag_path):
+ shutil.rmtree(tag_path)
+
+ os.makedirs(tag_path)
+
+ for tag in all_tags:
+ tag_page = tag_path + '/' + tag.replace(' ', '-').lower() + '.html'
+ with open(tag_page, 'w+', encoding='utf-8') as html:
+ html.write("---\n")
+ html.write("layout: {}\n".format(TAG_LAYOUT))
+ html.write("title: {}\n".format(tag))
+ html.write("tag: {}\n".format(tag))
+ html.write("---")
+
+ if is_verbose:
+ print("[INFO] Created page: " + tag_page)
+
+ change = subprocess.getoutput("git status tags -s")
+ if change:
+ print("[INFO] Succeed! {} tag-pages created.".format(len(all_tags)))
+
+
+def main():
+ check_py_version()
+
+ is_verbose = False
+
+ if len(sys.argv) > 1:
+ for arg in sys.argv:
+ if arg != sys.argv[0]:
+ if arg == '-d' or arg == '--drafts':
+ POSTS_DIR.insert(0, DRAFTS_DIR)
+ elif arg == '-v' or arg == '--verbose':
+ is_verbose = True
+ else:
+ help()
+ return
+
+ generate_category_pages(is_verbose)
+ generate_tag_pages(is_verbose)
+
+
+main()
diff --git a/_scripts/py/update_posts_lastmod.py b/_scripts/py/update_posts_lastmod.py
new file mode 100755
index 0000000..fb5db8b
--- /dev/null
+++ b/_scripts/py/update_posts_lastmod.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Update (or create if not existed) field 'seo.date_modified'
+in posts' Front Matter by their latest git commit date.
+
+Dependencies:
+ - git
+ - ruamel.yaml
+
+© 2018-2019 Cotes Chung
+Licensed under MIT
+"""
+
+import sys
+import glob
+import os
+import subprocess
+import shutil
+
+from ruamel.yaml import YAML
+from utils.common import get_yaml
+from utils.common import check_py_version
+
+
+POSTS_PATH = "_posts"
+
+
+def help():
+ print("Usage: "
+ " python update_posts_lastmod.py [option]\n"
+ "Options:\n"
+ " -v, --verbose Print verbose logs\n")
+
+
+def update_lastmod(verbose):
+ count = 0
+ yaml = YAML()
+
+ for post in glob.glob(os.path.join(POSTS_PATH, "*.md")):
+ git_log_count = subprocess.getoutput(
+ "git log --pretty=%ad \"{}\" | wc -l".format(post))
+
+ if git_log_count == "1":
+ continue
+
+ git_lastmod = subprocess.getoutput(
+ "git log -1 --pretty=%ad --date=iso \"{}\"".format(post))
+
+ if not git_lastmod:
+ continue
+
+ lates_commit = subprocess.check_output(
+ ['git', 'log', '-1', '--pretty=%B', post]).decode('utf-8')
+
+ if "[Automation]" in lates_commit and "Lastmod" in lates_commit:
+ continue
+
+ frontmatter, line_num = get_yaml(post)
+ meta = yaml.load(frontmatter)
+
+ if 'seo' in meta:
+ if ('date_modified' in meta['seo'] and
+ meta['seo']['date_modified'] == git_lastmod):
+ continue
+ else:
+ meta['seo']['date_modified'] = git_lastmod
+ else:
+ meta.insert(line_num, 'seo', dict(date_modified=git_lastmod))
+
+ output = 'new.md'
+ if os.path.isfile(output):
+ os.remove(output)
+
+ with open(output, 'w', encoding='utf-8') as new, \
+ open(post, 'r', encoding='utf-8') as old:
+ new.write("---\n")
+ yaml.dump(meta, new)
+ new.write("---\n")
+ line_num += 2
+
+ lines = old.readlines()
+
+ for line in lines:
+ if line_num > 0:
+ line_num -= 1
+ continue
+ else:
+ new.write(line)
+
+ shutil.move(output, post)
+ count += 1
+
+ if verbose:
+ print("[INFO] update 'lastmod' for:" + post)
+
+ if count > 0:
+ print("[INFO] Success to update lastmod for {} post(s).".format(count))
+
+
+def main():
+ check_py_version()
+
+ verbose = False
+
+ if len(sys.argv) > 1:
+ for arg in sys.argv:
+ if arg == sys.argv[0]:
+ continue
+ else:
+ if arg == '-v' or arg == '--verbose':
+ verbose = True
+ else:
+ help()
+ return
+
+ update_lastmod(verbose)
+
+
+main()
diff --git a/_scripts/py/utils/common.py b/_scripts/py/utils/common.py
new file mode 100644
index 0000000..2b5d701
--- /dev/null
+++ b/_scripts/py/utils/common.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+'''
+Common functions to other scripts.
+
+© 2018-2019 Cotes Chung
+MIT License
+'''
+
+import sys
+
+
+def get_yaml(path):
+ """
+ Return the Yaml block of a post and the linenumbers of it.
+ """
+ end = False
+ yaml = ""
+ num = 0
+
+ with open(path, 'r', encoding='utf-8') as f:
+ for line in f.readlines():
+ if line.strip() == '---':
+ if end:
+ break
+ else:
+ end = True
+ continue
+ else:
+ num += 1
+
+ yaml += line
+
+ return yaml, num
+
+
+def check_py_version():
+ if not sys.version_info.major == 3 and sys.version_info.minor >= 5:
+ print("WARNING: This script requires Python 3.5 or higher, "
+ "however you are using Python {}.{}."
+ .format(sys.version_info.major, sys.version_info.minor))
+ sys.exit(1)
diff --git a/assets/css/_src/fonts.scss b/assets/css/_src/fonts.scss
new file mode 100644
index 0000000..afda8aa
--- /dev/null
+++ b/assets/css/_src/fonts.scss
@@ -0,0 +1,312 @@
+/*
+ * The field 'font-display' is added for Google-fonts.
+ *
+ * See https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700,900|Oswald|Lato
+ *
+ */
+/* latin-ext */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v14/S6uyw4BMUTPHjxAwXjeu.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v14/S6uyw4BMUTPHjx4wXg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752HT8Ghe4.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752Fj8Ghe4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752Fz8Ghe4.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752GT8G.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmhduz8A.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwkxduz8A.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmxduz8A.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwlBduz8A.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmBduz8A.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmRduz8A.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwlxdu.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
\ No newline at end of file
diff --git a/assets/css/_src/main.scss b/assets/css/_src/main.scss
new file mode 100644
index 0000000..ddebfe6
--- /dev/null
+++ b/assets/css/_src/main.scss
@@ -0,0 +1,1518 @@
+
+/*!
+* The main styles.
+* © 2018-2019 Cotes Chung
+* MIT Licensed
+*/
+
+html, body {
+ height: 100%;
+}
+
+/* Solved jumping scrollbar */
+html {
+ overflow-y: scroll;
+}
+
+body {
+ line-height: 1.75rem;
+ background: #fafafa;
+ color: #212529;
+ -webkit-font-smoothing: antialiased;
+ font-family: 'Source Sans Pro', 'Microsoft Yahei', sans-serif;
+}
+
+/*--- sidebar layout ---*/
+
+#sidebar {
+ padding-left: 0;
+ padding-right: 0;
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ overflow-y: auto;
+ width: 260px;
+ background: rgb(35, 37, 46);
+ z-index: 99;
+ transition: transform 0.4s ease;
+ -webkit-transition: transform 0.4s ease;
+}
+
+#sidebar a {
+ color: rgba(255, 255, 255, 0.5);
+ transition: color 0.35s ease-in-out;
+}
+
+#sidebar .nav-item {
+ height: 20%;
+ padding: 0 2rem;
+}
+
+#sidebar .nav-link {
+ border-radius: 0;
+ font-size: .95rem;
+ font-weight: 600;
+ letter-spacing: 1px;
+}
+
+#sidebar .nav-item:hover .nav-link {
+ color: #f8f9facf;
+}
+
+#sidebar .nav-item.active .nav-link {
+ color: #fcfcfc;
+}
+
+#sidebar ul {
+ height: 16.5rem;
+ display: -webkit-box;
+ display: -ms-flexbox;
+}
+
+.cursor {
+ background: #fcfcfc;
+ position: relative;
+ display: none;
+ top: 0;
+ left: 98.5%;
+ width: 3px;
+ height: 10%;
+ -webkit-transition: top 0.5s ease;
+ -moz-transition: top 0.5s ease;
+ transition: top 0.5s ease;
+}
+
+#sidebar ul>li.active:nth-child(1)~.cursor,
+#sidebar ul>li.nav-item:nth-child(1):hover~.cursor {
+ top: -95%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(2)~.cursor,
+#sidebar ul>li.nav-item:nth-child(2):hover~.cursor {
+ top: -75%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(3)~.cursor,
+#sidebar ul>li.nav-item:nth-child(3):hover~.cursor {
+ top: -55%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(4)~.cursor,
+#sidebar ul>li.nav-item:nth-child(4):hover~.cursor {
+ top: -35%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(5)~.cursor,
+#sidebar ul>li.nav-item:nth-child(5):hover~.cursor {
+ top: -15%;
+ display: block;
+}
+
+#nav-wrap {
+ width: 100%;
+ flex-grow: 1;
+}
+
+#profile-wrap {
+ padding-top: 2rem;
+ padding-bottom: 1rem;
+}
+
+#profile {
+ width: 6rem;
+ height: 6rem;
+ border-radius: 50%;
+ border: 2px solid #b6b6b6;
+ overflow: hidden;
+ transform: translateZ(0); /* fixed the zoom in Safari */
+ -webkit-transition: border-color 0.35s ease-in-out;
+ -moz-transition: border-color 0.35s ease-in-out;
+ transition: border-color 0.35s ease-in-out;
+}
+
+#profile:hover {
+ border-color: #fff;
+}
+
+#profile img {
+ width: 100%;
+ height: 100%;
+ display: block;
+ background-size: cover;
+ background-repeat: no-repeat;
+ -webkit-transition: all .5s !important;
+ -moz-transition: all .5s !important;
+ transition: all .5s !important;
+}
+
+#profile img:hover {
+ -ms-transform: scale(1.2);
+ -moz-transform: scale(1.2);
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2);
+}
+
+#site-title a {
+ color: #b6b6b6;
+ font-weight: 900;
+ font-size: 1.5rem;
+ letter-spacing: .5px;
+}
+
+#site-title a:hover {
+ color: #fff;
+ text-decoration: none;
+}
+
+#site-subtitle {
+ font-size: 95%;
+ text-align: center;
+ color: #828282;
+ line-height: 1.2rem;
+ word-spacing: 1px;
+ padding: .6rem 1.5rem 2rem 1.5rem;
+}
+
+.sidebar-expand {
+ box-shadow: 4px 0 8px 0 rgba(0, 0, 0, 0.2), 6px 0 20px 0 rgba(0, 0, 0, 0.19) !important;
+}
+
+#search-result-wrap {
+ display: none;
+ position: fixed;
+ top: 3rem;
+ height: 100%;
+ width: calc(100% - 260px);
+ overflow: auto;
+}
+
+#search-result-wrap>div.row>div {
+ min-height: calc(100vh - 3rem - 2rem);
+}
+
+#search-result-wrap .post-content {
+ margin-top: 2rem;
+}
+
+.contact {
+ font-size: 1.2rem;
+ padding: 2rem 2.5rem;
+ flex-shrink: 0;
+ -webkit-flex-shrink: 0;
+ -ms-flex-shrink: 0;
+ /*box-shadow: inset 0 0 0.25em 0 rgba(0, 0, 0, 0.22);*/
+}
+
+#sidebar .contact a:hover {
+ color: #fff;
+}
+
+/*--- top-bar ---*/
+
+#topbar {
+ height: 3rem;
+ position: fixed;
+ top: 0;
+ left: 260px; /* same as sidebar width */
+ right: 0;
+ transition: top 0.2s ease-in-out;
+ z-index: 1;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.07);
+ box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.05);
+}
+
+#topbar i.fas { // icons
+ color: #999;
+}
+
+#breadcrumb {
+ font-size: 1rem;
+ color: gray;
+ padding-left: 1rem;
+}
+
+#breadcrumb span:not(:last-child)::after {
+ content: "›";
+ padding: 0 .3rem;
+}
+
+#sidebar-trigger,
+#search-trigger {
+ margin: 0 1rem;
+ display: none;
+}
+
+#search-wrap i {
+ position: relative;
+ top: 1rem;
+ left: .5rem;
+ z-index: 2;
+ font-size: .9rem;
+ color: #c2c6cc!important;
+}
+
+#search-input {
+ position: relative;
+ top: -.86rem;
+ background: #f5f5f5;
+ border-color: #e9ecef;
+ border-radius: 0.9rem;
+ padding: .18rem .75rem .18rem 2rem;
+ color: #797878;
+}
+
+#search-input:focus {
+ box-shadow: none;
+ background: center;
+}
+
+#topbar-title {
+ display: none;
+ font-size: 1.1rem;
+ font-weight: 600;
+ font-family: sans-serif;
+ color: rgb(78, 78, 78);
+ text-align: center;
+ width: 70%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: keep-all;
+ white-space: nowrap;
+}
+
+#search-wrap+a {
+ color: #2a408e;
+ display: none;
+}
+
+#mask {
+ display: none;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ background: #c1c3c5;
+ opacity: 0.5;
+ z-index: 1;
+}
+
+.sidebar-expand~#mask {
+ display: block!important;
+}
+
+/*--- main wrap ---*/
+
+#main-wrap {
+ position: relative;
+ min-height: 100%;
+ padding-bottom: 6rem; /* equals to or greatter than footer's height */
+ padding-left: 0;
+ padding-right: 0;
+ margin-left: 260px;
+ transition: transform 0.4s ease;
+ -webkit-transition: transform 0.4s ease;
+}
+
+#main>div.row>div {
+ margin-top: 3rem; /* same as the height of topbar */
+}
+
+#main>div.row>div:first-child {
+ min-height: calc(100vh - 3rem - 6rem); /* 3rem for topbar, 6rem for footer */
+}
+
+#topbar.row,
+#main>.row,
+#search-result-wrap>.row {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+footer {
+ position: absolute;
+ bottom: 0;
+ height: 6rem; /* see the height of #main-wrap */
+ padding: 1rem;
+ font-size: 0.8rem;
+ color: #7a7b7d;
+ background: #f3f3f3;
+}
+
+footer>div.d-flex {
+ line-height: 1.2rem;
+ width: 90%;
+}
+
+footer a:link,
+footer a:hover {
+ text-decoration: none;
+}
+
+footer>.d-flex>div {
+ width: 350px;
+}
+
+footer .copyright a,
+footer .license a {
+ font-weight: 600;
+ color: inherit;
+}
+
+
+/*--- Panels ---*/
+.panel-group {
+ position: -webkit-sticky; /* Safari */
+ position: sticky;
+ top: 2rem;
+ transition: top 0.2s ease-in-out;
+ padding-right: 1.5rem;
+ margin-top: 3rem;
+ margin-bottom: 6rem;
+ color: #6c757d;
+}
+
+.panel-group.topbar-down {
+ top: 6rem;
+}
+
+.panel-group>div {
+ padding-left: 1rem;
+ border-left: 1px solid rgba(158, 158, 158, 0.17);
+}
+
+.panel-group>div:not(:first-child) {
+ margin-top: 4rem;
+}
+
+.panel-group h3 {
+ padding-top: .5rem;
+ padding-bottom: .5rem;
+ margin-top: 0;
+ margin-bottom: 0;
+ letter-spacing: -0.02em;
+ font-size: 1rem;
+ font-family: 'Oswald', sans-serif;
+}
+
+.panel-group .post-content {
+ font-size: .9rem;
+}
+
+#panel-tags>div.post-content>div {
+ max-width: 80%;
+}
+
+#panel-tags .post-tag {
+ display: inline-block;
+ line-height: 1rem;
+ font-size: 0.85rem;
+ background: none;
+ border: 1px solid #ced4da;
+ border-radius: .8rem;
+ padding: .25rem .5rem;
+ margin-bottom: .2rem;
+}
+
+#panel-tags .post-tag:hover {
+ background-color: #2a408e;
+ border-color: #2a408e;
+ color: #fff;
+ transition: none;
+}
+
+#panel-update ul>li {
+ height: 1.8rem;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+ list-style: none;
+}
+
+#panel-update ul>li::before {
+ background: #999;
+ width: 4px;
+ height: 4px;
+ border-radius: 50%;
+ display: inline-block;
+ content: "";
+ position: relative;
+ bottom: .2rem;
+ margin-right: .4rem;
+}
+
+#panel-update ul a {
+ color: #6c757d;
+}
+
+/*--- button back-to-top ---*/
+
+#back-to-top {
+ display: none;
+ z-index: 1;
+ cursor: pointer;
+ position: fixed;
+ background: #fff;
+ color: #686868;
+ height: 2.6em;
+ width: 2.7em;
+ border-radius: 50%;
+ border: 1px solid #f1f1f1;
+ transition: 0.2s ease-out;
+ -webkit-transition: 0.2s ease-out;
+}
+
+#back-to-top:hover {
+ transform: translate3d(0, -5px, 0);
+ -webkit-transform: translate3d(0, -5px, 0);
+}
+
+/*--- Typography ---*/
+
+h1 {
+ font-size: 1.8rem;
+ font-weight: 400;
+}
+
+h2 {
+ font-size: 1.35rem;
+ font-weight: 400;
+}
+
+h3 {
+ font-size: 1.25rem;
+}
+
+h4 {
+ font-size: 1.15rem;
+}
+
+h5 {
+ font-size: 1.1rem;
+}
+
+h2, h3, h4 {
+ line-height: 1.2;
+ margin-bottom: 1rem;
+}
+
+blockquote {
+ border-left: 5px solid #eee;
+ padding-left: 1rem;
+ color: #9a9a9a;
+}
+
+.post-content blockquote a {
+ color: #2a408e;
+}
+
+kbd {
+ margin: 0 .3rem;
+}
+
+h2, h3, h4, sup {
+ padding-top: 4rem;
+ margin-top: -2.5rem;
+}
+
+div.footnotes>ol {
+ padding-inline-start: 2rem;
+ margin-top: .5rem;
+}
+
+div.footnotes>ol>li>p {
+ padding-left: .2em;
+}
+
+div.footnotes>ol>li:not(:last-child) {
+ margin-bottom: -.8rem;
+}
+
+div.footnotes>ol>li:target>p {
+ background-color: lightcyan;
+ width: fit-content;
+ -webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */
+ transition: background-color 1.5s ease-in-out;
+}
+
+a.footnote {
+ margin: 0 .2em;
+ -webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */
+ transition: background-color 1.5s ease-in-out;
+}
+
+sup:target>a.footnote {
+ background-color: lightcyan;
+ padding: 0 2px;
+ outline: thin dotted;
+}
+
+a.reversefootnote {
+ font-size: .6rem;
+ position: absolute;
+ line-height: 1;
+ padding-top: .5em;
+ margin-left: .5em;
+ border-bottom-style: none !important;
+}
+
+.post-content a {
+ color: #2a408e;
+ border-bottom: 1px dotted #c2c6cc;
+}
+
+#search-results a {
+ font-size: 1.1rem;
+ line-height: 2.5rem;
+}
+
+p>a, span>a,
+.post-preview a,
+.categories a,
+#tags a,
+#page-category a,
+#page-tag a,
+#archives a,
+#search-results a {
+ color: #2a408e;
+}
+
+.categories a,
+.panel-group a,
+#archives a,
+#page-tag a,
+#page-category a,
+#search-results a {
+ border-bottom: none;
+}
+
+.post h1 {
+ margin-top: 3rem;
+}
+
+#breadcrumb a:hover,
+#search-results a:hover,
+.post-preview a:hover,
+.post-meta a:hover,
+.post-content a:hover,
+.post a:hover code,
+footer a:hover,
+#post-wrap .post-content a:hover,
+#page .post-content a:hover,
+#panel-update a:hover {
+ color: #d2603a;
+ border-bottom: 1px solid #d2603a;
+ text-decoration: none;
+}
+
+.post em { /* MarkDown italic */
+ padding-right: .2rem;
+}
+
+/*--- Begin of Markdown table style ---*/
+
+div.post-content>table,
+div.post-content li>table {
+ min-width: 40%;
+ border-collapse: collapse;
+ border-spacing: 0;
+ margin-bottom: 1.5rem;
+}
+
+table thead {
+ border-bottom: solid 2px rgba(210, 215, 217, 0.75);
+}
+
+table thead+tbody tr {
+ border-bottom: solid 1px rgba(210, 215, 217, 0.75);
+}
+
+table thead+tbody tr:nth-child(2n + 1) {
+ background-color: #f8f9fa;
+}
+
+table thead th,
+table tbody td {
+ padding: .35rem .8rem;
+ font-size: 95%;
+}
+
+
+/*--- Home page ---*/
+
+#post-list {
+ margin-top: 1rem;
+ padding-right: .5rem;
+}
+
+.pagination {
+ font-size: 1rem;
+}
+
+.pagination a:hover {
+ text-decoration: none;
+}
+
+.post-preview {
+ padding-top: 1.5rem;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid rgba(158, 158, 158, 0.17);
+}
+
+.post-preview>h1 {
+ font-size: 1.4rem;
+ margin: 0;
+}
+
+.post-preview i.far {
+ /* fontawesome icons */
+ font-size: 86%;
+}
+
+.post-preview .post-content {
+ margin-top: .6rem;
+ margin-bottom: .6rem;
+ color: dimgray;
+}
+
+/* Make preview shorter in Home page*/
+.post-preview .post-content>p {
+ margin: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+
+.page-item .page-link {
+ color: #555555;
+ width: 2.5rem;
+ height: 2.5rem;
+ padding: 0;
+ text-align: center;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ border-radius: 50%;
+ border: 1px solid #f1f1f1;
+ font-family: 'Lato', sans-serif;
+}
+
+.page-item.active .page-link {
+ background-color: #2a408e;
+ box-shadow: 0 0 8px 0 #4b92d2 !important;
+ color: #f8f8f8;
+}
+
+.page-item.disabled .page-link {
+ color: rgba(108, 117, 125, 0.57);
+ border-color: #f1f1f1;
+}
+
+.page-item.disabled {
+ cursor: not-allowed;
+}
+
+.page-item:first-child .page-link,
+.page-item:last-child .page-link {
+ border-radius: 50%;
+}
+
+.page-item:not(:last-child) {
+ margin-right: 0.6rem;
+}
+
+/*--- post ---*/
+
+.post-meta {
+ font-size: 0.85rem;
+ word-spacing: 1px;
+}
+
+.post-meta a {
+ color: #2a408e;
+ border-bottom: 1px dotted #c2c6cc;
+}
+
+.post-meta a:not(:last-child) {
+ margin-right: 2px;
+}
+
+.post-content {
+ line-height: 1.8;
+ font-size: 1rem;
+ margin-top: 2rem;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+
+#post-list .post-meta i:not(:first-child) { // post-meta icons on HOME
+ margin-left: 1.5rem;
+}
+
+.post-tail {
+ margin-top: 4rem;
+ border-bottom: 2px solid #f2f2f2;
+ font-size: 0.85rem;
+}
+
+.post-tag {
+ background: rgba(0, 0, 0, 0.075);
+ border-radius: .34rem;
+ padding: .15rem .4rem;
+ margin: 0 .1rem;
+ color: #818182;
+ line-height: 1.6rem;
+}
+
+.tag:hover,
+.post-tag:hover {
+ background: rgb(222, 226, 230);
+ transition: background 0.35s ease-in-out;
+}
+
+.post-tag:hover {
+ border-bottom: none;
+ text-decoration: none;
+ color: #d2603a;
+}
+
+.post-pager {
+ margin: 1rem 0 2rem;
+}
+
+.post-pager .btn,
+.post-pager .btn.disabled {
+ color: #2a408e;
+ border-color: #2a408e;
+}
+
+.post-pager .btn:hover {
+ background: #2a408e;
+ color: #fff;
+}
+
+.post-pager a.btn.disabled {
+ pointer-events: auto;
+ cursor: not-allowed;
+ background: none;
+ color: gray;
+ border-color: gray;
+}
+
+.post img {
+ margin-top: .5rem;
+ margin-bottom: 1.5rem;
+ max-width: 100%;
+ height: auto;
+ filter: drop-shadow(2px 4px 6px rgba(0,0,0,0.08));
+}
+
+#post-panel .panel-group {
+ position: static;
+}
+
+#toc-wrap {
+ border-left: 1px solid rgba(158, 158, 158, 0.17);
+ position: -webkit-sticky;
+ position: sticky;
+ top: 2rem;
+ transition: top 0.2s ease-in-out;
+}
+
+#toc-wrap.topbar-down {
+ top: 6rem;
+}
+
+#toc-wrap>h3 {
+ font-size: 1rem;
+ font-family: 'Oswald', sans-serif;
+ color: gray;
+}
+
+#toc li>a {
+ padding-top: 0;
+}
+
+/* sharing */
+#sharing a>i{
+ font-size: 1.2em;
+}
+
+#sharing .fab.fa-facebook-square {
+ color: #3b549f;
+}
+
+#sharing .fab.fa-google-plus-g {
+ color: #d42a2a;
+}
+
+/*--- Tab Categories ---*/
+
+.categories {
+ margin-bottom: 2rem;
+}
+
+.categories .card-header {
+ padding-right: 12px;
+}
+
+.categories .card-header>span>i:first-child,
+.categories .list-group-item>i {
+ color: gray;
+}
+
+.categories .list-group-item {
+ border-left: none;
+ border-right: none;
+ padding-left: 2rem;
+}
+
+.categories .collapsing .list-group-item:first-child,
+.categories .collapse .list-group-item:first-child {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.categories i.far,
+.categories i.fas { // fontawesome icons
+ font-size: 86%;
+}
+
+.category-trigger {
+ width: 1.7rem;
+ height: 1.7rem;
+ border-radius: 50%;
+ text-align: center;
+ color: #6c757d!important;
+}
+
+@media (hover: hover) { // only works on desktop
+ .category-trigger:hover {
+ background-color: #e9ecef;
+ }
+}
+
+.category-trigger>i.fas.fa-angle-up {
+ position: relative;
+ bottom: 8%;
+ transition: 300ms ease all;
+}
+
+.disabled {
+ color: rgb(206, 196, 196);
+ pointer-events: auto;
+ cursor: not-allowed;
+}
+
+.hide-border-bottom {
+ border-bottom: none!important;
+}
+
+
+/*--- Tab Tags and Tag-Page ---*/
+
+.tag {
+ border-radius: 0.55em;
+ padding: 4px 8px 5px;
+ margin-right: .8rem;
+ line-height: 3rem;
+ letter-spacing: 0;
+ border: 1px solid #c5c6c7 !important;
+ box-shadow: 0 0 3px 0 #e9ecef;
+}
+
+.tag span {
+ margin-left: 0.6em;
+ font-size: 0.7em;
+ font-family: 'Oswald', sans-serif;
+}
+
+a.tag:hover {
+ text-decoration: none;
+}
+
+/*--- Tab Archives --*/
+
+#archives {
+ letter-spacing: 0.03rem;
+}
+
+#archives li {
+ font-size: 1.1rem;
+ line-height: 3rem;
+}
+
+#archives li:nth-child(odd) {
+ background-color: #fff;
+ background-image: linear-gradient(to left, #fff, #fbfbfb, #fbfbfb, #fbfbfb, #fff);
+}
+
+#archives span.lead {
+ font-size: 1.5rem;
+ font-family: 'Oswald', sans-serif;
+ position: relative;
+ left: 5px;
+}
+
+#archives span.lead:not(:first-child) {
+ position: relative;
+ left: 3px;
+}
+
+#archives span.lead:not(:first-child)::after {
+ left: 65px;
+}
+
+#archives span.lead::after { /* Year dot */
+ content: "";
+ display: block;
+ position: relative;
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ border-radius: 50%;
+ width: 10px;
+ height: 10px;
+ top: -26px;
+ left: 63px;
+ border: 2px solid;
+ background-color: #ffffff;
+ border-color: #9e9e9e;
+}
+
+#archives .date {
+ display: inline-block;
+}
+
+#archives .date.month {
+ width: 1.4rem;
+ text-align: center;
+ font-family: 'Oswald', sans-serif;
+ // background: yellowgreen;
+}
+
+#archives .date.day {
+ font-size: 85%;
+ font-family: sans-serif;
+ text-align: center;
+ margin-right: -2px;
+ width: 1.2rem;
+ position: relative;
+ left: -.15rem;
+ // background: aquamarine;
+}
+
+#archives ul>li>div>a {
+/* post title in Archvies */
+ margin-left: 2.5rem;
+ position: relative;
+ top: .1rem;
+}
+
+#archives .date.month~a::before {
+ /* A dot for Month and Day */
+ content: "";
+ display: inline-block;
+ position: relative;
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ border-radius: 50%;
+ width: 6px;
+ height: 6px;
+ float: left;
+ top: 20px;
+ left: 68px;
+ background-color: #9e9e9e;
+}
+
+#archives ul>li::after {
+ /* timeline for date */
+ content: "";
+ height: 39px;
+ top: -19px;
+ left: 72px;
+ display: inline-block;
+ float: left;
+ position: relative;
+ background-color: #ffffff;
+ border: 1px dashed silver;
+}
+
+#archives ul>li:first-child::before {
+ content: "";
+ width: 2px;
+ height: 44px;
+ top: -24px;
+ left: 72px;
+ display: inline-block;
+ float: left;
+ position: relative;
+ background-color: #ffffff;
+ border: 1px dashed silver;
+}
+
+#archives ul:not(:last-child)>li:last-child::after {
+ height: 50px;
+}
+
+#archives ul:last-child>li:last-child::after {
+ display: none;
+}
+
+
+/*--- Page Category and Tag ---*/
+
+#page-category ul>li,
+#page-tag ul>li {
+ line-height: 1.5rem;
+ padding: .6rem 0;
+}
+
+#page-category ul>li::before,
+#page-tag ul>li::before {
+ background: #999;
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ display: block;
+ content: "";
+ position: relative;
+ top: .6rem;
+ margin-right: .5rem;
+}
+
+#page-tag ul>li>a,
+#page-category ul>li>a, { /* post's title */
+ font-size: 1.1rem;
+}
+
+#page-category ul>li>span:last-child,
+#page-tag ul>li>span:last-child { /* post's date */
+ white-space: nowrap;
+}
+
+#page-tag h1>i { // tag icon
+ font-size: 1.2rem;
+}
+
+#page-category h1>i {
+ font-size: 1.25rem;
+}
+
+#page-category a:hover,
+#page-tag a:hover,
+#panel-update a:hover {
+ margin-bottom: -1px; // Avoid jumping
+}
+
+.dash {
+ margin: 0 .5rem .6rem .5rem;
+ border-bottom: 2px dotted silver;
+}
+
+
+/* --- Effects classes --- */
+
+.hidden {
+ display: none!important;
+}
+
+.shown {
+ display: block!important;
+}
+
+.no-scroll {
+ position: fixed;
+ width: 100%;
+}
+
+.flex-grow-1 {
+ -ms-flex-positive: 1!important;
+ flex-grow: 1!important;
+}
+
+.btn-box-shadow {
+ box-shadow: 0 0 8px 0 #eaeaea!important;
+}
+
+.topbar-up {
+ top: -3rem !important; /* same as topbar height. */
+}
+
+.flip {
+ -ms-transform: rotate(180deg); /* IE 9 */
+ -webkit-transform: rotate(180deg); /* Safari 3-8 */
+ transform: rotate(180deg);
+}
+
+.no-text-decoration {
+ text-decoration: none;
+}
+
+div.tooltip-inner { /* Overrided BS4 Tooltip */
+ font-size: .7rem;
+ max-width: 220px;
+}
+
+
+/*--- Responsive Design ---*/
+
+@media all and (max-width: 576px) {
+
+ #main>div.row>div:first-child {
+ min-height: calc(100vh - 3rem - 10rem); /* topbar is 3rem and footer is 10rem */
+ }
+
+ #main-wrap {
+ padding-bottom: 10rem; /* footer height */
+ }
+
+ #post-wrap h1 {
+ margin-top: 2.2rem;
+ font-size: 1.55rem;
+ }
+
+ #post-list .post-meta>span i:not(:first-child) {
+ margin-left: 1rem;
+ }
+
+ .post-content {
+ font-size: 1.08rem;
+ }
+
+ /* table text in small screens */
+ div>table, p~table {
+ width: 100%;
+ table-layout: fixed;
+ word-wrap: break-word;
+ }
+
+ #archives {
+ margin-top: -1rem;
+ }
+
+ #archives ul {
+ letter-spacing: 0;
+ }
+
+ #archives li>div {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ #page-tag ul>li>a,
+ #page-category ul>li>a {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ /* footer and #main-wrap expand vertical */
+ footer {
+ height: 10rem;
+ }
+
+ footer>div.d-flex {
+ flex-wrap: wrap;
+ justify-content: left!important;
+ -ms-flex-pack: distribute!important;
+ justify-content: space-around!important;
+ }
+
+}
+
+@media all and (max-width: 768px) {
+ .post img {
+ max-width: calc(100% + 1rem);
+ }
+}
+
+@media all and (min-width: 768px) {
+ .post .post-meta>div:not(:first-child)::before {
+ content: "\2022";
+ color: rgba(158, 158, 158, 0.8);
+ font-weight: bold;
+ padding-left: .5rem;
+ padding-right: .3rem;
+ }
+
+ .post .post-meta.flex-column {
+ -webkit-box-orient: horizontal!important;
+ -webkit-box-direction: normal!important;
+ -ms-flex-direction: row!important;
+ flex-direction: row!important;
+ }
+}
+
+@media all and (min-width: 831px) {
+ /* button 'back-to-Top' position */
+ #back-to-top {
+ bottom: 9.2rem;
+ right: 1.2rem;
+ }
+
+ .topbar-up {
+ box-shadow: none !important;
+ }
+
+ #topbar-title {
+ text-align: left;
+ }
+
+}
+
+/* iPad 9.7" horizontal */
+@media all and (min-width: 992px) and (max-width: 1024px) {
+ #main-wrap .col-lg-11 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 96%;
+ flex: 0 0 96%;
+ max-width: 96%;
+ }
+}
+
+
+@media all and (min-width: 768px) and (max-width: 831px) {
+ .post img {
+ max-width: calc(100% + 2rem);
+ }
+}
+
+
+/* Hide SideBar and TOC */
+@media all and (max-width: 831px) {
+
+ .sidebar-expand {
+ transform: translateX(0) !important;
+ }
+
+ .sidebar-expand~#main-wrap {
+ transform: translateX(260px) !important;
+ }
+
+ #sidebar {
+ transform: translateX(-260px); /* hide */
+ -webkit-transform: translateX(-260px);
+ }
+
+ #sidebar .cursor {
+ -webkit-transition: none;
+ -moz-transition: none;
+ transition: none;
+ }
+
+ #main-wrap {
+ margin-left: 0;
+ }
+
+ #search-result-wrap {
+ width: 100%
+ }
+
+ #page h1.dynamic-title {
+ display: none;
+ }
+
+ #page h1.dynamic-title ~ .post-content {
+ margin-top: 3rem;
+ }
+
+ #breadcrumb,
+ #search-wrap {
+ display: none;
+ }
+
+ #topbar {
+ position: -webkit-sticky;
+ position: sticky;
+ left: 0;
+ }
+
+ .topbar-up {
+ top: 0 !important;
+ }
+
+ #main>div.row>div {
+ margin-top: 0;
+ }
+
+ .post img {
+ position: relative;
+ left: 50%;
+ -webkit-transform: translateX(-50%);
+ -ms-transform: translateX(-50%);
+ transform: translateX(-50%);
+ }
+
+ #topbar-title,
+ #sidebar-trigger,
+ #search-trigger {
+ display: block;
+ }
+
+ #search-wrap.shown {
+ padding-left: 1rem;
+ }
+
+ #search-wrap.shown~a {
+ padding-right: 1rem;
+ }
+
+ #search-input {
+ margin-left: 0;
+ width: 95%;
+ }
+
+ #search-result-wrap .post-content {
+ letter-spacing: 0;
+ }
+
+ #tags {
+ -webkit-box-pack: center!important;
+ -ms-flex-pack: center!important;
+ justify-content: center!important;
+ }
+
+ sup {
+ padding-top: 3.4rem;
+ }
+
+ div.footnotes>ol>li {
+ padding-top: 3.5rem;
+ margin-top: -4.3rem;
+ }
+
+ div.footnotes>ol>li:first-child {
+ margin-top: -3.5rem;
+ }
+}
+
+/* Compact icons in sidebar & TOC hidden */
+@media all and (min-width: 832px) and (max-width: 1200px) {
+
+ #sidebar {
+ width: 210px;
+ }
+
+ #topbar {
+ left: 210px;
+ }
+
+ #search-result-wrap {
+ width: calc(100% - 210px);
+ }
+
+ #site-title {
+ font-size: 1.3rem;
+ margin-left: 0!important;
+ }
+
+ #site-subtitle {
+ font-size: 90%;
+ padding-left: 1rem;
+ padding-right: 1rem;
+ }
+
+ .contact a {
+ padding: 0 0.6rem;
+ }
+
+ #main-wrap {
+ margin-left: 210px;
+ }
+
+ #breadcrumb {
+ width: 65%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: keep-all;
+ white-space: nowrap;
+ }
+
+}
+
+/* Pannel hidden */
+@media all and (max-width: 1200px) {
+ #post-list {
+ padding-right: 0;
+ }
+
+ #panel-wrap, #post-panel {
+ display: none;
+ }
+
+ .pagination {
+ justify-content: center;
+ }
+
+ #topbar-main {
+ padding: 0;
+ }
+
+ footer>div.d-flex {
+ width: 95%;
+ }
+
+}
+
+
+/*--- Large screens ---*/
+
+@media all and (min-width: 1200px) {
+
+ #main>div.row .col-xl-8 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ padding-left: 3.5rem;
+ }
+
+ #back-to-top {
+ bottom: 9rem;
+ right: 4.3rem;
+ }
+
+ #search-input {
+ width: 15rem;
+ -webkit-transition: all .3s ease-in-out;
+ transition: all .3s ease-in-out;
+ }
+
+ #search-input:focus {
+ width: 20rem;
+ }
+
+}
+
+@media all and (min-width: 1441px) {
+ #topbar-main {
+ max-width: 73%;
+ }
+
+ #main>div.row .col-xl-8 {
+ max-width: 60%;
+ }
+
+ #main-wrap .col-xl-3 {
+ max-width: 18%;
+ }
+
+ footer>div.d-flex {
+ width: 70%;
+ }
+}
diff --git a/assets/css/_src/syntax.scss b/assets/css/_src/syntax.scss
new file mode 100644
index 0000000..cc1ace6
--- /dev/null
+++ b/assets/css/_src/syntax.scss
@@ -0,0 +1,157 @@
+/*!
+* The syntax highlight.
+* © 2018-2019 Cotes Chung
+* MIT Licensed
+*/
+
+.highlight .hll { background-color: #ffc; }
+.highlight .c { color: #999; } /* Comment */
+.highlight .err { color: #a00; background-color: #faa } /* Error */
+.highlight .k { color: #069; } /* Keyword */
+.highlight .o { color: #555 } /* Operator */
+.highlight .cm { color: #09f; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #099 } /* Comment.Preproc */
+.highlight .c1 { color: #999; } /* Comment.Single */
+.highlight .cs { color: #999; } /* Comment.Special */
+.highlight .gd { background-color: #fcc; border: 1px solid #c00 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #f00 } /* Generic.Error */
+.highlight .gh { color: #030; } /* Generic.Heading */
+.highlight .gi { background-color: #cfc; border: 1px solid #0c0 } /* Generic.Inserted */
+.highlight .go { color: #aaa } /* Generic.Output */
+.highlight .gp { color: #009; } /* Generic.Prompt */
+.highlight .gs { } /* Generic.Strong */
+.highlight .gu { color: #030; } /* Generic.Subheading */
+.highlight .gt { color: #9c6 } /* Generic.Traceback */
+.highlight .kc { color: #069; } /* Keyword.Constant */
+.highlight .kd { color: #069; } /* Keyword.Declaration */
+.highlight .kn { color: #069; } /* Keyword.Namespace */
+.highlight .kp { color: #069 } /* Keyword.Pseudo */
+.highlight .kr { color: #069; } /* Keyword.Reserved */
+.highlight .kt { color: #078; } /* Keyword.Type */
+.highlight .m { color: #f60 } /* Literal.Number */
+.highlight .s { color: #d44950 } /* Literal.String */
+.highlight .na { color: #4f9fcf } /* Name.Attribute */
+.highlight .nb { color: #366 } /* Name.Builtin */
+.highlight .nc { color: #0a8; } /* Name.Class */
+.highlight .no { color: #360 } /* Name.Constant */
+.highlight .nd { color: #99f } /* Name.Decorator */
+.highlight .ni { color: #999; } /* Name.Entity */
+.highlight .ne { color: #c00; } /* Name.Exception */
+.highlight .nf { color: #c0f } /* Name.Function */
+.highlight .nl { color: #99f } /* Name.Label */
+.highlight .nn { color: #0cf; } /* Name.Namespace */
+.highlight .nt { color: #2f6f9f; } /* Name.Tag */
+.highlight .nv { color: #033 } /* Name.Variable */
+.highlight .ow { color: #000; } /* Operator.Word */
+.highlight .w { color: #bbb } /* Text.Whitespace */
+.highlight .mf { color: #f60 } /* Literal.Number.Float */
+.highlight .mh { color: #f60 } /* Literal.Number.Hex */
+.highlight .mi { color: #f60 } /* Literal.Number.Integer */
+.highlight .mo { color: #f60 } /* Literal.Number.Oct */
+.highlight .sb { color: #c30 } /* Literal.String.Backtick */
+.highlight .sc { color: #c30 } /* Literal.String.Char */
+.highlight .sd { color: #c30; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #c30 } /* Literal.String.Double */
+.highlight .se { color: #c30; } /* Literal.String.Escape */
+.highlight .sh { color: #c30 } /* Literal.String.Heredoc */
+.highlight .si { color: #a00 } /* Literal.String.Interpol */
+.highlight .sx { color: #c30 } /* Literal.String.Other */
+.highlight .sr { color: #3aa } /* Literal.String.Regex */
+.highlight .s1 { color: #c30 } /* Literal.String.Single */
+.highlight .ss { color: #fc3 } /* Literal.String.Symbol */
+.highlight .bp { color: #366 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #033 } /* Name.Variable.Class */
+.highlight .vg { color: #033 } /* Name.Variable.Global */
+.highlight .vi { color: #033 } /* Name.Variable.Instance */
+.highlight .il { color: #f60 } /* Literal.Number.Integer.Long */
+
+/*-- Codes Snippet --*/
+
+div.highlight,
+figure.highlight,
+.highlighter-rouge {
+ background: #f7f7f7;
+}
+
+.highlight {
+ overflow: auto;
+ -moz-box-shadow: inset 0 0 2px #e9ecef;
+ -webkit-box-shadow: inset 0 0 2px #e9ecef;
+ box-shadow: inset 0 0 2px #e9ecef;
+}
+
+.highlight .lineno {
+ padding: .8rem .5rem;
+ min-width: 2rem;
+ text-align: right;
+ color: rgba(140, 134, 126, 0.67);
+ background: rgb(234, 236, 242);
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+.highlight table {
+ padding: 0;
+ border: 0;
+}
+
+.highlight td {
+ padding: 0;
+ border: 0;
+}
+
+.highlight pre {
+ margin-bottom: 0;
+ font-size: .85rem;
+ line-height: 1.4rem;
+ word-wrap: normal; /* Fixed Safari overflow-x */
+}
+
+.highlight table td pre {
+ overflow: visible; /* Fixed iOS safari overflow-x */
+ word-break: normal; /* Fixed iOS safari linenos code break */
+}
+
+/* Override BS Inline-code style */
+.highlighter-rouge {
+ color: black;
+ margin-bottom: 1.2em;
+}
+
+code {
+ -webkit-hyphens: none;
+ -ms-hyphens: none;
+ -moz-hyphens: none;
+ hyphens: none;
+}
+
+code.highlighter-rouge {
+ padding: 2px 4px;
+ margin: 0 .3rem;
+ border-radius: 4px;
+ border: 1px solid #e9ecef;
+}
+
+td.rouge-code {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+/* code snippet radius */
+.highlighter-rouge,
+.highlight {
+ border-radius: 5px;
+}
+
+
+/* Hide line numbers for code snippets without specific language */
+div[class^='highlighter-rouge'] pre.lineno {
+ display: none;
+}
+div[class^='highlighter-rouge'] td.rouge-code {
+ padding: .8rem 1rem;
+}
diff --git a/assets/css/styles.scss b/assets/css/styles.scss
new file mode 100644
index 0000000..354a8b1
--- /dev/null
+++ b/assets/css/styles.scss
@@ -0,0 +1,9 @@
+---
+# Aggregation of CSS files.
+# © 2018-2019 Cotes Chung
+# MIT License
+---
+
+@import "_src/main";
+@import "_src/syntax";
+@import "_src/fonts";
\ No newline at end of file
diff --git a/assets/data/proxy.json b/assets/data/proxy.json
new file mode 100644
index 0000000..d84ebdd
--- /dev/null
+++ b/assets/data/proxy.json
@@ -0,0 +1 @@
+{"proxyUrl":"https://your-gae.appspot.com/query?id=the_secrt_id"}
\ No newline at end of file
diff --git a/assets/img/favicons/android-icon-144x144.png b/assets/img/favicons/android-icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..782cf3a9437428c4609ab98f4a6a8e272209e956
GIT binary patch
literal 15762
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 $!1#ZF>EkGj*}X>DDUOC6^25
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
N%+uA+Wt~$(695CS2S@+_
literal 0
HcmV?d00001
diff --git a/assets/img/favicons/android-icon-192x192.png b/assets/img/favicons/android-icon-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..db2d8e67a4c5823d5a151cf0c03e2f7cfb7b47ab
GIT binary patch
literal 21277
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
QCQyKRy85}Sb4q9e0P#06j{pDw
literal 0
HcmV?d00001
diff --git a/assets/img/favicons/android-icon-48x48.png b/assets/img/favicons/android-icon-48x48.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b01aa734ab27f8f0dd69f20d33366d7d0604d74
GIT binary patch
literal 3978
zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F!lvNA9*
zFct^7J29*~C-ahlfk7eJBgmJ5p-PQ`p`nF=;THn~L&FOOhEf9thF1v;3|2E37{m+a
z>ZnLqRXM|jRq
zOL#r;PVuw(cW1uey}$bX_uB9GB&WX13U8Pa7E-LUF;{x2hy!N;_ZG&?h8ny2GtZ9)
zUz#h+;F{YPE_0l5LnC`*c0+i>`+l~h0-fv&5|Rg`dj-!-ypt0t)-3#wVFsrU>oR7&
zf)kr`>^YkBWe;!5by|2~g5p2MAK?i~8=h9olNWBtoW;PpG(=v2wT^KQcMbOp?mz2O
zBO_05`tiT(#x`FSA;)Z6#vf`0(jR0Kq>dKU@Oku$B)BND9A0PMU@(E%B!Ke{=MlEO
zm&;2mcPN~7)m%meYv`&sLFb|~{M7G$pB43Yd${J>Q(a_JPM`RC=={;@o;
z_dq?PG-J3+&H|s-rjcPap6q+`h9C6HacBf7puKG
zeEl@*_j`x-P;)HZefx^>gsF@9)+B|Jz#o`b7`gQW*Hr_Aaz9mT8BTNP5bud=HYqLlQ@Od4D#>UFc{6``B^h>+qP|f3({5CZyQeDS!3rf!180?
z|7*v3rRUGJEPmE29#haL$k#s8JYO#R+M2}UeX=Q=Bh${!>3siNCw7;}^-{))r&Gft
z_SIO{*4F0S-o|_X`^q(Ip7dG2d+=uSd9~SRC!I|L1^&{dsmcXMKJS@m@$g4VLAu4m
z9^-RA&a=x^9JsryboG|)+q>WYR#JMjYu%ndpH5%8a6w^PE`R*Vl%TM+QL3`CvY(Dg
z=bzx#-=na*{QWeig$nCldwF|z=iJ`ro44!bvhRy8zKFkao61jbX3dg{xt{v|-rhHNb{6m0P#!D3RODjDluw_E-tBxYw{GV%
zsYMqxqOvc&G>MIkm9Z-6D1CkHZRGa6yKCpy{d)OY+4RkdzV`=beb>2cGT(&fvB}!f
z!VQkChaVceERniwvU1(JXCEFOw&-(qc4q$k{CxVQC7z46o-;8wFW>k5UbVidsp;CB
z{QUceImAD#V9dGgmff2<>p8=Jzl|{_Z3;r2EY4pYtmdlCKFg|%@KYxM3p_DGyy%WzrKbf|fhlj^t%VLeC
zHHQuCL?^a?{`sfh%iDYQu3ft>9XN4I;PJ!8#i=*{PJbZ!rzMYBc749=gHQYIyKn1NHMO~3UT1ybM%g`H^)t`D
zxR@$6sn5z*zg}GUwdB?5RZ8i8D=c4h|5;~xyMCwqi~o!^Ymf68EZgQ~5$98VdF2{G
ze(NbNGCux+LPZ5W-E(c<&Y83#B`nhP^V*Z!!&{QVmmT@)|Nq;T;C=faZTeoer}jYn
zwuGlM82Zd-{$BiP@#-+f57&0t-fRDT`{vEU8PjinU+B7`bIOC447yI$dd*9Fez^Z#
zdD*BfJl=ZgpYYw~GFGKFS{n=*Wh`eL+m`#hS(p7a|CVJH8?)uRSNScw)Ope9!s(Su
z)f1%EjD@Ej(V0Ehw%xK~$?+Q>e;s$9ldE&hqQq^6))7S1+Ql%fBkaB{}&%f8Z>xMhE{*4yPmS+?TP~=B+C*pQY||`osS1
zFQzAdJFsJmQQgj`Vs%xg*-mLCFF$(f(0bFFz3Y~3+to9pCE!5A!{QyA^||jF
zsNa{FADg~?vF+klyau9Q1P9#yP|C!Qy{$-`DJWm$Opj`V0*Thn3p}UancA
z`*flB|8oKlO%_Bt*4^B>_`cWiBEC5eADiEWnDzy|GU7QG7_ffI
zuPI5t3RJz$W@o?53h`=nSjRSx