├── src ├── js │ ├── sidebar.js │ ├── wild.js │ ├── file_template.js │ ├── loader.js │ ├── css_template.js │ ├── helpers.js │ └── main.js ├── images │ ├── pp.jpg │ └── logo.svg ├── css │ ├── var.less │ ├── var.scss │ ├── main.less │ ├── main.scss │ ├── wild.less │ ├── wild.scss │ ├── media_query.less │ ├── media_query.scss │ ├── light.less │ ├── light.scss │ ├── dark.less │ ├── dark.scss │ ├── icon.less │ ├── icon.scss │ ├── base.less │ └── base.scss └── index.js ├── images ├── tn.png ├── dark.png ├── export.png ├── wild_mode.png ├── screenshot.png ├── wild_mode2.png └── wild_mode3.png ├── exampleSite ├── static │ └── images │ │ ├── favicon.ico │ │ ├── logo.svg │ │ └── logo_light.svg ├── content │ └── posts │ │ ├── hello-world.md │ │ └── The standard Lorem Ipsum passage, used since the 1500s.md └── config.toml ├── .gitignore ├── archetypes └── default.md ├── i18n ├── zh.yaml └── en.yaml ├── layouts ├── partials │ ├── loader.html │ ├── sidebar_posts.html │ ├── sidebar_tags.html │ ├── sidebar_categories.html │ ├── terms_list.html │ ├── js.html │ ├── sidebar_taxonomies.html │ ├── pagination.html │ ├── list.html │ ├── logo.html │ ├── comment.html │ ├── intro.html │ ├── header.html │ ├── post.html │ ├── head.html │ └── footer.html ├── _default │ ├── single.html │ ├── list.html │ └── terms.html ├── index.html └── 404.html ├── theme.toml ├── LICENSE ├── package.json ├── webpack.config.js ├── README-zh.md ├── README.md └── static └── css └── main.css /src/js/sidebar.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/js/wild.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/images/tn.png -------------------------------------------------------------------------------- /images/dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/images/dark.png -------------------------------------------------------------------------------- /images/export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/images/export.png -------------------------------------------------------------------------------- /src/images/pp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/src/images/pp.jpg -------------------------------------------------------------------------------- /images/wild_mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/images/wild_mode.png -------------------------------------------------------------------------------- /images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/images/screenshot.png -------------------------------------------------------------------------------- /images/wild_mode2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/images/wild_mode2.png -------------------------------------------------------------------------------- /images/wild_mode3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/images/wild_mode3.png -------------------------------------------------------------------------------- /src/css/var.less: -------------------------------------------------------------------------------- 1 | @light_main_bg: #FFF; 2 | @dark_main_bg: #282C34; 3 | @light_header_bg: #DDD; 4 | -------------------------------------------------------------------------------- /src/css/var.scss: -------------------------------------------------------------------------------- 1 | $light_main_bg: #FFF; 2 | $dark_main_bg: #282C34; 3 | $light_header_bg: #DDD; 4 | -------------------------------------------------------------------------------- /exampleSite/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfengyuan/edidor/HEAD/exampleSite/static/images/favicon.ico -------------------------------------------------------------------------------- /src/css/main.less: -------------------------------------------------------------------------------- 1 | @import 'var'; 2 | @import 'base'; 3 | @import 'dark'; 4 | @import 'light'; 5 | @import 'wild'; 6 | @import 'icon'; 7 | -------------------------------------------------------------------------------- /src/css/main.scss: -------------------------------------------------------------------------------- 1 | @import 'var'; 2 | @import 'base'; 3 | @import 'dark'; 4 | @import 'light'; 5 | @import 'wild'; 6 | @import 'icon'; 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Hugo default output directory 2 | /public 3 | node_modules 4 | ## OS Files 5 | # Windows 6 | Thumbs.db 7 | Desktop.ini 8 | $RECYCLE.BIN/ 9 | 10 | # OSX 11 | .DS_Store 12 | *.map 13 | -------------------------------------------------------------------------------- /archetypes/default.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | tags: [] 4 | categories: [] 5 | date: {{ .Date }} 6 | hidden: false 7 | draft: true 8 | keywords: [] 9 | description: "" 10 | slug: "" 11 | --- 12 | -------------------------------------------------------------------------------- /i18n/zh.yaml: -------------------------------------------------------------------------------- 1 | prev_page: 2 | other: "最新" 3 | 4 | next_page: 5 | other: "更早" 6 | 7 | home: 8 | other: "首页" 9 | 10 | archive: 11 | other: "归档" 12 | 13 | tags: 14 | other: "标签" 15 | 16 | about: 17 | other: "关于" 18 | -------------------------------------------------------------------------------- /i18n/en.yaml: -------------------------------------------------------------------------------- 1 | prev_page: 2 | other: "Prev" 3 | 4 | next_page: 5 | other: "Next" 6 | 7 | home: 8 | other: "Home" 9 | 10 | archive: 11 | other: "Archive" 12 | 13 | tags: 14 | other: "Tags" 15 | 16 | about: 17 | other: "About" 18 | -------------------------------------------------------------------------------- /layouts/partials/loader.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 |
6 | 7 |
8 | -------------------------------------------------------------------------------- /src/css/wild.less: -------------------------------------------------------------------------------- 1 | .wild-mode .main h1, 2 | .wild-mode .main h2, 3 | .wild-mode .main h3, 4 | .wild-mode .main h4, 5 | .wild-mode .main h5, 6 | .wild-mode .main h6, 7 | .wild-mode .title { 8 | text-shadow: none; 9 | } 10 | .wild-mode .local-info { 11 | box-shadow: none; 12 | } 13 | -------------------------------------------------------------------------------- /src/css/wild.scss: -------------------------------------------------------------------------------- 1 | .wild-mode .main h1, 2 | .wild-mode .main h2, 3 | .wild-mode .main h3, 4 | .wild-mode .main h4, 5 | .wild-mode .main h5, 6 | .wild-mode .main h6, 7 | .wild-mode .title { 8 | text-shadow: none; 9 | } 10 | .wild-mode .local-info { 11 | box-shadow: none; 12 | } 13 | -------------------------------------------------------------------------------- /layouts/partials/sidebar_posts.html: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /layouts/partials/sidebar_tags.html: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /layouts/partials/sidebar_categories.html: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /layouts/partials/terms_list.html: -------------------------------------------------------------------------------- 1 | {{ $title := .Data.Plural}} 2 |

{{ $title | humanize }}

3 | 14 | -------------------------------------------------------------------------------- /layouts/_default/single.html: -------------------------------------------------------------------------------- 1 | {{ partial "head.html" . }} 2 | 3 | 4 | {{ partial "loader.html" .}} 5 | {{ partial "header.html" . }} 6 |
7 | 10 |
11 | {{ partial "post.html" . }} 12 |
13 |
14 | {{ partial "footer.html" . }} 15 | {{ partial "js.html" . }} 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /layouts/_default/list.html: -------------------------------------------------------------------------------- 1 | {{ partial "head.html" . }} 2 | 3 | 4 | {{ partial "loader.html" .}} 5 | {{ partial "header.html" . }} 6 |
7 | 10 |
11 | {{ partial "list.html" . }} 12 |
13 |
14 | {{ partial "footer.html" . }} 15 | {{ partial "js.html" . }} 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /layouts/_default/terms.html: -------------------------------------------------------------------------------- 1 | {{ partial "head.html" . }} 2 | 3 | 4 | {{ partial "loader.html" .}} 5 | {{ partial "header.html" . }} 6 |
7 | 10 |
11 | {{ partial "terms_list.html" . }} 12 |
13 |
14 | {{ partial "footer.html" . }} 15 | {{ partial "js.html" . }} 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /layouts/index.html: -------------------------------------------------------------------------------- 1 | {{ partial "head.html" . }} 2 | 3 | 4 | {{ partial "loader.html" .}} 5 | {{ partial "header.html" . }} 6 |
7 | 10 |
11 | {{ partial "intro.html" . }} 12 |
13 |
14 | {{ partial "footer.html" . }} 15 | {{ partial "js.html" . }} 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /layouts/partials/js.html: -------------------------------------------------------------------------------- 1 | 2 | {{ range .Site.Params.customJs}} 3 | 4 | {{ end }} 5 | {{ if (.Site.Params.isHighlightCode) }} 6 | {{ if not .Site.Params.useCustomSyntaxHighlight}} 7 | 8 | {{ end }} 9 | 10 | {{ end }} 11 | 12 | {{- if not .Site.IsServer -}} 13 | {{ template "_internal/google_analytics_async.html" . }} 14 | {{- end -}} 15 | -------------------------------------------------------------------------------- /theme.toml: -------------------------------------------------------------------------------- 1 | # theme.toml template for a Hugo theme 2 | # See https://github.com/spf13/hugoThemes#themetoml for an example 3 | 4 | name = "edidor" 5 | license = "MIT" 6 | licenselink = "https://github.com/sfengyuan/edidor/blob/master/LICENSE" 7 | description = "a hugo theme that looks like editors with infinite color modes" 8 | homepage = "https://github.com/sfengyuan/edidor" 9 | tags = ["blog", "editor", "edidor"] 10 | features = ["personal", "color generator", "infinite color modes"] 11 | min_version = 0.40 12 | 13 | [author] 14 | name = "sunfy" 15 | homepage = "https://sunfy.xyz/" 16 | -------------------------------------------------------------------------------- /layouts/partials/sidebar_taxonomies.html: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /src/css/media_query.less: -------------------------------------------------------------------------------- 1 | @media only screen and (max-width: 800px) { 2 | .status li:last-child { 3 | display: none; 4 | } 5 | } 6 | 7 | @media only screen and (max-width: 600px) { 8 | .status li:nth-last-child(2) { 9 | display: none; 10 | } 11 | } 12 | 13 | @media only screen and (max-width: 500px) { 14 | .status li:nth-last-child(3) { 15 | display: none; 16 | } 17 | 18 | .status li:nth-last-child(4) { 19 | display: none; 20 | } 21 | } 22 | 23 | @media only screen and (max-width: 400px) { 24 | .status { 25 | display: none; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/css/media_query.scss: -------------------------------------------------------------------------------- 1 | @media only screen and (max-width: 800px) { 2 | .status li:last-child { 3 | display: none; 4 | } 5 | } 6 | 7 | @media only screen and (max-width: 600px) { 8 | .status li:nth-last-child(2) { 9 | display: none; 10 | } 11 | } 12 | 13 | @media only screen and (max-width: 500px) { 14 | .status li:nth-last-child(3) { 15 | display: none; 16 | } 17 | 18 | .status li:nth-last-child(4) { 19 | display: none; 20 | } 21 | } 22 | 23 | @media only screen and (max-width: 400px) { 24 | .status { 25 | display: none; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /layouts/partials/pagination.html: -------------------------------------------------------------------------------- 1 | 20 | -------------------------------------------------------------------------------- /layouts/404.html: -------------------------------------------------------------------------------- 1 | {{ partial "head.html" . }} 2 | 3 | 4 | {{ partial "loader.html" .}} 5 | {{ partial "header.html" . }} 6 |
7 | 10 |
11 |
12 | logo 13 |

404 Page not found.

14 |
15 |
16 |
17 | {{ partial "footer.html" . }} 18 | {{ partial "js.html" . }} 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /layouts/partials/list.html: -------------------------------------------------------------------------------- 1 | {{ $paginator := (.Paginate (.Pages.GroupByDate "2006-01")).PageGroups }} 2 | {{ range $paginator }} 3 |

4 | 5 |

6 | 18 | {{ end }} 19 | {{ partial "pagination.html" . }} 20 | -------------------------------------------------------------------------------- /src/js/file_template.js: -------------------------------------------------------------------------------- 1 | export function genFile (identifier, themeName) { 2 | return `/* 3 | Hugo Edidor theme wild mode exported. 4 | homepage: https://github.com/sfengyuan/edidor 5 | Usage: 6 | 1. Throw me to your site root folder/static/css directory, you can rename me to whatever you like. 7 | 2. Copy the code below to your config file. 8 | 9 | -------- 10 | [[menu.main]] 11 | parent = "Theme" 12 | identifier = "${identifier}" 13 | name = "${themeName}" 14 | url = "#" 15 | weight = 30 16 | -------- 17 | 18 | 3. Change the field 'name' and 'weight' to whatever you like. Leave others alone, and don't add your custom field, hugo doesn't support that, though I really hope so :/. 19 | */` 20 | } 21 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import './css/main.less' 2 | import { onEvent, qs } from './js/helpers' 3 | import { 4 | tryLoadMode, 5 | tryRestoreSidebar, 6 | activateSidebarToggle, 7 | activateModeSwitcher, 8 | activateSidebarDrag, 9 | activateDialog 10 | } from './js/main' 11 | import { getLoader } from './js/loader' 12 | const loader = getLoader() 13 | onEvent('DOMContentLoaded', e => { 14 | loader.loading() 15 | const doms = {} 16 | doms.pane = qs('.sidebar') 17 | doms.main = qs('.main') 18 | doms.paneLeft = doms.pane.getBoundingClientRect().left 19 | tryLoadMode(doms, loader) 20 | tryRestoreSidebar(doms) 21 | activateSidebarToggle(doms) 22 | activateModeSwitcher(doms, loader) 23 | activateSidebarDrag(doms) 24 | activateDialog(doms, loader) 25 | }, 0, document) 26 | -------------------------------------------------------------------------------- /layouts/partials/logo.html: -------------------------------------------------------------------------------- 1 | {{ if (fileExists "static/images/logo_light.svg") }} 2 |
  • 3 | 4 | 5 | 6 |
  • 7 | {{ end }} 8 | {{ if (fileExists "static/images/logo_wild.svg") }} 9 |
  • 10 | 11 | 12 | 13 |
  • 14 | {{ end }} 15 |
  • 16 | 17 | 18 | 19 |
  • 20 | -------------------------------------------------------------------------------- /layouts/partials/comment.html: -------------------------------------------------------------------------------- 1 |
    2 |

    3 | Comment is disabled to avoid unwanted discussions from 'localhost:1313' on your Disqus 4 | account... 5 |

    6 |
    7 |
    8 | 24 | -------------------------------------------------------------------------------- /layouts/partials/intro.html: -------------------------------------------------------------------------------- 1 |
    2 | {{ if (fileExists "static/images/logo_light.svg") }} 3 | 4 | 5 | 6 | {{ end }} 7 | {{ if (fileExists "static/images/logo_wild.svg") }} 8 | 9 | 10 | 11 | {{ end }} 12 | 13 | 14 | 15 |

    16 | {{ with .Param "title" }} 17 | {{ . }} 18 | {{ else }} 19 | {{ .Site.Title }} 20 | {{ end }} 21 |

    22 |

    23 | {{ with .Param "introText" }} 24 | {{ . | safeHTML }} 25 | {{ end }} 26 |

    27 |
    28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Jacob Sun 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "edidor", 3 | "version": "1.1.0", 4 | "description": "[中文](https://github.com/sfengyuan/edidor/blob/master/README-zh.md)", 5 | "main": "index.js", 6 | "dependencies": { 7 | "d3-ease": "^1.0.5", 8 | "lodash.throttle": "^4.1.1" 9 | }, 10 | "devDependencies": { 11 | "autoprefixer": "^10.2.5", 12 | "cross-env": "^7.0.3", 13 | "css-loader": "^5.1.3", 14 | "css-minimizer-webpack-plugin": "^1.3.0", 15 | "eslint": "^7.22.0", 16 | "eslint-config-standard": "^16.0.2", 17 | "eslint-plugin-import": "^2.22.1", 18 | "eslint-plugin-node": "^11.1.0", 19 | "eslint-plugin-promise": "^4.3.1", 20 | "file-loader": "^6.2.0", 21 | "less": "^4.1.1", 22 | "less-loader": "^8.0.0", 23 | "mini-css-extract-plugin": "^1.3.9", 24 | "postcss-loader": "^5.2.0", 25 | "postcss-preset-env": "^6.7.0", 26 | "rimraf": "^3.0.2", 27 | "style-loader": "^0.23.1", 28 | "url-loader": "^4.1.1", 29 | "webpack": "^5.26.0", 30 | "webpack-cli": "^4.5.0" 31 | }, 32 | "scripts": { 33 | "start": "cross-env NODE_ENV=development webpack --watch", 34 | "build": "rimraf static/images/* && cross-env NODE_ENV=production webpack --config webpack.config.js" 35 | }, 36 | "author": "", 37 | "license": "ISC", 38 | "browserslist": [ 39 | "last 2 version", 40 | "> 2%" 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /layouts/partials/header.html: -------------------------------------------------------------------------------- 1 |
    2 | 39 |
    40 | -------------------------------------------------------------------------------- /layouts/partials/post.html: -------------------------------------------------------------------------------- 1 |
    2 |

    {{ .Title }}

    3 |
    4 | 10 | {{ with .Params.categories }} 11 | 19 | {{ end }} 20 | {{ with .Params.tags }} 21 | 22 | 30 | {{ end }} 31 |
    32 |
    33 | {{ if .Content }} 34 | {{ .Content }} 35 | {{ else }} 36 |

    No Content. - -

    37 | {{ end }} 38 |
    39 | 40 |
    41 | {{ partial "comment.html" . }} 42 | -------------------------------------------------------------------------------- /src/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /exampleSite/static/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /layouts/partials/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{ hugo.Generator }} 9 | 10 | 11 | 12 | {{ range .AlternativeOutputFormats }} 13 | 14 | {{ end }} 15 | 16 | {{ if .IsHome }}{{ .Title }}{{ else }}{{ .Title }} · {{ .Site.Title }}{{ end }} 17 | 18 | 19 | 20 | 21 | {{ if (.Site.Params.isHighlightCode) }} 22 | {{ if (eq .Site.Params.mode "light") }} 23 | 25 | {{ else if (eq .Site.Params.mode "wild")}} 26 | 28 | {{ else}} 29 | 31 | {{ end }} 32 | {{ end }} 33 | 34 | {{ range .Site.Params.customCSS }} 35 | 36 | {{ end }} 37 | 38 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | const MiniCssExtractPlugin = require('mini-css-extract-plugin') 4 | const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') 5 | const postcssPresetEnv = require('postcss-preset-env') 6 | let config = { 7 | mode: process.env.NODE_ENV, 8 | entry: path.resolve(__dirname, 'src/index.js'), 9 | output: { 10 | filename: 'js/[name].js', 11 | path: path.resolve(__dirname, 'static'), 12 | publicPath: '/' 13 | }, 14 | devtool: 'inline-source-map', 15 | 16 | module: { 17 | rules: [ 18 | { test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)$/i, type: 'asset' }, 19 | { test: /\.less$/i, 20 | use: [ 21 | process.env.mode === 'development' ? 22 | "style-loader" : 23 | { 24 | loader: MiniCssExtractPlugin.loader, 25 | options: { publicPath: '/' } 26 | }, 27 | 28 | "css-loader", 29 | { 30 | loader: "postcss-loader", 31 | options: { 32 | postcssOptions: { 33 | plugins: [ 34 | [ 35 | "autoprefixer", 36 | { 37 | // Options 38 | }, 39 | ], 40 | ], 41 | }, 42 | }, 43 | }, 44 | { 45 | loader: "less-loader", 46 | options: { lessOptions: { strictMath: true } } 47 | } 48 | ], 49 | }, 50 | ] 51 | }, 52 | optimization: { 53 | minimizer: [ 54 | `...`, 55 | new CssMinimizerPlugin(), 56 | ] 57 | }, 58 | plugins: [ 59 | new MiniCssExtractPlugin({ 60 | filename: 'css/[name].css', 61 | }) 62 | ], 63 | } 64 | module.exports = config 65 | -------------------------------------------------------------------------------- /exampleSite/static/images/logo_light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 16 | 20 | 21 | -------------------------------------------------------------------------------- /src/js/loader.js: -------------------------------------------------------------------------------- 1 | import { qs, getProgress } from './helpers' 2 | import { easeElasticOut } from 'd3-ease' 3 | export function getLoader () { 4 | let topEle = qs('.top') 5 | let bottomEle = qs('.bottom') 6 | let halfScreen = document.documentElement.clientHeight / 2 7 | let distance = halfScreen + 100 8 | let ticket = false 9 | let closed = false 10 | let opening = false 11 | let openWaiting = false 12 | const animation = (ease, cb, duration, finaly = () => {}) => { 13 | const tick = () => { 14 | let progress = Math.min(ease((getProgress(data))), 1) 15 | // d3.easeExpOut has problem, t can not reach to 1, so I mannually fix it 16 | // progress = progress > 0.999 ? 1 : progress 17 | if (progress < 1) { 18 | cb(progress) 19 | window.requestAnimationFrame(tick) 20 | } else { 21 | window.performance.clearMarks(data.id) 22 | cb(progress) 23 | finaly() 24 | } 25 | } 26 | const data = { 27 | duration, 28 | id: window.requestAnimationFrame(tick) 29 | } 30 | } 31 | const loading = () => { 32 | if (ticket) return 33 | ticket = true 34 | close(() => { 35 | closed = true 36 | if (openWaiting) { 37 | open() 38 | } 39 | }) 40 | } 41 | const loaded = () => { 42 | if (!ticket) return 43 | if (opening) return 44 | opening = true 45 | if (closed) { 46 | open() 47 | } else { 48 | openWaiting = true 49 | } 50 | } 51 | function close (cb) { 52 | animation(easeElasticOut, progress => { 53 | topEle.style.top = -((1 - progress) * distance) + 'px' 54 | bottomEle.style.top = (1 - progress) * distance + halfScreen + 'px' 55 | }, 1000, cb) 56 | } 57 | 58 | function open (cb) { 59 | animation(easeElasticOut, progress => { 60 | topEle.style.top = -(progress * distance) + 'px' 61 | bottomEle.style.top = progress * distance + halfScreen + 'px' 62 | }, 1000, () => { 63 | opening = false 64 | closed = false 65 | openWaiting = false 66 | ticket = false 67 | }) 68 | } 69 | 70 | return { 71 | loading, 72 | loaded 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /layouts/partials/footer.html: -------------------------------------------------------------------------------- 1 | 37 |
    38 |
    39 |
    40 |
    41 |

    Theme Name

    42 |
    43 |
    44 |
    45 | 50 | 51 |
    52 |
    53 | 54 |
    55 | 56 |
    57 | 58 |
    59 |
    60 | -------------------------------------------------------------------------------- /src/css/light.less: -------------------------------------------------------------------------------- 1 | .light-mode .dialog button { 2 | color: #3083FE; 3 | } 4 | .light-mode .main a { 5 | color: #3083FE; 6 | } 7 | 8 | .light-mode .main .article-tags a { 9 | background: #35CC81; 10 | color : #FFF; 11 | } 12 | 13 | .light-mode .local-info { 14 | background: #EFECAA; 15 | color : #000000; 16 | box-shadow: none; 17 | } 18 | 19 | /* man bg */ 20 | body.light-mode, 21 | .light-mode .main { 22 | background: @light_main_bg; 23 | } 24 | 25 | /* main fg */ 26 | .light-mode .main, 27 | .light-mode blockquote.twitter-tweet, 28 | .light-mode .sidebar a, 29 | .light-mode .taxonomy-key, 30 | .light-mode .main .title a, 31 | .light-mode .dialog .title { 32 | color: #4C4C4C; 33 | } 34 | 35 | .light-mode .icon { 36 | background: #4C4C4C; 37 | } 38 | 39 | /* main minor */ 40 | .light-mode .article-meta, 41 | .light-mode .item-meta, 42 | .light-mode .footnotes { 43 | color: #999999; 44 | } 45 | 46 | .light-mode th, 47 | .light-mode td { 48 | border-bottom: 1px solid #CCCCCC; 49 | } 50 | 51 | .light-mode hr { 52 | border: 1px solid #CCCCCC; 53 | } 54 | 55 | .light-mode .pagination { 56 | background: #CCCCCC; 57 | } 58 | 59 | /* sidebar bg */ 60 | .light-mode .sidebar { 61 | background: #EEEEEE; 62 | } 63 | 64 | 65 | .light-mode pre, 66 | .light-mode code { 67 | background: @light_header_bg; 68 | } 69 | 70 | /* sidebar fg */ 71 | .light-mode .sidebar a { 72 | color: #3F3F3F; 73 | } 74 | 75 | /* sidebar minor */ 76 | .light-mode .count, 77 | .light-mode .taxonomy-key { 78 | color: #777777; 79 | } 80 | 81 | 82 | /* header, footer bg */ 83 | .light-mode .header, 84 | .light-mode .footer, 85 | .light-mode .header .sub-menu li:hover, 86 | .light-mode .sidebar a:hover, 87 | .light-mode .logo-link, 88 | .light-mode .dialog, 89 | .light-mode .dialog button { 90 | background: @light_header_bg; 91 | } 92 | 93 | .light-mode .header .menu>li:hover, 94 | .light-mode .footer a:hover { 95 | background: #CCCCCC; 96 | } 97 | 98 | /* sub-menu bg */ 99 | .light-mode .header ul ul { 100 | box-shadow: 0 0.1em 0.2em 0 #AAAAAA; 101 | } 102 | 103 | .light-mode .header ul ul, 104 | .light-mode .pagination a:hover { 105 | background: #CCCCCC; 106 | } 107 | 108 | /* header, footer fg */ 109 | .light-mode .header a, 110 | .light-mode .footer a, 111 | .light-mode .footer time, 112 | .light-mode .pagination a { 113 | color: #323232; 114 | } 115 | 116 | .light-mode .header .sub-menu a { 117 | color: #0B0B0B; 118 | } 119 | 120 | .light-mode .footer .icon { 121 | background-color: #323232; 122 | } 123 | 124 | .light-mode .main h1, 125 | .light-mode .main h2, 126 | .light-mode .main h3, 127 | .light-mode .main h4, 128 | .light-mode .main h5, 129 | .light-mode .main h6, 130 | .light-mode .title { 131 | text-shadow: none; 132 | } 133 | 134 | .light-mode { 135 | .top, .bottom { 136 | background: @light_header_bg; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /src/css/light.scss: -------------------------------------------------------------------------------- 1 | .light-mode .dialog button { 2 | color: #3083FE; 3 | } 4 | .light-mode .main a { 5 | color: #3083FE; 6 | } 7 | 8 | .light-mode .main .article-tags a { 9 | background: #35CC81; 10 | color : #FFF; 11 | } 12 | 13 | .light-mode .local-info { 14 | background: #EFECAA; 15 | color : #000000; 16 | box-shadow: none; 17 | } 18 | 19 | /* man bg */ 20 | body.light-mode, 21 | .light-mode .main { 22 | background: $light_main_bg; 23 | } 24 | 25 | /* main fg */ 26 | .light-mode .main, 27 | .light-mode blockquote.twitter-tweet, 28 | .light-mode .sidebar a, 29 | .light-mode .taxonomy-key, 30 | .light-mode .main .title a, 31 | .light-mode .dialog .title { 32 | color: #4C4C4C; 33 | } 34 | 35 | .light-mode .icon { 36 | background: #4C4C4C; 37 | } 38 | 39 | /* main minor */ 40 | .light-mode .article-meta, 41 | .light-mode .item-meta, 42 | .light-mode .footnotes { 43 | color: #999999; 44 | } 45 | 46 | .light-mode th, 47 | .light-mode td { 48 | border-bottom: 1px solid #CCCCCC; 49 | } 50 | 51 | .light-mode hr { 52 | border: 1px solid #CCCCCC; 53 | } 54 | 55 | .light-mode .pagination { 56 | background: #CCCCCC; 57 | } 58 | 59 | /* sidebar bg */ 60 | .light-mode .sidebar { 61 | background: #EEEEEE; 62 | } 63 | 64 | 65 | .light-mode pre, 66 | .light-mode code { 67 | background: $light_header_bg; 68 | } 69 | 70 | /* sidebar fg */ 71 | .light-mode .sidebar a { 72 | color: #3F3F3F; 73 | } 74 | 75 | /* sidebar minor */ 76 | .light-mode .count, 77 | .light-mode .taxonomy-key { 78 | color: #777777; 79 | } 80 | 81 | 82 | /* header, footer bg */ 83 | .light-mode .header, 84 | .light-mode .footer, 85 | .light-mode .header .sub-menu li:hover, 86 | .light-mode .sidebar a:hover, 87 | .light-mode .logo-link, 88 | .light-mode .dialog, 89 | .light-mode .dialog button { 90 | background: $light_header_bg; 91 | } 92 | 93 | .light-mode .header .menu>li:hover, 94 | .light-mode .footer a:hover { 95 | background: #CCCCCC; 96 | } 97 | 98 | /* sub-menu bg */ 99 | .light-mode .header ul ul { 100 | box-shadow: 0 0.1em 0.2em 0 #AAAAAA; 101 | } 102 | 103 | .light-mode .header ul ul, 104 | .light-mode .pagination a:hover { 105 | background: #CCCCCC; 106 | } 107 | 108 | /* header, footer fg */ 109 | .light-mode .header a, 110 | .light-mode .footer a, 111 | .light-mode .footer time, 112 | .light-mode .pagination a { 113 | color: #323232; 114 | } 115 | 116 | .light-mode .header .sub-menu a { 117 | color: #0B0B0B; 118 | } 119 | 120 | .light-mode .footer .icon { 121 | background-color: #323232; 122 | } 123 | 124 | .light-mode .main h1, 125 | .light-mode .main h2, 126 | .light-mode .main h3, 127 | .light-mode .main h4, 128 | .light-mode .main h5, 129 | .light-mode .main h6, 130 | .light-mode .title { 131 | text-shadow: none; 132 | } 133 | 134 | .light-mode { 135 | .top, .bottom { 136 | background: $light_header_bg; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /exampleSite/content/posts/hello-world.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Hello World" 3 | date: 2019-04-28T17:48:36+08:00 4 | draft: true 5 | categories: ["Test", "tmp", "hello-world"] 6 | tags: ["Development", "Go", "fast", "Blogging"] 7 | --- 8 | 9 | This is a demo page. 10 | 11 | # Lorem translated 12 | 13 | But I must explain to you how all this mistaken idea of denouncing of a pleasure and praising pain was born and I will give you a complete account of the [system](https://ziox.xyz), and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a [trivial example](https://ziox.xyz), which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure? 14 | 15 | On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish. In a free hour, when our power of choice is untrammeled and when nothing prevents our being able to do what we like best, every pleasure is to be welcomed and every pain avoided. But in certain circumstances and owing to the claims of duty or the obligations of business it will frequently occur that pleasures have to be repudiated and annoyances accepted. The wise man therefore always holds in these matters to this principle of selection: he rejects pleasures to secure other greater pleasures, or else he endures pains to avoid worse. 16 | 17 | ## Second header 18 | 19 | There is a list. 20 | 21 | - cat 22 | - dog 23 | - spider 24 | 25 | And another list. 26 | 27 | 1. Apple 28 | 2. Orange 29 | 3. Peach 30 | 31 | ### Third header image demo 32 | 33 | ![Image](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/screenshot.png) 34 | 35 | #### Fourth header 36 | 37 | *Texts* 38 | 39 | **and texts** 40 | 41 | ~~and more texts~~ 42 | 43 | ```javascript 44 | const tools = [] 45 | const menu = Object.create(null) 46 | const property = Object.create(null) 47 | class Tool { 48 | constructor(name, fn) { 49 | name = name.toLowerCase() 50 | this.name = name 51 | this.fn = fn 52 | this.el = elt('button', 53 | { class: 'tools', 'data-name': name }, 54 | name.capitalize()) 55 | } 56 | } 57 | ``` 58 | -------------------------------------------------------------------------------- /src/css/dark.less: -------------------------------------------------------------------------------- 1 | .main a { 2 | color: #99CCFF; 3 | } 4 | 5 | .main .article-tags a { 6 | background: #327E36; 7 | color : #FFF; 8 | } 9 | 10 | .local-info, .dialog label { 11 | background: #FFFF99; 12 | color : #333; 13 | box-shadow: 2px 3px 1px 1px #000; 14 | } 15 | 16 | /* man bg */ 17 | body, 18 | .main, 19 | .header .menu>li:hover, 20 | .footer a:hover, 21 | .logo-link, 22 | .dialog { 23 | background: @dark_main_bg; 24 | } 25 | 26 | /* main fg */ 27 | .main, 28 | blockquote.twitter-tweet, 29 | .header .sub-menu a, 30 | .sidebar a, 31 | .taxonomy-key, 32 | .main .title a, 33 | .dialog .title { 34 | color: #C6C6C7; 35 | } 36 | 37 | .icon { 38 | background: #C6C6C7; 39 | } 40 | 41 | /* main minor */ 42 | .article-meta, 43 | .item-meta, 44 | .footnotes { 45 | color: #939BAB; 46 | } 47 | 48 | th, 49 | td { 50 | border-bottom: 1px solid #939BAB; 51 | } 52 | 53 | hr { 54 | border: 1px solid #939BAB; 55 | } 56 | 57 | .pagination { 58 | background: #939BAB; 59 | } 60 | 61 | /* sidebar bg */ 62 | .sidebar { 63 | background: #16191D; 64 | } 65 | 66 | .header ul ul { 67 | box-shadow: 0 0.1em 0.2em 0 #060606; 68 | } 69 | 70 | .header ul ul, 71 | .pagination a:hover { 72 | background: #1A1D21; 73 | } 74 | 75 | code { 76 | background: #1A1C21; 77 | } 78 | 79 | /* sidebar minor */ 80 | .count, 81 | .taxonomy-key { 82 | color: #939394; 83 | } 84 | 85 | 86 | /* header, footer bg */ 87 | .header, 88 | .footer, 89 | .header .sub-menu li:hover, 90 | .sidebar a:hover { 91 | background: #21252B; 92 | } 93 | 94 | /* header, footer fg */ 95 | .header a, 96 | .footer a, 97 | .footer time, 98 | .pagination a { 99 | color: #797D85; 100 | } 101 | 102 | .footer .icon { 103 | background-color: #797D85; 104 | } 105 | 106 | .main h1, 107 | .main h2, 108 | .main h3, 109 | .main h4, 110 | .main h5, 111 | .main h6 { 112 | text-shadow: 0 1px 1px #000; 113 | } 114 | 115 | .title { 116 | text-shadow: 0 1px 1px #000; 117 | } 118 | 119 | .dialog { 120 | width: 100vw; 121 | height: 0; 122 | position: absolute; 123 | top: 0; 124 | left: 0; 125 | z-index: 9999; 126 | overflow: hidden; 127 | font-size: 1rem; 128 | } 129 | .dialog .wrapper { 130 | padding: 1rem; 131 | } 132 | .dialog header, .dialog main, .dialog footer { 133 | margin-bottom: 2rem; 134 | } 135 | 136 | .dialog header { 137 | margin-top: -2rem; 138 | } 139 | .dialog div { 140 | margin-bottom: 1rem; 141 | } 142 | .dialog.show { 143 | height: 100vh; 144 | } 145 | 146 | .dialog label { 147 | display: block; 148 | margin-bottom: 1rem; 149 | padding: 0.8rem 1rem; 150 | box-shadow: none; 151 | } 152 | .dialog input { 153 | padding: 0.3rem; 154 | } 155 | .dialog input, .dialog button { 156 | font-size: 1.2rem; 157 | float: right; 158 | } 159 | 160 | .dialog button { 161 | padding: 0.3rem 1rem; 162 | background: #3083FE; 163 | color: #FFF; 164 | } 165 | 166 | .dialog .close-dialog { 167 | font-size: 3rem; 168 | background: none; 169 | border: none; 170 | } 171 | -------------------------------------------------------------------------------- /src/css/dark.scss: -------------------------------------------------------------------------------- 1 | .main a { 2 | color: #99CCFF; 3 | } 4 | 5 | .main .article-tags a { 6 | background: #327E36; 7 | color : #FFF; 8 | } 9 | 10 | .local-info, .dialog label { 11 | background: #FFFF99; 12 | color : #333; 13 | box-shadow: 2px 3px 1px 1px #000; 14 | } 15 | 16 | /* man bg */ 17 | body, 18 | .main, 19 | .header .menu>li:hover, 20 | .footer a:hover, 21 | .logo-link, 22 | .dialog { 23 | background: $dark_main_bg; 24 | } 25 | 26 | /* main fg */ 27 | .main, 28 | blockquote.twitter-tweet, 29 | .header .sub-menu a, 30 | .sidebar a, 31 | .taxonomy-key, 32 | .main .title a, 33 | .dialog .title { 34 | color: #C6C6C7; 35 | } 36 | 37 | .icon { 38 | background: #C6C6C7; 39 | } 40 | 41 | /* main minor */ 42 | .article-meta, 43 | .item-meta, 44 | .footnotes { 45 | color: #939BAB; 46 | } 47 | 48 | th, 49 | td { 50 | border-bottom: 1px solid #939BAB; 51 | } 52 | 53 | hr { 54 | border: 1px solid #939BAB; 55 | } 56 | 57 | .pagination { 58 | background: #939BAB; 59 | } 60 | 61 | /* sidebar bg */ 62 | .sidebar { 63 | background: #16191D; 64 | } 65 | 66 | .header ul ul { 67 | box-shadow: 0 0.1em 0.2em 0 #060606; 68 | } 69 | 70 | .header ul ul, 71 | .pagination a:hover { 72 | background: #1A1D21; 73 | } 74 | 75 | code { 76 | background: #1A1C21; 77 | } 78 | 79 | /* sidebar minor */ 80 | .count, 81 | .taxonomy-key { 82 | color: #939394; 83 | } 84 | 85 | 86 | /* header, footer bg */ 87 | .header, 88 | .footer, 89 | .header .sub-menu li:hover, 90 | .sidebar a:hover { 91 | background: #21252B; 92 | } 93 | 94 | /* header, footer fg */ 95 | .header a, 96 | .footer a, 97 | .footer time, 98 | .pagination a { 99 | color: #797D85; 100 | } 101 | 102 | .footer .icon { 103 | background-color: #797D85; 104 | } 105 | 106 | .main h1, 107 | .main h2, 108 | .main h3, 109 | .main h4, 110 | .main h5, 111 | .main h6 { 112 | text-shadow: 0 1px 1px #000; 113 | } 114 | 115 | .title { 116 | text-shadow: 0 1px 1px #000; 117 | } 118 | 119 | .dialog { 120 | width: 100vw; 121 | height: 0; 122 | position: absolute; 123 | top: 0; 124 | left: 0; 125 | z-index: 9999; 126 | overflow: hidden; 127 | font-size: 1rem; 128 | } 129 | .dialog .wrapper { 130 | padding: 1rem; 131 | } 132 | .dialog header, .dialog main, .dialog footer { 133 | margin-bottom: 2rem; 134 | } 135 | 136 | .dialog header { 137 | margin-top: -2rem; 138 | } 139 | .dialog div { 140 | margin-bottom: 1rem; 141 | } 142 | .dialog.show { 143 | height: 100vh; 144 | } 145 | 146 | .dialog label { 147 | display: block; 148 | margin-bottom: 1rem; 149 | padding: 0.8rem 1rem; 150 | box-shadow: none; 151 | } 152 | .dialog input { 153 | padding: 0.3rem; 154 | } 155 | .dialog input, .dialog button { 156 | font-size: 1.2rem; 157 | float: right; 158 | } 159 | 160 | .dialog button { 161 | padding: 0.3rem 1rem; 162 | background: #3083FE; 163 | color: #FFF; 164 | } 165 | 166 | .dialog .close-dialog { 167 | font-size: 3rem; 168 | background: none; 169 | border: none; 170 | } 171 | -------------------------------------------------------------------------------- /exampleSite/config.toml: -------------------------------------------------------------------------------- 1 | theme = "edidor" 2 | title = "Edidor Demo" 3 | baseurl = "https://your-site-url" 4 | AuthorName = "Jon Doe" 5 | # place your logo file to ./static/images to set logo 6 | 7 | # i18n is not completed yet, help is appreciated. 8 | languageCode = "en" 9 | defaultContentLanguage = "en" 10 | # you may not need this 11 | hasCJKLanguage = true 12 | 13 | 14 | # ----- feel free change these settings, those are not tied to this theme -- 15 | paginate = 5 16 | enableEmoji = true 17 | 18 | # to have better preview 19 | buildDrafts = "true" 20 | # helpful if you want to edit the site or theme code 21 | disableFastRender = true 22 | # -------------------------------------------------------------------------- 23 | 24 | disqusShortname = "your disqus short name" 25 | googleAnalytics = "your ga id" 26 | 27 | # social link in the footer, change it to "" hide it 28 | [social] 29 | github = " " 30 | facebook = " " 31 | twitter = " " 32 | behance = " " 33 | email = " " 34 | 35 | # author, title, description are used in the home page, you can embed html tag in description 36 | [params] 37 | # will use AuthorName if you leave it blank, but you can set it to arbitrary text 38 | author = "sunfy" 39 | title = "SUNFY DEMO" 40 | description = "A hugo site using Edidor.

    Ctrl+B toggle sidebar. " 41 | # change it to false if you don't need syntax highlighting, and save a little bandwidth 42 | isHighlightCode = true 43 | # set true need to use custom js 44 | useCustomSyntaxHighlight = false 45 | customJs = [] 46 | customCss = [] 47 | mode = "light" 48 | # menubar setting, you can change url, weight and name except the 'Theme'. 49 | [[menu.main]] 50 | name = "Article" 51 | url = "#" 52 | weight = 1 53 | [[menu.main]] 54 | name = "View" 55 | url = "#" 56 | weight = 10 57 | # You can change the name, but please don't edit the identifier 58 | [[menu.main]] 59 | parent = "View" 60 | identifier = "toggle-sidebar" 61 | name = "Toggle Sidebar" 62 | url = "#" 63 | weight = 10 64 | [[menu.main]] 65 | parent = "Article" 66 | name = "Posts" 67 | url = "/posts" 68 | weight = 1 69 | [[menu.main]] 70 | parent = "Article" 71 | name = "Tags" 72 | url = "/tags" 73 | weight = 20 74 | [[menu.main]] 75 | parent = "Article" 76 | name = "Categories" 77 | url = "/categories" 78 | weight = 30 79 | 80 | # Please don't edit the identifier 81 | # I can't make the identifier works on top menu so please don't change the name of 'Theme' at the moment 82 | [[menu.main]] 83 | name = "Theme" 84 | url = "#" 85 | weight = 25 86 | [[menu.main]] 87 | parent = "Theme" 88 | identifier = "light" 89 | name = "Light" 90 | url = "#" 91 | weight = 1 92 | [[menu.main]] 93 | parent = "Theme" 94 | identifier = "dark" 95 | name = "Dark" 96 | url = "#" 97 | weight = 10 98 | [[menu.main]] 99 | parent = "Theme" 100 | identifier = "wild" 101 | name = "Wild" 102 | url = "#" 103 | weight = 20 104 | [[menu.main]] 105 | parent = "Theme" 106 | identifier = "export-wild" 107 | name = "Export Wild Style" 108 | url = "#" 109 | weight = 25 110 | -------------------------------------------------------------------------------- /README-zh.md: -------------------------------------------------------------------------------- 1 | # Edidor 2 | [English](https://github.com/sfengyuan/edidor/blob/master/README.md) 3 | 4 | 自带主题颜色生成器的主题, 从营销的角度看有无限主题. 😂 5 | 6 | 感谢 [@GoHugoIO](https://twitter.com/GoHugoIO)的[推荐](https://twitter.com/GoHugoIO/status/1127175277673631744) 7 | 8 | # 截图 9 | 白色模式 10 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/screenshot.png) 11 | 暗色模式 12 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/dark.png) 13 | 狂野模式 14 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/wild_mode.png) 15 | 还是狂野模式 16 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/wild_mode2.png) 17 | 仍然是狂野模式 18 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/wild_mode3.png) 19 | 20 | # 狂野模式 21 | 亲自试试狂野模式吧, 不用下载安装, 到我的网站 [my site](https://sunfy.xyz/). 持续点击 'Theme > Wild mode' 🙃 22 | 23 | **不保证你能得到满意的配色** 24 | 25 | # 特色 26 | 27 | - 视口单位, 测试了从 1920 x 1080 到 to 320 x 568 的分辨率 28 | - 无框架, 只有一个lodash的throttle函数, 和d3.ease 的一个easing 函数 29 | - 所有图标都是mask-image svg, 可以随意改变颜色 30 | - highlight.js 提供语法高亮, 可关闭从而不加载文件 31 | - Disqus 评论 32 | - 多国语言 33 | 34 | i18n 还没完成, 实在没空!! 35 | 不支持IE!! 36 | 37 | # 安装 38 | Hugo 网站根目录运行 39 | 40 | ``` 41 | cd themes 42 | git submodule add https://github.com/sfengyuan/edidor 43 | ``` 44 | 或者(这种方式, 请删除隐藏的.git文件夹) 45 | ``` 46 | cd themes 47 | git clone https://github.com/sfengyuan/edidor 48 | ``` 49 | 50 | # 使用 51 | 52 | 从 `exampleSite` 复制 `config.toml`到网站根目录中. 运行'hugo server' 预览. 53 | 54 | # 配置 55 | 56 | ## Logo 57 | 58 | Logo文件必须是 `svg` 格式, 以后会修改, 复制到 根目录/static/images/ 目录里. 你可以提供3种版本. 59 | 60 | - logo.svg 61 | - logo_light.svg 62 | - logo_dark.svg 63 | 64 | 主题会自动载入合适的版本. 65 | 66 | ## 菜单 67 | 有些菜单条目不要修改. 68 | 69 | 下面的别改 70 | - name是'Theme'的顶级菜单值不要改 71 | - 所有主题自带的的'identifier' 的值不要改. 72 | 73 | 其他可随意修改 74 | 75 | **为什么Theme不能改, 为什么不用identifier** 76 | 不知道为什么, 给顶级菜单加identifier会有奇怪的事情发生, 所以暂时只能用Name. 77 | 78 | ## 狂野模式 79 | 狂野模式的工作原理: 当你点击'Wild mode'时, 一份随机生成的样式会被插入到页面里, 同时保存到本地. 当你去其他页面时, 本地保存的样式会被读取. 如果你想把样式应用到服务器端, 你需要使用自定义css 80 | 81 | ## 自定义css 82 | 83 | 在配置文件中, 添加 84 | ``` 85 | [params] 86 | customCss = ["custom.css", ...] 87 | ``` 88 | 把 `custom.css` 放到 根目录/static/css 目录里. 89 | 90 | ## 使用狂野样式 91 | 点击 `Export Wild mode`, 输入主题名字, 你会下载一份css文件. 用记事本打开会看到需要的代码. 92 | 类似这个样子: 93 | ``` 94 | /* 95 | Hugo Edidor theme wild mode exported. 96 | homepage: https://github.com/sfengyuan/edidor 97 | Usage: 98 | 1. Throw me to your site root folder/static/css directory, you can rename me to whatever you like. 99 | 2. Copy below code to your config file. 100 | -------- 101 | [[menu.main]] 102 | parent = "Theme" 103 | identifier = "adf-a--" 104 | name = "adf a -" 105 | url = "#" 106 | weight = 30 107 | -------- 108 | 3. Change the field 'name' and 'weight' to whatever you like. Leave others alone. 109 | */ 110 | .adf-a---mode code { background: #e7e7e7 } 111 | ``` 112 | 113 | 你需要把这份文件复制到根目录/static/css 中, 文件名可修改, 然后复制中间的菜单的代码, 就是--(连字符)之间的, 你可以修改`name(菜单显示的文本`和`weight(菜单顺序)`, 但是`identifier(程序需要用)`不能改. 114 | 115 | ## 自定义JS 116 | 117 | 在配置文件中添加 118 | ``` 119 | [params] 120 | customJs = ["custom.js", ...] 121 | ``` 122 | 把`custom.js` 放到 根目录/static/js 中. 123 | 124 | ## 自定义语法高亮 125 | 126 | 主题使用 [hightlight.js](https://highlightjs.org/), 如果你想添加自己的高亮文件,首先添加自定义JS文件, 然后在配置文件里添加: 127 | 128 | ``` 129 | useCustomSyntaxHighlight = true 130 | ``` 131 | 你不用手动执行代码. 132 | 133 | # Todo 134 | 135 | # 其他 136 | 这是一个新主题, 如果你发现任何bug, 请发issue, 欢迎贡献代码! 😊 137 | 138 | # FAQ 139 | 140 | # License 141 | MIT 142 | -------------------------------------------------------------------------------- /src/js/css_template.js: -------------------------------------------------------------------------------- 1 | import { randomInt } from './helpers' 2 | 3 | // tagged template function, produce wild styles 4 | function styleTemplate (strings, ...keys) { 5 | return function () { 6 | let temp = strings.slice() 7 | keys.forEach((key, i) => { 8 | temp[i] += gen[key]() 9 | }) 10 | return temp.join('').replace(/\s{2}/gm, ' ') 11 | } 12 | } 13 | 14 | const gen = { 15 | darkCode: ['c', 'f', '6', '9'], 16 | lightCode: ['a', 'b', 'c', 'd', 'e', 'f'], 17 | textCode: ['1a2a3a', '2a3a4a', '3a4a5a', '4a5a6a', '5a6a7a', '6a7a8a', '7a8a9a'], 18 | grayCode: ['aaa', 'bbb', 'ccc', 'ddd'], 19 | lightGrayCode: ['e2e2e2', 'e7e7e7', 'ececec'], 20 | deepGrayCode: ['222', '333', '444'] 21 | } 22 | 23 | gen.dark = () => { 24 | let d = '' 25 | for (let i = 0; i !== 3; i++) { 26 | let c = gen.darkCode[randomInt(0, gen.darkCode.length)] 27 | d += c + c 28 | } 29 | return '#' + d 30 | } 31 | gen.light = () => { 32 | let d = '' 33 | for (let i = 0; i !== 6; i++) { 34 | d += gen.lightCode[randomInt(0, gen.lightCode.length)] 35 | } 36 | return '#' + d 37 | } 38 | 39 | gen.gray = () => { 40 | let i = randomInt(0, gen.grayCode.length) 41 | return '#' + gen.grayCode[i] 42 | } 43 | gen.lightGray = () => { 44 | let i = randomInt(0, gen.lightGrayCode.length) 45 | return '#' + gen.lightGrayCode[i] 46 | } 47 | gen.deepGray = () => { 48 | let i = randomInt(0, gen.deepGrayCode.length) 49 | return '#' + gen.deepGrayCode[i] 50 | } 51 | gen.text = (base = 0, max = 7) => { 52 | let i = randomInt(base, max) 53 | return '#' + gen.textCode[i] 54 | } 55 | 56 | gen.deepText = gen.text.bind(gen, 0, 2) 57 | gen.mediumText = gen.text.bind(gen, 2, 5) 58 | gen.lightText = gen.text.bind(gen, 5, 6) 59 | 60 | const wildStyle = styleTemplate` 61 | .wild-mode code { 62 | background: ${'lightGray'} 63 | } 64 | .wild-mode .main .article-tags a { 65 | background: ${'light'}; 66 | } 67 | .wild-mode .local-info { 68 | background: ${'light'}; 69 | } 70 | body.wild-mode, 71 | .wild-mode .main { 72 | background: ${'light'}; 73 | } 74 | .wild-mode th, 75 | .wild-mode td { 76 | border-bottom: 1px solid ${'dark'}; 77 | } 78 | .wild-mode hr { 79 | border: 1px solid ${'dark'}; 80 | } 81 | .wild-mode .pagination { 82 | background: ${'dark'}; 83 | } 84 | .wild-mode .sidebar { 85 | background: ${'dark'}; 86 | } 87 | .wild-mode .header, 88 | .wild-mode .footer, 89 | .wild-mode .header .sub-menu li:hover, 90 | .wild-mode .sidebar a:hover, 91 | .wild-mode .logo-link, 92 | .wild-mode .top, .wild-mode .bottom { 93 | background: ${'dark'}; 94 | } 95 | .wild-mode .header .menu>li:hover, 96 | .wild-mode .footer a:hover { 97 | background: ${'light'}; 98 | } 99 | .wild-mode .header ul ul { 100 | box-shadow: 0 0.1em 0.2em 0 ${'dark'}; 101 | } 102 | .wild-mode .header ul ul, 103 | .wild-mode .pagination a:hover { 104 | background: ${'dark'}; 105 | } 106 | .wild-mode .article-meta, 107 | .wild-mode .item-meta, 108 | .wild-mode .footnotes, 109 | .wild-mode .count, 110 | .wild-mode .taxonomy-key { 111 | color: ${'mediumText'}; 112 | } 113 | .wild-mode .main .article-tags a, 114 | .wild-mode .local-info, 115 | .wild-mode .main, 116 | .wild-mode .main a, 117 | .wild-mode .terms-list a, 118 | .wild-mode blockquote.twitter-tweet, 119 | .wild-mode .sidebar a, 120 | .wild-mode .taxonomy-key, 121 | .wild-mode .main .title a, 122 | .wild-mode .header a, 123 | .wild-mode .footer a, 124 | .wild-mode .footer time, 125 | .wild-mode .pagination a, 126 | .wild-mode .header .sub-menu a { 127 | color: ${'deepGray'}; 128 | } 129 | .wild-mode .icon, 130 | .wild-mode .footer .icon { 131 | background: ${'deepGray'}; 132 | } 133 | ` 134 | 135 | export default wildStyle 136 | -------------------------------------------------------------------------------- /src/js/helpers.js: -------------------------------------------------------------------------------- 1 | // dom helper functions 2 | const throttle = require('lodash.throttle') 3 | export function qs (sel, parent = document.body) { 4 | if (typeof parent === 'string') { 5 | parent = document.querySelector(parent) 6 | } 7 | return parent.querySelector(sel) 8 | } 9 | 10 | export function elt (name, attr = {}, ...text) { 11 | const node = document.createElement(name) 12 | Object.keys(attr).forEach(k => { 13 | node.setAttribute(k, attr[k]) 14 | }) 15 | text.forEach(t => { 16 | if (typeof t === 'string') { 17 | t = document.createTextNode(t) 18 | } 19 | node.appendChild(t) 20 | }) 21 | return node 22 | } 23 | 24 | export function removeClass (dom, cls) { 25 | if (typeof dom === 'string') { 26 | dom = qs(dom) 27 | } 28 | dom.classList.remove(cls) 29 | return dom 30 | } 31 | export function clearClass (dom, cls) { 32 | if (typeof dom === 'string') { 33 | dom = qs(dom) 34 | } 35 | dom.className = '' 36 | return dom 37 | } 38 | export function addClass (dom, cls) { 39 | if (typeof dom === 'string') { 40 | dom = qs(dom) 41 | } 42 | dom.classList.add(cls) 43 | return dom 44 | } 45 | export function toggleClass (dom, cls) { 46 | if (typeof dom === 'string') { 47 | dom = qs(dom) 48 | } 49 | dom.classList.toggle(cls) 50 | return dom 51 | } 52 | export function hasClass (dom, cls) { 53 | if (typeof dom === 'string') { 54 | dom = qs(dom) 55 | } 56 | return dom.classList.contains(cls) 57 | } 58 | export function setStyle (dom, styles) { 59 | if (typeof dom === 'string') { 60 | dom = qs(dom) 61 | } 62 | 63 | Object.keys(styles).forEach(key => { 64 | dom.style[key] = styles[key] 65 | }) 66 | } 67 | export function onEvent (event, cb, limit = 0, dom = document.body, options = {}) { 68 | if (typeof dom === 'string') { 69 | dom = qs(dom) 70 | } 71 | if (limit > 0) { 72 | dom.addEventListener(event, throttle(cb, limit), options) 73 | } else { 74 | dom.addEventListener(event, cb, options) 75 | } 76 | } 77 | // mousemove and touchmove abstraction 78 | export function onPointerMove (cb, limit, dom = document.body) { 79 | onEvent('mousemove', e => { 80 | cb({ // eslint-disable-line 81 | clientX: e.clientX, 82 | clientY: e.clientY, 83 | type: e.type 84 | }) 85 | }, limit, dom, { passive: true }) 86 | 87 | onEvent('touchmove', e => { 88 | cb({ // eslint-disable-line 89 | clientX: e.touches[0].clientX, 90 | clientY: e.touches[0].clientY, 91 | type: e.type 92 | }) 93 | }, limit, dom, { passive: true }) 94 | } 95 | // local storage 96 | export const ls = {} 97 | ls.get = key => window.localStorage.getItem(key) 98 | 99 | ls.set = (key, value) => { 100 | if (value === null || value === undefined) { 101 | value = '' 102 | } else if (typeof value !== 'string') { 103 | value = JSON.stringify(value) 104 | } 105 | window.localStorage.setItem(key, value) 106 | } 107 | export function randomInt (min, max) { 108 | min = Math.ceil(min) 109 | max = Math.floor(max) 110 | return Math.floor(Math.random() * (max - min)) + min 111 | } 112 | 113 | export function download (filename, text) { 114 | const a = elt('a', { 115 | href: 'data:text/plain;charset=utf-8,' + encodeURIComponent(text), 116 | download: filename, 117 | style: { 118 | display: 'none' 119 | } 120 | }) 121 | document.body.appendChild(a) 122 | a.click() 123 | document.body.removeChild(a) 124 | } 125 | 126 | export function trackTime (id) { 127 | const [entry] = window.performance.getEntriesByName(id) 128 | if (!entry) { 129 | window.performance.mark(id) 130 | return 0 131 | } 132 | return window.performance.now() - entry.startTime 133 | } 134 | export function getProgress (data) { 135 | if (data.duration) { 136 | return Math.min(trackTime(data.id) / data.duration, 1) 137 | } 138 | return 1 139 | } 140 | -------------------------------------------------------------------------------- /exampleSite/content/posts/The standard Lorem Ipsum passage, used since the 1500s.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "The standard Lorem Ipsum passage, used since the 1500s" 3 | date: 2019-05-06T23:26:23+08:00 4 | hidden: false 5 | draft: true 6 | categories: ["Test"] 7 | tags: ["test"] 8 | keywords: [] 9 | description: "" 10 | slug: "" 11 | --- 12 | # The standard Lorem Ipsum passage, used since the 1500s 13 | 14 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam placerat lacinia tellus, in blandit ligula faucibus eu. Nulla efficitur mauris mauris, vel aliquet quam tincidunt et. Aenean tincidunt, magna et faucibus pulvinar, nisl sapien molestie felis, non semper ligula nulla quis ante. Donec ut placerat lorem, id luctus dui. Proin semper eros eu rutrum egestas. Nullam at sem at turpis feugiat dapibus a et ex. Praesent et quam ut orci vulputate lobortis. Etiam at tincidunt augue. Etiam tincidunt, eros in maximus tempor, leo enim rutrum odio, in sollicitudin lacus ligula eget turpis. Donec in velit nec est sagittis rhoncus quis id risus. 15 | 16 | - Vivamus nec est mollis, tincidunt ante id, tincidunt odio. 17 | - Nam facilisis tellus bibendum nulla dignissim fringilla. 18 | - Fusce accumsan lectus ac metus commodo pellentesque. 19 | - Nunc non lectus eget turpis tempor accumsan. 20 | 21 | orci vulputate lobortis. 22 | 23 | - Quisque sollicitudin dui in ligula luctus, eu cursus neque elementum. 24 | - Morbi malesuada eros pellentesque diam pulvinar, eget interdum turpis commodo. 25 | - Etiam finibus elit non turpis convallis aliquet. 26 | - Proin posuere nibh vel leo gravida, sit amet congue dui dictum. 27 | - Maecenas auctor felis sit amet volutpat ornare. 28 | - Sed pharetra lacus sed dictum tincidunt. 29 | - Nullam bibendum diam a nulla ornare tempor. 30 | - Maecenas dapibus nulla sit amet sem facilisis, et posuere nibh congue. 31 | - Aenean auctor lectus ac ligula pellentesque, nec consequat erat aliquam. 32 | - Donec interdum velit vitae faucibus consectetur. 33 | 34 | Vivamus eget ornare nulla, congue volutpat neque. Donec ornare tellus ut felis mollis vestibulum. Integer felis purus, semper et odio at, fermentum aliquam orci. Donec vestibulum lectus non cursus bibendum. Integer neque eros, viverra nec cursus in, suscipit sodales sapien. Suspendisse nec bibendum ex. Nulla in ex tincidunt, sagittis nibh tempus, tincidunt arcu. Nunc tincidunt tortor quis urna porta, sit amet mollis ipsum venenatis. Nulla feugiat nisi et risus pretium luctus. Vestibulum ac nunc eget nisi sagittis condimentum. Quisque sed mauris in lacus semper pharetra luctus sit amet lectus. Aliquam condimentum leo justo, et efficitur ipsum aliquam at. Aenean non blandit purus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent scelerisque dui eu velit semper maximus. Pellentesque ultrices, enim a finibus faucibus, est felis vehicula mi, facilisis consectetur dolor mi non dui. 35 | 36 | Donec tincidunt sem et sapien placerat, sit amet gravida tellus egestas. Suspendisse interdum nulla nec sodales euismod. Sed vel elit ut elit laoreet commodo vitae sit amet augue. Vestibulum ligula tellus, bibendum vel faucibus eu, porttitor convallis ante. Suspendisse ac sem quis nisl feugiat faucibus sit amet et lorem. Morbi et quam sollicitudin, aliquet ante ut, commodo odio. Duis euismod nisl nec quam venenatis, eu sollicitudin arcu tempus. Suspendisse congue odio nisi, placerat fermentum tortor cursus at. In imperdiet erat augue, in congue dui volutpat a. Donec molestie condimentum arcu quis condimentum. Suspendisse potenti. 37 | 38 | Aenean commodo sem nec libero luctus dictum. Sed a sagittis augue. Vestibulum ut finibus purus. Nullam vitae molestie turpis. Ut enim purus, laoreet non justo in, porttitor pulvinar orci. Pellentesque vitae urna blandit, mattis mi in, tempor risus. Integer venenatis maximus dui ac pellentesque. 39 | 40 | Sed venenatis non purus et condimentum. Morbi iaculis ac felis et blandit. Pellentesque vitae efficitur tellus. Ut sollicitudin vitae nulla eu luctus. Pellentesque condimentum nisl id blandit feugiat. Aliquam gravida dolor facilisis consectetur faucibus. Etiam ullamcorper libero id dictum tristique. Integer aliquam mi at lectus feugiat, non rhoncus erat imperdiet. Nam lobortis mauris nec nibh pulvinar, at facilisis mauris vehicula. 41 | 42 | *Generated of Lorem Ipsum* 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Edidor 2 | [中文](https://github.com/sfengyuan/edidor/blob/master/README-zh.md) 3 | 4 | A hugo theme that looks like an editor with a builtin style generator, INFINITE COLOR MODE from a market perspective. 😂 5 | 6 | 7 | Thanks for [@GoHugoIO](https://twitter.com/GoHugoIO)'s [promotion](https://twitter.com/GoHugoIO/status/1127175277673631744) 8 | 9 | # Screenshot 10 | This is the light mode. 11 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/screenshot.png) 12 | This is the dark mode. 13 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/dark.png) 14 | 15 | Now this is the interesting part -- wild mode. 16 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/wild_mode.png) 17 | Wild mode too. 18 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/wild_mode2.png) 19 | Still wild mode. 20 | ![screenshot](https://raw.githubusercontent.com/sfengyuan/edidor/master/images/wild_mode3.png) 21 | 22 | # Wild Mode Demo 23 | I don't need to post more images, you can generate it by your self. You can use this theme, and click `theme/wild mode`. If you wanna publish the theme to visitors, use custom theme, you can find more information below. 24 | 25 | **No guarantee for what colors you can get** 🙃 26 | 27 | # Features 28 | 29 | - viewport unit, test from 1920 x 1080 desktop to 320 x 568 mobile 30 | - No frameworks, only a Lodash `throttle` and an easing function from d3.ease 31 | - All static icons are inline svgs, coloring available due to mask-image 32 | - syntax hightlighting by highlight.js, can be turn off 33 | - Disqus comment system 34 | - multiple languages 35 | 36 | i18n isn't completed!! 37 | NO IE support, and does in future! 38 | 39 | # Installation 40 | Inside the folder of your Hugo site run: 41 | 42 | ``` 43 | cd themes 44 | git submodule add https://github.com/sfengyuan/edidor 45 | ``` 46 | Or 47 | ``` 48 | cd themes 49 | git clone https://github.com/sfengyuan/edidor 50 | ``` 51 | 52 | # Usage 53 | 54 | Copy `config.toml` in `exampleSite` to your site root folder, you are good to go, you can also find more information there. 55 | 56 | # Config 57 | 58 | ## Logo 59 | 60 | Logo images should be `svg` file, they are in the root/static/images/ directory. You need to have three versions. Just copy and rename theme, if you don't want to use separate design. 61 | 62 | - logo.svg(default in dark mode!) 63 | - logo_light.svg 64 | - logo_wild.svg 65 | 66 | The theme will display the appropriate logo automatically. 67 | 68 | ## Menu 69 | Some menu entries are important to the theme, if you change it, some functions will stop to work. 70 | 71 | Do not change these fields: 72 | - the name of 'Theme' 73 | - all 'identifier' shipped with the theme. 74 | 75 | Beyond those, you can customize it as you like. 76 | 77 | *Why the field 'Theme' in menu doesn't use identifier, but name?* 78 | 79 | I tried, but when I add an identifier to the top menu, some weired things happend, this is just a temporary workaroud. 80 | 81 | ## Wild mode 82 | 83 | This is my favourite, and here is how it works. 84 | When you click the 'wild mode' link, some random css color rules will be applied to the page, and also saved in your browser's localStorage. 85 | When you go to another page, thoese rules will be loaded from local machine and applied again. 86 | 87 | If you want to publish the local styles to your server end. You have to use custom css in hugo. 88 | 89 | ## Custom CSS 90 | 91 | In your config file: add 92 | ``` 93 | [params] 94 | customCss = ["custom.css", ...] 95 | ``` 96 | Place the `custom.css` to your site root/static/css directory. 97 | 98 | ## Add wild mode CSS 99 | 100 | Click `Export Wild mode`, and enter a theme name, a css file will be downloaded. 101 | You can find the code that you need in this file, and following the above steps. 102 | 103 | ## Custom JS 104 | 105 | In your config file: add 106 | ``` 107 | [params] 108 | customJs = ["custom.js", ...] 109 | ``` 110 | Place the `custom.js` to your site root/static/js directory. 111 | 112 | ## Custom syntax highlighting 113 | 114 | The theme use [hightlight.js](https://highlightjs.org/) library, if you want to use custom hightlight.js, add it as custom js, and add this to your config. 115 | ``` 116 | useCustomSyntaxHighlight = true 117 | ``` 118 | You don't need to run the code manually. 119 | 120 | # Todo 121 | 122 | # Other 123 | This is a new theme, if you found any problems, feel free to open an issue, and contribution is welcome! 😊 124 | 125 | # FAQ 126 | 127 | 128 | # License 129 | MIT 130 | -------------------------------------------------------------------------------- /src/css/icon.less: -------------------------------------------------------------------------------- 1 | .icon-tags { 2 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='pricetags'%3E%3Cpath d='M12.87 22a1.84 1.84 0 0 1-1.29-.53l-6.41-6.42a1 1 0 0 1-.29-.61L4 5.09a1 1 0 0 1 .29-.8 1 1 0 0 1 .8-.29l9.35.88a1 1 0 0 1 .61.29l6.42 6.41a1.82 1.82 0 0 1 0 2.57l-7.32 7.32a1.82 1.82 0 0 1-1.28.53zm-6-8.11l6 6 7.05-7.05-6-6-7.81-.73z'/%3E%3Ccircle cx='10.5' cy='10.5' r='1.5'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 3 | } 4 | 5 | .icon-categories { 6 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19.5 20.5h-15A2.47 2.47 0 0 1 2 18.07V5.93A2.47 2.47 0 0 1 4.5 3.5h4.6a1 1 0 0 1 .77.37l2.6 3.18h7A2.47 2.47 0 0 1 22 9.48v8.59a2.47 2.47 0 0 1-2.5 2.43zM4 13.76v4.31a.46.46 0 0 0 .5.43h15a.46.46 0 0 0 .5-.43V9.48a.46.46 0 0 0-.5-.43H12a1 1 0 0 1-.77-.37L8.63 5.5H4.5a.46.46 0 0 0-.5.43z' data-name='folder'/%3E%3C/g%3E%3C/svg%3E"); 7 | } 8 | 9 | .icon-post { 10 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='file-text'%3E%3Cpath d='M15 16H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2zM9 14h3a1 1 0 0 0 0-2H9a1 1 0 0 0 0 2z'/%3E%3Cpath d='M19.74 8.33l-5.44-6a1 1 0 0 0-.74-.33h-7A2.53 2.53 0 0 0 4 4.5v15A2.53 2.53 0 0 0 6.56 22h10.88A2.53 2.53 0 0 0 20 19.5V9a1 1 0 0 0-.26-.67zM14 5l2.74 3h-2a.79.79 0 0 1-.74-.85zm3.44 15H6.56a.53.53 0 0 1-.56-.5v-15a.53.53 0 0 1 .56-.5H12v3.15A2.79 2.79 0 0 0 14.71 10H18v9.5a.53.53 0 0 1-.56.5z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 11 | } 12 | 13 | .article-meta .icon-date { 14 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='calendar'%3E%3Cpath d='M18 4h-1V3a1 1 0 0 0-2 0v1H9V3a1 1 0 0 0-2 0v1H6a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h12a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3zM6 6h1v1a1 1 0 0 0 2 0V6h6v1a1 1 0 0 0 2 0V6h1a1 1 0 0 1 1 1v4H5V7a1 1 0 0 1 1-1zm12 14H6a1 1 0 0 1-1-1v-6h14v6a1 1 0 0 1-1 1z'/%3E%3Ccircle cx='8' cy='16' r='1'/%3E%3Cpath d='M16 15h-4a1 1 0 0 0 0 2h4a1 1 0 0 0 0-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 15 | } 16 | 17 | .github { 18 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M12 1A10.89 10.89 0 0 0 1 11.77 10.79 10.79 0 0 0 8.52 22c.55.1.75-.23.75-.52v-1.83c-3.06.65-3.71-1.44-3.71-1.44a2.86 2.86 0 0 0-1.22-1.58c-1-.66.08-.65.08-.65a2.31 2.31 0 0 1 1.68 1.11 2.37 2.37 0 0 0 3.2.89 2.33 2.33 0 0 1 .7-1.44c-2.44-.27-5-1.19-5-5.32a4.15 4.15 0 0 1 1.11-2.91 3.78 3.78 0 0 1 .11-2.84s.93-.29 3 1.1a10.68 10.68 0 0 1 5.5 0c2.1-1.39 3-1.1 3-1.1a3.78 3.78 0 0 1 .11 2.84A4.15 4.15 0 0 1 19 11.2c0 4.14-2.58 5.05-5 5.32a2.5 2.5 0 0 1 .75 2v2.95c0 .35.2.63.75.52A10.8 10.8 0 0 0 23 11.77 10.89 10.89 0 0 0 12 1' data-name='github'/%3E%3C/g%3E%3C/svg%3E") 19 | } 20 | 21 | .twitter { 22 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M8.08 20A11.07 11.07 0 0 0 19.52 9 8.09 8.09 0 0 0 21 6.16a.44.44 0 0 0-.62-.51 1.88 1.88 0 0 1-2.16-.38 3.89 3.89 0 0 0-5.58-.17A4.13 4.13 0 0 0 11.49 9C8.14 9.2 5.84 7.61 4 5.43a.43.43 0 0 0-.75.24 9.68 9.68 0 0 0 4.6 10.05A6.73 6.73 0 0 1 3.38 18a.45.45 0 0 0-.14.84A11 11 0 0 0 8.08 20' data-name='twitter'/%3E%3C/g%3E%3C/svg%3E"); 23 | } 24 | 25 | .facebook { 26 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M17 3.5a.5.5 0 0 0-.5-.5H14a4.77 4.77 0 0 0-5 4.5v2.7H6.5a.5.5 0 0 0-.5.5v2.6a.5.5 0 0 0 .5.5H9v6.7a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-6.7h2.62a.5.5 0 0 0 .49-.37l.72-2.6a.5.5 0 0 0-.48-.63H13V7.5a1 1 0 0 1 1-.9h2.5a.5.5 0 0 0 .5-.5z' data-name='facebook'/%3E%3C/g%3E%3C/svg%3E"); 27 | } 28 | 29 | .behance { 30 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='behance'%3E%3Cpath d='M14.76 11.19a1 1 0 0 0-1 1.09h2.06a1 1 0 0 0-1.06-1.09zM9.49 12.3H8.26v1.94h1c1 0 1.44-.33 1.44-1s-.46-.94-1.21-.94zM10.36 10.52c0-.53-.35-.85-.95-.85H8.26v1.74h.85c.89 0 1.25-.32 1.25-.89z'/%3E%3Cpath d='M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2zM9.7 15.2H7V8.7h2.7c1.17 0 1.94.61 1.94 1.6a1.4 1.4 0 0 1-1.12 1.43A1.52 1.52 0 0 1 12 13.37c0 1.16-1 1.83-2.3 1.83zm3.55-6h3v.5h-3zM17 13.05h-3.3v.14a1.07 1.07 0 0 0 1.09 1.19.9.9 0 0 0 1-.63H17a2 2 0 0 1-2.17 1.55 2.15 2.15 0 0 1-2.36-2.3v-.44a2.11 2.11 0 0 1 2.28-2.25A2.12 2.12 0 0 1 17 12.58z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 31 | } 32 | 33 | .email { 34 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19 4H5a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3zm0 2l-6.5 4.47a1 1 0 0 1-1 0L5 6z' data-name='email'/%3E%3C/g%3E%3C/svg%3E"); 35 | } 36 | 37 | .rss { 38 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Ccircle cx='6.18' cy='17.82' r='2.18'/%3E%3Cpath d='M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z'/%3E%3C/svg%3E"); 39 | } 40 | -------------------------------------------------------------------------------- /src/css/icon.scss: -------------------------------------------------------------------------------- 1 | .icon-tags { 2 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='pricetags'%3E%3Cpath d='M12.87 22a1.84 1.84 0 0 1-1.29-.53l-6.41-6.42a1 1 0 0 1-.29-.61L4 5.09a1 1 0 0 1 .29-.8 1 1 0 0 1 .8-.29l9.35.88a1 1 0 0 1 .61.29l6.42 6.41a1.82 1.82 0 0 1 0 2.57l-7.32 7.32a1.82 1.82 0 0 1-1.28.53zm-6-8.11l6 6 7.05-7.05-6-6-7.81-.73z'/%3E%3Ccircle cx='10.5' cy='10.5' r='1.5'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 3 | } 4 | 5 | .icon-categories { 6 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19.5 20.5h-15A2.47 2.47 0 0 1 2 18.07V5.93A2.47 2.47 0 0 1 4.5 3.5h4.6a1 1 0 0 1 .77.37l2.6 3.18h7A2.47 2.47 0 0 1 22 9.48v8.59a2.47 2.47 0 0 1-2.5 2.43zM4 13.76v4.31a.46.46 0 0 0 .5.43h15a.46.46 0 0 0 .5-.43V9.48a.46.46 0 0 0-.5-.43H12a1 1 0 0 1-.77-.37L8.63 5.5H4.5a.46.46 0 0 0-.5.43z' data-name='folder'/%3E%3C/g%3E%3C/svg%3E"); 7 | } 8 | 9 | .icon-post { 10 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='file-text'%3E%3Cpath d='M15 16H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2zM9 14h3a1 1 0 0 0 0-2H9a1 1 0 0 0 0 2z'/%3E%3Cpath d='M19.74 8.33l-5.44-6a1 1 0 0 0-.74-.33h-7A2.53 2.53 0 0 0 4 4.5v15A2.53 2.53 0 0 0 6.56 22h10.88A2.53 2.53 0 0 0 20 19.5V9a1 1 0 0 0-.26-.67zM14 5l2.74 3h-2a.79.79 0 0 1-.74-.85zm3.44 15H6.56a.53.53 0 0 1-.56-.5v-15a.53.53 0 0 1 .56-.5H12v3.15A2.79 2.79 0 0 0 14.71 10H18v9.5a.53.53 0 0 1-.56.5z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 11 | } 12 | 13 | .article-meta .icon-date { 14 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='calendar'%3E%3Cpath d='M18 4h-1V3a1 1 0 0 0-2 0v1H9V3a1 1 0 0 0-2 0v1H6a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h12a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3zM6 6h1v1a1 1 0 0 0 2 0V6h6v1a1 1 0 0 0 2 0V6h1a1 1 0 0 1 1 1v4H5V7a1 1 0 0 1 1-1zm12 14H6a1 1 0 0 1-1-1v-6h14v6a1 1 0 0 1-1 1z'/%3E%3Ccircle cx='8' cy='16' r='1'/%3E%3Cpath d='M16 15h-4a1 1 0 0 0 0 2h4a1 1 0 0 0 0-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 15 | } 16 | 17 | .github { 18 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M12 1A10.89 10.89 0 0 0 1 11.77 10.79 10.79 0 0 0 8.52 22c.55.1.75-.23.75-.52v-1.83c-3.06.65-3.71-1.44-3.71-1.44a2.86 2.86 0 0 0-1.22-1.58c-1-.66.08-.65.08-.65a2.31 2.31 0 0 1 1.68 1.11 2.37 2.37 0 0 0 3.2.89 2.33 2.33 0 0 1 .7-1.44c-2.44-.27-5-1.19-5-5.32a4.15 4.15 0 0 1 1.11-2.91 3.78 3.78 0 0 1 .11-2.84s.93-.29 3 1.1a10.68 10.68 0 0 1 5.5 0c2.1-1.39 3-1.1 3-1.1a3.78 3.78 0 0 1 .11 2.84A4.15 4.15 0 0 1 19 11.2c0 4.14-2.58 5.05-5 5.32a2.5 2.5 0 0 1 .75 2v2.95c0 .35.2.63.75.52A10.8 10.8 0 0 0 23 11.77 10.89 10.89 0 0 0 12 1' data-name='github'/%3E%3C/g%3E%3C/svg%3E") 19 | } 20 | 21 | .twitter { 22 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M8.08 20A11.07 11.07 0 0 0 19.52 9 8.09 8.09 0 0 0 21 6.16a.44.44 0 0 0-.62-.51 1.88 1.88 0 0 1-2.16-.38 3.89 3.89 0 0 0-5.58-.17A4.13 4.13 0 0 0 11.49 9C8.14 9.2 5.84 7.61 4 5.43a.43.43 0 0 0-.75.24 9.68 9.68 0 0 0 4.6 10.05A6.73 6.73 0 0 1 3.38 18a.45.45 0 0 0-.14.84A11 11 0 0 0 8.08 20' data-name='twitter'/%3E%3C/g%3E%3C/svg%3E"); 23 | } 24 | 25 | .facebook { 26 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M17 3.5a.5.5 0 0 0-.5-.5H14a4.77 4.77 0 0 0-5 4.5v2.7H6.5a.5.5 0 0 0-.5.5v2.6a.5.5 0 0 0 .5.5H9v6.7a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-6.7h2.62a.5.5 0 0 0 .49-.37l.72-2.6a.5.5 0 0 0-.48-.63H13V7.5a1 1 0 0 1 1-.9h2.5a.5.5 0 0 0 .5-.5z' data-name='facebook'/%3E%3C/g%3E%3C/svg%3E"); 27 | } 28 | 29 | .behance { 30 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='behance'%3E%3Cpath d='M14.76 11.19a1 1 0 0 0-1 1.09h2.06a1 1 0 0 0-1.06-1.09zM9.49 12.3H8.26v1.94h1c1 0 1.44-.33 1.44-1s-.46-.94-1.21-.94zM10.36 10.52c0-.53-.35-.85-.95-.85H8.26v1.74h.85c.89 0 1.25-.32 1.25-.89z'/%3E%3Cpath d='M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2zM9.7 15.2H7V8.7h2.7c1.17 0 1.94.61 1.94 1.6a1.4 1.4 0 0 1-1.12 1.43A1.52 1.52 0 0 1 12 13.37c0 1.16-1 1.83-2.3 1.83zm3.55-6h3v.5h-3zM17 13.05h-3.3v.14a1.07 1.07 0 0 0 1.09 1.19.9.9 0 0 0 1-.63H17a2 2 0 0 1-2.17 1.55 2.15 2.15 0 0 1-2.36-2.3v-.44a2.11 2.11 0 0 1 2.28-2.25A2.12 2.12 0 0 1 17 12.58z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); 31 | } 32 | 33 | .email { 34 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19 4H5a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3zm0 2l-6.5 4.47a1 1 0 0 1-1 0L5 6z' data-name='email'/%3E%3C/g%3E%3C/svg%3E"); 35 | } 36 | 37 | .rss { 38 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Ccircle cx='6.18' cy='17.82' r='2.18'/%3E%3Cpath d='M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z'/%3E%3C/svg%3E"); 39 | } 40 | -------------------------------------------------------------------------------- /src/js/main.js: -------------------------------------------------------------------------------- 1 | import { 2 | qs, 3 | elt, 4 | removeClass, 5 | clearClass, 6 | addClass, 7 | hasClass, 8 | setStyle, 9 | onEvent, 10 | onPointerMove, 11 | ls, 12 | download 13 | } from './helpers' 14 | import wildStyle from './css_template' 15 | import { genFile } from './file_template' 16 | 17 | // sidebar function dragging wrapper 18 | function activateSidebarDrag (doms) { 19 | const state = { 20 | last: false, 21 | resizing: false, 22 | resizable: false 23 | } 24 | 25 | function switchCursor () { 26 | if (state.resizable) { 27 | setStyle(document.body, { cursor: 'ew-resize' }) 28 | } else { 29 | setStyle(document.body, { cursor: 'auto' }) 30 | } 31 | } 32 | 33 | function canResize (x, threshold = 4) { 34 | return Math.abs(x - doms.pane.getBoundingClientRect().right) <= threshold 35 | } 36 | function resize (x) { 37 | let newWidth = x - doms.paneLeft 38 | if (newWidth <= 10) { 39 | addClass(doms.pane, 'hide') 40 | } else { 41 | adjustWidth(newWidth) 42 | } 43 | } 44 | function cancelResize (e) { 45 | state.resizing = false 46 | let r = doms.pane.getBoundingClientRect() 47 | saveWidth(r.right - r.left) 48 | } 49 | 50 | function saveWidth (x) { 51 | if (x <= 10) { 52 | return 53 | } 54 | ls.set('sidebar_width', x) 55 | } 56 | 57 | onEvent('mousedown', e => { 58 | if (state.resizable) { 59 | state.resizing = true 60 | } 61 | }, 0) 62 | onEvent('mouseup', cancelResize, 0) 63 | onEvent('keydown', e => { 64 | if (e.ctrlKey && e.keyCode === 66) { 65 | toggleSidebar() 66 | } 67 | }, 0) 68 | 69 | onEvent('touchstart', e => { 70 | state.resizing = canResize(e.touches[0].clientX, 10) 71 | }) 72 | onEvent('touchend', cancelResize) 73 | onPointerMove(pointerMoveHandler, 50, qs('.middle')) 74 | function pointerMoveHandler (e) { 75 | state.resizable = canResize(e.clientX) 76 | if (state.resizing) { 77 | resize(e.clientX) 78 | } else if (e.type === 'mousemove' && e.clientX > 10 && state.last !== state.resizable) { 79 | switchCursor() 80 | state.last = state.resizable 81 | } 82 | } 83 | } 84 | // sidebar dragging function end 85 | // toggle and load sidebar width 86 | function adjustWidth (x, unit = 'px') { 87 | setStyle(qs('.sidebar'), { width: x + 'px' }) 88 | setStyle(qs('.main'), { marginLeft: x + 'px' }) 89 | } 90 | function tryRestoreSidebar (doms) { 91 | let x = ls.get('sidebar_width') 92 | adjustWidth(x) 93 | let flag = ls.get('is_sidebar_hide') 94 | flag === '1' ? addClass(doms.pane, 'hide') : removeClass(doms.pane, 'hide') 95 | } 96 | function activateSidebarToggle (doms) { 97 | onEvent('click', toggleSidebar.bind(null, doms), 0, '.toggle-sidebar') 98 | } 99 | 100 | function toggleSidebar (doms, e) { 101 | if (hasClass(doms.pane, 'hide')) { 102 | removeClass(doms.pane, 'hide') 103 | ls.set('is_sidebar_hide', '0') 104 | } else { 105 | addClass(doms.pane, 'hide') 106 | ls.set('is_sidebar_hide', '1') 107 | } 108 | e.preventDefault() 109 | e.stopPropagation() 110 | return false 111 | } 112 | // style mode functions 113 | const toMode = name => { 114 | if (!hasClass(document.body, name)) { 115 | addClass(clearClass(document.body), name) 116 | } 117 | ls.set('mode', name) 118 | } 119 | function tryLoadMode (doms, loader) { 120 | let mode = ls.get('mode') 121 | mode && toMode(mode) 122 | if (mode === 'wild-mode') { 123 | let wildEle = elt( 124 | 'style', 125 | { class: 'wild-ele' }, 126 | ls.get('wild_style')) 127 | document.body.appendChild(wildEle) 128 | } 129 | loader.loaded() 130 | } 131 | function activateModeSwitcher (doms, loader) { 132 | onEvent('click', e => { 133 | e.preventDefault() 134 | e.stopPropagation() 135 | if (e.target.id === 'theme-switcher-button') { 136 | return 137 | } 138 | if (hasClass(e.target, 'export-wild')) { 139 | addClass('.dialog', 'show') 140 | qs('#theme-name').focus() 141 | return 142 | } 143 | let theme = e.target.dataset.theme 144 | if (!theme) { 145 | console.error('Theme name not found, probably missing an "Identifier" field in Config file.') 146 | return 147 | } 148 | loader.loading() 149 | toMode(theme + '-mode') 150 | if (theme === 'wild') { 151 | const wildEle = qs('.wild-ele') 152 | const style = wildStyle() 153 | if (wildEle) { 154 | wildEle.innerText = style 155 | } else { 156 | document.body.appendChild(elt('style', { class: 'wild-ele' }, style)) 157 | } 158 | ls.set('wild_style', style) 159 | } 160 | loader.loaded() 161 | }, 0, '#theme-switcher') 162 | } 163 | 164 | // function showCloak () { 165 | // removeClass(cloak, 'hide') 166 | // } 167 | 168 | function activateDialog (doms, loader) { 169 | onEvent('click', e => { 170 | removeClass('.dialog', 'show') 171 | }, 0, '.close-dialog') 172 | onEvent('click', e => { 173 | const themeName = qs('#theme-name').value.trim() 174 | if (!themeName) { 175 | window.alert('Name is required.') 176 | return 177 | } 178 | if (!/^[a-zA-Z\s-]+$/.test(themeName)) { 179 | window.alert('Only English letters, space, hyphens are allowed.') 180 | return 181 | } 182 | if (themeName === 'light' || themeName === 'dark' || themeName === 'wild') { 183 | window.alert('Mess up builtin themes.') 184 | return 185 | } 186 | loader.loading() 187 | exportWild(themeName) 188 | removeClass('.dialog', 'show') 189 | loader.loaded() 190 | }, 0, '.export') 191 | } 192 | function exportWild (themeName) { 193 | let content = generateFile(themeName) 194 | download(themeName + '.css', content) 195 | } 196 | 197 | function generateFile (themeName) { 198 | let style = ls.get('wild_style') 199 | let identifier = themeName.replace(/\s/g, '-') 200 | style = style.replace(/wild-mode/g, `${identifier}-mode`) 201 | let file = genFile(identifier, themeName) 202 | return file + style 203 | } 204 | 205 | export { 206 | tryLoadMode, 207 | tryRestoreSidebar, 208 | activateSidebarToggle, 209 | activateModeSwitcher, 210 | activateSidebarDrag, 211 | activateDialog 212 | } 213 | -------------------------------------------------------------------------------- /src/css/base.less: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | html { 4 | font-size: calc(1vh + 1vw) 5 | } 6 | 7 | body { 8 | margin : 0; 9 | word-break : break-all; 10 | box-sizing : border-box; 11 | font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif; 12 | overflow: hidden; 13 | } 14 | 15 | img { 16 | height : auto; 17 | width : 100%; 18 | max-width: 40vw; 19 | } 20 | 21 | .clearfix::after { 22 | content: ""; 23 | display: table; 24 | clear : both; 25 | } 26 | 27 | .left { 28 | float: left; 29 | } 30 | 31 | .right { 32 | float: right; 33 | } 34 | 35 | .hide { 36 | height : 0; 37 | opacity: 0; 38 | } 39 | 40 | .btn { 41 | text-decoration: none; 42 | cursor: pointer; 43 | } 44 | 45 | .control { 46 | list-style-type: none; 47 | margin : 0; 48 | padding : 0; 49 | } 50 | 51 | .no-break { 52 | overflow : hidden; 53 | text-overflow: ellipsis; 54 | white-space : nowrap; 55 | } 56 | 57 | a:hover { 58 | text-decoration: none !important; 59 | } 60 | 61 | body.loaded { 62 | .top { 63 | display: none; 64 | } 65 | .bottom { 66 | display: none; 67 | } 68 | } 69 | 70 | 71 | .top img.logo, .bottom img.logo { 72 | display: block; 73 | margin: 0 auto; 74 | position: relative; 75 | } 76 | .top, .bottom { 77 | position: absolute; 78 | width: 100vw; 79 | height: 50vh; 80 | z-index: 99999; 81 | overflow: hidden; 82 | } 83 | .top { 84 | background: @dark_main_bg; 85 | top: calc(-50vh - 100px); 86 | img.logo { 87 | bottom: -100%; 88 | transform: translateY(-50%); 89 | } 90 | } 91 | 92 | .bottom { 93 | background: @dark_main_bg; 94 | top: calc(100vh + 100px); 95 | img.logo { 96 | transform: translateY(-50%); 97 | } 98 | 99 | } 100 | 101 | .header, 102 | .footer { 103 | height: 5vh; 104 | } 105 | 106 | .header a, 107 | .footer a { 108 | line-height : 5vh; 109 | display : block; 110 | padding-left : 0.8rem; 111 | padding-right: 0.8rem; 112 | } 113 | 114 | .header>ul, 115 | .footer ul { 116 | margin: 0 1vw; 117 | } 118 | 119 | .menu>li, 120 | .footer li { 121 | float: left; 122 | } 123 | 124 | .menu>li { 125 | position: relative; 126 | } 127 | 128 | .footer .social { 129 | float: left; 130 | } 131 | 132 | .footer .status { 133 | float: right; 134 | } 135 | 136 | .middle { 137 | height: 90vh; 138 | } 139 | 140 | .sidebar { 141 | width: 20vw; 142 | float: left; 143 | } 144 | 145 | .main { 146 | margin-left: 20vw; 147 | box-sizing : border-box; 148 | padding : 2vw 3vw; 149 | overflow-y : auto; 150 | position : relative; 151 | } 152 | 153 | .sidebar, 154 | .main { 155 | height: 100%; 156 | } 157 | 158 | .sidebar.hide { 159 | display: none; 160 | } 161 | 162 | .sidebar.hide+.main { 163 | margin-left: 0 !important; 164 | } 165 | 166 | .intro { 167 | text-align: center; 168 | position : absolute; 169 | top : 50%; 170 | left : 0; 171 | right : 0; 172 | transform : translateY(-50%); 173 | } 174 | 175 | .intro img.logo { 176 | display: inline; 177 | } 178 | 179 | .header ul ul { 180 | display : none; 181 | position: absolute; 182 | top : 100%; 183 | left : 0; 184 | width : 14em; 185 | z-index : 999; 186 | } 187 | 188 | .header li:hover>ul { 189 | display: block; 190 | } 191 | 192 | 193 | 194 | .main { 195 | font-size : 1rem; 196 | line-height: 2; 197 | } 198 | 199 | .header .sub-menu a { 200 | padding: 0 2vw; 201 | } 202 | 203 | .sidebar { 204 | overflow-y: auto; 205 | } 206 | 207 | 208 | .sidebar a { 209 | overflow : hidden; 210 | text-overflow: ellipsis; 211 | white-space : nowrap; 212 | } 213 | 214 | .sidebar a, 215 | .taxonomy-key { 216 | display: block; 217 | } 218 | 219 | .sidebar ul { 220 | margin-top: 1rem; 221 | } 222 | 223 | .sidebar a, 224 | .taxonomy-key { 225 | display : block; 226 | line-height: 2; 227 | padding : 0 4%; 228 | } 229 | 230 | .logo-link { 231 | height : 5vh; 232 | box-sizing : border-box; 233 | padding-top: 1.2vh; 234 | } 235 | 236 | 237 | .logo { 238 | height : 70%; 239 | width : auto; 240 | display: block; 241 | } 242 | 243 | .logo-container { 244 | display: none; 245 | } 246 | body.wild-mode .logo-wild { 247 | display: list-item; 248 | } 249 | body.light-mode .logo-light { 250 | display: list-item; 251 | } 252 | body.dark-mode .logo-default { 253 | display: list-item; 254 | } 255 | body.wild-mode .intro .logo-wild { 256 | display: block; 257 | } 258 | body.light-mode .intro .logo-light { 259 | display: block; 260 | } 261 | body.dark-mode .intro .logo-default { 262 | display: block; 263 | } 264 | hr { 265 | margin: 1rem 0; 266 | } 267 | 268 | 269 | pre { 270 | 271 | overflow: auto; 272 | padding : 0.8rem 1rem; 273 | } 274 | 275 | code { 276 | overflow : auto; 277 | font-size : 0.8rem; 278 | font-family: 'Fira Code', Inconsolata, 'Deja Vu Sans Mono', 'Source Code Pro', Consolas, monospace; 279 | padding : 0.2rem 0.6rem; 280 | } 281 | 282 | .icon { 283 | width : 1rem; 284 | height : 1rem; 285 | display: inline-block; 286 | } 287 | 288 | .footer .icon { 289 | position: relative; 290 | top : 0.2rem; 291 | } 292 | 293 | .sidebar .icon { 294 | margin-right: 0.5rem; 295 | position : relative; 296 | top : 0.1rem; 297 | } 298 | 299 | .article-meta .icon { 300 | position: relative; 301 | top : calc(0.1rem + 2px); 302 | } 303 | 304 | .article-tags .icon { 305 | position: relative; 306 | top : -0.2rem; 307 | } 308 | 309 | .article-categories li:first-child .icon { 310 | top: calc(0.1rem + 1px); 311 | } 312 | 313 | .article { 314 | text-align: left; 315 | } 316 | 317 | 318 | 319 | .title { 320 | font-weight: bold; 321 | margin : 0 0 0.5rem 0; 322 | } 323 | 324 | .item { 325 | margin-bottom: 1rem; 326 | } 327 | 328 | .item .title { 329 | margin: 0; 330 | } 331 | 332 | .article-meta { 333 | font-size : 0.8rem; 334 | margin-bottom: 1rem; 335 | } 336 | 337 | .article-meta ul { 338 | list-style-type: none; 339 | margin : 0; 340 | } 341 | 342 | .article-meta-splitter { 343 | margin-bottom: 0.5rem; 344 | } 345 | 346 | .article-meta li { 347 | float : left; 348 | margin-right : 1rem; 349 | margin-bottom: 0.5rem; 350 | } 351 | 352 | .article-meta li:first-child { 353 | margin-right: 0.5rem; 354 | } 355 | 356 | .main .article-tags a { 357 | 358 | padding : 0rem 0.8rem; 359 | border-radius: 1px; 360 | display : block; 361 | line-height : 1.4; 362 | } 363 | 364 | 365 | 366 | .main p a { 367 | margin: 0 0.3rem; 368 | } 369 | 370 | .title a, 371 | .article-meta a, 372 | .list a, 373 | a.terms-title, 374 | .terms-list a, 375 | .pagination a { 376 | text-decoration: none; 377 | } 378 | 379 | .terms-list a { 380 | font-size: 0.8rem; 381 | } 382 | 383 | .pagination a { 384 | font-size: 0.8rem; 385 | padding : 0 0.5rem; 386 | } 387 | 388 | .pagination { 389 | position: absolute; 390 | left : 0; 391 | right : 0; 392 | bottom : 0; 393 | padding : 0 2rem; 394 | } 395 | 396 | .pagination ul { 397 | list-style-type: none; 398 | margin-left : 0; 399 | } 400 | 401 | /* prism toolbar */ 402 | .code-toolbar>.toolbar a { 403 | border-bottom: none; 404 | display : block; 405 | } 406 | 407 | .local-info { 408 | font-size : 0.8rem; 409 | padding : 0.8rem; 410 | margin-bottom: 1rem; 411 | } 412 | 413 | .header a, 414 | .footer a, 415 | .sidebar a, 416 | .taxonomy-key { 417 | font-size: 0.81rem; 418 | } 419 | -------------------------------------------------------------------------------- /src/css/base.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | html { 4 | font-size: calc(1vh + 1vw) 5 | } 6 | 7 | body { 8 | margin : 0; 9 | word-break : break-all; 10 | box-sizing : border-box; 11 | font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif; 12 | overflow: hidden; 13 | } 14 | 15 | img { 16 | height : auto; 17 | width : 100%; 18 | max-width: 40vw; 19 | } 20 | 21 | .clearfix::after { 22 | content: ""; 23 | display: table; 24 | clear : both; 25 | } 26 | 27 | .left { 28 | float: left; 29 | } 30 | 31 | .right { 32 | float: right; 33 | } 34 | 35 | .hide { 36 | height : 0; 37 | opacity: 0; 38 | } 39 | 40 | .btn { 41 | text-decoration: none; 42 | cursor: pointer; 43 | } 44 | 45 | .control { 46 | list-style-type: none; 47 | margin : 0; 48 | padding : 0; 49 | } 50 | 51 | .no-break { 52 | overflow : hidden; 53 | text-overflow: ellipsis; 54 | white-space : nowrap; 55 | } 56 | 57 | a:hover { 58 | text-decoration: none !important; 59 | } 60 | 61 | body.loaded { 62 | .top { 63 | display: none; 64 | } 65 | .bottom { 66 | display: none; 67 | } 68 | } 69 | 70 | 71 | .top img.logo, .bottom img.logo { 72 | display: block; 73 | margin: 0 auto; 74 | position: relative; 75 | } 76 | .top, .bottom { 77 | position: absolute; 78 | width: 100vw; 79 | height: 50vh; 80 | z-index: 99999; 81 | overflow: hidden; 82 | } 83 | .top { 84 | background: $dark_main_bg; 85 | top: calc(-50vh - 100px); 86 | img.logo { 87 | bottom: -100%; 88 | transform: translateY(-50%); 89 | } 90 | } 91 | 92 | .bottom { 93 | background: $dark_main_bg; 94 | top: calc(100vh + 100px); 95 | img.logo { 96 | transform: translateY(-50%); 97 | } 98 | 99 | } 100 | 101 | .header, 102 | .footer { 103 | height: 5vh; 104 | } 105 | 106 | .header a, 107 | .footer a { 108 | line-height : 5vh; 109 | display : block; 110 | padding-left : 0.8rem; 111 | padding-right: 0.8rem; 112 | } 113 | 114 | .header>ul, 115 | .footer ul { 116 | margin: 0 1vw; 117 | } 118 | 119 | .menu>li, 120 | .footer li { 121 | float: left; 122 | } 123 | 124 | .menu>li { 125 | position: relative; 126 | } 127 | 128 | .footer .social { 129 | float: left; 130 | } 131 | 132 | .footer .status { 133 | float: right; 134 | } 135 | 136 | .middle { 137 | height: 90vh; 138 | } 139 | 140 | .sidebar { 141 | width: 20vw; 142 | float: left; 143 | } 144 | 145 | .main { 146 | margin-left: 20vw; 147 | box-sizing : border-box; 148 | padding : 2vw 3vw; 149 | overflow-y : auto; 150 | position : relative; 151 | } 152 | 153 | .sidebar, 154 | .main { 155 | height: 100%; 156 | } 157 | 158 | .sidebar.hide { 159 | display: none; 160 | } 161 | 162 | .sidebar.hide+.main { 163 | margin-left: 0 !important; 164 | } 165 | 166 | .intro { 167 | text-align: center; 168 | position : absolute; 169 | top : 50%; 170 | left : 0; 171 | right : 0; 172 | transform : translateY(-50%); 173 | } 174 | 175 | .intro img.logo { 176 | display: inline; 177 | } 178 | 179 | .header ul ul { 180 | display : none; 181 | position: absolute; 182 | top : 100%; 183 | left : 0; 184 | width : 14em; 185 | z-index : 999; 186 | } 187 | 188 | .header li:hover>ul { 189 | display: block; 190 | } 191 | 192 | 193 | 194 | .main { 195 | font-size : 1rem; 196 | line-height: 2; 197 | } 198 | 199 | .header .sub-menu a { 200 | padding: 0 2vw; 201 | } 202 | 203 | .sidebar { 204 | overflow-y: auto; 205 | } 206 | 207 | 208 | .sidebar a { 209 | overflow : hidden; 210 | text-overflow: ellipsis; 211 | white-space : nowrap; 212 | } 213 | 214 | .sidebar a, 215 | .taxonomy-key { 216 | display: block; 217 | } 218 | 219 | .sidebar ul { 220 | margin-top: 1rem; 221 | } 222 | 223 | .sidebar a, 224 | .taxonomy-key { 225 | display : block; 226 | line-height: 2; 227 | padding : 0 2vw; 228 | } 229 | 230 | .logo-link { 231 | height : 5vh; 232 | box-sizing : border-box; 233 | padding-top: 1.2vh; 234 | } 235 | 236 | 237 | .logo { 238 | height : 70%; 239 | width : auto; 240 | display: block; 241 | } 242 | 243 | .logo-container { 244 | display: none; 245 | } 246 | body.wild-mode .logo-wild { 247 | display: list-item; 248 | } 249 | body.light-mode .logo-light { 250 | display: list-item; 251 | } 252 | body.dark-mode .logo-default { 253 | display: list-item; 254 | } 255 | body.wild-mode .intro .logo-wild { 256 | display: block; 257 | } 258 | body.light-mode .intro .logo-light { 259 | display: block; 260 | } 261 | body.dark-mode .intro .logo-default { 262 | display: block; 263 | } 264 | hr { 265 | margin: 1rem 0; 266 | } 267 | 268 | 269 | pre { 270 | 271 | overflow: auto; 272 | padding : 0.8rem 1rem; 273 | } 274 | 275 | code { 276 | overflow : auto; 277 | font-size : 0.8rem; 278 | font-family: 'Fira Code', Inconsolata, 'Deja Vu Sans Mono', 'Source Code Pro', Consolas, monospace; 279 | padding : 0.2rem 0.6rem; 280 | } 281 | 282 | .icon { 283 | width : 1rem; 284 | height : 1rem; 285 | display: inline-block; 286 | } 287 | 288 | .footer .icon { 289 | position: relative; 290 | top : 0.2rem; 291 | } 292 | 293 | .sidebar .icon { 294 | margin-right: 0.5rem; 295 | position : relative; 296 | top : 0.1rem; 297 | } 298 | 299 | .article-meta .icon { 300 | position: relative; 301 | top : calc(0.1rem + 2px); 302 | } 303 | 304 | .article-tags .icon { 305 | position: relative; 306 | top : -0.2rem; 307 | } 308 | 309 | .article-categories li:first-child .icon { 310 | top: calc(0.1rem + 1px); 311 | } 312 | 313 | .article { 314 | text-align: left; 315 | } 316 | 317 | 318 | 319 | .title { 320 | font-weight: bold; 321 | margin : 0 0 0.5rem 0; 322 | } 323 | 324 | .item { 325 | margin-bottom: 1rem; 326 | } 327 | 328 | .item .title { 329 | margin: 0; 330 | } 331 | 332 | .article-meta { 333 | font-size : 0.8rem; 334 | margin-bottom: 1rem; 335 | } 336 | 337 | .article-meta ul { 338 | list-style-type: none; 339 | margin : 0; 340 | } 341 | 342 | .article-meta-splitter { 343 | margin-bottom: 0.5rem; 344 | } 345 | 346 | .article-meta li { 347 | float : left; 348 | margin-right : 1rem; 349 | margin-bottom: 0.5rem; 350 | } 351 | 352 | .article-meta li:first-child { 353 | margin-right: 0.5rem; 354 | } 355 | 356 | .main .article-tags a { 357 | 358 | padding : 0rem 0.8rem; 359 | border-radius: 1px; 360 | display : block; 361 | line-height : 1.4; 362 | } 363 | 364 | 365 | 366 | .main p a { 367 | margin: 0 0.3rem; 368 | } 369 | 370 | .title a, 371 | .article-meta a, 372 | .list a, 373 | a.terms-title, 374 | .terms-list a, 375 | .pagination a { 376 | text-decoration: none; 377 | } 378 | 379 | .terms-list a { 380 | font-size: 0.8rem; 381 | } 382 | 383 | .pagination a { 384 | font-size: 0.8rem; 385 | padding : 0 0.5rem; 386 | } 387 | 388 | .pagination { 389 | position: absolute; 390 | left : 0; 391 | right : 0; 392 | bottom : 0; 393 | padding : 0 2rem; 394 | } 395 | 396 | .pagination ul { 397 | list-style-type: none; 398 | margin-left : 0; 399 | } 400 | 401 | /* prism toolbar */ 402 | .code-toolbar>.toolbar a { 403 | border-bottom: none; 404 | display : block; 405 | } 406 | 407 | .local-info { 408 | font-size : 0.8rem; 409 | padding : 0.8rem; 410 | margin-bottom: 1rem; 411 | } 412 | 413 | .header a, 414 | .footer a, 415 | .sidebar a, 416 | .taxonomy-key { 417 | font-size: 0.81rem; 418 | } 419 | -------------------------------------------------------------------------------- /static/css/main.css: -------------------------------------------------------------------------------- 1 | html{font-size:calc(1vh + 1vw)}body{margin:0;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,sans-serif;overflow:hidden}img{height:auto;width:100%;max-width:40vw}.clearfix:after{content:"";display:table;clear:both}.left{float:left}.right{float:right}.hide{height:0;opacity:0}.btn{text-decoration:none;cursor:pointer}.control{list-style-type:none;margin:0;padding:0}.no-break{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a:hover{text-decoration:none!important}body.loaded .bottom,body.loaded .top{display:none}.bottom img.logo,.top img.logo{display:block;margin:0 auto;position:relative}.bottom,.top{position:absolute;width:100vw;height:50vh;z-index:99999;overflow:hidden}.top{background:#282c34;top:calc(-50vh - 100px)}.top img.logo{bottom:-100%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.bottom{background:#282c34;top:calc(100vh + 100px)}.bottom img.logo{-webkit-transform:translateY(-50%);transform:translateY(-50%)}.footer,.header{height:5vh}.footer a,.header a{line-height:5vh;display:block;padding-left:.8rem;padding-right:.8rem}.footer ul,.header>ul{margin:0 1vw}.footer li,.menu>li{float:left}.menu>li{position:relative}.footer .social{float:left}.footer .status{float:right}.middle{height:90vh}.sidebar{width:20vw;float:left}.main{margin-left:20vw;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2vw 3vw;overflow-y:auto;position:relative}.main,.sidebar{height:100%}.sidebar.hide{display:none}.sidebar.hide+.main{margin-left:0!important}.intro{text-align:center;position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.intro img.logo{display:inline}.header ul ul{display:none;position:absolute;top:100%;left:0;width:14em;z-index:999}.header li:hover>ul{display:block}.main{font-size:1rem;line-height:2}.header .sub-menu a{padding:0 2vw}.sidebar{overflow-y:auto}.sidebar a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar ul{margin-top:1rem}.sidebar a,.taxonomy-key{display:block;line-height:2;padding:0 4%}.logo-link{height:5vh;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:1.2vh}.logo{height:70%;width:auto;display:block}.logo-container{display:none}body.dark-mode .logo-default,body.light-mode .logo-light,body.wild-mode .logo-wild{display:list-item}body.dark-mode .intro .logo-default,body.light-mode .intro .logo-light,body.wild-mode .intro .logo-wild{display:block}hr{margin:1rem 0}pre{padding:.8rem 1rem}code,pre{overflow:auto}code{font-size:.8rem;font-family:Fira Code,Inconsolata,Deja Vu Sans Mono,Source Code Pro,Consolas,monospace;padding:.2rem .6rem}.icon{width:1rem;height:1rem;display:inline-block}.footer .icon{position:relative;top:.2rem}.sidebar .icon{margin-right:.5rem;position:relative;top:.1rem}.article-meta .icon{position:relative;top:calc(.1rem + 2px)}.article-tags .icon{position:relative;top:-.2rem}.article-categories li:first-child .icon{top:calc(.1rem + 1px)}.article{text-align:left}.title{font-weight:700;margin:0 0 .5rem}.item{margin-bottom:1rem}.item .title{margin:0}.article-meta{font-size:.8rem;margin-bottom:1rem}.article-meta ul{list-style-type:none;margin:0}.article-meta-splitter,.article-meta li{margin-bottom:.5rem}.article-meta li{float:left;margin-right:1rem}.article-meta li:first-child{margin-right:.5rem}.main .article-tags a{padding:0 .8rem;border-radius:1px;display:block;line-height:1.4}.main p a{margin:0 .3rem}.article-meta a,.list a,.pagination a,.terms-list a,.title a,a.terms-title{text-decoration:none}.pagination a,.terms-list a{font-size:.8rem}.pagination a{padding:0 .5rem}.pagination{position:absolute;left:0;right:0;bottom:0;padding:0 2rem}.pagination ul{list-style-type:none;margin-left:0}.code-toolbar>.toolbar a{border-bottom:none;display:block}.local-info{font-size:.8rem;padding:.8rem;margin-bottom:1rem}.footer a,.header a,.sidebar a,.taxonomy-key{font-size:.81rem}.main a{color:#9cf}.main .article-tags a{background:#327e36;color:#fff}.dialog label,.local-info{background:#ff9;color:#333;-webkit-box-shadow:2px 3px 1px 1px #000;box-shadow:2px 3px 1px 1px #000}.dialog,.footer a:hover,.header .menu>li:hover,.logo-link,.main,body{background:#282c34}.dialog .title,.header .sub-menu a,.main,.main .title a,.sidebar a,.taxonomy-key,blockquote.twitter-tweet{color:#c6c6c7}.icon{background:#c6c6c7}.article-meta,.footnotes,.item-meta{color:#939bab}td,th{border-bottom:1px solid #939bab}hr{border:1px solid #939bab}.pagination{background:#939bab}.sidebar{background:#16191d}.header ul ul{-webkit-box-shadow:0 .1em .2em 0 #060606;box-shadow:0 .1em .2em 0 #060606}.header ul ul,.pagination a:hover{background:#1a1d21}code{background:#1a1c21}.count,.taxonomy-key{color:#939394}.footer,.header,.header .sub-menu li:hover,.sidebar a:hover{background:#21252b}.footer a,.footer time,.header a,.pagination a{color:#797d85}.footer .icon{background-color:#797d85}.main h1,.main h2,.main h3,.main h4,.main h5,.main h6,.title{text-shadow:0 1px 1px #000}.dialog{width:100vw;height:0;position:absolute;top:0;left:0;z-index:9999;overflow:hidden;font-size:1rem}.dialog .wrapper{padding:1rem}.dialog footer,.dialog header,.dialog main{margin-bottom:2rem}.dialog header{margin-top:-2rem}.dialog div{margin-bottom:1rem}.dialog.show{height:100vh}.dialog label{display:block;margin-bottom:1rem;padding:.8rem 1rem;-webkit-box-shadow:none;box-shadow:none}.dialog input{padding:.3rem}.dialog button,.dialog input{font-size:1.2rem;float:right}.dialog button{padding:.3rem 1rem;background:#3083fe;color:#fff}.dialog .close-dialog{font-size:3rem;background:none;border:none}.light-mode .dialog button,.light-mode .main a{color:#3083fe}.light-mode .main .article-tags a{background:#35cc81;color:#fff}.light-mode .local-info{background:#efecaa;color:#000;-webkit-box-shadow:none;box-shadow:none}.light-mode .main,body.light-mode{background:#fff}.light-mode .dialog .title,.light-mode .main,.light-mode .main .title a,.light-mode .sidebar a,.light-mode .taxonomy-key,.light-mode blockquote.twitter-tweet{color:#4c4c4c}.light-mode .icon{background:#4c4c4c}.light-mode .article-meta,.light-mode .footnotes,.light-mode .item-meta{color:#999}.light-mode td,.light-mode th{border-bottom:1px solid #ccc}.light-mode hr{border:1px solid #ccc}.light-mode .pagination{background:#ccc}.light-mode .sidebar{background:#eee}.light-mode code,.light-mode pre{background:#ddd}.light-mode .sidebar a{color:#3f3f3f}.light-mode .count,.light-mode .taxonomy-key{color:#777}.light-mode .dialog,.light-mode .dialog button,.light-mode .footer,.light-mode .header,.light-mode .header .sub-menu li:hover,.light-mode .logo-link,.light-mode .sidebar a:hover{background:#ddd}.light-mode .footer a:hover,.light-mode .header .menu>li:hover{background:#ccc}.light-mode .header ul ul{-webkit-box-shadow:0 .1em .2em 0 #aaa;box-shadow:0 .1em .2em 0 #aaa}.light-mode .header ul ul,.light-mode .pagination a:hover{background:#ccc}.light-mode .footer a,.light-mode .footer time,.light-mode .header a,.light-mode .pagination a{color:#323232}.light-mode .header .sub-menu a{color:#0b0b0b}.light-mode .footer .icon{background-color:#323232}.light-mode .main h1,.light-mode .main h2,.light-mode .main h3,.light-mode .main h4,.light-mode .main h5,.light-mode .main h6,.light-mode .title{text-shadow:none}.light-mode .bottom,.light-mode .top{background:#ddd}.wild-mode .main h1,.wild-mode .main h2,.wild-mode .main h3,.wild-mode .main h4,.wild-mode .main h5,.wild-mode .main h6,.wild-mode .title{text-shadow:none}.wild-mode .local-info{-webkit-box-shadow:none;box-shadow:none}.icon-tags{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='pricetags'%3E%3Cpath d='M12.87 22a1.84 1.84 0 01-1.29-.53l-6.41-6.42a1 1 0 01-.29-.61L4 5.09a1 1 0 01.29-.8 1 1 0 01.8-.29l9.35.88a1 1 0 01.61.29l6.42 6.41a1.82 1.82 0 010 2.57l-7.32 7.32a1.82 1.82 0 01-1.28.53zm-6-8.11l6 6 7.05-7.05-6-6-7.81-.73z'/%3E%3Ccircle cx='10.5' cy='10.5' r='1.5'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='pricetags'%3E%3Cpath d='M12.87 22a1.84 1.84 0 01-1.29-.53l-6.41-6.42a1 1 0 01-.29-.61L4 5.09a1 1 0 01.29-.8 1 1 0 01.8-.29l9.35.88a1 1 0 01.61.29l6.42 6.41a1.82 1.82 0 010 2.57l-7.32 7.32a1.82 1.82 0 01-1.28.53zm-6-8.11l6 6 7.05-7.05-6-6-7.81-.73z'/%3E%3Ccircle cx='10.5' cy='10.5' r='1.5'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.icon-categories{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19.5 20.5h-15A2.47 2.47 0 012 18.07V5.93A2.47 2.47 0 014.5 3.5h4.6a1 1 0 01.77.37l2.6 3.18h7A2.47 2.47 0 0122 9.48v8.59a2.47 2.47 0 01-2.5 2.43zM4 13.76v4.31a.46.46 0 00.5.43h15a.46.46 0 00.5-.43V9.48a.46.46 0 00-.5-.43H12a1 1 0 01-.77-.37L8.63 5.5H4.5a.46.46 0 00-.5.43z' data-name='folder'/%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19.5 20.5h-15A2.47 2.47 0 012 18.07V5.93A2.47 2.47 0 014.5 3.5h4.6a1 1 0 01.77.37l2.6 3.18h7A2.47 2.47 0 0122 9.48v8.59a2.47 2.47 0 01-2.5 2.43zM4 13.76v4.31a.46.46 0 00.5.43h15a.46.46 0 00.5-.43V9.48a.46.46 0 00-.5-.43H12a1 1 0 01-.77-.37L8.63 5.5H4.5a.46.46 0 00-.5.43z' data-name='folder'/%3E%3C/g%3E%3C/svg%3E")}.icon-post{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='file-text'%3E%3Cpath d='M15 16H9a1 1 0 000 2h6a1 1 0 000-2zm-6-2h3a1 1 0 000-2H9a1 1 0 000 2z'/%3E%3Cpath d='M19.74 8.33l-5.44-6a1 1 0 00-.74-.33h-7A2.53 2.53 0 004 4.5v15A2.53 2.53 0 006.56 22h10.88A2.53 2.53 0 0020 19.5V9a1 1 0 00-.26-.67zM14 5l2.74 3h-2a.79.79 0 01-.74-.85zm3.44 15H6.56a.53.53 0 01-.56-.5v-15a.53.53 0 01.56-.5H12v3.15A2.79 2.79 0 0014.71 10H18v9.5a.53.53 0 01-.56.5z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='file-text'%3E%3Cpath d='M15 16H9a1 1 0 000 2h6a1 1 0 000-2zm-6-2h3a1 1 0 000-2H9a1 1 0 000 2z'/%3E%3Cpath d='M19.74 8.33l-5.44-6a1 1 0 00-.74-.33h-7A2.53 2.53 0 004 4.5v15A2.53 2.53 0 006.56 22h10.88A2.53 2.53 0 0020 19.5V9a1 1 0 00-.26-.67zM14 5l2.74 3h-2a.79.79 0 01-.74-.85zm3.44 15H6.56a.53.53 0 01-.56-.5v-15a.53.53 0 01.56-.5H12v3.15A2.79 2.79 0 0014.71 10H18v9.5a.53.53 0 01-.56.5z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.article-meta .icon-date{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='calendar'%3E%3Cpath d='M18 4h-1V3a1 1 0 00-2 0v1H9V3a1 1 0 00-2 0v1H6a3 3 0 00-3 3v12a3 3 0 003 3h12a3 3 0 003-3V7a3 3 0 00-3-3zM6 6h1v1a1 1 0 002 0V6h6v1a1 1 0 002 0V6h1a1 1 0 011 1v4H5V7a1 1 0 011-1zm12 14H6a1 1 0 01-1-1v-6h14v6a1 1 0 01-1 1z'/%3E%3Ccircle cx='8' cy='16' r='1'/%3E%3Cpath d='M16 15h-4a1 1 0 000 2h4a1 1 0 000-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='calendar'%3E%3Cpath d='M18 4h-1V3a1 1 0 00-2 0v1H9V3a1 1 0 00-2 0v1H6a3 3 0 00-3 3v12a3 3 0 003 3h12a3 3 0 003-3V7a3 3 0 00-3-3zM6 6h1v1a1 1 0 002 0V6h6v1a1 1 0 002 0V6h1a1 1 0 011 1v4H5V7a1 1 0 011-1zm12 14H6a1 1 0 01-1-1v-6h14v6a1 1 0 01-1 1z'/%3E%3Ccircle cx='8' cy='16' r='1'/%3E%3Cpath d='M16 15h-4a1 1 0 000 2h4a1 1 0 000-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.github{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M12 1A10.89 10.89 0 001 11.77 10.79 10.79 0 008.52 22c.55.1.75-.23.75-.52v-1.83c-3.06.65-3.71-1.44-3.71-1.44a2.86 2.86 0 00-1.22-1.58c-1-.66.08-.65.08-.65a2.31 2.31 0 011.68 1.11 2.37 2.37 0 003.2.89 2.33 2.33 0 01.7-1.44c-2.44-.27-5-1.19-5-5.32a4.15 4.15 0 011.11-2.91 3.78 3.78 0 01.11-2.84s.93-.29 3 1.1a10.68 10.68 0 015.5 0c2.1-1.39 3-1.1 3-1.1a3.78 3.78 0 01.11 2.84A4.15 4.15 0 0119 11.2c0 4.14-2.58 5.05-5 5.32a2.5 2.5 0 01.75 2v2.95c0 .35.2.63.75.52A10.8 10.8 0 0023 11.77 10.89 10.89 0 0012 1' data-name='github'/%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M12 1A10.89 10.89 0 001 11.77 10.79 10.79 0 008.52 22c.55.1.75-.23.75-.52v-1.83c-3.06.65-3.71-1.44-3.71-1.44a2.86 2.86 0 00-1.22-1.58c-1-.66.08-.65.08-.65a2.31 2.31 0 011.68 1.11 2.37 2.37 0 003.2.89 2.33 2.33 0 01.7-1.44c-2.44-.27-5-1.19-5-5.32a4.15 4.15 0 011.11-2.91 3.78 3.78 0 01.11-2.84s.93-.29 3 1.1a10.68 10.68 0 015.5 0c2.1-1.39 3-1.1 3-1.1a3.78 3.78 0 01.11 2.84A4.15 4.15 0 0119 11.2c0 4.14-2.58 5.05-5 5.32a2.5 2.5 0 01.75 2v2.95c0 .35.2.63.75.52A10.8 10.8 0 0023 11.77 10.89 10.89 0 0012 1' data-name='github'/%3E%3C/g%3E%3C/svg%3E")}.twitter{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M8.08 20A11.07 11.07 0 0019.52 9 8.09 8.09 0 0021 6.16a.44.44 0 00-.62-.51 1.88 1.88 0 01-2.16-.38 3.89 3.89 0 00-5.58-.17A4.13 4.13 0 0011.49 9C8.14 9.2 5.84 7.61 4 5.43a.43.43 0 00-.75.24 9.68 9.68 0 004.6 10.05A6.73 6.73 0 013.38 18a.45.45 0 00-.14.84A11 11 0 008.08 20' data-name='twitter'/%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M8.08 20A11.07 11.07 0 0019.52 9 8.09 8.09 0 0021 6.16a.44.44 0 00-.62-.51 1.88 1.88 0 01-2.16-.38 3.89 3.89 0 00-5.58-.17A4.13 4.13 0 0011.49 9C8.14 9.2 5.84 7.61 4 5.43a.43.43 0 00-.75.24 9.68 9.68 0 004.6 10.05A6.73 6.73 0 013.38 18a.45.45 0 00-.14.84A11 11 0 008.08 20' data-name='twitter'/%3E%3C/g%3E%3C/svg%3E")}.facebook{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M17 3.5a.5.5 0 00-.5-.5H14a4.77 4.77 0 00-5 4.5v2.7H6.5a.5.5 0 00-.5.5v2.6a.5.5 0 00.5.5H9v6.7a.5.5 0 00.5.5h3a.5.5 0 00.5-.5v-6.7h2.62a.5.5 0 00.49-.37l.72-2.6a.5.5 0 00-.48-.63H13V7.5a1 1 0 011-.9h2.5a.5.5 0 00.5-.5z' data-name='facebook'/%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M17 3.5a.5.5 0 00-.5-.5H14a4.77 4.77 0 00-5 4.5v2.7H6.5a.5.5 0 00-.5.5v2.6a.5.5 0 00.5.5H9v6.7a.5.5 0 00.5.5h3a.5.5 0 00.5-.5v-6.7h2.62a.5.5 0 00.49-.37l.72-2.6a.5.5 0 00-.48-.63H13V7.5a1 1 0 011-.9h2.5a.5.5 0 00.5-.5z' data-name='facebook'/%3E%3C/g%3E%3C/svg%3E")}.behance{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='behance'%3E%3Cpath d='M14.76 11.19a1 1 0 00-1 1.09h2.06a1 1 0 00-1.06-1.09zM9.49 12.3H8.26v1.94h1c1 0 1.44-.33 1.44-1s-.46-.94-1.21-.94zm.87-1.78c0-.53-.35-.85-.95-.85H8.26v1.74h.85c.89 0 1.25-.32 1.25-.89z'/%3E%3Cpath d='M12 2a10 10 0 1010 10A10 10 0 0012 2zM9.7 15.2H7V8.7h2.7c1.17 0 1.94.61 1.94 1.6a1.4 1.4 0 01-1.12 1.43A1.52 1.52 0 0112 13.37c0 1.16-1 1.83-2.3 1.83zm3.55-6h3v.5h-3zM17 13.05h-3.3v.14a1.07 1.07 0 001.09 1.19.9.9 0 001-.63H17a2 2 0 01-2.17 1.55 2.15 2.15 0 01-2.36-2.3v-.44a2.11 2.11 0 012.28-2.25A2.12 2.12 0 0117 12.58z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cg data-name='behance'%3E%3Cpath d='M14.76 11.19a1 1 0 00-1 1.09h2.06a1 1 0 00-1.06-1.09zM9.49 12.3H8.26v1.94h1c1 0 1.44-.33 1.44-1s-.46-.94-1.21-.94zm.87-1.78c0-.53-.35-.85-.95-.85H8.26v1.74h.85c.89 0 1.25-.32 1.25-.89z'/%3E%3Cpath d='M12 2a10 10 0 1010 10A10 10 0 0012 2zM9.7 15.2H7V8.7h2.7c1.17 0 1.94.61 1.94 1.6a1.4 1.4 0 01-1.12 1.43A1.52 1.52 0 0112 13.37c0 1.16-1 1.83-2.3 1.83zm3.55-6h3v.5h-3zM17 13.05h-3.3v.14a1.07 1.07 0 001.09 1.19.9.9 0 001-.63H17a2 2 0 01-2.17 1.55 2.15 2.15 0 01-2.36-2.3v-.44a2.11 2.11 0 012.28-2.25A2.12 2.12 0 0117 12.58z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.email{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19 4H5a3 3 0 00-3 3v10a3 3 0 003 3h14a3 3 0 003-3V7a3 3 0 00-3-3zm0 2l-6.5 4.47a1 1 0 01-1 0L5 6z' data-name='email'/%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg data-name='Layer 2'%3E%3Cpath d='M19 4H5a3 3 0 00-3 3v10a3 3 0 003 3h14a3 3 0 003-3V7a3 3 0 00-3-3zm0 2l-6.5 4.47a1 1 0 01-1 0L5 6z' data-name='email'/%3E%3C/g%3E%3C/svg%3E")}.rss{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Ccircle cx='6.18' cy='17.82' r='2.18'/%3E%3Cpath d='M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Ccircle cx='6.18' cy='17.82' r='2.18'/%3E%3Cpath d='M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z'/%3E%3C/svg%3E")} 2 | /*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9lZGlkb3IvLi9zcmMvY3NzL2Jhc2UubGVzcyIsIndlYnBhY2s6Ly9lZGlkb3IvLi9zcmMvY3NzL21haW4ubGVzcyIsIndlYnBhY2s6Ly9lZGlkb3IvLi9zcmMvY3NzL2RhcmsubGVzcyIsIndlYnBhY2s6Ly9lZGlkb3IvLi9zcmMvY3NzL2xpZ2h0Lmxlc3MiLCJ3ZWJwYWNrOi8vZWRpZG9yLy4vc3JjL2Nzcy93aWxkLmxlc3MiLCJ3ZWJwYWNrOi8vZWRpZG9yLy4vc3JjL2Nzcy9pY29uLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsS0FDSSx5QkNBSixDREdBLEtBQ0ksU0FDQSxxQkFDQSxvREFDQSwySkFDQSxlQ0RKLENESUEsSUFDSSxZQUNBLFdBQ0EsY0NGSixDREtBLGdCQUNJLFdBQ0EsY0FDQSxVQ0hKLENETUEsTUFDSSxVQ0pKLENET0EsT0FDSSxXQ0xKLENEUUEsTUFDSSxTQUNBLFNDTkosQ0RTQSxLQUNJLHFCQUNBLGNDUEosQ0RVQSxTQUNJLHFCQUNBLFNBQ0EsU0NSSixDRFdBLFVBQ0ksZ0JBQ0EsdUJBQ0Esa0JDVEosQ0RZQSxRQUNJLDhCQ1ZKLENEYUEscUNBS1EsWUNaUixDRGlCQSwrQkFDSSxjQUNBLGNBQ0EsaUJDZEosQ0RnQkEsYUFDSSxrQkFDQSxZQUNBLFlBQ0EsY0FDQSxlQ2JKLENEZUEsS0FDSSxtQkFDQSx1QkNiSixDRFdBLGNBSVEsYUFDQSw2RENaUixDRGdCQSxRQUNJLG1CQUNBLHVCQ2RKLENEWUEsaUJBSVEsNkRDYlIsQ0RrQkEsZ0JBRUksVUNoQkosQ0RtQkEsb0JBRUksZ0JBQ0EsY0FDQSxtQkFDQSxtQkNqQkosQ0RvQkEsc0JBRUksWUNsQkosQ0RxQkEsb0JBRUksVUNuQkosQ0RzQkEsU0FDSSxpQkNwQkosQ0R1QkEsZ0JBQ0ksVUNyQkosQ0R3QkEsZ0JBQ0ksV0N0QkosQ0R5QkEsUUFDSSxXQ3ZCSixDRDBCQSxTQUNJLFdBQ0EsVUN4QkosQ0QyQkEsTUFDSSxpQkFDQSxvREFDQSxnQkFDQSxnQkFDQSxpQkN6QkosQ0Q0QkEsZUFFSSxXQzFCSixDRDZCQSxjQUNJLFlDM0JKLENEOEJBLG9CQUNJLHVCQzVCSixDRCtCQSxPQUNJLGtCQUNBLGtCQUNBLFFBQ0EsT0FDQSxRQUNBLDZEQzdCSixDRGdDQSxnQkFDSSxjQzlCSixDRGlDQSxjQUNJLGFBQ0Esa0JBQ0EsU0FDQSxPQUNBLFdBQ0EsV0MvQkosQ0RrQ0Esb0JBQ0ksYUNoQ0osQ0RxQ0EsTUFDSSxlQUNBLGFDbkNKLENEc0NBLG9CQUNJLGFDcENKLENEdUNBLFNBQ0ksZUNyQ0osQ0R5Q0EsV0FDSSxnQkFDQSx1QkFDQSxrQkN2Q0osQ0QrQ0EsWUFDSSxlQ3pDSixDRDRDQSx5QkFFSSxjQUNBLGNBQ0EsWUMxQ0osQ0Q2Q0EsV0FDSSxXQUNBLG9EQUNBLGlCQzNDSixDRCtDQSxNQUNJLFdBQ0EsV0FDQSxhQzdDSixDRGdEQSxnQkFDSSxZQzlDSixDRHNEQSxtRkFDSSxpQkM5Q0osQ0RzREEsd0dBQ0ksYUM5Q0osQ0RnREEsR0FDSSxhQzlDSixDRGtEQSxJQUdJLGtCQ2pESixDRG9EQSxTQUpJLGFDMUNKLENEOENBLEtBRUksZ0JBQ0EsdUZBQ0EsbUJDbERKLENEcURBLE1BQ0ksV0FDQSxZQUNBLG9CQ25ESixDRHNEQSxjQUNJLGtCQUNBLFNDcERKLENEdURBLGVBQ0ksbUJBQ0Esa0JBQ0EsU0NyREosQ0R3REEsb0JBQ0ksa0JBQ0EscUJDdERKLENEeURBLG9CQUNJLGtCQUNBLFVDdkRKLENEMERBLHlDQUNJLHFCQ3hESixDRDJEQSxTQUNJLGVDekRKLENEOERBLE9BQ0ksZ0JBQ0EsZ0JDNURKLENEK0RBLE1BQ0ksa0JDN0RKLENEZ0VBLGFBQ0ksUUM5REosQ0RpRUEsY0FDSSxnQkFDQSxrQkMvREosQ0RrRUEsaUJBQ0kscUJBQ0EsUUNoRUosQ0R1RUEsd0NBSEksbUJDNURKLENEK0RBLGlCQUNJLFdBQ0EsaUJDakVKLENEcUVBLDZCQUNJLGtCQ25FSixDRHNFQSxzQkFFSSxnQkFDQSxrQkFDQSxjQUNBLGVDckVKLENEMEVBLFVBQ0ksY0N4RUosQ0QyRUEsMkVBTUksb0JDekVKLENEZ0ZBLDRCQUhJLGVDdEVKLENEeUVBLGNBRUksZUMzRUosQ0Q4RUEsWUFDSSxrQkFDQSxPQUNBLFFBQ0EsU0FDQSxjQzVFSixDRCtFQSxlQUNJLHFCQUNBLGFDN0VKLENEaUZBLHlCQUNJLG1CQUNBLGFDOUVKLENEaUZBLFlBQ0ksZ0JBQ0EsY0FDQSxrQkMvRUosQ0RrRkEsNkNBSUksZ0JDaEZKLENDaFZBLFFBQ0ksVURrVkosQ0MvVUEsc0JBQ0ksbUJBQ0EsVURpVkosQ0M5VUEsMEJBQ0ksZ0JBQ0EsV0FDQSx1RURpVkosQ0M3VUEscUVBTUksa0JEZ1ZKLENDNVVBLDBHQU9JLGFEK1VKLENDNVVBLE1BQ0ksa0JEOFVKLENDMVVBLG9DQUdJLGFENlVKLENDMVVBLE1BRUksK0JENFVKLENDelVBLEdBQ0ksd0JEMlVKLENDeFVBLFlBQ0ksa0JEMFVKLENDdFVBLFNBQ0ksa0JEeVVKLENDdFVBLGNBQ0kseUVEd1VKLENDclVBLGtDQUVJLGtCRHVVSixDQ3BVQSxLQUNJLGtCRHNVSixDQ2xVQSxxQkFFSSxhRHFVSixDQ2hVQSw0REFJSSxrQkRtVUosQ0MvVEEsK0NBSUksYURrVUosQ0MvVEEsY0FDSSx3QkRpVUosQ0NyVEEsNkRBQ0ksMEJEK1RKLENDNVRBLFFBQ0ksWUFDQSxTQUNBLGtCQUNBLE1BQ0EsT0FDQSxhQUNBLGdCQUNBLGNEOFRKLENDNVRBLGlCQUNJLFlEOFRKLENDNVRBLDJDQUNJLGtCRGdVSixDQzdUQSxlQUNJLGdCRCtUSixDQzdUQSxZQUNJLGtCRCtUSixDQzdUQSxhQUNJLFlEK1RKLENDNVRBLGNBQ0ksY0FDQSxtQkFDQSxtQkFDQSx1Q0Q4VEosQ0M1VEEsY0FDSSxhRDhUSixDQzVUQSw2QkFDSSxpQkFDQSxXRCtUSixDQzVUQSxlQUNJLG1CQUNBLG1CQUNBLFVEOFRKLENDM1RBLHNCQUNJLGVBQ0EsZ0JBQ0EsV0Q2VEosQ0VsZUEsK0NBQ0ksYUZ1ZUosQ0VwZUEsa0NBQ0ksbUJBQ0EsVUZzZUosQ0VuZUEsd0JBQ0ksbUJBQ0EsV0FDQSx1Q0ZxZUosQ0VqZUEsa0NBRUksZUZvZUosQ0VoZUEsOEpBTUksYUZtZUosQ0VoZUEsa0JBQ0ksa0JGa2VKLENFOWRBLHdFQUdJLFVGaWVKLENFOWRBLDhCQUVJLDRCRmdlSixDRTdkQSxlQUNJLHFCRitkSixDRTVkQSx3QkFDSSxlRjhkSixDRTFkQSxxQkFDSSxlRjZkSixDRXpkQSxpQ0FFSSxlRjJkSixDRXZkQSx1QkFDSSxhRjBkSixDRXRkQSw2Q0FFSSxVRnlkSixDRXBkQSxrTEFPSSxlRnVkSixDRXBkQSwrREFFSSxlRnNkSixDRWxkQSwwQkFDSSxtRUZxZEosQ0VsZEEsMERBRUksZUZvZEosQ0VoZEEsK0ZBSUksYUZtZEosQ0VoZEEsZ0NBQ0ksYUZrZEosQ0UvY0EsMEJBQ0ksd0JGaWRKLENFOWNBLGlKQU9JLGdCRmdkSixDRTdjQSxxQ0FFUSxlRitjUixDR3RsQkEsMElBT0ksZ0JId2xCSixDR3RsQkEsdUJBQ0ksdUNId2xCSixDSWxtQkEsV0FDSSxtOEJKb21CSixDSWptQkEsaUJBQ0ksKzZCSm1tQkosQ0lobUJBLFdBQ0ksMm9DSmttQkosQ0kvbEJBLHlCQUNJLHVoQ0ppbUJKLENJOWxCQSxRQUNJLDIzQ0pnbUJKLENJN2xCQSxTQUNJLGk3QkorbEJKLENJNWxCQSxVQUNJLHUwQko4bEJKLENJM2xCQSxTQUNJLGk4Q0o2bEJKLENJMWxCQSxPQUNJLGlsQko0bEJKLENJemxCQSxLQUNJLDZ1QkoybEJKIiwiZmlsZSI6ImNzcy9tYWluLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIkBjaGFyc2V0IFwiVVRGLThcIjtcblxuaHRtbCB7XG4gICAgZm9udC1zaXplOiBjYWxjKDF2aCArIDF2dylcbn1cblxuYm9keSB7XG4gICAgbWFyZ2luICAgICA6IDA7XG4gICAgd29yZC1icmVhayA6IGJyZWFrLWFsbDtcbiAgICBib3gtc2l6aW5nIDogYm9yZGVyLWJveDtcbiAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBIZWx2ZXRpY2EgTmV1ZSwgUGluZ0ZhbmcgU0MsIE1pY3Jvc29mdCBZYUhlaSwgU291cmNlIEhhbiBTYW5zIFNDLCBOb3RvIFNhbnMgQ0pLIFNDLCBXZW5RdWFuWWkgTWljcm8gSGVpLCBzYW5zLXNlcmlmO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbmltZyB7XG4gICAgaGVpZ2h0ICAgOiBhdXRvO1xuICAgIHdpZHRoICAgIDogMTAwJTtcbiAgICBtYXgtd2lkdGg6IDQwdnc7XG59XG5cbi5jbGVhcmZpeDo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgZGlzcGxheTogdGFibGU7XG4gICAgY2xlYXIgIDogYm90aDtcbn1cblxuLmxlZnQge1xuICAgIGZsb2F0OiBsZWZ0O1xufVxuXG4ucmlnaHQge1xuICAgIGZsb2F0OiByaWdodDtcbn1cblxuLmhpZGUge1xuICAgIGhlaWdodCA6IDA7XG4gICAgb3BhY2l0eTogMDtcbn1cblxuLmJ0biB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmNvbnRyb2wge1xuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgICBtYXJnaW4gICAgICAgICA6IDA7XG4gICAgcGFkZGluZyAgICAgICAgOiAwO1xufVxuXG4ubm8tYnJlYWsge1xuICAgIG92ZXJmbG93ICAgICA6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZSAgOiBub3dyYXA7XG59XG5cbmE6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5ib2R5LmxvYWRlZCB7XG4gICAgLnRvcCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5ib3R0b20ge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cblxuXG4udG9wIGltZy5sb2dvLCAuYm90dG9tIGltZy5sb2dvIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW46IDAgYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4udG9wLCAuYm90dG9tIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMHZ3O1xuICAgIGhlaWdodDogNTB2aDtcbiAgICB6LWluZGV4OiA5OTk5OTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnRvcCB7XG4gICAgYmFja2dyb3VuZDogQGRhcmtfbWFpbl9iZztcbiAgICB0b3A6IGNhbGMoLTUwdmggLSAxMDBweCk7XG4gICAgaW1nLmxvZ28ge1xuICAgICAgICBib3R0b206IC0xMDAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgfVxufVxuXG4uYm90dG9tIHtcbiAgICBiYWNrZ3JvdW5kOiBAZGFya19tYWluX2JnO1xuICAgIHRvcDogY2FsYygxMDB2aCArIDEwMHB4KTtcbiAgICBpbWcubG9nbyB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICB9XG5cbn1cblxuLmhlYWRlcixcbi5mb290ZXIge1xuICAgIGhlaWdodDogNXZoO1xufVxuXG4uaGVhZGVyIGEsXG4uZm9vdGVyIGEge1xuICAgIGxpbmUtaGVpZ2h0ICA6IDV2aDtcbiAgICBkaXNwbGF5ICAgICAgOiBibG9jaztcbiAgICBwYWRkaW5nLWxlZnQgOiAwLjhyZW07XG4gICAgcGFkZGluZy1yaWdodDogMC44cmVtO1xufVxuXG4uaGVhZGVyPnVsLFxuLmZvb3RlciB1bCB7XG4gICAgbWFyZ2luOiAwIDF2dztcbn1cblxuLm1lbnU+bGksXG4uZm9vdGVyIGxpIHtcbiAgICBmbG9hdDogbGVmdDtcbn1cblxuLm1lbnU+bGkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmZvb3RlciAuc29jaWFsIHtcbiAgICBmbG9hdDogbGVmdDtcbn1cblxuLmZvb3RlciAuc3RhdHVzIHtcbiAgICBmbG9hdDogcmlnaHQ7XG59XG5cbi5taWRkbGUge1xuICAgIGhlaWdodDogOTB2aDtcbn1cblxuLnNpZGViYXIge1xuICAgIHdpZHRoOiAyMHZ3O1xuICAgIGZsb2F0OiBsZWZ0O1xufVxuXG4ubWFpbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDIwdnc7XG4gICAgYm94LXNpemluZyA6IGJvcmRlci1ib3g7XG4gICAgcGFkZGluZyAgICA6IDJ2dyAzdnc7XG4gICAgb3ZlcmZsb3cteSA6IGF1dG87XG4gICAgcG9zaXRpb24gICA6IHJlbGF0aXZlO1xufVxuXG4uc2lkZWJhcixcbi5tYWluIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5zaWRlYmFyLmhpZGUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zaWRlYmFyLmhpZGUrLm1haW4ge1xuICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cbi5pbnRybyB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBvc2l0aW9uICA6IGFic29sdXRlO1xuICAgIHRvcCAgICAgICA6IDUwJTtcbiAgICBsZWZ0ICAgICAgOiAwO1xuICAgIHJpZ2h0ICAgICA6IDA7XG4gICAgdHJhbnNmb3JtIDogdHJhbnNsYXRlWSgtNTAlKTtcbn1cblxuLmludHJvIGltZy5sb2dvIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG59XG5cbi5oZWFkZXIgdWwgdWwge1xuICAgIGRpc3BsYXkgOiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3AgICAgIDogMTAwJTtcbiAgICBsZWZ0ICAgIDogMDtcbiAgICB3aWR0aCAgIDogMTRlbTtcbiAgICB6LWluZGV4IDogOTk5O1xufVxuXG4uaGVhZGVyIGxpOmhvdmVyPnVsIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuXG5cbi5tYWluIHtcbiAgICBmb250LXNpemUgIDogMXJlbTtcbiAgICBsaW5lLWhlaWdodDogMjtcbn1cblxuLmhlYWRlciAuc3ViLW1lbnUgYSB7XG4gICAgcGFkZGluZzogMCAydnc7XG59XG5cbi5zaWRlYmFyIHtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG5cbi5zaWRlYmFyIGEge1xuICAgIG92ZXJmbG93ICAgICA6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZSAgOiBub3dyYXA7XG59XG5cbi5zaWRlYmFyIGEsXG4udGF4b25vbXkta2V5IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnNpZGViYXIgdWwge1xuICAgIG1hcmdpbi10b3A6IDFyZW07XG59XG5cbi5zaWRlYmFyIGEsXG4udGF4b25vbXkta2V5IHtcbiAgICBkaXNwbGF5ICAgIDogYmxvY2s7XG4gICAgbGluZS1oZWlnaHQ6IDI7XG4gICAgcGFkZGluZyAgICA6IDAgNCU7XG59XG5cbi5sb2dvLWxpbmsge1xuICAgIGhlaWdodCAgICAgOiA1dmg7XG4gICAgYm94LXNpemluZyA6IGJvcmRlci1ib3g7XG4gICAgcGFkZGluZy10b3A6IDEuMnZoO1xufVxuXG5cbi5sb2dvIHtcbiAgICBoZWlnaHQgOiA3MCU7XG4gICAgd2lkdGggIDogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmxvZ28tY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuYm9keS53aWxkLW1vZGUgLmxvZ28td2lsZCB7XG4gICAgZGlzcGxheTogbGlzdC1pdGVtO1xufVxuYm9keS5saWdodC1tb2RlIC5sb2dvLWxpZ2h0IHtcbiAgICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG5ib2R5LmRhcmstbW9kZSAubG9nby1kZWZhdWx0IHtcbiAgICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG5ib2R5LndpbGQtbW9kZSAuaW50cm8gLmxvZ28td2lsZCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5ib2R5LmxpZ2h0LW1vZGUgLmludHJvIC5sb2dvLWxpZ2h0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cbmJvZHkuZGFyay1tb2RlIC5pbnRybyAubG9nby1kZWZhdWx0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cbmhyIHtcbiAgICBtYXJnaW46IDFyZW0gMDtcbn1cblxuXG5wcmUge1xuXG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgcGFkZGluZyA6IDAuOHJlbSAxcmVtO1xufVxuXG5jb2RlIHtcbiAgICBvdmVyZmxvdyAgIDogYXV0bztcbiAgICBmb250LXNpemUgIDogMC44cmVtO1xuICAgIGZvbnQtZmFtaWx5OiAnRmlyYSBDb2RlJywgSW5jb25zb2xhdGEsICdEZWphIFZ1IFNhbnMgTW9ubycsICdTb3VyY2UgQ29kZSBQcm8nLCBDb25zb2xhcywgbW9ub3NwYWNlO1xuICAgIHBhZGRpbmcgICAgOiAwLjJyZW0gMC42cmVtO1xufVxuXG4uaWNvbiB7XG4gICAgd2lkdGggIDogMXJlbTtcbiAgICBoZWlnaHQgOiAxcmVtO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmZvb3RlciAuaWNvbiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcCAgICAgOiAwLjJyZW07XG59XG5cbi5zaWRlYmFyIC5pY29uIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTtcbiAgICBwb3NpdGlvbiAgICA6IHJlbGF0aXZlO1xuICAgIHRvcCAgICAgICAgIDogMC4xcmVtO1xufVxuXG4uYXJ0aWNsZS1tZXRhIC5pY29uIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wICAgICA6IGNhbGMoMC4xcmVtICsgMnB4KTtcbn1cblxuLmFydGljbGUtdGFncyAuaWNvbiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcCAgICAgOiAtMC4ycmVtO1xufVxuXG4uYXJ0aWNsZS1jYXRlZ29yaWVzIGxpOmZpcnN0LWNoaWxkIC5pY29uIHtcbiAgICB0b3A6IGNhbGMoMC4xcmVtICsgMXB4KTtcbn1cblxuLmFydGljbGUge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cblxuXG4udGl0bGUge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIG1hcmdpbiAgICAgOiAwIDAgMC41cmVtIDA7XG59XG5cbi5pdGVtIHtcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxuXG4uaXRlbSAudGl0bGUge1xuICAgIG1hcmdpbjogMDtcbn1cblxuLmFydGljbGUtbWV0YSB7XG4gICAgZm9udC1zaXplICAgIDogMC44cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG59XG5cbi5hcnRpY2xlLW1ldGEgdWwge1xuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgICBtYXJnaW4gICAgICAgICA6IDA7XG59XG5cbi5hcnRpY2xlLW1ldGEtc3BsaXR0ZXIge1xuICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbn1cblxuLmFydGljbGUtbWV0YSBsaSB7XG4gICAgZmxvYXQgICAgICAgIDogbGVmdDtcbiAgICBtYXJnaW4tcmlnaHQgOiAxcmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbn1cblxuLmFydGljbGUtbWV0YSBsaTpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG59XG5cbi5tYWluIC5hcnRpY2xlLXRhZ3MgYSB7XG5cbiAgICBwYWRkaW5nICAgICAgOiAwcmVtIDAuOHJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgZGlzcGxheSAgICAgIDogYmxvY2s7XG4gICAgbGluZS1oZWlnaHQgIDogMS40O1xufVxuXG5cblxuLm1haW4gcCBhIHtcbiAgICBtYXJnaW46IDAgMC4zcmVtO1xufVxuXG4udGl0bGUgYSxcbi5hcnRpY2xlLW1ldGEgYSxcbi5saXN0IGEsXG5hLnRlcm1zLXRpdGxlLFxuLnRlcm1zLWxpc3QgYSxcbi5wYWdpbmF0aW9uIGEge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLnRlcm1zLWxpc3QgYSB7XG4gICAgZm9udC1zaXplOiAwLjhyZW07XG59XG5cbi5wYWdpbmF0aW9uIGEge1xuICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgIHBhZGRpbmcgIDogMCAwLjVyZW07XG59XG5cbi5wYWdpbmF0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdCAgICA6IDA7XG4gICAgcmlnaHQgICA6IDA7XG4gICAgYm90dG9tICA6IDA7XG4gICAgcGFkZGluZyA6IDAgMnJlbTtcbn1cblxuLnBhZ2luYXRpb24gdWwge1xuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgICBtYXJnaW4tbGVmdCAgICA6IDA7XG59XG5cbi8qIHByaXNtIHRvb2xiYXIgKi9cbi5jb2RlLXRvb2xiYXI+LnRvb2xiYXIgYSB7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICBkaXNwbGF5ICAgICAgOiBibG9jaztcbn1cblxuLmxvY2FsLWluZm8ge1xuICAgIGZvbnQtc2l6ZSAgICA6IDAuOHJlbTtcbiAgICBwYWRkaW5nICAgICAgOiAwLjhyZW07XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cblxuLmhlYWRlciBhLFxuLmZvb3RlciBhLFxuLnNpZGViYXIgYSxcbi50YXhvbm9teS1rZXkge1xuICAgIGZvbnQtc2l6ZTogMC44MXJlbTtcbn1cbiIsIkBjaGFyc2V0IFwiVVRGLThcIjtcbmh0bWwge1xuICBmb250LXNpemU6IGNhbGMoMXZoICsgMXZ3KTtcbn1cbmJvZHkge1xuICBtYXJnaW46IDA7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgSGVsdmV0aWNhIE5ldWUsIFBpbmdGYW5nIFNDLCBNaWNyb3NvZnQgWWFIZWksIFNvdXJjZSBIYW4gU2FucyBTQywgTm90byBTYW5zIENKSyBTQywgV2VuUXVhbllpIE1pY3JvIEhlaSwgc2Fucy1zZXJpZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbmltZyB7XG4gIGhlaWdodDogYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogNDB2dztcbn1cbi5jbGVhcmZpeDo6YWZ0ZXIge1xuICBjb250ZW50OiBcIlwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgY2xlYXI6IGJvdGg7XG59XG4ubGVmdCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLnJpZ2h0IHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuLmhpZGUge1xuICBoZWlnaHQ6IDA7XG4gIG9wYWNpdHk6IDA7XG59XG4uYnRuIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4uY29udHJvbCB7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuLm5vLWJyZWFrIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5hOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7XG59XG5ib2R5LmxvYWRlZCAudG9wIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbmJvZHkubG9hZGVkIC5ib3R0b20ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLnRvcCBpbWcubG9nbyxcbi5ib3R0b20gaW1nLmxvZ28ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50b3AsXG4uYm90dG9tIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwdnc7XG4gIGhlaWdodDogNTB2aDtcbiAgei1pbmRleDogOTk5OTk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4udG9wIHtcbiAgYmFja2dyb3VuZDogIzI4MkMzNDtcbiAgdG9wOiBjYWxjKC01MHZoIC0gMTAwcHgpO1xufVxuLnRvcCBpbWcubG9nbyB7XG4gIGJvdHRvbTogLTEwMCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5ib3R0b20ge1xuICBiYWNrZ3JvdW5kOiAjMjgyQzM0O1xuICB0b3A6IGNhbGMoMTAwdmggKyAxMDBweCk7XG59XG4uYm90dG9tIGltZy5sb2dvIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLmhlYWRlcixcbi5mb290ZXIge1xuICBoZWlnaHQ6IDV2aDtcbn1cbi5oZWFkZXIgYSxcbi5mb290ZXIgYSB7XG4gIGxpbmUtaGVpZ2h0OiA1dmg7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDAuOHJlbTtcbiAgcGFkZGluZy1yaWdodDogMC44cmVtO1xufVxuLmhlYWRlciA+IHVsLFxuLmZvb3RlciB1bCB7XG4gIG1hcmdpbjogMCAxdnc7XG59XG4ubWVudSA+IGxpLFxuLmZvb3RlciBsaSB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLm1lbnUgPiBsaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi5mb290ZXIgLnNvY2lhbCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmZvb3RlciAuc3RhdHVzIHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuLm1pZGRsZSB7XG4gIGhlaWdodDogOTB2aDtcbn1cbi5zaWRlYmFyIHtcbiAgd2lkdGg6IDIwdnc7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLm1haW4ge1xuICBtYXJnaW4tbGVmdDogMjB2dztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogMnZ3IDN2dztcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnNpZGViYXIsXG4ubWFpbiB7XG4gIGhlaWdodDogMTAwJTtcbn1cbi5zaWRlYmFyLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLnNpZGViYXIuaGlkZSArIC5tYWluIHtcbiAgbWFyZ2luLWxlZnQ6IDAgIWltcG9ydGFudDtcbn1cbi5pbnRybyB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5pbnRybyBpbWcubG9nbyB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cbi5oZWFkZXIgdWwgdWwge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTAwJTtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDE0ZW07XG4gIHotaW5kZXg6IDk5OTtcbn1cbi5oZWFkZXIgbGk6aG92ZXIgPiB1bCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLm1haW4ge1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xufVxuLmhlYWRlciAuc3ViLW1lbnUgYSB7XG4gIHBhZGRpbmc6IDAgMnZ3O1xufVxuLnNpZGViYXIge1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuLnNpZGViYXIgYSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnNpZGViYXIgYSxcbi50YXhvbm9teS1rZXkge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi5zaWRlYmFyIHVsIHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbn1cbi5zaWRlYmFyIGEsXG4udGF4b25vbXkta2V5IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBwYWRkaW5nOiAwIDQlO1xufVxuLmxvZ28tbGluayB7XG4gIGhlaWdodDogNXZoO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nLXRvcDogMS4ydmg7XG59XG4ubG9nbyB7XG4gIGhlaWdodDogNzAlO1xuICB3aWR0aDogYXV0bztcbiAgZGlzcGxheTogYmxvY2s7XG59XG4ubG9nby1jb250YWluZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxuYm9keS53aWxkLW1vZGUgLmxvZ28td2lsZCB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cbmJvZHkubGlnaHQtbW9kZSAubG9nby1saWdodCB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cbmJvZHkuZGFyay1tb2RlIC5sb2dvLWRlZmF1bHQge1xuICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG5ib2R5LndpbGQtbW9kZSAuaW50cm8gLmxvZ28td2lsZCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuYm9keS5saWdodC1tb2RlIC5pbnRybyAubG9nby1saWdodCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuYm9keS5kYXJrLW1vZGUgLmludHJvIC5sb2dvLWRlZmF1bHQge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbmhyIHtcbiAgbWFyZ2luOiAxcmVtIDA7XG59XG5wcmUge1xuICBvdmVyZmxvdzogYXV0bztcbiAgcGFkZGluZzogMC44cmVtIDFyZW07XG59XG5jb2RlIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBmb250LWZhbWlseTogJ0ZpcmEgQ29kZScsIEluY29uc29sYXRhLCAnRGVqYSBWdSBTYW5zIE1vbm8nLCAnU291cmNlIENvZGUgUHJvJywgQ29uc29sYXMsIG1vbm9zcGFjZTtcbiAgcGFkZGluZzogMC4ycmVtIDAuNnJlbTtcbn1cbi5pY29uIHtcbiAgd2lkdGg6IDFyZW07XG4gIGhlaWdodDogMXJlbTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLmZvb3RlciAuaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAwLjJyZW07XG59XG4uc2lkZWJhciAuaWNvbiB7XG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMC4xcmVtO1xufVxuLmFydGljbGUtbWV0YSAuaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiBjYWxjKDAuMXJlbSArIDJweCk7XG59XG4uYXJ0aWNsZS10YWdzIC5pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IC0wLjJyZW07XG59XG4uYXJ0aWNsZS1jYXRlZ29yaWVzIGxpOmZpcnN0LWNoaWxkIC5pY29uIHtcbiAgdG9wOiBjYWxjKDAuMXJlbSArIDFweCk7XG59XG4uYXJ0aWNsZSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4udGl0bGUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbWFyZ2luOiAwIDAgMC41cmVtIDA7XG59XG4uaXRlbSB7XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG59XG4uaXRlbSAudGl0bGUge1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZS1tZXRhIHtcbiAgZm9udC1zaXplOiAwLjhyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG59XG4uYXJ0aWNsZS1tZXRhIHVsIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZS1tZXRhLXNwbGl0dGVyIHtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xufVxuLmFydGljbGUtbWV0YSBsaSB7XG4gIGZsb2F0OiBsZWZ0O1xuICBtYXJnaW4tcmlnaHQ6IDFyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbn1cbi5hcnRpY2xlLW1ldGEgbGk6Zmlyc3QtY2hpbGQge1xuICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTtcbn1cbi5tYWluIC5hcnRpY2xlLXRhZ3MgYSB7XG4gIHBhZGRpbmc6IDByZW0gMC44cmVtO1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBsaW5lLWhlaWdodDogMS40O1xufVxuLm1haW4gcCBhIHtcbiAgbWFyZ2luOiAwIDAuM3JlbTtcbn1cbi50aXRsZSBhLFxuLmFydGljbGUtbWV0YSBhLFxuLmxpc3QgYSxcbmEudGVybXMtdGl0bGUsXG4udGVybXMtbGlzdCBhLFxuLnBhZ2luYXRpb24gYSB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi50ZXJtcy1saXN0IGEge1xuICBmb250LXNpemU6IDAuOHJlbTtcbn1cbi5wYWdpbmF0aW9uIGEge1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgcGFkZGluZzogMCAwLjVyZW07XG59XG4ucGFnaW5hdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgcGFkZGluZzogMCAycmVtO1xufVxuLnBhZ2luYXRpb24gdWwge1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuLyogcHJpc20gdG9vbGJhciAqL1xuLmNvZGUtdG9vbGJhciA+IC50b29sYmFyIGEge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi5sb2NhbC1pbmZvIHtcbiAgZm9udC1zaXplOiAwLjhyZW07XG4gIHBhZGRpbmc6IDAuOHJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cbi5oZWFkZXIgYSxcbi5mb290ZXIgYSxcbi5zaWRlYmFyIGEsXG4udGF4b25vbXkta2V5IHtcbiAgZm9udC1zaXplOiAwLjgxcmVtO1xufVxuLm1haW4gYSB7XG4gIGNvbG9yOiAjOTlDQ0ZGO1xufVxuLm1haW4gLmFydGljbGUtdGFncyBhIHtcbiAgYmFja2dyb3VuZDogIzMyN0UzNjtcbiAgY29sb3I6ICNGRkY7XG59XG4ubG9jYWwtaW5mbyxcbi5kaWFsb2cgbGFiZWwge1xuICBiYWNrZ3JvdW5kOiAjRkZGRjk5O1xuICBjb2xvcjogIzMzMztcbiAgYm94LXNoYWRvdzogMnB4IDNweCAxcHggMXB4ICMwMDA7XG59XG4vKiBtYW4gYmcgKi9cbmJvZHksXG4ubWFpbixcbi5oZWFkZXIgLm1lbnUgPiBsaTpob3Zlcixcbi5mb290ZXIgYTpob3Zlcixcbi5sb2dvLWxpbmssXG4uZGlhbG9nIHtcbiAgYmFja2dyb3VuZDogIzI4MkMzNDtcbn1cbi8qIG1haW4gZmcgKi9cbi5tYWluLFxuYmxvY2txdW90ZS50d2l0dGVyLXR3ZWV0LFxuLmhlYWRlciAuc3ViLW1lbnUgYSxcbi5zaWRlYmFyIGEsXG4udGF4b25vbXkta2V5LFxuLm1haW4gLnRpdGxlIGEsXG4uZGlhbG9nIC50aXRsZSB7XG4gIGNvbG9yOiAjQzZDNkM3O1xufVxuLmljb24ge1xuICBiYWNrZ3JvdW5kOiAjQzZDNkM3O1xufVxuLyogbWFpbiBtaW5vciAqL1xuLmFydGljbGUtbWV0YSxcbi5pdGVtLW1ldGEsXG4uZm9vdG5vdGVzIHtcbiAgY29sb3I6ICM5MzlCQUI7XG59XG50aCxcbnRkIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5MzlCQUI7XG59XG5ociB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM5MzlCQUI7XG59XG4ucGFnaW5hdGlvbiB7XG4gIGJhY2tncm91bmQ6ICM5MzlCQUI7XG59XG4vKiBzaWRlYmFyIGJnICovXG4uc2lkZWJhciB7XG4gIGJhY2tncm91bmQ6ICMxNjE5MUQ7XG59XG4uaGVhZGVyIHVsIHVsIHtcbiAgYm94LXNoYWRvdzogMCAwLjFlbSAwLjJlbSAwICMwNjA2MDY7XG59XG4uaGVhZGVyIHVsIHVsLFxuLnBhZ2luYXRpb24gYTpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICMxQTFEMjE7XG59XG5jb2RlIHtcbiAgYmFja2dyb3VuZDogIzFBMUMyMTtcbn1cbi8qIHNpZGViYXIgbWlub3IgKi9cbi5jb3VudCxcbi50YXhvbm9teS1rZXkge1xuICBjb2xvcjogIzkzOTM5NDtcbn1cbi8qIGhlYWRlciwgZm9vdGVyIGJnICovXG4uaGVhZGVyLFxuLmZvb3Rlcixcbi5oZWFkZXIgLnN1Yi1tZW51IGxpOmhvdmVyLFxuLnNpZGViYXIgYTpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICMyMTI1MkI7XG59XG4vKiBoZWFkZXIsIGZvb3RlciBmZyAqL1xuLmhlYWRlciBhLFxuLmZvb3RlciBhLFxuLmZvb3RlciB0aW1lLFxuLnBhZ2luYXRpb24gYSB7XG4gIGNvbG9yOiAjNzk3RDg1O1xufVxuLmZvb3RlciAuaWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM3OTdEODU7XG59XG4ubWFpbiBoMSxcbi5tYWluIGgyLFxuLm1haW4gaDMsXG4ubWFpbiBoNCxcbi5tYWluIGg1LFxuLm1haW4gaDYge1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMXB4ICMwMDA7XG59XG4udGl0bGUge1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMXB4ICMwMDA7XG59XG4uZGlhbG9nIHtcbiAgd2lkdGg6IDEwMHZ3O1xuICBoZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiA5OTk5O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBmb250LXNpemU6IDFyZW07XG59XG4uZGlhbG9nIC53cmFwcGVyIHtcbiAgcGFkZGluZzogMXJlbTtcbn1cbi5kaWFsb2cgaGVhZGVyLFxuLmRpYWxvZyBtYWluLFxuLmRpYWxvZyBmb290ZXIge1xuICBtYXJnaW4tYm90dG9tOiAycmVtO1xufVxuLmRpYWxvZyBoZWFkZXIge1xuICBtYXJnaW4tdG9wOiAtMnJlbTtcbn1cbi5kaWFsb2cgZGl2IHtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cbi5kaWFsb2cuc2hvdyB7XG4gIGhlaWdodDogMTAwdmg7XG59XG4uZGlhbG9nIGxhYmVsIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIHBhZGRpbmc6IDAuOHJlbSAxcmVtO1xuICBib3gtc2hhZG93OiBub25lO1xufVxuLmRpYWxvZyBpbnB1dCB7XG4gIHBhZGRpbmc6IDAuM3JlbTtcbn1cbi5kaWFsb2cgaW5wdXQsXG4uZGlhbG9nIGJ1dHRvbiB7XG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xuICBmbG9hdDogcmlnaHQ7XG59XG4uZGlhbG9nIGJ1dHRvbiB7XG4gIHBhZGRpbmc6IDAuM3JlbSAxcmVtO1xuICBiYWNrZ3JvdW5kOiAjMzA4M0ZFO1xuICBjb2xvcjogI0ZGRjtcbn1cbi5kaWFsb2cgLmNsb3NlLWRpYWxvZyB7XG4gIGZvbnQtc2l6ZTogM3JlbTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xufVxuLmxpZ2h0LW1vZGUgLmRpYWxvZyBidXR0b24ge1xuICBjb2xvcjogIzMwODNGRTtcbn1cbi5saWdodC1tb2RlIC5tYWluIGEge1xuICBjb2xvcjogIzMwODNGRTtcbn1cbi5saWdodC1tb2RlIC5tYWluIC5hcnRpY2xlLXRhZ3MgYSB7XG4gIGJhY2tncm91bmQ6ICMzNUNDODE7XG4gIGNvbG9yOiAjRkZGO1xufVxuLmxpZ2h0LW1vZGUgLmxvY2FsLWluZm8ge1xuICBiYWNrZ3JvdW5kOiAjRUZFQ0FBO1xuICBjb2xvcjogIzAwMDAwMDtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cbi8qIG1hbiBiZyAqL1xuYm9keS5saWdodC1tb2RlLFxuLmxpZ2h0LW1vZGUgLm1haW4ge1xuICBiYWNrZ3JvdW5kOiAjRkZGO1xufVxuLyogbWFpbiBmZyAqL1xuLmxpZ2h0LW1vZGUgLm1haW4sXG4ubGlnaHQtbW9kZSBibG9ja3F1b3RlLnR3aXR0ZXItdHdlZXQsXG4ubGlnaHQtbW9kZSAuc2lkZWJhciBhLFxuLmxpZ2h0LW1vZGUgLnRheG9ub215LWtleSxcbi5saWdodC1tb2RlIC5tYWluIC50aXRsZSBhLFxuLmxpZ2h0LW1vZGUgLmRpYWxvZyAudGl0bGUge1xuICBjb2xvcjogIzRDNEM0Qztcbn1cbi5saWdodC1tb2RlIC5pY29uIHtcbiAgYmFja2dyb3VuZDogIzRDNEM0Qztcbn1cbi8qIG1haW4gbWlub3IgKi9cbi5saWdodC1tb2RlIC5hcnRpY2xlLW1ldGEsXG4ubGlnaHQtbW9kZSAuaXRlbS1tZXRhLFxuLmxpZ2h0LW1vZGUgLmZvb3Rub3RlcyB7XG4gIGNvbG9yOiAjOTk5OTk5O1xufVxuLmxpZ2h0LW1vZGUgdGgsXG4ubGlnaHQtbW9kZSB0ZCB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0NDQ0NDO1xufVxuLmxpZ2h0LW1vZGUgaHIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDO1xufVxuLmxpZ2h0LW1vZGUgLnBhZ2luYXRpb24ge1xuICBiYWNrZ3JvdW5kOiAjQ0NDQ0NDO1xufVxuLyogc2lkZWJhciBiZyAqL1xuLmxpZ2h0LW1vZGUgLnNpZGViYXIge1xuICBiYWNrZ3JvdW5kOiAjRUVFRUVFO1xufVxuLmxpZ2h0LW1vZGUgcHJlLFxuLmxpZ2h0LW1vZGUgY29kZSB7XG4gIGJhY2tncm91bmQ6ICNEREQ7XG59XG4vKiBzaWRlYmFyIGZnICovXG4ubGlnaHQtbW9kZSAuc2lkZWJhciBhIHtcbiAgY29sb3I6ICMzRjNGM0Y7XG59XG4vKiBzaWRlYmFyIG1pbm9yICovXG4ubGlnaHQtbW9kZSAuY291bnQsXG4ubGlnaHQtbW9kZSAudGF4b25vbXkta2V5IHtcbiAgY29sb3I6ICM3Nzc3Nzc7XG59XG4vKiBoZWFkZXIsIGZvb3RlciBiZyAqL1xuLmxpZ2h0LW1vZGUgLmhlYWRlcixcbi5saWdodC1tb2RlIC5mb290ZXIsXG4ubGlnaHQtbW9kZSAuaGVhZGVyIC5zdWItbWVudSBsaTpob3Zlcixcbi5saWdodC1tb2RlIC5zaWRlYmFyIGE6aG92ZXIsXG4ubGlnaHQtbW9kZSAubG9nby1saW5rLFxuLmxpZ2h0LW1vZGUgLmRpYWxvZyxcbi5saWdodC1tb2RlIC5kaWFsb2cgYnV0dG9uIHtcbiAgYmFja2dyb3VuZDogI0RERDtcbn1cbi5saWdodC1tb2RlIC5oZWFkZXIgLm1lbnUgPiBsaTpob3Zlcixcbi5saWdodC1tb2RlIC5mb290ZXIgYTpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICNDQ0NDQ0M7XG59XG4vKiBzdWItbWVudSBiZyAqL1xuLmxpZ2h0LW1vZGUgLmhlYWRlciB1bCB1bCB7XG4gIGJveC1zaGFkb3c6IDAgMC4xZW0gMC4yZW0gMCAjQUFBQUFBO1xufVxuLmxpZ2h0LW1vZGUgLmhlYWRlciB1bCB1bCxcbi5saWdodC1tb2RlIC5wYWdpbmF0aW9uIGE6aG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjQ0NDQ0NDO1xufVxuLyogaGVhZGVyLCBmb290ZXIgZmcgKi9cbi5saWdodC1tb2RlIC5oZWFkZXIgYSxcbi5saWdodC1tb2RlIC5mb290ZXIgYSxcbi5saWdodC1tb2RlIC5mb290ZXIgdGltZSxcbi5saWdodC1tb2RlIC5wYWdpbmF0aW9uIGEge1xuICBjb2xvcjogIzMyMzIzMjtcbn1cbi5saWdodC1tb2RlIC5oZWFkZXIgLnN1Yi1tZW51IGEge1xuICBjb2xvcjogIzBCMEIwQjtcbn1cbi5saWdodC1tb2RlIC5mb290ZXIgLmljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyO1xufVxuLmxpZ2h0LW1vZGUgLm1haW4gaDEsXG4ubGlnaHQtbW9kZSAubWFpbiBoMixcbi5saWdodC1tb2RlIC5tYWluIGgzLFxuLmxpZ2h0LW1vZGUgLm1haW4gaDQsXG4ubGlnaHQtbW9kZSAubWFpbiBoNSxcbi5saWdodC1tb2RlIC5tYWluIGg2LFxuLmxpZ2h0LW1vZGUgLnRpdGxlIHtcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XG59XG4ubGlnaHQtbW9kZSAudG9wLFxuLmxpZ2h0LW1vZGUgLmJvdHRvbSB7XG4gIGJhY2tncm91bmQ6ICNEREQ7XG59XG4ud2lsZC1tb2RlIC5tYWluIGgxLFxuLndpbGQtbW9kZSAubWFpbiBoMixcbi53aWxkLW1vZGUgLm1haW4gaDMsXG4ud2lsZC1tb2RlIC5tYWluIGg0LFxuLndpbGQtbW9kZSAubWFpbiBoNSxcbi53aWxkLW1vZGUgLm1haW4gaDYsXG4ud2lsZC1tb2RlIC50aXRsZSB7XG4gIHRleHQtc2hhZG93OiBub25lO1xufVxuLndpbGQtbW9kZSAubG9jYWwtaW5mbyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG4uaWNvbi10YWdzIHtcbiAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NnIGRhdGEtbmFtZT0nTGF5ZXIgMiclM0UlM0NnIGRhdGEtbmFtZT0ncHJpY2V0YWdzJyUzRSUzQ3BhdGggZD0nTTEyLjg3IDIyYTEuODQgMS44NCAwIDAgMS0xLjI5LS41M2wtNi40MS02LjQyYTEgMSAwIDAgMS0uMjktLjYxTDQgNS4wOWExIDEgMCAwIDEgLjI5LS44IDEgMSAwIDAgMSAuOC0uMjlsOS4zNS44OGExIDEgMCAwIDEgLjYxLjI5bDYuNDIgNi40MWExLjgyIDEuODIgMCAwIDEgMCAyLjU3bC03LjMyIDcuMzJhMS44MiAxLjgyIDAgMCAxLTEuMjguNTN6bS02LTguMTFsNiA2IDcuMDUtNy4wNS02LTYtNy44MS0uNzN6Jy8lM0UlM0NjaXJjbGUgY3g9JzEwLjUnIGN5PScxMC41JyByPScxLjUnLyUzRSUzQy9nJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpO1xufVxuLmljb24tY2F0ZWdvcmllcyB7XG4gIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnJTNFJTNDZyBkYXRhLW5hbWU9J0xheWVyIDInJTNFJTNDcGF0aCBkPSdNMTkuNSAyMC41aC0xNUEyLjQ3IDIuNDcgMCAwIDEgMiAxOC4wN1Y1LjkzQTIuNDcgMi40NyAwIDAgMSA0LjUgMy41aDQuNmExIDEgMCAwIDEgLjc3LjM3bDIuNiAzLjE4aDdBMi40NyAyLjQ3IDAgMCAxIDIyIDkuNDh2OC41OWEyLjQ3IDIuNDcgMCAwIDEtMi41IDIuNDN6TTQgMTMuNzZ2NC4zMWEuNDYuNDYgMCAwIDAgLjUuNDNoMTVhLjQ2LjQ2IDAgMCAwIC41LS40M1Y5LjQ4YS40Ni40NiAwIDAgMC0uNS0uNDNIMTJhMSAxIDAgMCAxLS43Ny0uMzdMOC42MyA1LjVINC41YS40Ni40NiAwIDAgMC0uNS40M3onIGRhdGEtbmFtZT0nZm9sZGVyJy8lM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG4uaWNvbi1wb3N0IHtcbiAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NnIGRhdGEtbmFtZT0nTGF5ZXIgMiclM0UlM0NnIGRhdGEtbmFtZT0nZmlsZS10ZXh0JyUzRSUzQ3BhdGggZD0nTTE1IDE2SDlhMSAxIDAgMCAwIDAgMmg2YTEgMSAwIDAgMCAwLTJ6TTkgMTRoM2ExIDEgMCAwIDAgMC0ySDlhMSAxIDAgMCAwIDAgMnonLyUzRSUzQ3BhdGggZD0nTTE5Ljc0IDguMzNsLTUuNDQtNmExIDEgMCAwIDAtLjc0LS4zM2gtN0EyLjUzIDIuNTMgMCAwIDAgNCA0LjV2MTVBMi41MyAyLjUzIDAgMCAwIDYuNTYgMjJoMTAuODhBMi41MyAyLjUzIDAgMCAwIDIwIDE5LjVWOWExIDEgMCAwIDAtLjI2LS42N3pNMTQgNWwyLjc0IDNoLTJhLjc5Ljc5IDAgMCAxLS43NC0uODV6bTMuNDQgMTVINi41NmEuNTMuNTMgMCAwIDEtLjU2LS41di0xNWEuNTMuNTMgMCAwIDEgLjU2LS41SDEydjMuMTVBMi43OSAyLjc5IDAgMCAwIDE0LjcxIDEwSDE4djkuNWEuNTMuNTMgMCAwIDEtLjU2LjV6Jy8lM0UlM0MvZyUzRSUzQy9nJTNFJTNDL3N2ZyUzRVwiKTtcbn1cbi5hcnRpY2xlLW1ldGEgLmljb24tZGF0ZSB7XG4gIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnJTNFJTNDZyBkYXRhLW5hbWU9J0xheWVyIDInJTNFJTNDZyBkYXRhLW5hbWU9J2NhbGVuZGFyJyUzRSUzQ3BhdGggZD0nTTE4IDRoLTFWM2ExIDEgMCAwIDAtMiAwdjFIOVYzYTEgMSAwIDAgMC0yIDB2MUg2YTMgMyAwIDAgMC0zIDN2MTJhMyAzIDAgMCAwIDMgM2gxMmEzIDMgMCAwIDAgMy0zVjdhMyAzIDAgMCAwLTMtM3pNNiA2aDF2MWExIDEgMCAwIDAgMiAwVjZoNnYxYTEgMSAwIDAgMCAyIDBWNmgxYTEgMSAwIDAgMSAxIDF2NEg1VjdhMSAxIDAgMCAxIDEtMXptMTIgMTRINmExIDEgMCAwIDEtMS0xdi02aDE0djZhMSAxIDAgMCAxLTEgMXonLyUzRSUzQ2NpcmNsZSBjeD0nOCcgY3k9JzE2JyByPScxJy8lM0UlM0NwYXRoIGQ9J00xNiAxNWgtNGExIDEgMCAwIDAgMCAyaDRhMSAxIDAgMCAwIDAtMnonLyUzRSUzQy9nJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpO1xufVxuLmdpdGh1YiB7XG4gIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnJTNFJTNDZyBkYXRhLW5hbWU9J0xheWVyIDInJTNFJTNDcGF0aCBkPSdNMTIgMUExMC44OSAxMC44OSAwIDAgMCAxIDExLjc3IDEwLjc5IDEwLjc5IDAgMCAwIDguNTIgMjJjLjU1LjEuNzUtLjIzLjc1LS41MnYtMS44M2MtMy4wNi42NS0zLjcxLTEuNDQtMy43MS0xLjQ0YTIuODYgMi44NiAwIDAgMC0xLjIyLTEuNThjLTEtLjY2LjA4LS42NS4wOC0uNjVhMi4zMSAyLjMxIDAgMCAxIDEuNjggMS4xMSAyLjM3IDIuMzcgMCAwIDAgMy4yLjg5IDIuMzMgMi4zMyAwIDAgMSAuNy0xLjQ0Yy0yLjQ0LS4yNy01LTEuMTktNS01LjMyYTQuMTUgNC4xNSAwIDAgMSAxLjExLTIuOTEgMy43OCAzLjc4IDAgMCAxIC4xMS0yLjg0cy45My0uMjkgMyAxLjFhMTAuNjggMTAuNjggMCAwIDEgNS41IDBjMi4xLTEuMzkgMy0xLjEgMy0xLjFhMy43OCAzLjc4IDAgMCAxIC4xMSAyLjg0QTQuMTUgNC4xNSAwIDAgMSAxOSAxMS4yYzAgNC4xNC0yLjU4IDUuMDUtNSA1LjMyYTIuNSAyLjUgMCAwIDEgLjc1IDJ2Mi45NWMwIC4zNS4yLjYzLjc1LjUyQTEwLjggMTAuOCAwIDAgMCAyMyAxMS43NyAxMC44OSAxMC44OSAwIDAgMCAxMiAxJyBkYXRhLW5hbWU9J2dpdGh1YicvJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpO1xufVxuLnR3aXR0ZXIge1xuICBtYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ2cgZGF0YS1uYW1lPSdMYXllciAyJyUzRSUzQ3BhdGggZD0nTTguMDggMjBBMTEuMDcgMTEuMDcgMCAwIDAgMTkuNTIgOSA4LjA5IDguMDkgMCAwIDAgMjEgNi4xNmEuNDQuNDQgMCAwIDAtLjYyLS41MSAxLjg4IDEuODggMCAwIDEtMi4xNi0uMzggMy44OSAzLjg5IDAgMCAwLTUuNTgtLjE3QTQuMTMgNC4xMyAwIDAgMCAxMS40OSA5QzguMTQgOS4yIDUuODQgNy42MSA0IDUuNDNhLjQzLjQzIDAgMCAwLS43NS4yNCA5LjY4IDkuNjggMCAwIDAgNC42IDEwLjA1QTYuNzMgNi43MyAwIDAgMSAzLjM4IDE4YS40NS40NSAwIDAgMC0uMTQuODRBMTEgMTEgMCAwIDAgOC4wOCAyMCcgZGF0YS1uYW1lPSd0d2l0dGVyJy8lM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG4uZmFjZWJvb2sge1xuICBtYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ2cgZGF0YS1uYW1lPSdMYXllciAyJyUzRSUzQ3BhdGggZD0nTTE3IDMuNWEuNS41IDAgMCAwLS41LS41SDE0YTQuNzcgNC43NyAwIDAgMC01IDQuNXYyLjdINi41YS41LjUgMCAwIDAtLjUuNXYyLjZhLjUuNSAwIDAgMCAuNS41SDl2Ni43YS41LjUgMCAwIDAgLjUuNWgzYS41LjUgMCAwIDAgLjUtLjV2LTYuN2gyLjYyYS41LjUgMCAwIDAgLjQ5LS4zN2wuNzItMi42YS41LjUgMCAwIDAtLjQ4LS42M0gxM1Y3LjVhMSAxIDAgMCAxIDEtLjloMi41YS41LjUgMCAwIDAgLjUtLjV6JyBkYXRhLW5hbWU9J2ZhY2Vib29rJy8lM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG4uYmVoYW5jZSB7XG4gIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnJTNFJTNDZyBkYXRhLW5hbWU9J0xheWVyIDInJTNFJTNDZyBkYXRhLW5hbWU9J2JlaGFuY2UnJTNFJTNDcGF0aCBkPSdNMTQuNzYgMTEuMTlhMSAxIDAgMCAwLTEgMS4wOWgyLjA2YTEgMSAwIDAgMC0xLjA2LTEuMDl6TTkuNDkgMTIuM0g4LjI2djEuOTRoMWMxIDAgMS40NC0uMzMgMS40NC0xcy0uNDYtLjk0LTEuMjEtLjk0ek0xMC4zNiAxMC41MmMwLS41My0uMzUtLjg1LS45NS0uODVIOC4yNnYxLjc0aC44NWMuODkgMCAxLjI1LS4zMiAxLjI1LS44OXonLyUzRSUzQ3BhdGggZD0nTTEyIDJhMTAgMTAgMCAxIDAgMTAgMTBBMTAgMTAgMCAwIDAgMTIgMnpNOS43IDE1LjJIN1Y4LjdoMi43YzEuMTcgMCAxLjk0LjYxIDEuOTQgMS42YTEuNCAxLjQgMCAwIDEtMS4xMiAxLjQzQTEuNTIgMS41MiAwIDAgMSAxMiAxMy4zN2MwIDEuMTYtMSAxLjgzLTIuMyAxLjgzem0zLjU1LTZoM3YuNWgtM3pNMTcgMTMuMDVoLTMuM3YuMTRhMS4wNyAxLjA3IDAgMCAwIDEuMDkgMS4xOS45LjkgMCAwIDAgMS0uNjNIMTdhMiAyIDAgMCAxLTIuMTcgMS41NSAyLjE1IDIuMTUgMCAwIDEtMi4zNi0yLjN2LS40NGEyLjExIDIuMTEgMCAwIDEgMi4yOC0yLjI1QTIuMTIgMi4xMiAwIDAgMSAxNyAxMi41OHonLyUzRSUzQy9nJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpO1xufVxuLmVtYWlsIHtcbiAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NnIGRhdGEtbmFtZT0nTGF5ZXIgMiclM0UlM0NwYXRoIGQ9J00xOSA0SDVhMyAzIDAgMCAwLTMgM3YxMGEzIDMgMCAwIDAgMyAzaDE0YTMgMyAwIDAgMCAzLTNWN2EzIDMgMCAwIDAtMy0zem0wIDJsLTYuNSA0LjQ3YTEgMSAwIDAgMS0xIDBMNSA2eicgZGF0YS1uYW1lPSdlbWFpbCcvJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpO1xufVxuLnJzcyB7XG4gIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyAgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ3BhdGggZmlsbD0nbm9uZScgZD0nTTAgMGgyNHYyNEgweicvJTNFJTNDY2lyY2xlIGN4PSc2LjE4JyBjeT0nMTcuODInIHI9JzIuMTgnLyUzRSUzQ3BhdGggZD0nTTQgNC40NHYyLjgzYzcuMDMgMCAxMi43MyA1LjcgMTIuNzMgMTIuNzNoMi44M2MwLTguNTktNi45Ny0xNS41Ni0xNS41Ni0xNS41NnptMCA1LjY2djIuODNjMy45IDAgNy4wNyAzLjE3IDcuMDcgNy4wN2gyLjgzYzAtNS40Ny00LjQzLTkuOS05LjktOS45eicvJTNFJTNDL3N2ZyUzRVwiKTtcbn1cbiIsIi5tYWluIGEge1xuICAgIGNvbG9yOiAjOTlDQ0ZGO1xufVxuXG4ubWFpbiAuYXJ0aWNsZS10YWdzIGEge1xuICAgIGJhY2tncm91bmQ6ICMzMjdFMzY7XG4gICAgY29sb3IgICAgIDogI0ZGRjtcbn1cblxuLmxvY2FsLWluZm8sIC5kaWFsb2cgbGFiZWwge1xuICAgIGJhY2tncm91bmQ6ICNGRkZGOTk7XG4gICAgY29sb3IgICAgIDogIzMzMztcbiAgICBib3gtc2hhZG93OiAycHggM3B4IDFweCAxcHggIzAwMDtcbn1cblxuLyogbWFuIGJnICovXG5ib2R5LFxuLm1haW4sXG4uaGVhZGVyIC5tZW51PmxpOmhvdmVyLFxuLmZvb3RlciBhOmhvdmVyLFxuLmxvZ28tbGluayxcbi5kaWFsb2cge1xuICAgIGJhY2tncm91bmQ6IEBkYXJrX21haW5fYmc7XG59XG5cbi8qIG1haW4gZmcgKi9cbi5tYWluLFxuYmxvY2txdW90ZS50d2l0dGVyLXR3ZWV0LFxuLmhlYWRlciAuc3ViLW1lbnUgYSxcbi5zaWRlYmFyIGEsXG4udGF4b25vbXkta2V5LFxuLm1haW4gLnRpdGxlIGEsXG4uZGlhbG9nIC50aXRsZSB7XG4gICAgY29sb3I6ICNDNkM2Qzc7XG59XG5cbi5pY29uIHtcbiAgICBiYWNrZ3JvdW5kOiAjQzZDNkM3O1xufVxuXG4vKiBtYWluIG1pbm9yICovXG4uYXJ0aWNsZS1tZXRhLFxuLml0ZW0tbWV0YSxcbi5mb290bm90ZXMge1xuICAgIGNvbG9yOiAjOTM5QkFCO1xufVxuXG50aCxcbnRkIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzkzOUJBQjtcbn1cblxuaHIge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICM5MzlCQUI7XG59XG5cbi5wYWdpbmF0aW9uIHtcbiAgICBiYWNrZ3JvdW5kOiAjOTM5QkFCO1xufVxuXG4vKiBzaWRlYmFyIGJnICovXG4uc2lkZWJhciB7XG4gICAgYmFja2dyb3VuZDogIzE2MTkxRDtcbn1cblxuLmhlYWRlciB1bCB1bCB7XG4gICAgYm94LXNoYWRvdzogMCAwLjFlbSAwLjJlbSAwICMwNjA2MDY7XG59XG5cbi5oZWFkZXIgdWwgdWwsXG4ucGFnaW5hdGlvbiBhOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiAjMUExRDIxO1xufVxuXG5jb2RlIHtcbiAgICBiYWNrZ3JvdW5kOiAjMUExQzIxO1xufVxuXG4vKiBzaWRlYmFyIG1pbm9yICovXG4uY291bnQsXG4udGF4b25vbXkta2V5IHtcbiAgICBjb2xvcjogIzkzOTM5NDtcbn1cblxuXG4vKiBoZWFkZXIsIGZvb3RlciBiZyAqL1xuLmhlYWRlcixcbi5mb290ZXIsXG4uaGVhZGVyIC5zdWItbWVudSBsaTpob3Zlcixcbi5zaWRlYmFyIGE6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6ICMyMTI1MkI7XG59XG5cbi8qIGhlYWRlciwgZm9vdGVyIGZnICovXG4uaGVhZGVyIGEsXG4uZm9vdGVyIGEsXG4uZm9vdGVyIHRpbWUsXG4ucGFnaW5hdGlvbiBhIHtcbiAgICBjb2xvcjogIzc5N0Q4NTtcbn1cblxuLmZvb3RlciAuaWNvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzc5N0Q4NTtcbn1cblxuLm1haW4gaDEsXG4ubWFpbiBoMixcbi5tYWluIGgzLFxuLm1haW4gaDQsXG4ubWFpbiBoNSxcbi5tYWluIGg2IHtcbiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMXB4ICMwMDA7XG59XG5cbi50aXRsZSB7XG4gICAgdGV4dC1zaGFkb3c6IDAgMXB4IDFweCAjMDAwO1xufVxuXG4uZGlhbG9nIHtcbiAgICB3aWR0aDogMTAwdnc7XG4gICAgaGVpZ2h0OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiA5OTk5O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZm9udC1zaXplOiAxcmVtO1xufVxuLmRpYWxvZyAud3JhcHBlciB7XG4gICAgcGFkZGluZzogMXJlbTtcbn1cbi5kaWFsb2cgaGVhZGVyLCAuZGlhbG9nIG1haW4sIC5kaWFsb2cgZm9vdGVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAycmVtO1xufVxuXG4uZGlhbG9nIGhlYWRlciB7XG4gICAgbWFyZ2luLXRvcDogLTJyZW07XG59XG4uZGlhbG9nIGRpdiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cbi5kaWFsb2cuc2hvdyB7XG4gICAgaGVpZ2h0OiAxMDB2aDtcbn1cblxuLmRpYWxvZyBsYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgICBwYWRkaW5nOiAwLjhyZW0gMXJlbTtcbiAgICBib3gtc2hhZG93OiBub25lO1xufVxuLmRpYWxvZyBpbnB1dCB7XG4gICAgcGFkZGluZzogMC4zcmVtO1xufVxuLmRpYWxvZyBpbnB1dCwgLmRpYWxvZyBidXR0b24ge1xuICAgIGZvbnQtc2l6ZTogMS4ycmVtO1xuICAgIGZsb2F0OiByaWdodDtcbn1cblxuLmRpYWxvZyBidXR0b24ge1xuICAgIHBhZGRpbmc6IDAuM3JlbSAxcmVtO1xuICAgIGJhY2tncm91bmQ6ICMzMDgzRkU7XG4gICAgY29sb3I6ICNGRkY7XG59XG5cbi5kaWFsb2cgLmNsb3NlLWRpYWxvZyB7XG4gICAgZm9udC1zaXplOiAzcmVtO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgYm9yZGVyOiBub25lO1xufVxuIiwiLmxpZ2h0LW1vZGUgLmRpYWxvZyBidXR0b24ge1xuICAgIGNvbG9yOiAjMzA4M0ZFO1xufVxuLmxpZ2h0LW1vZGUgLm1haW4gYSB7XG4gICAgY29sb3I6ICMzMDgzRkU7XG59XG5cbi5saWdodC1tb2RlIC5tYWluIC5hcnRpY2xlLXRhZ3MgYSB7XG4gICAgYmFja2dyb3VuZDogIzM1Q0M4MTtcbiAgICBjb2xvciAgICAgOiAjRkZGO1xufVxuXG4ubGlnaHQtbW9kZSAubG9jYWwtaW5mbyB7XG4gICAgYmFja2dyb3VuZDogI0VGRUNBQTtcbiAgICBjb2xvciAgICAgOiAjMDAwMDAwO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi8qIG1hbiBiZyAqL1xuYm9keS5saWdodC1tb2RlLFxuLmxpZ2h0LW1vZGUgLm1haW4ge1xuICAgIGJhY2tncm91bmQ6IEBsaWdodF9tYWluX2JnO1xufVxuXG4vKiBtYWluIGZnICovXG4ubGlnaHQtbW9kZSAubWFpbixcbi5saWdodC1tb2RlIGJsb2NrcXVvdGUudHdpdHRlci10d2VldCxcbi5saWdodC1tb2RlIC5zaWRlYmFyIGEsXG4ubGlnaHQtbW9kZSAudGF4b25vbXkta2V5LFxuLmxpZ2h0LW1vZGUgLm1haW4gLnRpdGxlIGEsXG4ubGlnaHQtbW9kZSAuZGlhbG9nIC50aXRsZSB7XG4gICAgY29sb3I6ICM0QzRDNEM7XG59XG5cbi5saWdodC1tb2RlIC5pY29uIHtcbiAgICBiYWNrZ3JvdW5kOiAjNEM0QzRDO1xufVxuXG4vKiBtYWluIG1pbm9yICovXG4ubGlnaHQtbW9kZSAuYXJ0aWNsZS1tZXRhLFxuLmxpZ2h0LW1vZGUgLml0ZW0tbWV0YSxcbi5saWdodC1tb2RlIC5mb290bm90ZXMge1xuICAgIGNvbG9yOiAjOTk5OTk5O1xufVxuXG4ubGlnaHQtbW9kZSB0aCxcbi5saWdodC1tb2RlIHRkIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0NDQ0NDQztcbn1cblxuLmxpZ2h0LW1vZGUgaHIge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7XG59XG5cbi5saWdodC1tb2RlIC5wYWdpbmF0aW9uIHtcbiAgICBiYWNrZ3JvdW5kOiAjQ0NDQ0NDO1xufVxuXG4vKiBzaWRlYmFyIGJnICovXG4ubGlnaHQtbW9kZSAuc2lkZWJhciB7XG4gICAgYmFja2dyb3VuZDogI0VFRUVFRTtcbn1cblxuXG4ubGlnaHQtbW9kZSBwcmUsXG4ubGlnaHQtbW9kZSBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kOiBAbGlnaHRfaGVhZGVyX2JnO1xufVxuXG4vKiBzaWRlYmFyIGZnICovXG4ubGlnaHQtbW9kZSAuc2lkZWJhciBhIHtcbiAgICBjb2xvcjogIzNGM0YzRjtcbn1cblxuLyogc2lkZWJhciBtaW5vciAqL1xuLmxpZ2h0LW1vZGUgLmNvdW50LFxuLmxpZ2h0LW1vZGUgLnRheG9ub215LWtleSB7XG4gICAgY29sb3I6ICM3Nzc3Nzc7XG59XG5cblxuLyogaGVhZGVyLCBmb290ZXIgYmcgKi9cbi5saWdodC1tb2RlIC5oZWFkZXIsXG4ubGlnaHQtbW9kZSAuZm9vdGVyLFxuLmxpZ2h0LW1vZGUgLmhlYWRlciAuc3ViLW1lbnUgbGk6aG92ZXIsXG4ubGlnaHQtbW9kZSAuc2lkZWJhciBhOmhvdmVyLFxuLmxpZ2h0LW1vZGUgLmxvZ28tbGluayxcbi5saWdodC1tb2RlIC5kaWFsb2csXG4ubGlnaHQtbW9kZSAuZGlhbG9nIGJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZDogQGxpZ2h0X2hlYWRlcl9iZztcbn1cblxuLmxpZ2h0LW1vZGUgLmhlYWRlciAubWVudT5saTpob3Zlcixcbi5saWdodC1tb2RlIC5mb290ZXIgYTpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogI0NDQ0NDQztcbn1cblxuLyogc3ViLW1lbnUgYmcgKi9cbi5saWdodC1tb2RlIC5oZWFkZXIgdWwgdWwge1xuICAgIGJveC1zaGFkb3c6IDAgMC4xZW0gMC4yZW0gMCAjQUFBQUFBO1xufVxuXG4ubGlnaHQtbW9kZSAuaGVhZGVyIHVsIHVsLFxuLmxpZ2h0LW1vZGUgLnBhZ2luYXRpb24gYTpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogI0NDQ0NDQztcbn1cblxuLyogaGVhZGVyLCBmb290ZXIgZmcgKi9cbi5saWdodC1tb2RlIC5oZWFkZXIgYSxcbi5saWdodC1tb2RlIC5mb290ZXIgYSxcbi5saWdodC1tb2RlIC5mb290ZXIgdGltZSxcbi5saWdodC1tb2RlIC5wYWdpbmF0aW9uIGEge1xuICAgIGNvbG9yOiAjMzIzMjMyO1xufVxuXG4ubGlnaHQtbW9kZSAuaGVhZGVyIC5zdWItbWVudSBhIHtcbiAgICBjb2xvcjogIzBCMEIwQjtcbn1cblxuLmxpZ2h0LW1vZGUgLmZvb3RlciAuaWNvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzMyMzIzMjtcbn1cblxuLmxpZ2h0LW1vZGUgLm1haW4gaDEsXG4ubGlnaHQtbW9kZSAubWFpbiBoMixcbi5saWdodC1tb2RlIC5tYWluIGgzLFxuLmxpZ2h0LW1vZGUgLm1haW4gaDQsXG4ubGlnaHQtbW9kZSAubWFpbiBoNSxcbi5saWdodC1tb2RlIC5tYWluIGg2LFxuLmxpZ2h0LW1vZGUgLnRpdGxlIHtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZTtcbn1cblxuLmxpZ2h0LW1vZGUge1xuICAgIC50b3AsIC5ib3R0b20ge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAbGlnaHRfaGVhZGVyX2JnO1xuICAgIH1cbn1cbiIsIi53aWxkLW1vZGUgLm1haW4gaDEsXG4ud2lsZC1tb2RlIC5tYWluIGgyLFxuLndpbGQtbW9kZSAubWFpbiBoMyxcbi53aWxkLW1vZGUgLm1haW4gaDQsXG4ud2lsZC1tb2RlIC5tYWluIGg1LFxuLndpbGQtbW9kZSAubWFpbiBoNixcbi53aWxkLW1vZGUgLnRpdGxlIHtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZTtcbn1cbi53aWxkLW1vZGUgLmxvY2FsLWluZm8ge1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG59XG4iLCIuaWNvbi10YWdzIHtcbiAgICBtYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ2cgZGF0YS1uYW1lPSdMYXllciAyJyUzRSUzQ2cgZGF0YS1uYW1lPSdwcmljZXRhZ3MnJTNFJTNDcGF0aCBkPSdNMTIuODcgMjJhMS44NCAxLjg0IDAgMCAxLTEuMjktLjUzbC02LjQxLTYuNDJhMSAxIDAgMCAxLS4yOS0uNjFMNCA1LjA5YTEgMSAwIDAgMSAuMjktLjggMSAxIDAgMCAxIC44LS4yOWw5LjM1Ljg4YTEgMSAwIDAgMSAuNjEuMjlsNi40MiA2LjQxYTEuODIgMS44MiAwIDAgMSAwIDIuNTdsLTcuMzIgNy4zMmExLjgyIDEuODIgMCAwIDEtMS4yOC41M3ptLTYtOC4xMWw2IDYgNy4wNS03LjA1LTYtNi03LjgxLS43M3onLyUzRSUzQ2NpcmNsZSBjeD0nMTAuNScgY3k9JzEwLjUnIHI9JzEuNScvJTNFJTNDL2clM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi5pY29uLWNhdGVnb3JpZXMge1xuICAgIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnJTNFJTNDZyBkYXRhLW5hbWU9J0xheWVyIDInJTNFJTNDcGF0aCBkPSdNMTkuNSAyMC41aC0xNUEyLjQ3IDIuNDcgMCAwIDEgMiAxOC4wN1Y1LjkzQTIuNDcgMi40NyAwIDAgMSA0LjUgMy41aDQuNmExIDEgMCAwIDEgLjc3LjM3bDIuNiAzLjE4aDdBMi40NyAyLjQ3IDAgMCAxIDIyIDkuNDh2OC41OWEyLjQ3IDIuNDcgMCAwIDEtMi41IDIuNDN6TTQgMTMuNzZ2NC4zMWEuNDYuNDYgMCAwIDAgLjUuNDNoMTVhLjQ2LjQ2IDAgMCAwIC41LS40M1Y5LjQ4YS40Ni40NiAwIDAgMC0uNS0uNDNIMTJhMSAxIDAgMCAxLS43Ny0uMzdMOC42MyA1LjVINC41YS40Ni40NiAwIDAgMC0uNS40M3onIGRhdGEtbmFtZT0nZm9sZGVyJy8lM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi5pY29uLXBvc3Qge1xuICAgIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnJTNFJTNDZyBkYXRhLW5hbWU9J0xheWVyIDInJTNFJTNDZyBkYXRhLW5hbWU9J2ZpbGUtdGV4dCclM0UlM0NwYXRoIGQ9J00xNSAxNkg5YTEgMSAwIDAgMCAwIDJoNmExIDEgMCAwIDAgMC0yek05IDE0aDNhMSAxIDAgMCAwIDAtMkg5YTEgMSAwIDAgMCAwIDJ6Jy8lM0UlM0NwYXRoIGQ9J00xOS43NCA4LjMzbC01LjQ0LTZhMSAxIDAgMCAwLS43NC0uMzNoLTdBMi41MyAyLjUzIDAgMCAwIDQgNC41djE1QTIuNTMgMi41MyAwIDAgMCA2LjU2IDIyaDEwLjg4QTIuNTMgMi41MyAwIDAgMCAyMCAxOS41VjlhMSAxIDAgMCAwLS4yNi0uNjd6TTE0IDVsMi43NCAzaC0yYS43OS43OSAwIDAgMS0uNzQtLjg1em0zLjQ0IDE1SDYuNTZhLjUzLjUzIDAgMCAxLS41Ni0uNXYtMTVhLjUzLjUzIDAgMCAxIC41Ni0uNUgxMnYzLjE1QTIuNzkgMi43OSAwIDAgMCAxNC43MSAxMEgxOHY5LjVhLjUzLjUzIDAgMCAxLS41Ni41eicvJTNFJTNDL2clM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi5hcnRpY2xlLW1ldGEgLmljb24tZGF0ZSB7XG4gICAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NnIGRhdGEtbmFtZT0nTGF5ZXIgMiclM0UlM0NnIGRhdGEtbmFtZT0nY2FsZW5kYXInJTNFJTNDcGF0aCBkPSdNMTggNGgtMVYzYTEgMSAwIDAgMC0yIDB2MUg5VjNhMSAxIDAgMCAwLTIgMHYxSDZhMyAzIDAgMCAwLTMgM3YxMmEzIDMgMCAwIDAgMyAzaDEyYTMgMyAwIDAgMCAzLTNWN2EzIDMgMCAwIDAtMy0zek02IDZoMXYxYTEgMSAwIDAgMCAyIDBWNmg2djFhMSAxIDAgMCAwIDIgMFY2aDFhMSAxIDAgMCAxIDEgMXY0SDVWN2ExIDEgMCAwIDEgMS0xem0xMiAxNEg2YTEgMSAwIDAgMS0xLTF2LTZoMTR2NmExIDEgMCAwIDEtMSAxeicvJTNFJTNDY2lyY2xlIGN4PSc4JyBjeT0nMTYnIHI9JzEnLyUzRSUzQ3BhdGggZD0nTTE2IDE1aC00YTEgMSAwIDAgMCAwIDJoNGExIDEgMCAwIDAgMC0yeicvJTNFJTNDL2clM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi5naXRodWIge1xuICAgIG1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnJTNFJTNDZyBkYXRhLW5hbWU9J0xheWVyIDInJTNFJTNDcGF0aCBkPSdNMTIgMUExMC44OSAxMC44OSAwIDAgMCAxIDExLjc3IDEwLjc5IDEwLjc5IDAgMCAwIDguNTIgMjJjLjU1LjEuNzUtLjIzLjc1LS41MnYtMS44M2MtMy4wNi42NS0zLjcxLTEuNDQtMy43MS0xLjQ0YTIuODYgMi44NiAwIDAgMC0xLjIyLTEuNThjLTEtLjY2LjA4LS42NS4wOC0uNjVhMi4zMSAyLjMxIDAgMCAxIDEuNjggMS4xMSAyLjM3IDIuMzcgMCAwIDAgMy4yLjg5IDIuMzMgMi4zMyAwIDAgMSAuNy0xLjQ0Yy0yLjQ0LS4yNy01LTEuMTktNS01LjMyYTQuMTUgNC4xNSAwIDAgMSAxLjExLTIuOTEgMy43OCAzLjc4IDAgMCAxIC4xMS0yLjg0cy45My0uMjkgMyAxLjFhMTAuNjggMTAuNjggMCAwIDEgNS41IDBjMi4xLTEuMzkgMy0xLjEgMy0xLjFhMy43OCAzLjc4IDAgMCAxIC4xMSAyLjg0QTQuMTUgNC4xNSAwIDAgMSAxOSAxMS4yYzAgNC4xNC0yLjU4IDUuMDUtNSA1LjMyYTIuNSAyLjUgMCAwIDEgLjc1IDJ2Mi45NWMwIC4zNS4yLjYzLjc1LjUyQTEwLjggMTAuOCAwIDAgMCAyMyAxMS43NyAxMC44OSAxMC44OSAwIDAgMCAxMiAxJyBkYXRhLW5hbWU9J2dpdGh1YicvJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpXG59XG5cbi50d2l0dGVyIHtcbiAgICBtYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ2cgZGF0YS1uYW1lPSdMYXllciAyJyUzRSUzQ3BhdGggZD0nTTguMDggMjBBMTEuMDcgMTEuMDcgMCAwIDAgMTkuNTIgOSA4LjA5IDguMDkgMCAwIDAgMjEgNi4xNmEuNDQuNDQgMCAwIDAtLjYyLS41MSAxLjg4IDEuODggMCAwIDEtMi4xNi0uMzggMy44OSAzLjg5IDAgMCAwLTUuNTgtLjE3QTQuMTMgNC4xMyAwIDAgMCAxMS40OSA5QzguMTQgOS4yIDUuODQgNy42MSA0IDUuNDNhLjQzLjQzIDAgMCAwLS43NS4yNCA5LjY4IDkuNjggMCAwIDAgNC42IDEwLjA1QTYuNzMgNi43MyAwIDAgMSAzLjM4IDE4YS40NS40NSAwIDAgMC0uMTQuODRBMTEgMTEgMCAwIDAgOC4wOCAyMCcgZGF0YS1uYW1lPSd0d2l0dGVyJy8lM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi5mYWNlYm9vayB7XG4gICAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NnIGRhdGEtbmFtZT0nTGF5ZXIgMiclM0UlM0NwYXRoIGQ9J00xNyAzLjVhLjUuNSAwIDAgMC0uNS0uNUgxNGE0Ljc3IDQuNzcgMCAwIDAtNSA0LjV2Mi43SDYuNWEuNS41IDAgMCAwLS41LjV2Mi42YS41LjUgMCAwIDAgLjUuNUg5djYuN2EuNS41IDAgMCAwIC41LjVoM2EuNS41IDAgMCAwIC41LS41di02LjdoMi42MmEuNS41IDAgMCAwIC40OS0uMzdsLjcyLTIuNmEuNS41IDAgMCAwLS40OC0uNjNIMTNWNy41YTEgMSAwIDAgMSAxLS45aDIuNWEuNS41IDAgMCAwIC41LS41eicgZGF0YS1uYW1lPSdmYWNlYm9vaycvJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpO1xufVxuXG4uYmVoYW5jZSB7XG4gICAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NnIGRhdGEtbmFtZT0nTGF5ZXIgMiclM0UlM0NnIGRhdGEtbmFtZT0nYmVoYW5jZSclM0UlM0NwYXRoIGQ9J00xNC43NiAxMS4xOWExIDEgMCAwIDAtMSAxLjA5aDIuMDZhMSAxIDAgMCAwLTEuMDYtMS4wOXpNOS40OSAxMi4zSDguMjZ2MS45NGgxYzEgMCAxLjQ0LS4zMyAxLjQ0LTFzLS40Ni0uOTQtMS4yMS0uOTR6TTEwLjM2IDEwLjUyYzAtLjUzLS4zNS0uODUtLjk1LS44NUg4LjI2djEuNzRoLjg1Yy44OSAwIDEuMjUtLjMyIDEuMjUtLjg5eicvJTNFJTNDcGF0aCBkPSdNMTIgMmExMCAxMCAwIDEgMCAxMCAxMEExMCAxMCAwIDAgMCAxMiAyek05LjcgMTUuMkg3VjguN2gyLjdjMS4xNyAwIDEuOTQuNjEgMS45NCAxLjZhMS40IDEuNCAwIDAgMS0xLjEyIDEuNDNBMS41MiAxLjUyIDAgMCAxIDEyIDEzLjM3YzAgMS4xNi0xIDEuODMtMi4zIDEuODN6bTMuNTUtNmgzdi41aC0zek0xNyAxMy4wNWgtMy4zdi4xNGExLjA3IDEuMDcgMCAwIDAgMS4wOSAxLjE5LjkuOSAwIDAgMCAxLS42M0gxN2EyIDIgMCAwIDEtMi4xNyAxLjU1IDIuMTUgMi4xNSAwIDAgMS0yLjM2LTIuM3YtLjQ0YTIuMTEgMi4xMSAwIDAgMSAyLjI4LTIuMjVBMi4xMiAyLjEyIDAgMCAxIDE3IDEyLjU4eicvJTNFJTNDL2clM0UlM0MvZyUzRSUzQy9zdmclM0VcIik7XG59XG5cbi5lbWFpbCB7XG4gICAgbWFzay1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NnIGRhdGEtbmFtZT0nTGF5ZXIgMiclM0UlM0NwYXRoIGQ9J00xOSA0SDVhMyAzIDAgMCAwLTMgM3YxMGEzIDMgMCAwIDAgMyAzaDE0YTMgMyAwIDAgMCAzLTNWN2EzIDMgMCAwIDAtMy0zem0wIDJsLTYuNSA0LjQ3YTEgMSAwIDAgMS0xIDBMNSA2eicgZGF0YS1uYW1lPSdlbWFpbCcvJTNFJTNDL2clM0UlM0Mvc3ZnJTNFXCIpO1xufVxuXG4ucnNzIHtcbiAgICBtYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgIHZpZXdCb3g9JzAgMCAyNCAyNCclM0UlM0NwYXRoIGZpbGw9J25vbmUnIGQ9J00wIDBoMjR2MjRIMHonLyUzRSUzQ2NpcmNsZSBjeD0nNi4xOCcgY3k9JzE3LjgyJyByPScyLjE4Jy8lM0UlM0NwYXRoIGQ9J000IDQuNDR2Mi44M2M3LjAzIDAgMTIuNzMgNS43IDEyLjczIDEyLjczaDIuODNjMC04LjU5LTYuOTctMTUuNTYtMTUuNTYtMTUuNTZ6bTAgNS42NnYyLjgzYzMuOSAwIDcuMDcgMy4xNyA3LjA3IDcuMDdoMi44M2MwLTUuNDctNC40My05LjktOS45LTkuOXonLyUzRSUzQy9zdmclM0VcIik7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9*/ --------------------------------------------------------------------------------