Showing preview only (2,055K chars total). Download the full file or copy to clipboard to get everything.
Repository: SecurityPaper/SecurityPaper-web
Branch: master
Commit: cbe1d19c3b80
Files: 122
Total size: 1.8 MB
Directory structure:
gitextract_uoldwxkc/
├── .gitignore
├── LICENSE
├── README.md
├── SecurityPaper-themes/
│ ├── 404.html
│ ├── __init__.py
│ ├── assets/
│ │ ├── fonts/
│ │ │ ├── font-awesome.css
│ │ │ └── material-icons.css
│ │ ├── javascripts/
│ │ │ ├── application.js
│ │ │ ├── lunr/
│ │ │ │ ├── lunr.da.js
│ │ │ │ ├── lunr.de.js
│ │ │ │ ├── lunr.du.js
│ │ │ │ ├── lunr.es.js
│ │ │ │ ├── lunr.fi.js
│ │ │ │ ├── lunr.fr.js
│ │ │ │ ├── lunr.hu.js
│ │ │ │ ├── lunr.it.js
│ │ │ │ ├── lunr.jp.js
│ │ │ │ ├── lunr.multi.js
│ │ │ │ ├── lunr.no.js
│ │ │ │ ├── lunr.pt.js
│ │ │ │ ├── lunr.ro.js
│ │ │ │ ├── lunr.ru.js
│ │ │ │ ├── lunr.stemmer.support.js
│ │ │ │ ├── lunr.sv.js
│ │ │ │ ├── lunr.tr.js
│ │ │ │ └── tinyseg.js
│ │ │ └── modernizr.js
│ │ └── stylesheets/
│ │ ├── application-palette.css
│ │ └── application.css
│ ├── base.html
│ ├── main.html
│ ├── mkdocs_theme.yml
│ └── partials/
│ ├── footer.html
│ ├── header.html
│ ├── hero.html
│ ├── integrations/
│ │ ├── analytics.html
│ │ └── disqus.html
│ ├── language/
│ │ ├── ar.html
│ │ ├── ca.html
│ │ ├── cs.html
│ │ ├── da.html
│ │ ├── de.html
│ │ ├── en.html
│ │ ├── es.html
│ │ ├── fa.html
│ │ ├── fi.html
│ │ ├── fr.html
│ │ ├── gl.html
│ │ ├── he.html
│ │ ├── hi.html
│ │ ├── hr.html
│ │ ├── hu.html
│ │ ├── id.html
│ │ ├── it.html
│ │ ├── ja.html
│ │ ├── kr.html
│ │ ├── nl.html
│ │ ├── no.html
│ │ ├── pl.html
│ │ ├── pt.html
│ │ ├── ru.html
│ │ ├── sh.html
│ │ ├── sk.html
│ │ ├── sr.html
│ │ ├── sv.html
│ │ ├── tr.html
│ │ ├── uk.html
│ │ ├── vi.html
│ │ ├── zh-Hant.html
│ │ ├── zh-TW.html
│ │ └── zh.html
│ ├── language.html
│ ├── nav-item.html
│ ├── nav.html
│ ├── palette.html
│ ├── search.html
│ ├── social.html
│ ├── source.html
│ ├── tabs-item.html
│ ├── tabs.html
│ ├── toc-item.html
│ └── toc.html
├── docs/
│ ├── 1.SDL介绍/
│ │ ├── 1-什么是SDL.md
│ │ ├── 2-企业为什么需求SDL.md
│ │ ├── 3-哪些企业需要SDL.md
│ │ └── 4-SDL所带来的优缺点.md
│ ├── 2.SDL规范文档/
│ │ ├── 1-安全设计Checklist.md
│ │ ├── 10-SDL上线规定文档.md
│ │ ├── 11-web应用安全业务自查checklist.md
│ │ ├── 2-php安全编码规范.md
│ │ ├── 3-java安全编码规范.md
│ │ ├── 4-python安全编码规范.md
│ │ ├── 5-nodejs安全编码规范.md
│ │ ├── 6-移动安全规范.md
│ │ ├── 7-产品设计开发最佳实践.md
│ │ ├── 8-常见协议安全开发实践.md
│ │ └── 9-MySQL安全配置.md
│ ├── 3.SDL落地方案/
│ │ ├── 1-安全培训.md
│ │ ├── 2-需求评估.md
│ │ ├── 3-产品设计.md
│ │ ├── 4-代码编写.md
│ │ ├── 5-渗透测试.md
│ │ ├── 6-上线发布.md
│ │ └── 7-应急响应.md
│ ├── 4.构建企业安全/
│ │ ├── 1-内功修炼第一步-挖漏洞.md
│ │ ├── 2-内功修炼第二步-引起重视.md
│ │ ├── 3-互联网安全运营的思考.md
│ │ ├── 4-如何利用Flink实现超大规模用户行为分析.md
│ │ └── 5-APT 攻击基础科普.md
│ ├── 5.附录/
│ │ ├── 01.相关术语.md
│ │ ├── 02.文档变更规范.md
│ │ ├── 03.GitHub工作流.md
│ │ └── 04.NAXSI安装测试与简介.md
│ ├── 6.Project/
│ │ ├── 1-内部钓鱼系统.md
│ │ ├── 2-工作流自动化代码审计.md
│ │ └── 3-泰式感知.md
│ ├── 7.安全前瞻/
│ │ └── 1-BeyondCorp-以全新方式保障企业安全.md
│ ├── _headers
│ ├── index.md
│ └── update.md
├── mkdocs.yml
└── requirements.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
site/
.DS_Store
================================================
FILE: LICENSE
================================================
Copyright (c) <year> <copyright holders>
Anti 996 License Version 1.0 (Draft)
Permission is hereby granted to any individual or legal entity
obtaining a copy of this licensed work (including the source code,
documentation and/or related items, hereinafter collectively referred
to as the "licensed work"), free of charge, to deal with the licensed
work for any purpose, including without limitation, the rights to use,
reproduce, modify, prepare derivative works of, distribute, publish
and sublicense the licensed work, subject to the following conditions:
1. The individual or the legal entity must conspicuously display,
without modification, this License and the notice on each redistributed
or derivative copy of the Licensed Work.
2. The individual or the legal entity must strictly comply with all
applicable laws, regulations, rules and standards of the jurisdiction
relating to labor and employment where the individual is physically
located or where the individual was born or naturalized; or where the
legal entity is registered or is operating (whichever is stricter). In
case that the jurisdiction has no such laws, regulations, rules and
standards or its laws, regulations, rules and standards are
unenforceable, the individual or the legal entity are required to
comply with Core International Labor Standards.
3. The individual or the legal entity shall not induce or force its
employee(s), whether full-time or part-time, or its independent
contractor(s), in any methods, to agree in oral or written form, to
directly or indirectly restrict, weaken or relinquish his or her
rights or remedies under such laws, regulations, rules and standards
relating to labor and employment as mentioned above, no matter whether
such written or oral agreement are enforceable under the laws of the
said jurisdiction, nor shall such individual or the legal entity
limit, in any methods, the rights of its employee(s) or independent
contractor(s) from reporting or complaining to the copyright holder or
relevant authorities monitoring the compliance of the license about
its violation(s) of the said license.
THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN ANY WAY CONNECTION WITH THE
LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE LICENSED WORK.
================================================
FILE: README.md
================================================
## SecurityPaper
所有文档都来自中国互联网一线安全工程师编写整理
## 官网
```
https://www.SecurityPaper.org
```
官网状态:[](https://travis-ci.com/SecurityPaper/SecurityPaper-web)
## 下载文档方法
clone 项目到本地
所有文档都在**docs**目录下,以markdown文件进行存储,可以直接保存
## 提交文章和改进
请参考git工作流方法
fork项目到自己账户,修改后提交给主分支,审核后即可展示。
提交可以多种方式,如web、命令、客户端,这里演示web提交方式
提交SDL落地方案-产品设计
1. 选择相应的文件,所有文档都在**_post**目录下
```
SecurityPaper-web/_posts/3.SDL落地方案/2018-08-17-SDL-3-产品设计.md
```
选择**edit**或者**create new file**,文件名必须要符合: ```YEAR-MONTH-DAY-title.md```

2. 编辑文档
所有博客文章顶部必须有一段YAML头信息(YAML front- matter),文章可以使用markdown格式编写
```
---
date: 2018-08-17
title: 03.产品设计
categories:
- 3.SDL落地方案
description: 和研发同学进行产品设计定框架部分应该怎么去执行
type: Document
---
```
编辑完成之后点击**commit changes**(同命令```git add . && git commit -m "添加产品设计" && git pusht origin master```)

3. 提交pull请求
点击**New pull request**

检查没有问题,点击**Create pull request**

提交成功,等待管理员**Merge**之后就成功了

## 署名
原则上对文章修改后即可进行署名在协作者添加上自己的ID。
## About页面变更
需要对网站文档进行提交建议以及文档改进或者文档编写方可在About页面添加自己ID
排序需要按照字母顺序排序。
================================================
FILE: SecurityPaper-themes/404.html
================================================
{% extends "base.html" %}
{% block content %}
<h1>404 - Not found</h1>
{% endblock %}
================================================
FILE: SecurityPaper-themes/__init__.py
================================================
================================================
FILE: SecurityPaper-themes/assets/fonts/font-awesome.css
================================================
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url("specimen/FontAwesome.woff2") format("woff2"),url("specimen/FontAwesome.woff") format("woff"),url("specimen/FontAwesome.ttf") format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
================================================
FILE: SecurityPaper-themes/assets/fonts/material-icons.css
================================================
/*!
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE
* DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
* SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND
* LIMITATIONS UNDER THE LICENSE.
*/@font-face{font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")}
================================================
FILE: SecurityPaper-themes/assets/javascripts/application.js
================================================
(function(e, a) { for(var i in a) e[i] = a[i]; }(window, /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 6);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Module
* ------------------------------------------------------------------------- */
/* eslint-disable no-underscore-dangle */
exports.default = /* JSX */{
/**
* Create a native DOM node from JSX's intermediate representation
*
* @param {string} tag - Tag name
* @param {?Object} properties - Properties
* @param {Array<string | number | { __html: string } | Array<HTMLElement>>}
* children - Child nodes
* @return {HTMLElement} Native DOM node
*/
createElement: function createElement(tag, properties) {
var el = document.createElement(tag);
/* Set all properties */
if (properties) Array.prototype.forEach.call(Object.keys(properties), function (attr) {
el.setAttribute(attr, properties[attr]);
});
/* Iterate child nodes */
var iterateChildNodes = function iterateChildNodes(nodes) {
Array.prototype.forEach.call(nodes, function (node) {
/* Directly append text content */
if (typeof node === "string" || typeof node === "number") {
el.textContent += node;
/* Recurse, if we got an array */
} else if (Array.isArray(node)) {
iterateChildNodes(node);
/* Append raw HTML */
} else if (typeof node.__html !== "undefined") {
el.innerHTML += node.__html;
/* Append regular nodes */
} else if (node instanceof Node) {
el.appendChild(node);
}
});
};
/* Iterate child nodes and return element */
for (var _len = arguments.length, children = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
children[_key - 2] = arguments[_key];
}
iterateChildNodes(children);
return el;
}
};
module.exports = exports.default;
/***/ }),
/* 1 */
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || Function("return this")() || (1,eval)("this");
} catch(e) {
// This works if the window reference is available
if(typeof window === "object")
g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
var index = typeof fetch=='function' ? fetch.bind() : function(url, options) {
options = options || {};
return new Promise( function (resolve, reject) {
var request = new XMLHttpRequest();
request.open(options.method || 'get', url, true);
for (var i in options.headers) {
request.setRequestHeader(i, options.headers[i]);
}
request.withCredentials = options.credentials=='include';
request.onload = function () {
resolve(response());
};
request.onerror = reject;
request.send(options.body || null);
function response() {
var keys = [],
all = [],
headers = {},
header;
request.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, function (m, key, value) {
keys.push(key = key.toLowerCase());
all.push([key, value]);
header = headers[key];
headers[key] = header ? (header + "," + value) : value;
});
return {
ok: (request.status/100|0) == 2, // 200-299
status: request.status,
statusText: request.statusText,
url: request.responseURL,
clone: response,
text: function () { return Promise.resolve(request.responseText); },
json: function () { return Promise.resolve(request.responseText).then(JSON.parse); },
blob: function () { return Promise.resolve(new Blob([request.response])); },
headers: {
keys: function () { return keys; },
entries: function () { return all; },
get: function (n) { return headers[n.toLowerCase()]; },
has: function (n) { return n.toLowerCase() in headers; }
}
};
}
});
};
/* harmony default export */ __webpack_exports__["default"] = (index);
//# sourceMappingURL=unfetch.es.js.map
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Listener = function () {
/**
* Generic event listener
*
* @constructor
*
* @property {(Array<EventTarget>)} els_ - Event targets
* @property {Object} handler_- Event handlers
* @property {Array<string>} events_ - Event names
* @property {Function} update_ - Update handler
*
* @param {?(string|EventTarget|NodeList<EventTarget>)} els -
* Selector or Event targets
* @param {(string|Array<string>)} events - Event names
* @param {(Object|Function)} handler - Handler to be invoked
*/
function Listener(els, events, handler) {
var _this = this;
_classCallCheck(this, Listener);
this.els_ = Array.prototype.slice.call(typeof els === "string" ? document.querySelectorAll(els) : [].concat(els));
/* Set handler as function or directly as object */
this.handler_ = typeof handler === "function" ? { update: handler } : handler;
/* Initialize event names and update handler */
this.events_ = [].concat(events);
this.update_ = function (ev) {
return _this.handler_.update(ev);
};
}
/**
* Register listener for all relevant events
*/
Listener.prototype.listen = function listen() {
var _this2 = this;
this.els_.forEach(function (el) {
_this2.events_.forEach(function (event) {
el.addEventListener(event, _this2.update_, false);
});
});
/* Execute setup handler, if implemented */
if (typeof this.handler_.setup === "function") this.handler_.setup();
};
/**
* Unregister listener for all relevant events
*/
Listener.prototype.unlisten = function unlisten() {
var _this3 = this;
this.els_.forEach(function (el) {
_this3.events_.forEach(function (event) {
el.removeEventListener(event, _this3.update_);
});
});
/* Execute reset handler, if implemented */
if (typeof this.handler_.reset === "function") this.handler_.reset();
};
return Listener;
}();
exports.default = Listener;
/***/ }),
/* 4 */,
/* 5 */,
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(JSX) {
exports.__esModule = true;
exports.app = undefined;
__webpack_require__(7);
__webpack_require__(8);
__webpack_require__(9);
__webpack_require__(10);
__webpack_require__(11);
__webpack_require__(12);
__webpack_require__(13);
var _promisePolyfill = __webpack_require__(14);
var _promisePolyfill2 = _interopRequireDefault(_promisePolyfill);
var _clipboard = __webpack_require__(19);
var _clipboard2 = _interopRequireDefault(_clipboard);
var _fastclick = __webpack_require__(20);
var _fastclick2 = _interopRequireDefault(_fastclick);
var _Material = __webpack_require__(21);
var _Material2 = _interopRequireDefault(_Material);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
window.Promise = window.Promise || _promisePolyfill2.default;
/* ----------------------------------------------------------------------------
* Dependencies
* ------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------------
* Polyfills
* ------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------------
* Functions
* ------------------------------------------------------------------------- */
/**
* Return the meta tag value for the given key
*
* @param {string} key - Meta name
*
* @return {string} Meta content value
*/
var translate = function translate(key) {
var meta = document.getElementsByName("lang:" + key)[0];
if (!(meta instanceof HTMLMetaElement)) throw new ReferenceError();
return meta.content;
};
/* ----------------------------------------------------------------------------
* Application
* ------------------------------------------------------------------------- */
/**
* Initialize Material for MkDocs
*
* @param {Object} config - Configuration
*/
function initialize(config) {
// eslint-disable-line func-style
/* Initialize Modernizr and FastClick */
new _Material2.default.Event.Listener(document, "DOMContentLoaded", function () {
if (!(document.body instanceof HTMLElement)) throw new ReferenceError();
/* Attach FastClick to mitigate 300ms delay on touch devices */
_fastclick2.default.attach(document.body);
/* Test for iOS */
Modernizr.addTest("ios", function () {
return !!navigator.userAgent.match(/(iPad|iPhone|iPod)/g);
});
/* Wrap all data tables for better overflow scrolling */
var tables = document.querySelectorAll("table:not([class])"); // TODO: this is JSX, we should rename the file
Array.prototype.forEach.call(tables, function (table) {
var wrap = JSX.createElement(
"div",
{ "class": "md-typeset__scrollwrap" },
JSX.createElement("div", { "class": "md-typeset__table" })
);
if (table.nextSibling) {
table.parentNode.insertBefore(wrap, table.nextSibling);
} else {
table.parentNode.appendChild(wrap);
}
wrap.children[0].appendChild(table);
});
/* Clipboard integration */
if (_clipboard2.default.isSupported()) {
var blocks = document.querySelectorAll(".codehilite > pre, pre > code");
Array.prototype.forEach.call(blocks, function (block, index) {
var id = "__code_" + index;
/* Create button with message container */
var button = JSX.createElement(
"button",
{ "class": "md-clipboard", title: translate("clipboard.copy"),
"data-clipboard-target": "#" + id + " pre, #" + id + " code" },
JSX.createElement("span", { "class": "md-clipboard__message" })
);
/* Link to block and insert button */
var parent = block.parentNode;
parent.id = id;
parent.insertBefore(button, block);
});
/* Initialize Clipboard listener */
var copy = new _clipboard2.default(".md-clipboard");
/* Success handler */
copy.on("success", function (action) {
var message = action.trigger.querySelector(".md-clipboard__message");
if (!(message instanceof HTMLElement)) throw new ReferenceError();
/* Clear selection and reset debounce logic */
action.clearSelection();
if (message.dataset.mdTimer) clearTimeout(parseInt(message.dataset.mdTimer, 10));
/* Set message indicating success and show it */
message.classList.add("md-clipboard__message--active");
message.innerHTML = translate("clipboard.copied");
/* Hide message after two seconds */
message.dataset.mdTimer = setTimeout(function () {
message.classList.remove("md-clipboard__message--active");
message.dataset.mdTimer = "";
}, 2000).toString();
});
}
/* Polyfill details/summary functionality */
if (!Modernizr.details) {
var _blocks = document.querySelectorAll("details > summary");
Array.prototype.forEach.call(_blocks, function (summary) {
summary.addEventListener("click", function (ev) {
var details = ev.target.parentNode;
if (details.hasAttribute("open")) {
details.removeAttribute("open");
} else {
details.setAttribute("open", "");
}
});
});
}
/* Open details after anchor jump */
var details = function details() {
if (document.location.hash) {
var el = document.getElementById(document.location.hash.substring(1));
if (!el) return;
/* Walk up as long as we're not in a details tag */
var parent = el.parentNode;
while (parent && !(parent instanceof HTMLDetailsElement)) {
parent = parent.parentNode;
} /* If there's a details tag, open it */
if (parent && !parent.open) {
parent.open = true;
/* Force reload, so the viewport repositions */
var loc = location.hash;
location.hash = " ";
location.hash = loc;
}
}
};
window.addEventListener("hashchange", details);
details();
/* Force 1px scroll offset to trigger overflow scrolling */
if (Modernizr.ios) {
var scrollable = document.querySelectorAll("[data-md-scrollfix]");
Array.prototype.forEach.call(scrollable, function (item) {
item.addEventListener("touchstart", function () {
var top = item.scrollTop;
/* We're at the top of the container */
if (top === 0) {
item.scrollTop = 1;
/* We're at the bottom of the container */
} else if (top + item.offsetHeight === item.scrollHeight) {
item.scrollTop = top - 1;
}
});
});
}
}).listen();
/* Component: header shadow toggle */
new _Material2.default.Event.Listener(window, ["scroll", "resize", "orientationchange"], new _Material2.default.Header.Shadow("[data-md-component=container]", "[data-md-component=header]")).listen();
/* Component: header title toggle */
new _Material2.default.Event.Listener(window, ["scroll", "resize", "orientationchange"], new _Material2.default.Header.Title("[data-md-component=title]", ".md-typeset h1")).listen();
/* Component: hero visibility toggle */
if (document.querySelector("[data-md-component=hero]")) new _Material2.default.Event.Listener(window, ["scroll", "resize", "orientationchange"], new _Material2.default.Tabs.Toggle("[data-md-component=hero]")).listen();
/* Component: tabs visibility toggle */
if (document.querySelector("[data-md-component=tabs]")) new _Material2.default.Event.Listener(window, ["scroll", "resize", "orientationchange"], new _Material2.default.Tabs.Toggle("[data-md-component=tabs]")).listen();
/* Component: sidebar with navigation */
new _Material2.default.Event.MatchMedia("(min-width: 1220px)", new _Material2.default.Event.Listener(window, ["scroll", "resize", "orientationchange"], new _Material2.default.Sidebar.Position("[data-md-component=navigation]", "[data-md-component=header]")));
/* Component: sidebar with table of contents (missing on 404 page) */
if (document.querySelector("[data-md-component=toc]")) new _Material2.default.Event.MatchMedia("(min-width: 960px)", new _Material2.default.Event.Listener(window, ["scroll", "resize", "orientationchange"], new _Material2.default.Sidebar.Position("[data-md-component=toc]", "[data-md-component=header]")));
/* Component: link blurring for table of contents */
new _Material2.default.Event.MatchMedia("(min-width: 960px)", new _Material2.default.Event.Listener(window, "scroll", new _Material2.default.Nav.Blur("[data-md-component=toc] [href]")));
/* Component: collapsible elements for navigation */
var collapsibles = document.querySelectorAll("[data-md-component=collapsible]");
Array.prototype.forEach.call(collapsibles, function (collapse) {
new _Material2.default.Event.MatchMedia("(min-width: 1220px)", new _Material2.default.Event.Listener(collapse.previousElementSibling, "click", new _Material2.default.Nav.Collapse(collapse)));
});
/* Component: active pane monitor for iOS scrolling fixes */
new _Material2.default.Event.MatchMedia("(max-width: 1219px)", new _Material2.default.Event.Listener("[data-md-component=navigation] [data-md-toggle]", "change", new _Material2.default.Nav.Scrolling("[data-md-component=navigation] nav")));
/* Initialize search, if available */
if (document.querySelector("[data-md-component=search]")) {
/* Component: search body lock for mobile */
new _Material2.default.Event.MatchMedia("(max-width: 959px)", new _Material2.default.Event.Listener("[data-md-toggle=search]", "change", new _Material2.default.Search.Lock("[data-md-toggle=search]")));
/* Component: search results */
new _Material2.default.Event.Listener("[data-md-component=query]", ["focus", "keyup", "change"], new _Material2.default.Search.Result("[data-md-component=result]", function () {
return fetch(config.url.base + "/" + (config.version < "0.17" ? "mkdocs" : "search") + "/search_index.json", {
credentials: "same-origin"
}).then(function (response) {
return response.json();
}).then(function (data) {
return data.docs.map(function (doc) {
doc.location = config.url.base + "/" + doc.location;
return doc;
});
});
})).listen();
/* Listener: focus input after form reset */
new _Material2.default.Event.Listener("[data-md-component=reset]", "click", function () {
setTimeout(function () {
var query = document.querySelector("[data-md-component=query]");
if (!(query instanceof HTMLInputElement)) throw new ReferenceError();
query.focus();
}, 10);
}).listen();
/* Listener: focus input after opening search */
new _Material2.default.Event.Listener("[data-md-toggle=search]", "change", function (ev) {
setTimeout(function (toggle) {
if (!(toggle instanceof HTMLInputElement)) throw new ReferenceError();
if (toggle.checked) {
var query = document.querySelector("[data-md-component=query]");
if (!(query instanceof HTMLInputElement)) throw new ReferenceError();
query.focus();
}
}, 400, ev.target);
}).listen();
/* Listener: open search on focus */
new _Material2.default.Event.MatchMedia("(min-width: 960px)", new _Material2.default.Event.Listener("[data-md-component=query]", "focus", function () {
var toggle = document.querySelector("[data-md-toggle=search]");
if (!(toggle instanceof HTMLInputElement)) throw new ReferenceError();
if (!toggle.checked) {
toggle.checked = true;
toggle.dispatchEvent(new CustomEvent("change"));
}
}));
/* Listener: keyboard handlers */ // eslint-disable-next-line complexity
new _Material2.default.Event.Listener(window, "keydown", function (ev) {
// TODO: split up into component to reduce complexity
var toggle = document.querySelector("[data-md-toggle=search]");
if (!(toggle instanceof HTMLInputElement)) throw new ReferenceError();
var query = document.querySelector("[data-md-component=query]");
if (!(query instanceof HTMLInputElement)) throw new ReferenceError();
/* Abort if meta key (macOS) or ctrl key (Windows) is pressed */
if (ev.metaKey || ev.ctrlKey) return;
/* Search is open */
if (toggle.checked) {
/* Enter: prevent form submission */
if (ev.keyCode === 13) {
if (query === document.activeElement) {
ev.preventDefault();
/* Go to current active/focused link */
var focus = document.querySelector("[data-md-component=search] [href][data-md-state=active]");
if (focus instanceof HTMLLinkElement) {
window.location = focus.getAttribute("href");
/* Close search */
toggle.checked = false;
toggle.dispatchEvent(new CustomEvent("change"));
query.blur();
}
}
/* Escape or Tab: close search */
} else if (ev.keyCode === 9 || ev.keyCode === 27) {
toggle.checked = false;
toggle.dispatchEvent(new CustomEvent("change"));
query.blur();
/* Horizontal arrows and backspace: focus input */
} else if ([8, 37, 39].indexOf(ev.keyCode) !== -1) {
if (query !== document.activeElement) query.focus();
/* Vertical arrows: select previous or next search result */
} else if ([38, 40].indexOf(ev.keyCode) !== -1) {
var key = ev.keyCode;
/* Retrieve all results */
var links = Array.prototype.slice.call(document.querySelectorAll("[data-md-component=query], [data-md-component=search] [href]"));
/* Retrieve current active/focused result */
var _focus = links.find(function (link) {
if (!(link instanceof HTMLElement)) throw new ReferenceError();
return link.dataset.mdState === "active";
});
if (_focus) _focus.dataset.mdState = "";
/* Calculate index depending on direction, add length to form ring */
var index = Math.max(0, (links.indexOf(_focus) + links.length + (key === 38 ? -1 : +1)) % links.length);
/* Set active state and focus */
if (links[index]) {
links[index].dataset.mdState = "active";
links[index].focus();
}
/* Prevent scrolling of page */
ev.preventDefault();
ev.stopPropagation();
/* Return false prevents the cursor position from changing */
return false;
}
/* Search is closed and we're not inside a form */
} else if (document.activeElement && !document.activeElement.form) {
/* F/S: Open search if not in input field */
if (ev.keyCode === 70 || ev.keyCode === 83) {
query.focus();
ev.preventDefault();
}
}
}).listen();
/* Listener: focus query if in search is open and character is typed */
new _Material2.default.Event.Listener(window, "keypress", function () {
var toggle = document.querySelector("[data-md-toggle=search]");
if (!(toggle instanceof HTMLInputElement)) throw new ReferenceError();
if (toggle.checked) {
var query = document.querySelector("[data-md-component=query]");
if (!(query instanceof HTMLInputElement)) throw new ReferenceError();
if (query !== document.activeElement) query.focus();
}
}).listen();
}
/* Listener: handle tabbing context for better accessibility */
new _Material2.default.Event.Listener(document.body, "keydown", function (ev) {
if (ev.keyCode === 9) {
var labels = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])");
Array.prototype.forEach.call(labels, function (label) {
if (label.offsetHeight) label.tabIndex = 0;
});
}
}).listen();
/* Listener: reset tabbing behavior */
new _Material2.default.Event.Listener(document.body, "mousedown", function () {
var labels = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]");
Array.prototype.forEach.call(labels, function (label) {
label.removeAttribute("tabIndex");
});
}).listen();
document.body.addEventListener("click", function () {
if (document.body.dataset.mdState === "tabbing") document.body.dataset.mdState = "";
});
/* Listener: close drawer when anchor links are clicked */
new _Material2.default.Event.MatchMedia("(max-width: 959px)", new _Material2.default.Event.Listener("[data-md-component=navigation] [href^='#']", "click", function () {
var toggle = document.querySelector("[data-md-toggle=drawer]");
if (!(toggle instanceof HTMLInputElement)) throw new ReferenceError();
if (toggle.checked) {
toggle.checked = false;
toggle.dispatchEvent(new CustomEvent("change"));
}
}))
/* Retrieve facts for the given repository type */
;(function () {
var el = document.querySelector("[data-md-source]");
if (!el) return _promisePolyfill2.default.resolve([]);else if (!(el instanceof HTMLAnchorElement)) throw new ReferenceError();
switch (el.dataset.mdSource) {
case "github":
return new _Material2.default.Source.Adapter.GitHub(el).fetch();
default:
return _promisePolyfill2.default.resolve([]);
}
/* Render repository information */
})().then(function (facts) {
var sources = document.querySelectorAll("[data-md-source]");
Array.prototype.forEach.call(sources, function (source) {
new _Material2.default.Source.Repository(source).initialize(facts);
});
});
}
/* ----------------------------------------------------------------------------
* Exports
* ------------------------------------------------------------------------- */
/* Provide this for downward compatibility for now */
var app = {
initialize: initialize
};
exports.app = app;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__.p + "assets/images/icons/bitbucket.svg";
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__.p + "assets/images/icons/github.svg";
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__.p + "assets/images/icons/gitlab.svg";
/***/ }),
/* 10 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 11 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 12 */
/***/ (function(module, exports) {
// Polyfill for creating CustomEvents on IE9/10/11
// code pulled from:
// https://github.com/d4tocchini/customevent-polyfill
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill
(function() {
if (typeof window === 'undefined') {
return;
}
try {
var ce = new window.CustomEvent('test', { cancelable: true });
ce.preventDefault();
if (ce.defaultPrevented !== true) {
// IE has problems with .preventDefault() on custom events
// http://stackoverflow.com/questions/23349191
throw new Error('Could not prevent default');
}
} catch (e) {
var CustomEvent = function(event, params) {
var evt, origPrevent;
params = params || {
bubbles: false,
cancelable: false,
detail: undefined
};
evt = document.createEvent('CustomEvent');
evt.initCustomEvent(
event,
params.bubbles,
params.cancelable,
params.detail
);
origPrevent = evt.preventDefault;
evt.preventDefault = function() {
origPrevent.call(this);
try {
Object.defineProperty(this, 'defaultPrevented', {
get: function() {
return true;
}
});
} catch (e) {
this.defaultPrevented = true;
}
};
return evt;
};
CustomEvent.prototype = window.Event.prototype;
window.CustomEvent = CustomEvent; // expose definition to window
}
})();
/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {
if (!window.fetch) window.fetch = __webpack_require__(2).default || __webpack_require__(2);
/***/ }),
/* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* WEBPACK VAR INJECTION */(function(setImmediate) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__finally__ = __webpack_require__(18);
// Store setTimeout reference so promise-polyfill will be unaffected by
// other code modifying setTimeout (like sinon.useFakeTimers())
var setTimeoutFunc = setTimeout;
function noop() {}
// Polyfill for Function.prototype.bind
function bind(fn, thisArg) {
return function() {
fn.apply(thisArg, arguments);
};
}
/**
* @constructor
* @param {Function} fn
*/
function Promise(fn) {
if (!(this instanceof Promise))
throw new TypeError('Promises must be constructed via new');
if (typeof fn !== 'function') throw new TypeError('not a function');
/** @type {!number} */
this._state = 0;
/** @type {!boolean} */
this._handled = false;
/** @type {Promise|undefined} */
this._value = undefined;
/** @type {!Array<!Function>} */
this._deferreds = [];
doResolve(fn, this);
}
function handle(self, deferred) {
while (self._state === 3) {
self = self._value;
}
if (self._state === 0) {
self._deferreds.push(deferred);
return;
}
self._handled = true;
Promise._immediateFn(function() {
var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
if (cb === null) {
(self._state === 1 ? resolve : reject)(deferred.promise, self._value);
return;
}
var ret;
try {
ret = cb(self._value);
} catch (e) {
reject(deferred.promise, e);
return;
}
resolve(deferred.promise, ret);
});
}
function resolve(self, newValue) {
try {
// Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
if (newValue === self)
throw new TypeError('A promise cannot be resolved with itself.');
if (
newValue &&
(typeof newValue === 'object' || typeof newValue === 'function')
) {
var then = newValue.then;
if (newValue instanceof Promise) {
self._state = 3;
self._value = newValue;
finale(self);
return;
} else if (typeof then === 'function') {
doResolve(bind(then, newValue), self);
return;
}
}
self._state = 1;
self._value = newValue;
finale(self);
} catch (e) {
reject(self, e);
}
}
function reject(self, newValue) {
self._state = 2;
self._value = newValue;
finale(self);
}
function finale(self) {
if (self._state === 2 && self._deferreds.length === 0) {
Promise._immediateFn(function() {
if (!self._handled) {
Promise._unhandledRejectionFn(self._value);
}
});
}
for (var i = 0, len = self._deferreds.length; i < len; i++) {
handle(self, self._deferreds[i]);
}
self._deferreds = null;
}
/**
* @constructor
*/
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
this.onRejected = typeof onRejected === 'function' ? onRejected : null;
this.promise = promise;
}
/**
* Take a potentially misbehaving resolver function and make sure
* onFulfilled and onRejected are only called once.
*
* Makes no guarantees about asynchrony.
*/
function doResolve(fn, self) {
var done = false;
try {
fn(
function(value) {
if (done) return;
done = true;
resolve(self, value);
},
function(reason) {
if (done) return;
done = true;
reject(self, reason);
}
);
} catch (ex) {
if (done) return;
done = true;
reject(self, ex);
}
}
Promise.prototype['catch'] = function(onRejected) {
return this.then(null, onRejected);
};
Promise.prototype.then = function(onFulfilled, onRejected) {
// @ts-ignore
var prom = new this.constructor(noop);
handle(this, new Handler(onFulfilled, onRejected, prom));
return prom;
};
Promise.prototype['finally'] = __WEBPACK_IMPORTED_MODULE_0__finally__["a" /* default */];
Promise.all = function(arr) {
return new Promise(function(resolve, reject) {
if (!arr || typeof arr.length === 'undefined')
throw new TypeError('Promise.all accepts an array');
var args = Array.prototype.slice.call(arr);
if (args.length === 0) return resolve([]);
var remaining = args.length;
function res(i, val) {
try {
if (val && (typeof val === 'object' || typeof val === 'function')) {
var then = val.then;
if (typeof then === 'function') {
then.call(
val,
function(val) {
res(i, val);
},
reject
);
return;
}
}
args[i] = val;
if (--remaining === 0) {
resolve(args);
}
} catch (ex) {
reject(ex);
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i]);
}
});
};
Promise.resolve = function(value) {
if (value && typeof value === 'object' && value.constructor === Promise) {
return value;
}
return new Promise(function(resolve) {
resolve(value);
});
};
Promise.reject = function(value) {
return new Promise(function(resolve, reject) {
reject(value);
});
};
Promise.race = function(values) {
return new Promise(function(resolve, reject) {
for (var i = 0, len = values.length; i < len; i++) {
values[i].then(resolve, reject);
}
});
};
// Use polyfill for setImmediate for performance gains
Promise._immediateFn =
(typeof setImmediate === 'function' &&
function(fn) {
setImmediate(fn);
}) ||
function(fn) {
setTimeoutFunc(fn, 0);
};
Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
if (typeof console !== 'undefined' && console) {
console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
}
};
/* harmony default export */ __webpack_exports__["default"] = (Promise);
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(15).setImmediate))
/***/ }),
/* 15 */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
(typeof self !== "undefined" && self) ||
window;
var apply = Function.prototype.apply;
// DOM APIs, for completeness
exports.setTimeout = function() {
return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
};
exports.setInterval = function() {
return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
};
exports.clearTimeout =
exports.clearInterval = function(timeout) {
if (timeout) {
timeout.close();
}
};
function Timeout(id, clearFn) {
this._id = id;
this._clearFn = clearFn;
}
Timeout.prototype.unref = Timeout.prototype.ref = function() {};
Timeout.prototype.close = function() {
this._clearFn.call(scope, this._id);
};
// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
clearTimeout(item._idleTimeoutId);
item._idleTimeout = msecs;
};
exports.unenroll = function(item) {
clearTimeout(item._idleTimeoutId);
item._idleTimeout = -1;
};
exports._unrefActive = exports.active = function(item) {
clearTimeout(item._idleTimeoutId);
var msecs = item._idleTimeout;
if (msecs >= 0) {
item._idleTimeoutId = setTimeout(function onTimeout() {
if (item._onTimeout)
item._onTimeout();
}, msecs);
}
};
// setimmediate attaches itself to the global object
__webpack_require__(16);
// On some exotic environments, it's not clear which object `setimmediate` was
// able to install onto. Search each possibility in the same order as the
// `setimmediate` library.
exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
(typeof global !== "undefined" && global.setImmediate) ||
(this && this.setImmediate);
exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
(typeof global !== "undefined" && global.clearImmediate) ||
(this && this.clearImmediate);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
"use strict";
if (global.setImmediate) {
return;
}
var nextHandle = 1; // Spec says greater than zero
var tasksByHandle = {};
var currentlyRunningATask = false;
var doc = global.document;
var registerImmediate;
function setImmediate(callback) {
// Callback can either be a function or a string
if (typeof callback !== "function") {
callback = new Function("" + callback);
}
// Copy function arguments
var args = new Array(arguments.length - 1);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i + 1];
}
// Store and register the task
var task = { callback: callback, args: args };
tasksByHandle[nextHandle] = task;
registerImmediate(nextHandle);
return nextHandle++;
}
function clearImmediate(handle) {
delete tasksByHandle[handle];
}
function run(task) {
var callback = task.callback;
var args = task.args;
switch (args.length) {
case 0:
callback();
break;
case 1:
callback(args[0]);
break;
case 2:
callback(args[0], args[1]);
break;
case 3:
callback(args[0], args[1], args[2]);
break;
default:
callback.apply(undefined, args);
break;
}
}
function runIfPresent(handle) {
// From the spec: "Wait until any invocations of this algorithm started before this one have completed."
// So if we're currently running a task, we'll need to delay this invocation.
if (currentlyRunningATask) {
// Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
// "too much recursion" error.
setTimeout(runIfPresent, 0, handle);
} else {
var task = tasksByHandle[handle];
if (task) {
currentlyRunningATask = true;
try {
run(task);
} finally {
clearImmediate(handle);
currentlyRunningATask = false;
}
}
}
}
function installNextTickImplementation() {
registerImmediate = function(handle) {
process.nextTick(function () { runIfPresent(handle); });
};
}
function canUsePostMessage() {
// The test against `importScripts` prevents this implementation from being installed inside a web worker,
// where `global.postMessage` means something completely different and can't be used for this purpose.
if (global.postMessage && !global.importScripts) {
var postMessageIsAsynchronous = true;
var oldOnMessage = global.onmessage;
global.onmessage = function() {
postMessageIsAsynchronous = false;
};
global.postMessage("", "*");
global.onmessage = oldOnMessage;
return postMessageIsAsynchronous;
}
}
function installPostMessageImplementation() {
// Installs an event handler on `global` for the `message` event: see
// * https://developer.mozilla.org/en/DOM/window.postMessage
// * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
var messagePrefix = "setImmediate$" + Math.random() + "$";
var onGlobalMessage = function(event) {
if (event.source === global &&
typeof event.data === "string" &&
event.data.indexOf(messagePrefix) === 0) {
runIfPresent(+event.data.slice(messagePrefix.length));
}
};
if (global.addEventListener) {
global.addEventListener("message", onGlobalMessage, false);
} else {
global.attachEvent("onmessage", onGlobalMessage);
}
registerImmediate = function(handle) {
global.postMessage(messagePrefix + handle, "*");
};
}
function installMessageChannelImplementation() {
var channel = new MessageChannel();
channel.port1.onmessage = function(event) {
var handle = event.data;
runIfPresent(handle);
};
registerImmediate = function(handle) {
channel.port2.postMessage(handle);
};
}
function installReadyStateChangeImplementation() {
var html = doc.documentElement;
registerImmediate = function(handle) {
// Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
// into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
var script = doc.createElement("script");
script.onreadystatechange = function () {
runIfPresent(handle);
script.onreadystatechange = null;
html.removeChild(script);
script = null;
};
html.appendChild(script);
};
}
function installSetTimeoutImplementation() {
registerImmediate = function(handle) {
setTimeout(runIfPresent, 0, handle);
};
}
// If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
// Don't get fooled by e.g. browserify environments.
if ({}.toString.call(global.process) === "[object process]") {
// For Node.js before 0.9
installNextTickImplementation();
} else if (canUsePostMessage()) {
// For non-IE10 modern browsers
installPostMessageImplementation();
} else if (global.MessageChannel) {
// For web workers, where supported
installMessageChannelImplementation();
} else if (doc && "onreadystatechange" in doc.createElement("script")) {
// For IE 6–8
installReadyStateChangeImplementation();
} else {
// For older browsers
installSetTimeoutImplementation();
}
attachTo.setImmediate = setImmediate;
attachTo.clearImmediate = clearImmediate;
}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(17)))
/***/ }),
/* 17 */
/***/ (function(module, exports) {
// shim for using process in browser
var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
throw new Error('clearTimeout has not been defined');
}
(function () {
try {
if (typeof setTimeout === 'function') {
cachedSetTimeout = setTimeout;
} else {
cachedSetTimeout = defaultSetTimout;
}
} catch (e) {
cachedSetTimeout = defaultSetTimout;
}
try {
if (typeof clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
} else {
cachedClearTimeout = defaultClearTimeout;
}
} catch (e) {
cachedClearTimeout = defaultClearTimeout;
}
} ())
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
}
// if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch(e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch(e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
}
// if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;
process.listeners = function (name) { return [] }
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
/***/ }),
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/**
* @this {Promise}
*/
function finallyConstructor(callback) {
var constructor = this.constructor;
return this.then(
function(value) {
return constructor.resolve(callback()).then(function() {
return value;
});
},
function(reason) {
return constructor.resolve(callback()).then(function() {
return constructor.reject(reason);
});
}
);
}
/* harmony default export */ __webpack_exports__["a"] = (finallyConstructor);
/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {
/*!
* clipboard.js v2.0.4
* https://zenorocha.github.io/clipboard.js
*
* Licensed MIT © Zeno Rocha
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(true)
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["ClipboardJS"] = factory();
else
root["ClipboardJS"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _clipboardAction = __webpack_require__(1);
var _clipboardAction2 = _interopRequireDefault(_clipboardAction);
var _tinyEmitter = __webpack_require__(3);
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);
var _goodListener = __webpack_require__(4);
var _goodListener2 = _interopRequireDefault(_goodListener);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Base class which takes one or more elements, adds event listeners to them,
* and instantiates a new `ClipboardAction` on each click.
*/
var Clipboard = function (_Emitter) {
_inherits(Clipboard, _Emitter);
/**
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
* @param {Object} options
*/
function Clipboard(trigger, options) {
_classCallCheck(this, Clipboard);
var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));
_this.resolveOptions(options);
_this.listenClick(trigger);
return _this;
}
/**
* Defines if attributes would be resolved using internal setter functions
* or custom functions that were passed in the constructor.
* @param {Object} options
*/
_createClass(Clipboard, [{
key: 'resolveOptions',
value: function resolveOptions() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
this.text = typeof options.text === 'function' ? options.text : this.defaultText;
this.container = _typeof(options.container) === 'object' ? options.container : document.body;
}
/**
* Adds a click event listener to the passed trigger.
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
*/
}, {
key: 'listenClick',
value: function listenClick(trigger) {
var _this2 = this;
this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) {
return _this2.onClick(e);
});
}
/**
* Defines a new `ClipboardAction` on each click event.
* @param {Event} e
*/
}, {
key: 'onClick',
value: function onClick(e) {
var trigger = e.delegateTarget || e.currentTarget;
if (this.clipboardAction) {
this.clipboardAction = null;
}
this.clipboardAction = new _clipboardAction2.default({
action: this.action(trigger),
target: this.target(trigger),
text: this.text(trigger),
container: this.container,
trigger: trigger,
emitter: this
});
}
/**
* Default `action` lookup function.
* @param {Element} trigger
*/
}, {
key: 'defaultAction',
value: function defaultAction(trigger) {
return getAttributeValue('action', trigger);
}
/**
* Default `target` lookup function.
* @param {Element} trigger
*/
}, {
key: 'defaultTarget',
value: function defaultTarget(trigger) {
var selector = getAttributeValue('target', trigger);
if (selector) {
return document.querySelector(selector);
}
}
/**
* Returns the support of the given action, or all actions if no action is
* given.
* @param {String} [action]
*/
}, {
key: 'defaultText',
/**
* Default `text` lookup function.
* @param {Element} trigger
*/
value: function defaultText(trigger) {
return getAttributeValue('text', trigger);
}
/**
* Destroy lifecycle.
*/
}, {
key: 'destroy',
value: function destroy() {
this.listener.destroy();
if (this.clipboardAction) {
this.clipboardAction.destroy();
this.clipboardAction = null;
}
}
}], [{
key: 'isSupported',
value: function isSupported() {
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
var actions = typeof action === 'string' ? [action] : action;
var support = !!document.queryCommandSupported;
actions.forEach(function (action) {
support = support && !!document.queryCommandSupported(action);
});
return support;
}
}]);
return Clipboard;
}(_tinyEmitter2.default);
/**
* Helper function to retrieve attribute value.
* @param {String} suffix
* @param {Element} element
*/
function getAttributeValue(suffix, element) {
var attribute = 'data-clipboard-' + suffix;
if (!element.hasAttribute(attribute)) {
return;
}
return element.getAttribute(attribute);
}
module.exports = Clipboard;
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _select = __webpack_require__(2);
var _select2 = _interopRequireDefault(_select);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Inner class which performs selection from either `text` or `target`
* properties and then executes copy or cut operations.
*/
var ClipboardAction = function () {
/**
* @param {Object} options
*/
function ClipboardAction(options) {
_classCallCheck(this, ClipboardAction);
this.resolveOptions(options);
this.initSelection();
}
/**
* Defines base properties passed from constructor.
* @param {Object} options
*/
_createClass(ClipboardAction, [{
key: 'resolveOptions',
value: function resolveOptions() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.action = options.action;
this.container = options.container;
this.emitter = options.emitter;
this.target = options.target;
this.text = options.text;
this.trigger = options.trigger;
this.selectedText = '';
}
/**
* Decides which selection strategy is going to be applied based
* on the existence of `text` and `target` properties.
*/
}, {
key: 'initSelection',
value: function initSelection() {
if (this.text) {
this.selectFake();
} else if (this.target) {
this.selectTarget();
}
}
/**
* Creates a fake textarea element, sets its value from `text` property,
* and makes a selection on it.
*/
}, {
key: 'selectFake',
value: function selectFake() {
var _this = this;
var isRTL = document.documentElement.getAttribute('dir') == 'rtl';
this.removeFake();
this.fakeHandlerCallback = function () {
return _this.removeFake();
};
this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;
this.fakeElem = document.createElement('textarea');
// Prevent zooming on iOS
this.fakeElem.style.fontSize = '12pt';
// Reset box model
this.fakeElem.style.border = '0';
this.fakeElem.style.padding = '0';
this.fakeElem.style.margin = '0';
// Move element out of screen horizontally
this.fakeElem.style.position = 'absolute';
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
// Move element to the same position vertically
var yPosition = window.pageYOffset || document.documentElement.scrollTop;
this.fakeElem.style.top = yPosition + 'px';
this.fakeElem.setAttribute('readonly', '');
this.fakeElem.value = this.text;
this.container.appendChild(this.fakeElem);
this.selectedText = (0, _select2.default)(this.fakeElem);
this.copyText();
}
/**
* Only removes the fake element after another click event, that way
* a user can hit `Ctrl+C` to copy because selection still exists.
*/
}, {
key: 'removeFake',
value: function removeFake() {
if (this.fakeHandler) {
this.container.removeEventListener('click', this.fakeHandlerCallback);
this.fakeHandler = null;
this.fakeHandlerCallback = null;
}
if (this.fakeElem) {
this.container.removeChild(this.fakeElem);
this.fakeElem = null;
}
}
/**
* Selects the content from element passed on `target` property.
*/
}, {
key: 'selectTarget',
value: function selectTarget() {
this.selectedText = (0, _select2.default)(this.target);
this.copyText();
}
/**
* Executes the copy operation based on the current selection.
*/
}, {
key: 'copyText',
value: function copyText() {
var succeeded = void 0;
try {
succeeded = document.execCommand(this.action);
} catch (err) {
succeeded = false;
}
this.handleResult(succeeded);
}
/**
* Fires an event based on the copy operation result.
* @param {Boolean} succeeded
*/
}, {
key: 'handleResult',
value: function handleResult(succeeded) {
this.emitter.emit(succeeded ? 'success' : 'error', {
action: this.action,
text: this.selectedText,
trigger: this.trigger,
clearSelection: this.clearSelection.bind(this)
});
}
/**
* Moves focus away from `target` and back to the trigger, removes current selection.
*/
}, {
key: 'clearSelection',
value: function clearSelection() {
if (this.trigger) {
this.trigger.focus();
}
window.getSelection().removeAllRanges();
}
/**
* Sets the `action` to be performed which can be either 'copy' or 'cut'.
* @param {String} action
*/
}, {
key: 'destroy',
/**
* Destroy lifecycle.
*/
value: function destroy() {
this.removeFake();
}
}, {
key: 'action',
set: function set() {
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';
this._action = action;
if (this._action !== 'copy' && this._action !== 'cut') {
throw new Error('Invalid "action" value, use either "copy" or "cut"');
}
}
/**
* Gets the `action` property.
* @return {String}
*/
,
get: function get() {
return this._action;
}
/**
* Sets the `target` property using an element
* that will be have its content copied.
* @param {Element} target
*/
}, {
key: 'target',
set: function set(target) {
if (target !== undefined) {
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {
if (this.action === 'copy' && target.hasAttribute('disabled')) {
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
}
if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
}
this._target = target;
} else {
throw new Error('Invalid "target" value, use a valid Element');
}
}
}
/**
* Gets the `target` property.
* @return {String|HTMLElement}
*/
,
get: function get() {
return this._target;
}
}]);
return ClipboardAction;
}();
module.exports = ClipboardAction;
/***/ }),
/* 2 */
/***/ (function(module, exports) {
function select(element) {
var selectedText;
if (element.nodeName === 'SELECT') {
element.focus();
selectedText = element.value;
}
else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
var isReadOnly = element.hasAttribute('readonly');
if (!isReadOnly) {
element.setAttribute('readonly', '');
}
element.select();
element.setSelectionRange(0, element.value.length);
if (!isReadOnly) {
element.removeAttribute('readonly');
}
selectedText = element.value;
}
else {
if (element.hasAttribute('contenteditable')) {
element.focus();
}
var selection = window.getSelection();
var range = document.createRange();
range.selectNodeContents(element);
selection.removeAllRanges();
selection.addRange(range);
selectedText = selection.toString();
}
return selectedText;
}
module.exports = select;
/***/ }),
/* 3 */
/***/ (function(module, exports) {
function E () {
// Keep this empty so it's easier to inherit from
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
}
E.prototype = {
on: function (name, callback, ctx) {
var e = this.e || (this.e = {});
(e[name] || (e[name] = [])).push({
fn: callback,
ctx: ctx
});
return this;
},
once: function (name, callback, ctx) {
var self = this;
function listener () {
self.off(name, listener);
callback.apply(ctx, arguments);
};
listener._ = callback
return this.on(name, listener, ctx);
},
emit: function (name) {
var data = [].slice.call(arguments, 1);
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
var i = 0;
var len = evtArr.length;
for (i; i < len; i++) {
evtArr[i].fn.apply(evtArr[i].ctx, data);
}
return this;
},
off: function (name, callback) {
var e = this.e || (this.e = {});
var evts = e[name];
var liveEvents = [];
if (evts && callback) {
for (var i = 0, len = evts.length; i < len; i++) {
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
liveEvents.push(evts[i]);
}
}
// Remove event from queue to prevent memory leak
// Suggested by https://github.com/lazd
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
(liveEvents.length)
? e[name] = liveEvents
: delete e[name];
return this;
}
};
module.exports = E;
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
var is = __webpack_require__(5);
var delegate = __webpack_require__(6);
/**
* Validates all params and calls the right
* listener function based on its target type.
*
* @param {String|HTMLElement|HTMLCollection|NodeList} target
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listen(target, type, callback) {
if (!target && !type && !callback) {
throw new Error('Missing required arguments');
}
if (!is.string(type)) {
throw new TypeError('Second argument must be a String');
}
if (!is.fn(callback)) {
throw new TypeError('Third argument must be a Function');
}
if (is.node(target)) {
return listenNode(target, type, callback);
}
else if (is.nodeList(target)) {
return listenNodeList(target, type, callback);
}
else if (is.string(target)) {
return listenSelector(target, type, callback);
}
else {
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
}
}
/**
* Adds an event listener to a HTML element
* and returns a remove listener function.
*
* @param {HTMLElement} node
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenNode(node, type, callback) {
node.addEventListener(type, callback);
return {
destroy: function() {
node.removeEventListener(type, callback);
}
}
}
/**
* Add an event listener to a list of HTML elements
* and returns a remove listener function.
*
* @param {NodeList|HTMLCollection} nodeList
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenNodeList(nodeList, type, callback) {
Array.prototype.forEach.call(nodeList, function(node) {
node.addEventListener(type, callback);
});
return {
destroy: function() {
Array.prototype.forEach.call(nodeList, function(node) {
node.removeEventListener(type, callback);
});
}
}
}
/**
* Add an event listener to a selector
* and returns a remove listener function.
*
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenSelector(selector, type, callback) {
return delegate(document.body, selector, type, callback);
}
module.exports = listen;
/***/ }),
/* 5 */
/***/ (function(module, exports) {
/**
* Check if argument is a HTML element.
*
* @param {Object} value
* @return {Boolean}
*/
exports.node = function(value) {
return value !== undefined
&& value instanceof HTMLElement
&& value.nodeType === 1;
};
/**
* Check if argument is a list of HTML elements.
*
* @param {Object} value
* @return {Boolean}
*/
exports.nodeList = function(value) {
var type = Object.prototype.toString.call(value);
return value !== undefined
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
&& ('length' in value)
&& (value.length === 0 || exports.node(value[0]));
};
/**
* Check if argument is a string.
*
* @param {Object} value
* @return {Boolean}
*/
exports.string = function(value) {
return typeof value === 'string'
|| value instanceof String;
};
/**
* Check if argument is a function.
*
* @param {Object} value
* @return {Boolean}
*/
exports.fn = function(value) {
var type = Object.prototype.toString.call(value);
return type === '[object Function]';
};
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
var closest = __webpack_require__(7);
/**
* Delegates event to a selector.
*
* @param {Element} element
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @param {Boolean} useCapture
* @return {Object}
*/
function _delegate(element, selector, type, callback, useCapture) {
var listenerFn = listener.apply(this, arguments);
element.addEventListener(type, listenerFn, useCapture);
return {
destroy: function() {
element.removeEventListener(type, listenerFn, useCapture);
}
}
}
/**
* Delegates event to a selector.
*
* @param {Element|String|Array} [elements]
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @param {Boolean} useCapture
* @return {Object}
*/
function delegate(elements, selector, type, callback, useCapture) {
// Handle the regular Element usage
if (typeof elements.addEventListener === 'function') {
return _delegate.apply(null, arguments);
}
// Handle Element-less usage, it defaults to global delegation
if (typeof type === 'function') {
// Use `document` as the first parameter, then apply arguments
// This is a short way to .unshift `arguments` without running into deoptimizations
return _delegate.bind(null, document).apply(null, arguments);
}
// Handle Selector-based usage
if (typeof elements === 'string') {
elements = document.querySelectorAll(elements);
}
// Handle Array-like based usage
return Array.prototype.map.call(elements, function (element) {
return _delegate(element, selector, type, callback, useCapture);
});
}
/**
* Finds closest match and invokes callback.
*
* @param {Element} element
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @return {Function}
*/
function listener(element, selector, type, callback) {
return function(e) {
e.delegateTarget = closest(e.target, selector);
if (e.delegateTarget) {
callback.call(element, e);
}
}
}
module.exports = delegate;
/***/ }),
/* 7 */
/***/ (function(module, exports) {
var DOCUMENT_NODE_TYPE = 9;
/**
* A polyfill for Element.matches()
*/
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
var proto = Element.prototype;
proto.matches = proto.matchesSelector ||
proto.mozMatchesSelector ||
proto.msMatchesSelector ||
proto.oMatchesSelector ||
proto.webkitMatchesSelector;
}
/**
* Finds the closest parent that matches a selector.
*
* @param {Element} element
* @param {String} selector
* @return {Function}
*/
function closest (element, selector) {
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
if (typeof element.matches === 'function' &&
element.matches(selector)) {
return element;
}
element = element.parentNode;
}
}
module.exports = closest;
/***/ })
/******/ ]);
});
/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_RESULT__;;(function () {
'use strict';
/**
* @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.
*
* @codingstandard ftlabs-jsv2
* @copyright The Financial Times Limited [All Rights Reserved]
* @license MIT License (see LICENSE.txt)
*/
/*jslint browser:true, node:true*/
/*global define, Event, Node*/
/**
* Instantiate fast-clicking listeners on the specified layer.
*
* @constructor
* @param {Element} layer The layer to listen on
* @param {Object} [options={}] The options to override the defaults
*/
function FastClick(layer, options) {
var oldOnClick;
options = options || {};
/**
* Whether a click is currently being tracked.
*
* @type boolean
*/
this.trackingClick = false;
/**
* Timestamp for when click tracking started.
*
* @type number
*/
this.trackingClickStart = 0;
/**
* The element being tracked for a click.
*
* @type EventTarget
*/
this.targetElement = null;
/**
* X-coordinate of touch start event.
*
* @type number
*/
this.touchStartX = 0;
/**
* Y-coordinate of touch start event.
*
* @type number
*/
this.touchStartY = 0;
/**
* ID of the last touch, retrieved from Touch.identifier.
*
* @type number
*/
this.lastTouchIdentifier = 0;
/**
* Touchmove boundary, beyond which a click will be cancelled.
*
* @type number
*/
this.touchBoundary = options.touchBoundary || 10;
/**
* The FastClick layer.
*
* @type Element
*/
this.layer = layer;
/**
* The minimum time between tap(touchstart and touchend) events
*
* @type number
*/
this.tapDelay = options.tapDelay || 200;
/**
* The maximum time for a tap
*
* @type number
*/
this.tapTimeout = options.tapTimeout || 700;
if (FastClick.notNeeded(layer)) {
return;
}
// Some old versions of Android don't have Function.prototype.bind
function bind(method, context) {
return function() { return method.apply(context, arguments); };
}
var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];
var context = this;
for (var i = 0, l = methods.length; i < l; i++) {
context[methods[i]] = bind(context[methods[i]], context);
}
// Set up event handlers as required
if (deviceIsAndroid) {
layer.addEventListener('mouseover', this.onMouse, true);
layer.addEventListener('mousedown', this.onMouse, true);
layer.addEventListener('mouseup', this.onMouse, true);
}
layer.addEventListener('click', this.onClick, true);
layer.addEventListener('touchstart', this.onTouchStart, false);
layer.addEventListener('touchmove', this.onTouchMove, false);
layer.addEventListener('touchend', this.onTouchEnd, false);
layer.addEventListener('touchcancel', this.onTouchCancel, false);
// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick
// layer when they are cancelled.
if (!Event.prototype.stopImmediatePropagation) {
layer.removeEventListener = function(type, callback, capture) {
var rmv = Node.prototype.removeEventListener;
if (type === 'click') {
rmv.call(layer, type, callback.hijacked || callback, capture);
} else {
rmv.call(layer, type, callback, capture);
}
};
layer.addEventListener = function(type, callback, capture) {
var adv = Node.prototype.addEventListener;
if (type === 'click') {
adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {
if (!event.propagationStopped) {
callback(event);
}
}), capture);
} else {
adv.call(layer, type, callback, capture);
}
};
}
// If a handler is already declared in the element's onclick attribute, it will be fired before
// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and
// adding it as listener.
if (typeof layer.onclick === 'function') {
// Android browser on at least 3.2 requires a new reference to the function in layer.onclick
// - the old one won't work if passed to addEventListener directly.
oldOnClick = layer.onclick;
layer.addEventListener('click', function(event) {
oldOnClick(event);
}, false);
layer.onclick = null;
}
}
/**
* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.
*
* @type boolean
*/
var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0;
/**
* Android requires exceptions.
*
* @type boolean
*/
var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;
/**
* iOS requires exceptions.
*
* @type boolean
*/
var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;
/**
* iOS 4 requires an exception for select elements.
*
* @type boolean
*/
var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);
/**
* iOS 6.0-7.* requires the target element to be manually derived
*
* @type boolean
*/
var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent);
/**
* BlackBerry requires exceptions.
*
* @type boolean
*/
var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;
/**
* Determine whether a given element requires a native click.
*
* @param {EventTarget|Element} target Target DOM element
* @returns {boolean} Returns true if the element needs a native click
*/
FastClick.prototype.needsClick = function(target) {
switch (target.nodeName.toLowerCase()) {
// Don't send a synthetic click to disabled inputs (issue #62)
case 'button':
case 'select':
case 'textarea':
if (target.disabled) {
return true;
}
break;
case 'input':
// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
if ((deviceIsIOS && target.type === 'file') || target.disabled) {
return true;
}
break;
case 'label':
case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames
case 'video':
return true;
}
return (/\bneedsclick\b/).test(target.className);
};
/**
* Determine whether a given element requires a call to focus to simulate click into element.
*
* @param {EventTarget|Element} target Target DOM element
* @returns {boolean} Returns true if the element requires a call to focus to simulate native click.
*/
FastClick.prototype.needsFocus = function(target) {
switch (target.nodeName.toLowerCase()) {
case 'textarea':
return true;
case 'select':
return !deviceIsAndroid;
case 'input':
switch (target.type) {
case 'button':
case 'checkbox':
case 'file':
case 'image':
case 'radio':
case 'submit':
return false;
}
// No point in attempting to focus disabled inputs
return !target.disabled && !target.readOnly;
default:
return (/\bneedsfocus\b/).test(target.className);
}
};
/**
* Send a click event to the specified element.
*
* @param {EventTarget|Element} targetElement
* @param {Event} event
*/
FastClick.prototype.sendClick = function(targetElement, event) {
var clickEvent, touch;
// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)
if (document.activeElement && document.activeElement !== targetElement) {
document.activeElement.blur();
}
touch = event.changedTouches[0];
// Synthesise a click event, with an extra attribute so it can be tracked
clickEvent = document.createEvent('MouseEvents');
clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
clickEvent.forwardedTouchEvent = true;
targetElement.dispatchEvent(clickEvent);
};
FastClick.prototype.determineEventType = function(targetElement) {
//Issue #159: Android Chrome Select Box does not open with a synthetic click event
if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {
return 'mousedown';
}
return 'click';
};
/**
* @param {EventTarget|Element} targetElement
*/
FastClick.prototype.focus = function(targetElement) {
var length;
// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.
if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {
length = targetElement.value.length;
targetElement.setSelectionRange(length, length);
} else {
targetElement.focus();
}
};
/**
* Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.
*
* @param {EventTarget|Element} targetElement
*/
FastClick.prototype.updateScrollParent = function(targetElement) {
var scrollParent, parentElement;
scrollParent = targetElement.fastClickScrollParent;
// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the
// target element was moved to another parent.
if (!scrollParent || !scrollParent.contains(targetElement)) {
parentElement = targetElement;
do {
if (parentElement.scrollHeight > parentElement.offsetHeight) {
scrollParent = parentElement;
targetElement.fastClickScrollParent = parentElement;
break;
}
parentElement = parentElement.parentElement;
} while (parentElement);
}
// Always update the scroll top tracker if possible.
if (scrollParent) {
scrollParent.fastClickLastScrollTop = scrollParent.scrollTop;
}
};
/**
* @param {EventTarget} targetElement
* @returns {Element|EventTarget}
*/
FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {
// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.
if (eventTarget.nodeType === Node.TEXT_NODE) {
return eventTarget.parentNode;
}
return eventTarget;
};
/**
* On touch start, record the position and scroll offset.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onTouchStart = function(event) {
var targetElement, touch, selection;
// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).
if (event.targetTouches.length > 1) {
return true;
}
targetElement = this.getTargetElementFromEventTarget(event.target);
touch = event.targetTouches[0];
if (deviceIsIOS) {
// Only trusted events will deselect text on iOS (issue #49)
selection = window.getSelection();
if (selection.rangeCount && !selection.isCollapsed) {
return true;
}
if (!deviceIsIOS4) {
// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):
// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched
// with the same identifier as the touch event that previously triggered the click that triggered the alert.
// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an
// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.
// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,
// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,
// random integers, it's safe to to continue if the identifier is 0 here.
if (touch.identifier && touch.identifier === this.lastTouchIdentifier) {
event.preventDefault();
return false;
}
this.lastTouchIdentifier = touch.identifier;
// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:
// 1) the user does a fling scroll on the scrollable layer
// 2) the user stops the fling scroll with another tap
// then the event.target of the last 'touchend' event will be the element that was under the user's finger
// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check
// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).
this.updateScrollParent(targetElement);
}
}
this.trackingClick = true;
this.trackingClickStart = event.timeStamp;
this.targetElement = targetElement;
this.touchStartX = touch.pageX;
this.touchStartY = touch.pageY;
// Prevent phantom clicks on fast double-tap (issue #36)
if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
event.preventDefault();
}
return true;
};
/**
* Based on a touchmove event object, check whether the touch has moved past a boundary since it started.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.touchHasMoved = function(event) {
var touch = event.changedTouches[0], boundary = this.touchBoundary;
if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {
return true;
}
return false;
};
/**
* Update the last position.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onTouchMove = function(event) {
if (!this.trackingClick) {
return true;
}
// If the touch has moved, cancel the click tracking
if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {
this.trackingClick = false;
this.targetElement = null;
}
return true;
};
/**
* Attempt to find the labelled control for the given label element.
*
* @param {EventTarget|HTMLLabelElement} labelElement
* @returns {Element|null}
*/
FastClick.prototype.findControl = function(labelElement) {
// Fast path for newer browsers supporting the HTML5 control attribute
if (labelElement.control !== undefined) {
return labelElement.control;
}
// All browsers under test that support touch events also support the HTML5 htmlFor attribute
if (labelElement.htmlFor) {
return document.getElementById(labelElement.htmlFor);
}
// If no for attribute exists, attempt to retrieve the first labellable descendant element
// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label
return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');
};
/**
* On touch end, determine whether to send a click event at once.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onTouchEnd = function(event) {
var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;
if (!this.trackingClick) {
return true;
}
// Prevent phantom clicks on fast double-tap (issue #36)
if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
this.cancelNextClick = true;
return true;
}
if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {
return true;
}
// Reset to prevent wrong click cancel on input (issue #156).
this.cancelNextClick = false;
this.lastClickTime = event.timeStamp;
trackingClickStart = this.trackingClickStart;
this.trackingClick = false;
this.trackingClickStart = 0;
// On some iOS devices, the targetElement supplied with the event is invalid if the layer
// is performing a transition or scroll, and has to be re-detected manually. Note that
// for this to function correctly, it must be called *after* the event target is checked!
// See issue #57; also filed as rdar://13048589 .
if (deviceIsIOSWithBadTarget) {
touch = event.changedTouches[0];
// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null
targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;
targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;
}
targetTagName = targetElement.tagName.toLowerCase();
if (targetTagName === 'label') {
forElement = this.findControl(targetElement);
if (forElement) {
this.focus(targetElement);
if (deviceIsAndroid) {
return false;
}
targetElement = forElement;
}
} else if (this.needsFocus(targetElement)) {
// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.
// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).
if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
this.targetElement = null;
return false;
}
this.focus(targetElement);
this.sendClick(targetElement, event);
// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.
// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)
if (!deviceIsIOS || targetTagName !== 'select') {
this.targetElement = null;
event.preventDefault();
}
return false;
}
if (deviceIsIOS && !deviceIsIOS4) {
// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled
// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).
scrollParent = targetElement.fastClickScrollParent;
if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {
return true;
}
}
// Prevent the actual click from going though - unless the target node is marked as requiring
// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.
if (!this.needsClick(targetElement)) {
event.preventDefault();
this.sendClick(targetElement, event);
}
return false;
};
/**
* On touch cancel, stop tracking the click.
*
* @returns {void}
*/
FastClick.prototype.onTouchCancel = function() {
this.trackingClick = false;
this.targetElement = null;
};
/**
* Determine mouse events which should be permitted.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onMouse = function(event) {
// If a target element was never set (because a touch event was never fired) allow the event
if (!this.targetElement) {
return true;
}
if (event.forwardedTouchEvent) {
return true;
}
// Programmatically generated events targeting a specific element should be permitted
if (!event.cancelable) {
return true;
}
// Derive and check the target element to see whether the mouse event needs to be permitted;
// unless explicitly enabled, prevent non-touch click events from triggering actions,
// to prevent ghost/doubleclicks.
if (!this.needsClick(this.targetElement) || this.cancelNextClick) {
// Prevent any user-added listeners declared on FastClick element from being fired.
if (event.stopImmediatePropagation) {
event.stopImmediatePropagation();
} else {
// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
event.propagationStopped = true;
}
// Cancel the event
event.stopPropagation();
event.preventDefault();
return false;
}
// If the mouse event is permitted, return true for the action to go through.
return true;
};
/**
* On actual clicks, determine whether this is a touch-generated click, a click action occurring
* naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or
* an actual click which should be permitted.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onClick = function(event) {
var permitted;
// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.
if (this.trackingClick) {
this.targetElement = null;
this.trackingClick = false;
return true;
}
// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.
if (event.target.type === 'submit' && event.detail === 0) {
return true;
}
permitted = this.onMouse(event);
// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.
if (!permitted) {
this.targetElement = null;
}
// If clicks are permitted, return true for the action to go through.
return permitted;
};
/**
* Remove all FastClick's event listeners.
*
* @returns {void}
*/
FastClick.prototype.destroy = function() {
var layer = this.layer;
if (deviceIsAndroid) {
layer.removeEventListener('mouseover', this.onMouse, true);
layer.removeEventListener('mousedown', this.onMouse, true);
layer.removeEventListener('mouseup', this.onMouse, true);
}
layer.removeEventListener('click', this.onClick, true);
layer.removeEventListener('touchstart', this.onTouchStart, false);
layer.removeEventListener('touchmove', this.onTouchMove, false);
layer.removeEventListener('touchend', this.onTouchEnd, false);
layer.removeEventListener('touchcancel', this.onTouchCancel, false);
};
/**
* Check whether FastClick is needed.
*
* @param {Element} layer The layer to listen on
*/
FastClick.notNeeded = function(layer) {
var metaViewport;
var chromeVersion;
var blackberryVersion;
var firefoxVersion;
// Devices that don't support touch don't need FastClick
if (typeof window.ontouchstart === 'undefined') {
return true;
}
// Chrome version - zero for other browsers
chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
if (chromeVersion) {
if (deviceIsAndroid) {
metaViewport = document.querySelector('meta[name=viewport]');
if (metaViewport) {
// Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
return true;
}
// Chrome 32 and above with width=device-width or less don't need FastClick
if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {
return true;
}
}
// Chrome desktop doesn't need FastClick (issue #15)
} else {
return true;
}
}
if (deviceIsBlackBerry10) {
blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/);
// BlackBerry 10.3+ does not require Fastclick library.
// https://github.com/ftlabs/fastclick/issues/251
if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {
metaViewport = document.querySelector('meta[name=viewport]');
if (metaViewport) {
// user-scalable=no eliminates click delay.
if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
return true;
}
// width=device-width (or less than device-width) eliminates click delay.
if (document.documentElement.scrollWidth <= window.outerWidth) {
return true;
}
}
}
}
// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)
if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {
return true;
}
// Firefox version - zero for other browsers
firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
if (firefoxVersion >= 27) {
// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896
metaViewport = document.querySelector('meta[name=viewport]');
if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {
return true;
}
}
// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version
// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx
if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {
return true;
}
return false;
};
/**
* Factory method for creating a FastClick object
*
* @param {Element} layer The layer to listen on
* @param {Object} [options={}] The options to override the defaults
*/
FastClick.attach = function(layer, options) {
return new FastClick(layer, options);
};
if (true) {
// AMD. Register as an anonymous module.
!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
return FastClick;
}).call(exports, __webpack_require__, exports, module),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
} else if (typeof module !== 'undefined' && module.exports) {
module.exports = FastClick.attach;
module.exports.FastClick = FastClick;
} else {
window.FastClick = FastClick;
}
}());
/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
var _Event = __webpack_require__(22);
var _Event2 = _interopRequireDefault(_Event);
var _Header = __webpack_require__(24);
var _Header2 = _interopRequireDefault(_Header);
var _Nav = __webpack_require__(27);
var _Nav2 = _interopRequireDefault(_Nav);
var _Search = __webpack_require__(31);
var _Search2 = _interopRequireDefault(_Search);
var _Sidebar = __webpack_require__(37);
var _Sidebar2 = _interopRequireDefault(_Sidebar);
var _Source = __webpack_require__(39);
var _Source2 = _interopRequireDefault(_Source);
var _Tabs = __webpack_require__(45);
var _Tabs2 = _interopRequireDefault(_Tabs);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* ----------------------------------------------------------------------------
* Module
* ------------------------------------------------------------------------- */
exports.default = {
Event: _Event2.default,
Header: _Header2.default,
Nav: _Nav2.default,
Search: _Search2.default,
Sidebar: _Sidebar2.default,
Source: _Source2.default,
Tabs: _Tabs2.default
}; /*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
var _Listener = __webpack_require__(3);
var _Listener2 = _interopRequireDefault(_Listener);
var _MatchMedia = __webpack_require__(23);
var _MatchMedia2 = _interopRequireDefault(_MatchMedia);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* ----------------------------------------------------------------------------
* Module
* ------------------------------------------------------------------------- */
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
exports.default = {
Listener: _Listener2.default,
MatchMedia: _MatchMedia2.default
};
/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
var _Listener = __webpack_require__(3);
var _Listener2 = _interopRequireDefault(_Listener);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
// eslint-disable-line no-unused-vars
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var MatchMedia =
/**
* Media query listener
*
* This class listens for state changes of media queries and automatically
* switches the given listeners on or off.
*
* @constructor
*
* @property {Function} handler_ - Media query event handler
*
* @param {string} query - Media query to test for
* @param {Listener} listener - Event listener
*/
function MatchMedia(query, listener) {
_classCallCheck(this, MatchMedia);
this.handler_ = function (mq) {
if (mq.matches) listener.listen();else listener.unlisten();
};
/* Initialize media query listener */
var media = window.matchMedia(query);
media.addListener(this.handler_);
/* Always check at initialization */
this.handler_(media);
};
exports.default = MatchMedia;
/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
var _Shadow = __webpack_require__(25);
var _Shadow2 = _interopRequireDefault(_Shadow);
var _Title = __webpack_require__(26);
var _Title2 = _interopRequireDefault(_Title);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* ----------------------------------------------------------------------------
* Module
* ------------------------------------------------------------------------- */
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
exports.default = {
Shadow: _Shadow2.default,
Title: _Title2.default
};
/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Shadow = function () {
/**
* Show or hide header shadow depending on page y-offset
*
* @constructor
*
* @property {HTMLElement} el_ - Content container
* @property {HTMLElement} header_ - Header
* @property {number} height_ - Offset height of previous nodes
* @property {boolean} active_ - Header shadow state
*
* @param {(string|HTMLElement)} el - Selector or HTML element
* @param {(string|HTMLElement)} header - Selector or HTML element
*/
function Shadow(el, header) {
_classCallCheck(this, Shadow);
var ref = typeof el === "string" ? document.querySelector(el) : el;
if (!(ref instanceof HTMLElement) || !(ref.parentNode instanceof HTMLElement)) throw new ReferenceError();
this.el_ = ref.parentNode;
/* Retrieve header */
ref = typeof header === "string" ? document.querySelector(header) : header;
if (!(ref instanceof HTMLElement)) throw new ReferenceError();
this.header_ = ref;
/* Initialize height and state */
this.height_ = 0;
this.active_ = false;
}
/**
* Calculate total height of previous nodes
*/
Shadow.prototype.setup = function setup() {
var current = this.el_;
while (current = current.previousElementSibling) {
if (!(current instanceof HTMLElement)) throw new ReferenceError();
this.height_ += current.offsetHeight;
}
this.update();
};
/**
* Update shadow state
*
* @param {Event} ev - Event
*/
Shadow.prototype.update = function update(ev) {
if (ev && (ev.type === "resize" || ev.type === "orientationchange")) {
this.height_ = 0;
this.setup();
} else {
var active = window.pageYOffset >= this.height_;
if (active !== this.active_) this.header_.dataset.mdState = (this.active_ = active) ? "shadow" : "";
}
};
/**
* Reset shadow state
*/
Shadow.prototype.reset = function reset() {
this.header_.dataset.mdState = "";
this.height_ = 0;
this.active_ = false;
};
return Shadow;
}();
exports.default = Shadow;
/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Title = function () {
/**
* Swap header title topics when header is scrolled past
*
* @constructor
*
* @property {HTMLElement} el_ - Element
* @property {HTMLElement} header_ - Header
* @property {boolean} active_ - Title state
*
* @param {(string|HTMLElement)} el - Selector or HTML element
* @param {(string|HTMLHeadingElement)} header - Selector or HTML element
*/
function Title(el, header) {
_classCallCheck(this, Title);
var ref = typeof el === "string" ? document.querySelector(el) : el;
if (!(ref instanceof HTMLElement)) throw new ReferenceError();
this.el_ = ref;
/* Retrieve header */
ref = typeof header === "string" ? document.querySelector(header) : header;
if (!(ref instanceof HTMLHeadingElement)) throw new ReferenceError();
this.header_ = ref;
/* Initialize state */
this.active_ = false;
}
/**
* Setup title state
*/
Title.prototype.setup = function setup() {
var _this = this;
Array.prototype.forEach.call(this.el_.children, function (node) {
// TODO: use childNodes here for IE?
node.style.width = _this.el_.offsetWidth - 20 + "px";
});
};
/**
* Update title state
*
* @param {Event} ev - Event
*/
Title.prototype.update = function update(ev) {
var _this2 = this;
var active = window.pageYOffset >= this.header_.offsetTop;
if (active !== this.active_) this.el_.dataset.mdState = (this.active_ = active) ? "active" : "";
/* Hack: induce ellipsis on topics */
if (ev.type === "resize" || ev.type === "orientationchange") {
Array.prototype.forEach.call(this.el_.children, function (node) {
node.style.width = _this2.el_.offsetWidth - 20 + "px";
});
}
};
/**
* Reset title state
*/
Title.prototype.reset = function reset() {
this.el_.dataset.mdState = "";
this.el_.style.width = "";
this.active_ = false;
};
return Title;
}();
exports.default = Title;
/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
var _Blur = __webpack_require__(28);
var _Blur2 = _interopRequireDefault(_Blur);
var _Collapse = __webpack_require__(29);
var _Collapse2 = _interopRequireDefault(_Collapse);
var _Scrolling = __webpack_require__(30);
var _Scrolling2 = _interopRequireDefault(_Scrolling);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* ----------------------------------------------------------------------------
* Module
* ------------------------------------------------------------------------- */
exports.default = {
Blur: _Blur2.default,
Collapse: _Collapse2.default,
Scrolling: _Scrolling2.default
}; /*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Blur = function () {
/**
* Blur links within the table of contents above current page y-offset
*
* @constructor
*
* @property {NodeList<HTMLElement>} els_ - Table of contents links
* @property {Array<HTMLElement>} anchors_ - Referenced anchor nodes
* @property {number} index_ - Current link index
* @property {number} offset_ - Current page y-offset
* @property {boolean} dir_ - Scroll direction change
*
* @param {(string|NodeList<HTMLElement>)} els - Selector or HTML elements
*/
function Blur(els) {
_classCallCheck(this, Blur);
this.els_ = typeof els === "string" ? document.querySelectorAll(els) : els;
/* Initialize index and page y-offset */
this.index_ = 0;
this.offset_ = window.pageYOffset;
/* Necessary state to correctly reset the index */
this.dir_ = false;
/* Index anchor node offsets for fast lookup */
this.anchors_ = [].reduce.call(this.els_, function (anchors, el) {
return anchors.concat(document.getElementById(el.hash.substring(1)) || []);
}, []);
}
/**
* Initialize blur states
*/
Blur.prototype.setup = function setup() {
this.update();
};
/**
* Update blur states
*
* Deduct the static offset of the header (56px) and sidebar offset (24px),
* see _permalinks.scss for more information.
*/
Blur.prototype.update = function update() {
var offset = window.pageYOffset;
var dir = this.offset_ - offset < 0;
/* Hack: reset index if direction changed to catch very fast scrolling,
because otherwise we would have to register a timer and that sucks */
if (this.dir_ !== dir) this.index_ = dir ? this.index_ = 0 : this.index_ = this.els_.length - 1;
/* Exit when there are no anchors */
if (this.anchors_.length === 0) return;
/* Scroll direction is down */
if (this.offset_ <= offset) {
for (var i = this.index_ + 1; i < this.els_.length; i++) {
if (this.anchors_[i].offsetTop - (56 + 24) <= offset) {
if (i > 0) this.els_[i - 1].dataset.mdState = "blur";
this.index_ = i;
} else {
break;
}
}
/* Scroll direction is up */
} else {
for (var _i = this.index_; _i >= 0; _i--) {
if (this.anchors_[_i].offsetTop - (56 + 24) > offset) {
if (_i > 0) this.els_[_i - 1].dataset.mdState = "";
} else {
this.index_ = _i;
break;
}
}
}
/* Remember current offset and direction for next iteration */
this.offset_ = offset;
this.dir_ = dir;
};
/**
* Reset blur states
*/
Blur.prototype.reset = function reset() {
Array.prototype.forEach.call(this.els_, function (el) {
el.dataset.mdState = "";
});
/* Reset index and page y-offset */
this.index_ = 0;
this.offset_ = window.pageYOffset;
};
return Blur;
}();
exports.default = Blur;
/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Collapse = function () {
/**
* Expand or collapse navigation on toggle
*
* @constructor
*
* @property {HTMLElement} el_ - Navigation list
*
* @param {(string|HTMLElement)} el - Selector or HTML element
*/
function Collapse(el) {
_classCallCheck(this, Collapse);
var ref = typeof el === "string" ? document.querySelector(el) : el;
if (!(ref instanceof HTMLElement)) throw new ReferenceError();
this.el_ = ref;
}
/**
* Initialize overflow and display for accessibility
*/
Collapse.prototype.setup = function setup() {
var current = this.el_.getBoundingClientRect().height;
/* Hidden links should not be focusable, so hide them when the navigation
is collapsed and set overflow so the outline is not cut off */
this.el_.style.display = current ? "block" : "none";
this.el_.style.overflow = current ? "visible" : "hidden";
};
/**
* Animate expand and collapse smoothly
*
* Internet Explorer 11 is very slow at recognizing changes on the dataset
* which results in the menu not expanding or collapsing properly. THerefore,
* for reasons of compatibility, the attribute accessors are used.
*/
Collapse.prototype.update = function update() {
var _this = this;
var current = this.el_.getBoundingClientRect().height;
/* Reset overflow to CSS defaults */
this.el_.style.display = "block";
this.el_.style.overflow = "";
/* Expanded, so collapse */
if (current) {
this.el_.style.maxHeight = current + "px";
requestAnimationFrame(function () {
_this.el_.setAttribute("data-md-state", "animate");
_this.el_.style.maxHeight = "0px";
});
/* Collapsed, so expand */
} else {
this.el_.setAttribute("data-md-state", "expand");
this.el_.style.maxHeight = "";
/* Read height and unset pseudo-toggled state */
var height = this.el_.getBoundingClientRect().height;
this.el_.removeAttribute("data-md-state");
/* Set initial state and animate */
this.el_.style.maxHeight = "0px";
requestAnimationFrame(function () {
_this.el_.setAttribute("data-md-state", "animate");
_this.el_.style.maxHeight = height + "px";
});
}
/* Remove state on end of transition */
var end = function end(ev) {
var target = ev.target;
if (!(target instanceof HTMLElement)) throw new ReferenceError();
/* Reset height and state */
target.removeAttribute("data-md-state");
target.style.maxHeight = "";
/* Hidden links should not be focusable, so hide them when the navigation
is collapsed and set overflow so the outline is not cut off */
target.style.display = current ? "none" : "block";
target.style.overflow = current ? "hidden" : "visible";
/* Only fire once, so directly remove event listener */
target.removeEventListener("transitionend", end);
};
this.el_.addEventListener("transitionend", end, false);
};
/**
* Reset height and pseudo-toggled state
*/
Collapse.prototype.reset = function reset() {
this.el_.dataset.mdState = "";
this.el_.style.maxHeight = "";
this.el_.style.display = "";
this.el_.style.overflow = "";
};
return Collapse;
}();
exports.default = Collapse;
/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Scrolling = function () {
/**
* Set overflow scrolling on the current active pane (for iOS)
*
* @constructor
*
* @property {HTMLElement} el_ - Primary navigation
*
* @param {(string|HTMLElement)} el - Selector or HTML element
*/
function Scrolling(el) {
_classCallCheck(this, Scrolling);
var ref = typeof el === "string" ? document.querySelector(el) : el;
if (!(ref instanceof HTMLElement)) throw new ReferenceError();
this.el_ = ref;
}
/**
* Setup panes
*/
Scrolling.prototype.setup = function setup() {
/* Initially set overflow scrolling on main pane */
var main = this.el_.children[this.el_.children.length - 1];
main.style.webkitOverflowScrolling = "touch";
/* Find all toggles and check which one is active */
var toggles = this.el_.querySelectorAll("[data-md-toggle]");
Array.prototype.forEach.call(toggles, function (toggle) {
if (!(toggle instanceof HTMLInputElement)) throw new ReferenceError();
if (toggle.checked) {
/* Find corresponding navigational pane */
var pane = toggle.nextElementSibling;
if (!(pane instanceof HTMLElement)) throw new ReferenceError();
while (pane.tagName !== "NAV" && pane.nextElementSibling) {
pane = pane.nextElementSibling;
} /* Check references */
if (!(toggle.parentNode instanceof HTMLElement) || !(toggle.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError();
/* Find current and parent list elements */
var parent = toggle.parentNode.parentNode;
var target = pane.children[pane.children.length - 1];
/* Always reset all lists when transitioning */
parent.style.webkitOverflowScrolling = "";
target.style.webkitOverflowScrolling = "touch";
}
});
};
/**
* Update active panes
*
* @param {Event} ev - Change event
*/
Scrolling.prototype.update = function update(ev) {
var target = ev.target;
if (!(target instanceof HTMLElement)) throw new ReferenceError();
/* Find corresponding navigational pane */
var pane = target.nextElementSibling;
if (!(pane instanceof HTMLElement)) throw new ReferenceError();
while (pane.tagName !== "NAV" && pane.nextElementSibling) {
pane = pane.nextElementSibling;
} /* Check references */
if (!(target.parentNode instanceof HTMLElement) || !(target.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError();
/* Find parent and active panes */
var parent = target.parentNode.parentNode;
var active = pane.children[pane.children.length - 1];
/* Always reset all lists when transitioning */
parent.style.webkitOverflowScrolling = "";
active.style.webkitOverflowScrolling = "";
/* Set overflow scrolling on parent pane */
if (!target.checked) {
var end = function end() {
if (pane instanceof HTMLElement) {
parent.style.webkitOverflowScrolling = "touch";
pane.removeEventListener("transitionend", end);
}
};
pane.addEventListener("transitionend", end, false);
}
/* Set overflow scrolling on active pane */
if (target.checked) {
var _end = function _end() {
if (pane instanceof HTMLElement) {
active.style.webkitOverflowScrolling = "touch";
pane.removeEventListener("transitionend", _end);
}
};
pane.addEventListener("transitionend", _end, false);
}
};
/**
* Reset panes
*/
Scrolling.prototype.reset = function reset() {
/* Reset overflow scrolling on main pane */
this.el_.children[1].style.webkitOverflowScrolling = "";
/* Find all toggles and check which one is active */
var toggles = this.el_.querySelectorAll("[data-md-toggle]");
Array.prototype.forEach.call(toggles, function (toggle) {
if (!(toggle instanceof HTMLInputElement)) throw new ReferenceError();
if (toggle.checked) {
/* Find corresponding navigational pane */
var pane = toggle.nextElementSibling;
if (!(pane instanceof HTMLElement)) throw new ReferenceError();
while (pane.tagName !== "NAV" && pane.nextElementSibling) {
pane = pane.nextElementSibling;
} /* Check references */
if (!(toggle.parentNode instanceof HTMLElement) || !(toggle.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError();
/* Find parent and active panes */
var parent = toggle.parentNode.parentNode;
var active = pane.children[pane.children.length - 1];
/* Always reset all lists when transitioning */
parent.style.webkitOverflowScrolling = "";
active.style.webkitOverflowScrolling = "";
}
});
};
return Scrolling;
}();
exports.default = Scrolling;
/***/ }),
/* 31 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
var _Lock = __webpack_require__(32);
var _Lock2 = _interopRequireDefault(_Lock);
var _Result = __webpack_require__(33);
var _Result2 = _interopRequireDefault(_Result);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* ----------------------------------------------------------------------------
* Module
* ------------------------------------------------------------------------- */
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
exports.default = {
Lock: _Lock2.default,
Result: _Result2.default
};
/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Lock = function () {
/**
* Lock body for full-screen search modal
*
* @constructor
*
* @property {HTMLInputElement} el_ - Lock toggle
* @property {HTMLElement} lock_ - Element to lock (document body)
* @property {number} offset_ - Current page y-offset
*
* @param {(string|HTMLElement)} el - Selector or HTML element
*/
function Lock(el) {
_classCallCheck(this, Lock);
var ref = typeof el === "string" ? document.querySelector(el) : el;
if (!(ref instanceof HTMLInputElement)) throw new ReferenceError();
this.el_ = ref;
/* Retrieve element to lock (= body) */
if (!document.body) throw new ReferenceError();
this.lock_ = document.body;
}
/**
* Setup locked state
*/
Lock.prototype.setup = function setup() {
this.update();
};
/**
* Update locked state
*/
Lock.prototype.update = function update() {
var _this = this;
/* Entering search mode */
if (this.el_.checked) {
this.offset_ = window.pageYOffset;
/* Scroll to top after transition, to omit flickering */
setTimeout(function () {
window.scrollTo(0, 0);
/* Lock body after finishing transition */
if (_this.el_.checked) {
_this.lock_.dataset.mdState = "lock";
}
}, 400);
/* Exiting search mode */
} else {
this.lock_.dataset.mdState = "";
/* Scroll to former position, but wait for 100ms to prevent flashes on
iOS. A short timeout seems to do the trick */
setTimeout(function () {
if (typeof _this.offset_ !== "undefined") window.scrollTo(0, _this.offset_);
}, 100);
}
};
/**
* Reset locked state and page y-offset
*/
Lock.prototype.reset = function reset() {
if (this.lock_.dataset.mdState === "lock") window.scrollTo(0, this.offset_);
this.lock_.dataset.mdState = "";
};
return Lock;
}();
exports.default = Lock;
/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(JSX) {
exports.__esModule = true;
var _escapeStringRegexp = __webpack_require__(34);
var _escapeStringRegexp2 = _interopRequireDefault(_escapeStringRegexp);
var _exposeLoaderLunrLunr = __webpack_require__(35);
var _exposeLoaderLunrLunr2 = _interopRequireDefault(_exposeLoaderLunrLunr);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /*
* Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* ----------------------------------------------------------------------------
* Functions
* ------------------------------------------------------------------------- */
/**
* Escape HTML strings
*
* Documentation may contain code JavaScript code snippets which would get
* executed when inserted into the DOM as plain HTML.
*
* See https://github.com/squidfunk/mkdocs-material/issues/906
*
* @param {string} html - HTML string
*
* @return {string} Escaped HTML string
*/
var escapeHTML = function escapeHTML(html) {
var text = document.createTextNode(html);
var p = document.createElement('p');
p.appendChild(text);
return p.innerHTML;
};
/**
* Truncate a string after the given number of character
*
* This is not a reasonable approach, since the summaries kind of suck. It
* would be better to create something more intelligent, highlighting the
* search occurrences and making a better summary out of it.
*
* @param {string} string - String to be truncated
* @param {number} n - Number of characters
* @return {string} Truncated string
*/
var truncate = function truncate(string, n) {
var i = n;
if (string.length > i) {
while (string[i] !== " " && --i > 0) {}
return string.substring(0, i) + "...";
}
return string;
};
/**
* Return the meta tag value for the given key
*
* @param {string} key - Meta name
*
* @return {string} Meta content value
*/
var translate = function translate(key) {
var meta = document.getElementsByName("lang:" + key)[0];
if (!(meta instanceof HTMLMetaElement)) throw new ReferenceError();
return meta.content;
};
/* ----------------------------------------------------------------------------
* Class
* ------------------------------------------------------------------------- */
var Result = function () {
/**
* Perform search and update results on keyboard events
*
* @constructor
*
* @property {HTMLElement} el_ - Search result container
* @property {(Array<Object>|Function)} data_ - Raw document data
* @property {Object} docs_ - Indexed documents
* @property {HTMLElement} meta_ - Search meta information
* @property {HTMLElement} list_ - Search result list
* @property {Array<string>} lang_ - Search languages
* @property {Object} message_ - Search result messages
* @property {Object} index_ - Search index
* @property {Array<Function>} stack_ - Search result stack
* @property {string} value_ - Last input value
*
* @param {(string|HTMLElement)} el - Selector or HTML element
* @param {(Array<Object>|Function)} data - Function providing data or array
*/
function Result(el, data) {
_classCallCheck(this, Result);
var ref = typeof el === "string" ? document.querySelector(el) : el;
if (!(ref instanceof HTMLElement)) throw new ReferenceError();
this.el_ = ref;
/* Retrieve metadata and list element */
var _Array$prototype$slic = Array.prototype.slice.call(this.el_.children),
meta = _Array$prototype$slic[0],
list = _Array$prototype$slic[1];
/* Set data, metadata and list elements */
this.data_ = data;
this.meta_ = meta;
this.list_ = list;
/* Load messages for metadata display */
this.message_ = {
placeholder: this.meta_.textContent,
none: translate("search.result.none"),
one: translate("search.result.one"),
other: translate("search.result.other")
/* Override tokenizer separator, if given */
};var tokenizer = translate("search.tokenizer");
if (tokenizer.length) _exposeLoaderLunrLunr2.default.tokenizer.separator = tokenizer;
/* Load search languages */
this.lang_ = translate("search.language").split(",").filter(Boolean).map(function (lang) {
return lang.trim();
});
}
/**
* Update search results
*
* @param {Event} ev - Input or focus event
*/
Result.prototype.update = function update(ev) {
var _this = this;
/* Initialize index, if this has not be done yet */
if (ev.type === "focus" && !this.index_) {
/* Initialize index */
var init = function init(data) {
/* Preprocess and index sections and documents */
_this.docs_ = data.reduce(function (docs, doc) {
var _doc$location$split = doc.location.split("#"),
path = _doc$location$split[0],
hash = _doc$location$split[1];
/* Escape HTML */
doc.title = escapeHTML(doc.title);
doc.text = escapeHTML(doc.text);
/* Associate section with parent document */
if (hash) {
doc.parent = docs.get(path);
/* Override page title with document title if first section */
if (doc.parent && !doc.parent.done) {
doc.parent.title = doc.title;
doc.parent.text = doc.text;
doc.parent.done = true;
}
}
/* Some cleanup on the text */
doc.text = doc.text.replace(/\n/g, " ") /* Remove newlines */
.replace(/\s+/g, " ") /* Compact whitespace */
.replace(/\s+([,.:;!?])/g, /* Correct punctuation */
function (_, char) {
return char;
});
/* Index sections and documents, but skip top-level headline */
if (!doc.parent || doc.parent.title !== doc.title) docs.set(doc.location, doc);
return docs;
}, new Map());
/* eslint-disable no-invalid-this */
var docs = _this.docs_,
lang = _this.lang_;
/* Create stack and index */
_this.stack_ = [];
_this.index_ = (0, _exposeLoaderLunrLunr2.default)(function () {
var _pipeline,
_this2 = this;
var filters = {
"search.pipeline.trimmer": _exposeLoaderLunrLunr2.default.trimmer,
"search.pipeline.stopwords": _exposeLoaderLunrLunr2.default.stopWordFilter
gitextract_uoldwxkc/ ├── .gitignore ├── LICENSE ├── README.md ├── SecurityPaper-themes/ │ ├── 404.html │ ├── __init__.py │ ├── assets/ │ │ ├── fonts/ │ │ │ ├── font-awesome.css │ │ │ └── material-icons.css │ │ ├── javascripts/ │ │ │ ├── application.js │ │ │ ├── lunr/ │ │ │ │ ├── lunr.da.js │ │ │ │ ├── lunr.de.js │ │ │ │ ├── lunr.du.js │ │ │ │ ├── lunr.es.js │ │ │ │ ├── lunr.fi.js │ │ │ │ ├── lunr.fr.js │ │ │ │ ├── lunr.hu.js │ │ │ │ ├── lunr.it.js │ │ │ │ ├── lunr.jp.js │ │ │ │ ├── lunr.multi.js │ │ │ │ ├── lunr.no.js │ │ │ │ ├── lunr.pt.js │ │ │ │ ├── lunr.ro.js │ │ │ │ ├── lunr.ru.js │ │ │ │ ├── lunr.stemmer.support.js │ │ │ │ ├── lunr.sv.js │ │ │ │ ├── lunr.tr.js │ │ │ │ └── tinyseg.js │ │ │ └── modernizr.js │ │ └── stylesheets/ │ │ ├── application-palette.css │ │ └── application.css │ ├── base.html │ ├── main.html │ ├── mkdocs_theme.yml │ └── partials/ │ ├── footer.html │ ├── header.html │ ├── hero.html │ ├── integrations/ │ │ ├── analytics.html │ │ └── disqus.html │ ├── language/ │ │ ├── ar.html │ │ ├── ca.html │ │ ├── cs.html │ │ ├── da.html │ │ ├── de.html │ │ ├── en.html │ │ ├── es.html │ │ ├── fa.html │ │ ├── fi.html │ │ ├── fr.html │ │ ├── gl.html │ │ ├── he.html │ │ ├── hi.html │ │ ├── hr.html │ │ ├── hu.html │ │ ├── id.html │ │ ├── it.html │ │ ├── ja.html │ │ ├── kr.html │ │ ├── nl.html │ │ ├── no.html │ │ ├── pl.html │ │ ├── pt.html │ │ ├── ru.html │ │ ├── sh.html │ │ ├── sk.html │ │ ├── sr.html │ │ ├── sv.html │ │ ├── tr.html │ │ ├── uk.html │ │ ├── vi.html │ │ ├── zh-Hant.html │ │ ├── zh-TW.html │ │ └── zh.html │ ├── language.html │ ├── nav-item.html │ ├── nav.html │ ├── palette.html │ ├── search.html │ ├── social.html │ ├── source.html │ ├── tabs-item.html │ ├── tabs.html │ ├── toc-item.html │ └── toc.html ├── docs/ │ ├── 1.SDL介绍/ │ │ ├── 1-什么是SDL.md │ │ ├── 2-企业为什么需求SDL.md │ │ ├── 3-哪些企业需要SDL.md │ │ └── 4-SDL所带来的优缺点.md │ ├── 2.SDL规范文档/ │ │ ├── 1-安全设计Checklist.md │ │ ├── 10-SDL上线规定文档.md │ │ ├── 11-web应用安全业务自查checklist.md │ │ ├── 2-php安全编码规范.md │ │ ├── 3-java安全编码规范.md │ │ ├── 4-python安全编码规范.md │ │ ├── 5-nodejs安全编码规范.md │ │ ├── 6-移动安全规范.md │ │ ├── 7-产品设计开发最佳实践.md │ │ ├── 8-常见协议安全开发实践.md │ │ └── 9-MySQL安全配置.md │ ├── 3.SDL落地方案/ │ │ ├── 1-安全培训.md │ │ ├── 2-需求评估.md │ │ ├── 3-产品设计.md │ │ ├── 4-代码编写.md │ │ ├── 5-渗透测试.md │ │ ├── 6-上线发布.md │ │ └── 7-应急响应.md │ ├── 4.构建企业安全/ │ │ ├── 1-内功修炼第一步-挖漏洞.md │ │ ├── 2-内功修炼第二步-引起重视.md │ │ ├── 3-互联网安全运营的思考.md │ │ ├── 4-如何利用Flink实现超大规模用户行为分析.md │ │ └── 5-APT 攻击基础科普.md │ ├── 5.附录/ │ │ ├── 01.相关术语.md │ │ ├── 02.文档变更规范.md │ │ ├── 03.GitHub工作流.md │ │ └── 04.NAXSI安装测试与简介.md │ ├── 6.Project/ │ │ ├── 1-内部钓鱼系统.md │ │ ├── 2-工作流自动化代码审计.md │ │ └── 3-泰式感知.md │ ├── 7.安全前瞻/ │ │ └── 1-BeyondCorp-以全新方式保障企业安全.md │ ├── _headers │ ├── index.md │ └── update.md ├── mkdocs.yml └── requirements.txt
SYMBOL INDEX (220 symbols across 15 files)
FILE: SecurityPaper-themes/assets/javascripts/application.js
function __webpack_require__ (line 6) | function __webpack_require__(moduleId) {
function response (line 209) | function response() {
function _classCallCheck (line 255) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Listener (line 300) | function Listener(els, events, handler) {
function _interopRequireDefault (line 400) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function initialize (line 460) | function initialize(config) {
function noop (line 945) | function noop() {}
function bind (line 948) | function bind(fn, thisArg) {
function Promise (line 958) | function Promise(fn) {
function handle (line 974) | function handle(self, deferred) {
function resolve (line 1000) | function resolve(self, newValue) {
function reject (line 1028) | function reject(self, newValue) {
function finale (line 1034) | function finale(self) {
function Handler (line 1052) | function Handler(onFulfilled, onRejected, promise) {
function doResolve (line 1064) | function doResolve(fn, self) {
function res (line 1108) | function res(i, val) {
function Timeout (line 1206) | function Timeout(id, clearFn) {
function setImmediate (line 1269) | function setImmediate(callback) {
function clearImmediate (line 1286) | function clearImmediate(handle) {
function run (line 1290) | function run(task) {
function runIfPresent (line 1312) | function runIfPresent(handle) {
function installNextTickImplementation (line 1333) | function installNextTickImplementation() {
function canUsePostMessage (line 1339) | function canUsePostMessage() {
function installPostMessageImplementation (line 1354) | function installPostMessageImplementation() {
function installMessageChannelImplementation (line 1379) | function installMessageChannelImplementation() {
function installReadyStateChangeImplementation (line 1391) | function installReadyStateChangeImplementation() {
function installSetTimeoutImplementation (line 1407) | function installSetTimeoutImplementation() {
function defaultSetTimout (line 1460) | function defaultSetTimout() {
function defaultClearTimeout (line 1463) | function defaultClearTimeout () {
function runTimeout (line 1486) | function runTimeout(fun) {
function runClearTimeout (line 1511) | function runClearTimeout(marker) {
function cleanUpNextTick (line 1543) | function cleanUpNextTick() {
function drainQueue (line 1558) | function drainQueue() {
function Item (line 1596) | function Item(fun, array) {
function noop (line 1610) | function noop() {}
function finallyConstructor (line 1643) | function finallyConstructor(callback) {
function __webpack_require__ (line 1687) | function __webpack_require__(moduleId) {
function defineProperties (line 1777) | function defineProperties(target, props) { for (var i = 0; i < props.len...
function _interopRequireDefault (line 1791) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 1793) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _possibleConstructorReturn (line 1795) | function _possibleConstructorReturn(self, call) { if (!self) { throw new...
function _inherits (line 1797) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function Clipboard (line 1810) | function Clipboard(trigger, options) {
function getAttributeValue (line 1961) | function getAttributeValue(suffix, element) {
function defineProperties (line 1982) | function defineProperties(target, props) { for (var i = 0; i < props.len...
function _interopRequireDefault (line 1988) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 1990) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function ClipboardAction (line 2000) | function ClipboardAction(options) {
function select (line 2245) | function select(element) {
function E (line 2294) | function E () {
function listener (line 2313) | function listener () {
function listen (line 2378) | function listen(target, type, callback) {
function listenNode (line 2414) | function listenNode(node, type, callback) {
function listenNodeList (line 2433) | function listenNodeList(nodeList, type, callback) {
function listenSelector (line 2456) | function listenSelector(selector, type, callback) {
function _delegate (line 2534) | function _delegate(element, selector, type, callback, useCapture) {
function delegate (line 2556) | function delegate(elements, selector, type, callback, useCapture) {
function listener (line 2589) | function listener(element, selector, type, callback) {
function closest (line 2628) | function closest (element, selector) {
function FastClick (line 2671) | function FastClick(layer, options) {
function _interopRequireDefault (line 3530) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _interopRequireDefault (line 3583) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _interopRequireDefault (line 3629) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 3631) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _interopRequireDefault (line 3708) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 3750) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Shadow (line 3793) | function Shadow(el, header) {
function _classCallCheck (line 3866) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Title (line 3908) | function Title(el, header) {
function _interopRequireDefault (line 3996) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 4037) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Blur (line 4080) | function Blur(els) {
function _classCallCheck (line 4183) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Collapse (line 4222) | function Collapse(el) {
function _classCallCheck (line 4333) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Scrolling (line 4372) | function Scrolling(el) {
function _interopRequireDefault (line 4523) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 4565) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Lock (line 4606) | function Lock(el) {
function _interopRequireDefault (line 4693) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 4695) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Result (line 4798) | function Result(el, data) {
function _interopRequireDefault (line 8644) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 8683) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Position (line 8728) | function Position(el, header) {
function _interopRequireDefault (line 8836) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _interopRequireDefault (line 8882) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _interopRequireDefault (line 8925) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 8927) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _possibleConstructorReturn (line 8929) | function _possibleConstructorReturn(self, call) { if (!self) { throw new...
function _inherits (line 8931) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function GitHub (line 8969) | function GitHub(el) {
function _interopRequireDefault (line 9046) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 9048) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Abstract (line 9087) | function Abstract(el) {
function extend (line 9208) | function extend () {
function init (line 9220) | function init (converter) {
function _classCallCheck (line 9358) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Repository (line 9397) | function Repository(el) {
function _interopRequireDefault (line 9448) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 9487) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function Toggle (line 9528) | function Toggle(el) {
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.da.js
function l (line 1) | function l(){var e,r=c.limit-c.cursor;c.cursor>=t&&(e=c.limit_backward,c...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.de.js
function h (line 1) | function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t...
function w (line 1) | function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return...
function f (line 1) | function f(){return i<=m.cursor}
function b (line 1) | function b(){return n<=m.cursor}
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.du.js
function s (line 1) | function s(r){return(_.cursor=r)>=_.limit||(_.cursor++,!1)}
function w (line 1) | function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return...
function b (line 1) | function b(){return i<=_.cursor}
function p (line 1) | function p(){return e<=_.cursor}
function g (line 1) | function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.lim...
function h (line 1) | function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,...
function k (line 1) | function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.es.js
function _ (line 1) | function _(){if(f.out_grouping(b,97,252)){for(;!f.in_grouping(b,97,252);...
function h (line 1) | function h(){var e,s=f.cursor;if(function(){if(f.in_grouping(b,97,252)){...
function v (line 1) | function v(){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return...
function p (line 1) | function p(){return i<=f.cursor}
function g (line 1) | function g(){return r<=f.cursor}
function k (line 1) | function k(e,s){if(!g())return!0;f.slice_del(),f.ket=f.cursor;var r=f.fi...
function y (line 1) | function y(e){return!g()||(f.slice_del(),f.ket=f.cursor,f.eq_s_b(2,e)&&(...
function q (line 1) | function q(){var e;if(f.ket=f.cursor,e=f.find_among_b(c,46)){switch(f.br...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.fi.js
function p (line 1) | function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.curso...
function g (line 1) | function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backwa...
function j (line 1) | function j(){return h.find_among_b(i,7)}
function q (line 1) | function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.fr.js
function k (line 1) | function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_...
function p (line 1) | function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d...
function g (line 1) | function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return...
function q (line 1) | function q(){return t<=d.cursor}
function v (line 1) | function v(){return i<=d.cursor}
function h (line 1) | function h(){return s<=d.cursor}
function z (line 1) | function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.hu.js
function b (line 1) | function b(){return r<=f.cursor}
function d (line 1) | function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cur...
function g (line 1) | function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var...
function h (line 1) | function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.it.js
function d (line 1) | function d(e,r,n){return!(!b.eq_s(1,e)||(b.ket=b.cursor,!b.in_grouping(m...
function _ (line 1) | function _(e){if(b.cursor=e,!b.in_grouping(m,97,249))return!1;for(;!b.ou...
function g (line 1) | function g(){var e,r=b.cursor;if(!function(){if(b.in_grouping(m,97,249))...
function p (line 1) | function p(){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return...
function k (line 1) | function k(){return s<=b.cursor}
function h (line 1) | function h(){return o<=b.cursor}
function q (line 1) | function q(){var e;if(b.ket=b.cursor,!(e=b.find_among_b(i,51)))return!1;...
function C (line 1) | function C(){var e;e=b.limit-b.cursor,b.ket=b.cursor,b.in_grouping_b(f,9...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.pt.js
function v (line 1) | function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);...
function p (line 1) | function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor...
function _ (line 1) | function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return...
function h (line 1) | function h(){return i<=d.cursor}
function b (line 1) | function b(){return s<=d.cursor}
function g (line 1) | function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;...
function k (line 1) | function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;...
function q (line 1) | function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.ro.js
function f (line 1) | function f(e,i){l.eq_s(1,e)&&(l.ket=l.cursor,l.in_grouping(m,97,259)&&l....
function p (line 1) | function p(){if(l.out_grouping(m,97,259)){for(;!l.in_grouping(m,97,259);...
function d (line 1) | function d(){var e,i,r=l.cursor;if(l.in_grouping(m,97,259)){if(e=l.curso...
function b (line 1) | function b(){for(;!l.in_grouping(m,97,259);){if(l.cursor>=l.limit)return...
function v (line 1) | function v(){return t<=l.cursor}
function _ (line 1) | function _(){var e,i=l.limit-l.cursor;if(l.ket=l.cursor,(e=l.find_among_...
function g (line 1) | function g(){var e,i;for(r=!1;;)if(i=l.limit-l.cursor,!_()){l.cursor=l.l...
function k (line 1) | function k(){var e;l.ket=l.cursor,(e=l.find_among_b(i,5))&&(l.bra=l.curs...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.ru.js
function f (line 1) | function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)ret...
function a (line 1) | function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)re...
function p (line 1) | function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(...
function d (line 1) | function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(...
function _ (line 1) | function _(){return!!d(t,26)&&(p(w,8),!0)}
function b (line 1) | function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.curs...
FILE: SecurityPaper-themes/assets/javascripts/lunr/lunr.tr.js
function x (line 1) | function x(r,i,e){for(;;){var n=L.limit-L.cursor;if(L.in_grouping_b(r,i,...
function A (line 1) | function A(){var r,i;r=L.limit-L.cursor,x(C,97,305);for(var e=0;e<W.leng...
function E (line 1) | function E(r,i){var e,n=L.limit-L.cursor;return r()&&(L.cursor=L.limit-n...
function j (line 1) | function j(r){return E(r,function(){return L.in_grouping_b(C,97,305)})}
function T (line 1) | function T(){return j(function(){return L.eq_s_b(1,"n")})}
function Z (line 1) | function Z(){return j(function(){return L.eq_s_b(1,"y")})}
function B (line 1) | function B(){return L.find_among_b(r,10)&&E(function(){return L.in_group...
function D (line 1) | function D(){return A()&&L.in_grouping_b(P,105,305)&&j(function(){return...
function G (line 1) | function G(){return L.find_among_b(i,2)}
function H (line 1) | function H(){return A()&&L.find_among_b(n,4)&&T()}
function I (line 1) | function I(){return A()&&L.find_among_b(s,4)}
function J (line 1) | function J(){return A()&&L.find_among_b(c,2)}
function K (line 1) | function K(){return A()&&L.find_among_b(f,4)&&Z()}
function M (line 1) | function M(){return A()&&L.find_among_b(b,4)}
function N (line 1) | function N(){return A()&&L.find_among_b(w,4)&&Z()}
function O (line 1) | function O(){return L.find_among_b(_,4)}
function Q (line 1) | function Q(){return A()&&L.find_among_b(k,2)}
function R (line 1) | function R(){return A()&&L.find_among_b(g,8)}
function U (line 1) | function U(){return A()&&L.find_among_b(z,32)&&Z()}
function V (line 1) | function V(){return L.find_among_b(h,8)&&Z()}
function X (line 1) | function X(){return A()&&L.find_among_b(v,4)&&Z()}
function Y (line 1) | function Y(){var r=L.limit-L.cursor;return!(X()||(L.cursor=L.limit-r,U()...
function $ (line 1) | function $(){if(L.find_among_b(y,2)){var r=L.limit-L.cursor;if(O()||(L.c...
function rr (line 1) | function rr(){if(!A()||!L.find_among_b(p,4))return!0;var r=L.limit-L.cur...
function ir (line 1) | function ir(){var r,i,e,n=L.limit-L.cursor;if(L.ket=L.cursor,t=!0,Y()&&(...
function er (line 1) | function er(){var r,i,e,n;if(L.ket=L.cursor,L.eq_s_b(2,"ki")){if(r=L.lim...
function nr (line 1) | function nr(r){if(L.ket=L.cursor,!J()&&(L.cursor=L.limit-r,!A()||!L.find...
function tr (line 1) | function tr(r){if(L.ket=L.cursor,!(A()&&L.find_among_b(a,2)||(L.cursor=L...
function ur (line 1) | function ur(){var r,i=L.limit-L.cursor;return L.ket=L.cursor,!!(H()||(L....
function or (line 1) | function or(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,!(I()||(L.cur...
function sr (line 1) | function sr(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,Q())return L....
function cr (line 1) | function cr(r,i,e){if(L.cursor=L.limit-r,function(){for(;;){var r=L.limi...
function lr (line 1) | function lr(r,i,e){for(;!L.eq_s(i,e);){if(L.cursor>=L.limit)return!0;L.c...
function ar (line 1) | function ar(){var r,i,e=L.cursor;return!(!lr(r=L.cursor,2,"ad")||!lr(L.c...
FILE: SecurityPaper-themes/assets/javascripts/lunr/tinyseg.js
function t (line 1) | function t(){var _={"[一二三四五六七八九十百千万億兆]":"M","[一-龠々〆ヵヶ]":"H","[ぁ-ん]":"I",...
FILE: SecurityPaper-themes/assets/javascripts/modernizr.js
function __webpack_require__ (line 6) | function __webpack_require__(moduleId) {
function r (line 84) | function r(e,t){return typeof e===t}
function o (line 84) | function o(){var e,t,n,o,i,s,a;for(var l in C)if(C.hasOwnProperty(l)){if...
function i (line 84) | function i(e){var t=T.className,n=Modernizr._config.classPrefix||"";if(x...
function s (line 84) | function s(e,t){if("object"==typeof e)for(var n in e)w(e,n)&&s(n,e[n]);e...
function a (line 84) | function a(){return"function"!=typeof t.createElement?t.createElement(ar...
function l (line 84) | function l(){var e=t.body;return e||(e=a(x?"svg":"body"),e.fake=!0),e}
function u (line 84) | function u(e,n,r,o){var i,s,u,f,c="modernizr",d=a("div"),p=l();if(parseI...
function f (line 84) | function f(e,t){return!!~(""+e).indexOf(t)}
function c (line 84) | function c(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLo...
function d (line 84) | function d(t,n,r){var o;if("getComputedStyle"in e){o=getComputedStyle.ca...
function p (line 84) | function p(t,r){var o=t.length;if("CSS"in e&&"supports"in e.CSS){for(;o-...
function m (line 84) | function m(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return...
function h (line 84) | function h(e,t,o,i){function s(){u&&(delete E.style,delete E.modElem)}if...
function g (line 84) | function g(e,t){return function(){return e.apply(t,arguments)}}
function y (line 84) | function y(e,t,n){var o;for(var i in e)if(e[i]in t)return n===!1?e[i]:(o...
function v (line 84) | function v(e,t,n,o,i){var s=e.charAt(0).toUpperCase()+e.slice(1),a=(e+" ...
function S (line 84) | function S(e,t,r){return v(e,n,n,t,r)}
Condensed preview — 122 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,081K chars).
[
{
"path": ".gitignore",
"chars": 16,
"preview": "site/\n.DS_Store\n"
},
{
"path": "LICENSE",
"chars": 2589,
"preview": "Copyright (c) <year> <copyright holders>\n\nAnti 996 License Version 1.0 (Draft)\n\nPermission is hereby granted to any indi"
},
{
"path": "README.md",
"chars": 1607,
"preview": "## SecurityPaper\n\n所有文档都来自中国互联网一线安全工程师编写整理\n\n\n## 官网\n\n```\nhttps://www.SecurityPaper.org\n```\n\n官网状态:[; you may not\n * use this file except in compliance"
},
{
"path": "SecurityPaper-themes/assets/javascripts/application.js",
"chars": 822104,
"preview": "(function(e, a) { for(var i in a) e[i] = a[i]; }(window, /******/ (function(modules) { // webpackBootstrap\n/******/ \t// "
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.da.js",
"chars": 4157,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.de.js",
"chars": 5630,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.du.js",
"chars": 5531,
"preview": "!function(r,e){\"function\"==typeof define&&define.amd?define(e):\"object\"==typeof exports?module.exports=e():e()(r.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.es.js",
"chars": 10831,
"preview": "!function(e,s){\"function\"==typeof define&&define.amd?define(s):\"object\"==typeof exports?module.exports=s():s()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.fi.js",
"chars": 8626,
"preview": "!function(i,e){\"function\"==typeof define&&define.amd?define(e):\"object\"==typeof exports?module.exports=e():e()(i.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.fr.js",
"chars": 10103,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.hu.js",
"chars": 8778,
"preview": "!function(e,n){\"function\"==typeof define&&define.amd?define(n):\"object\"==typeof exports?module.exports=n():n()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.it.js",
"chars": 10616,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.jp.js",
"chars": 1616,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.multi.js",
"chars": 774,
"preview": "!function(e,i){\"function\"==typeof define&&define.amd?define(i):\"object\"==typeof exports?module.exports=i():i()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.no.js",
"chars": 4229,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.pt.js",
"chars": 9548,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.ro.js",
"chars": 10165,
"preview": "!function(e,i){\"function\"==typeof define&&define.amd?define(i):\"object\"==typeof exports?module.exports=i():i()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.ru.js",
"chars": 7415,
"preview": "!function(e,n){\"function\"==typeof define&&define.amd?define(n):\"object\"==typeof exports?module.exports=n():n()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.stemmer.support.js",
"chars": 3633,
"preview": "!function(r,t){\"function\"==typeof define&&define.amd?define(t):\"object\"==typeof exports?module.exports=t():t()(r.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.sv.js",
"chars": 4010,
"preview": "!function(e,r){\"function\"==typeof define&&define.amd?define(r):\"object\"==typeof exports?module.exports=r():r()(e.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/lunr.tr.js",
"chars": 13522,
"preview": "!function(r,i){\"function\"==typeof define&&define.amd?define(i):\"object\"==typeof exports?module.exports=i():i()(r.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/lunr/tinyseg.js",
"chars": 15352,
"preview": "!function(_,t){\"function\"==typeof define&&define.amd?define(t):\"object\"==typeof exports?module.exports=t():t()(_.lunr)}("
},
{
"path": "SecurityPaper-themes/assets/javascripts/modernizr.js",
"chars": 26252,
"preview": "(function(e, a) { for(var i in a) e[i] = a[i]; }(window, /******/ (function(modules) { // webpackBootstrap\n/******/ \t// "
},
{
"path": "SecurityPaper-themes/assets/stylesheets/application-palette.css",
"chars": 119887,
"preview": "button[data-md-color-primary],\nbutton[data-md-color-accent] {\n width: 13rem;\n margin-bottom: 0.4rem;\n padding: 2.4rem"
},
{
"path": "SecurityPaper-themes/assets/stylesheets/application.css",
"chars": 486450,
"preview": "@charset \"UTF-8\";\nhtml {\n box-sizing: border-box; }\n\n*,\n*::before,\n*::after {\n box-sizing: inherit; }\n\nhtml {\n -webki"
},
{
"path": "SecurityPaper-themes/base.html",
"chars": 9250,
"preview": "{% import \"partials/language.html\" as lang with context %}\n{% set feature = config.theme.feature %}\n{% set palette = con"
},
{
"path": "SecurityPaper-themes/main.html",
"chars": 26,
"preview": "{% extends \"base.html\" %}\n"
},
{
"path": "SecurityPaper-themes/mkdocs_theme.yml",
"chars": 2678,
"preview": "# Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>\n\n# Permission is hereby granted, free of charge, t"
},
{
"path": "SecurityPaper-themes/partials/footer.html",
"chars": 2271,
"preview": "{% import \"partials/language.html\" as lang with context %}\n<footer class=\"md-footer\">\n {% if page.previous_page or page"
},
{
"path": "SecurityPaper-themes/partials/header.html",
"chars": 1586,
"preview": "<header class=\"md-header\" data-md-component=\"header\">\n <nav class=\"md-header-nav md-grid\">\n <div class=\"md-flex\">\n\n "
},
{
"path": "SecurityPaper-themes/partials/hero.html",
"chars": 284,
"preview": "{% set feature = config.theme.feature %}\n{% set class = \"md-hero\" %}\n{% if not feature.tabs %}\n {% set class = \"md-hero"
},
{
"path": "SecurityPaper-themes/partials/integrations/analytics.html",
"chars": 906,
"preview": "<script>!function(e,a,t,n,o,c,i){e.GoogleAnalyticsObject=o,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e."
},
{
"path": "SecurityPaper-themes/partials/integrations/disqus.html",
"chars": 734,
"preview": "{% set disqus = config.extra.disqus %}\n{% if page and page.meta and page.meta.disqus is string %}\n {% set disqus = page"
},
{
"path": "SecurityPaper-themes/partials/language/ar.html",
"chars": 764,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"ar\",\n \"direction\": \"rtl\",\n \"clipboard.copy\": \"نسخ إلى الحافظة\",\n \"clipboard.cop"
},
{
"path": "SecurityPaper-themes/partials/language/ca.html",
"chars": 729,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"ca\",\n \"clipboard.copy\": \"Còpia al porta-retalls\",\n \"clipboard.copied\": \"Copiat a"
},
{
"path": "SecurityPaper-themes/partials/language/cs.html",
"chars": 704,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"cs\",\n \"clipboard.copy\": \"Kopírovat do schránky\",\n \"clipboard.copied\": \"Zkopírová"
},
{
"path": "SecurityPaper-themes/partials/language/da.html",
"chars": 683,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"da\",\n \"clipboard.copy\": \"Kopiér til udklipsholderen\",\n \"clipboard.copied\": \"Kopi"
},
{
"path": "SecurityPaper-themes/partials/language/de.html",
"chars": 685,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"de\",\n \"clipboard.copy\": \"In Zwischenablage kopieren\",\n \"clipboard.copied\": \"In Z"
},
{
"path": "SecurityPaper-themes/partials/language/en.html",
"chars": 816,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"en\",\n \"direction\": \"ltr\",\n \"clipboard.copy\": \"Copy to clipboard\",\n \"clipboard.c"
},
{
"path": "SecurityPaper-themes/partials/language/es.html",
"chars": 738,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"es\",\n \"clipboard.copy\": \"Copiar al portapapeles\",\n \"clipboard.copied\": \"Copiado "
},
{
"path": "SecurityPaper-themes/partials/language/fa.html",
"chars": 732,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"fa\",\n \"direction\": \"rtl\",\n \"clipboard.copy\": \"کپی کردن\",\n \"clipboard.copied\": \""
},
{
"path": "SecurityPaper-themes/partials/language/fi.html",
"chars": 719,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"fi\",\n \"clipboard.copy\": \"Kopioi leikepöydälle\",\n \"clipboard.copied\": \"Kopioitu l"
},
{
"path": "SecurityPaper-themes/partials/language/fr.html",
"chars": 688,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"fr\",\n \"clipboard.copy\": \"Copier dans le presse-papier\",\n \"clipboard.copied\": \"Co"
},
{
"path": "SecurityPaper-themes/partials/language/gl.html",
"chars": 690,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"gl\",\n \"clipboard.copy\": \"Copiar no cortapapeis\",\n \"clipboard.copied\": \"Copiado n"
},
{
"path": "SecurityPaper-themes/partials/language/he.html",
"chars": 717,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"he\",\n \"direction\": \"rtl\",\n \"clipboard.copy\": \"העתק ללוח\",\n \"clipboard.copied\": "
},
{
"path": "SecurityPaper-themes/partials/language/hi.html",
"chars": 786,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"hi\",\n \"clipboard.copy\": \"क्लिपबोर्ड पर कॉपी करें\",\n \"clipboard.copied\": \"क्लिपबो"
},
{
"path": "SecurityPaper-themes/partials/language/hr.html",
"chars": 796,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"hr\",\n \"clipboard.copy\": \"Kopirajte u međuspremnik\",\n \"clipboard.copied\": \"Kopira"
},
{
"path": "SecurityPaper-themes/partials/language/hu.html",
"chars": 683,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"hu\",\n \"clipboard.copy\": \"Másolás vágólapra\",\n \"clipboard.copied\": \"Vágólapra más"
},
{
"path": "SecurityPaper-themes/partials/language/id.html",
"chars": 770,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"id\",\n \"clipboard.copy\": \"Salin ke memori\",\n \"clipboard.copied\": \"Tersalin ke mem"
},
{
"path": "SecurityPaper-themes/partials/language/it.html",
"chars": 663,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"it\",\n \"clipboard.copy\": \"Copia\",\n \"clipboard.copied\": \"Copiato\",\n \"edit.link.ti"
},
{
"path": "SecurityPaper-themes/partials/language/ja.html",
"chars": 574,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"ja\",\n \"clipboard.copy\": \"クリップボードへコピー\",\n \"clipboard.copied\": \"コピーしました\",\n \"edit.l"
},
{
"path": "SecurityPaper-themes/partials/language/kr.html",
"chars": 546,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"kr\",\n \"clipboard.copy\": \"클립보드로 복사\",\n \"clipboard.copied\": \"클립보드에 복사됨\",\n \"edit.li"
},
{
"path": "SecurityPaper-themes/partials/language/nl.html",
"chars": 728,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"nl\",\n \"clipboard.copy\": \"Kopiëren naar klembord\",\n \"clipboard.copied\": \"Gekopiee"
},
{
"path": "SecurityPaper-themes/partials/language/no.html",
"chars": 660,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"no\",\n \"clipboard.copy\": \"Kopier til utklippstavlen\",\n \"clipboard.copied\": \"Kopie"
},
{
"path": "SecurityPaper-themes/partials/language/pl.html",
"chars": 792,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"pl\",\n \"clipboard.copy\": \"Kopiuj do schowka\",\n \"clipboard.copied\": \"Skopiowane\",\n"
},
{
"path": "SecurityPaper-themes/partials/language/pt.html",
"chars": 739,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"pt\",\n \"clipboard.copy\": \"Copiar para área de transferência\",\n \"clipboard.copied\""
},
{
"path": "SecurityPaper-themes/partials/language/ru.html",
"chars": 713,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"ru\",\n \"clipboard.copy\": \"Копировать в буфер\",\n \"clipboard.copied\": \"Скопировано "
},
{
"path": "SecurityPaper-themes/partials/language/sh.html",
"chars": 686,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"sh\",\n \"clipboard.copy\": \"Kopiraj u klipbord\",\n \"clipboard.copied\": \"Iskopirano u"
},
{
"path": "SecurityPaper-themes/partials/language/sk.html",
"chars": 710,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"sk\",\n \"clipboard.copy\": \"Kopírovať do schránky\",\n \"clipboard.copied\": \"Skopírova"
},
{
"path": "SecurityPaper-themes/partials/language/sr.html",
"chars": 762,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"sr\",\n \"clipboard.copy\": \"Копирај у клипборд\",\n \"clipboard.copied\": \"Ископирано у"
},
{
"path": "SecurityPaper-themes/partials/language/sv.html",
"chars": 676,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"sv\",\n \"clipboard.copy\": \"Kopiera till urklipp\",\n \"clipboard.copied\": \"Kopierat t"
},
{
"path": "SecurityPaper-themes/partials/language/tr.html",
"chars": 613,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"tr\",\n \"clipboard.copy\": \"Kopyala\",\n \"clipboard.copied\": \"Kopyalandı\",\n \"edit.li"
},
{
"path": "SecurityPaper-themes/partials/language/uk.html",
"chars": 691,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"uk\",\n \"clipboard.copy\": \"Скопіювати в буфер\",\n \"clipboard.copied\": \"Скопійовано "
},
{
"path": "SecurityPaper-themes/partials/language/vi.html",
"chars": 669,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"vi\",\n \"clipboard.copy\": \"Sao chép vào bộ nhớ\",\n \"clipboard.copied\": \"Sao chép xo"
},
{
"path": "SecurityPaper-themes/partials/language/zh-Hant.html",
"chars": 593,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"zh-Hant\",\n \"clipboard.copy\": \"拷貝\",\n \"clipboard.copied\": \"已拷貝\",\n \"edit.link.titl"
},
{
"path": "SecurityPaper-themes/partials/language/zh-TW.html",
"chars": 581,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"zh-Hant\",\n \"clipboard.copy\": \"複製\",\n \"clipboard.copied\": \"已複製\",\n \"edit.link.titl"
},
{
"path": "SecurityPaper-themes/partials/language/zh.html",
"chars": 586,
"preview": "{% macro t(key) %}{{ {\n \"language\": \"zh\",\n \"clipboard.copy\": \"复制\",\n \"clipboard.copied\": \"已复制\",\n \"edit.link.title\": \""
},
{
"path": "SecurityPaper-themes/partials/language.html",
"chars": 421,
"preview": "{% import \"partials/language/\" + config.theme.language + \".html\" as lang %}\n{% import \"partials/language/en.html\" as fal"
},
{
"path": "SecurityPaper-themes/partials/nav-item.html",
"chars": 1979,
"preview": "{% set class = \"md-nav__item\" %}\n{% if nav_item.active %}\n {% set class = \"md-nav__item md-nav__item--active\" %}\n{% end"
},
{
"path": "SecurityPaper-themes/partials/nav.html",
"chars": 415,
"preview": "<nav class=\"md-nav md-nav--primary\" data-md-level=\"0\">\n\n {% if config.repo_url %}\n <div class=\"md-nav__source\">\n "
},
{
"path": "SecurityPaper-themes/partials/palette.html",
"chars": 1083,
"preview": "{% macro primary(key) %}{{ {\n \"red\": \"#ef5350\",\n \"pink\": \"#e91e63\",\n \"purple\": \"#ab47bc\",\n \"deep"
},
{
"path": "SecurityPaper-themes/partials/search.html",
"chars": 1119,
"preview": "{% import \"partials/language.html\" as lang with context %}\n<div class=\"md-search\" data-md-component=\"search\" role=\"dialo"
},
{
"path": "SecurityPaper-themes/partials/social.html",
"chars": 312,
"preview": "{% if config.extra.social %}\n <div class=\"md-footer-social\">\n <link rel=\"stylesheet\" href=\"{{ '/assets/fonts/font-aw"
},
{
"path": "SecurityPaper-themes/partials/source.html",
"chars": 855,
"preview": "{% import \"partials/language.html\" as lang with context %}\n{% set platform = config.extra.repo_icon or config.repo_url %"
},
{
"path": "SecurityPaper-themes/partials/tabs-item.html",
"chars": 1148,
"preview": "{% if nav_item.is_homepage %}\n <li class=\"md-tabs__item\">\n {% if not page.ancestors | length and nav | selectattr(\"u"
},
{
"path": "SecurityPaper-themes/partials/tabs.html",
"chars": 369,
"preview": "{% set class = \"md-tabs\" %}\n{% if page.ancestors | length > 0 %}\n {% set class = \"md-tabs md-tabs--active\" %}\n{% endif "
},
{
"path": "SecurityPaper-themes/partials/toc-item.html",
"chars": 387,
"preview": "<li class=\"md-nav__item\">\n <a href=\"{{ toc_item.url }}\" title=\"{{ toc_item.title }}\" class=\"md-nav__link\">\n {{ toc_i"
},
{
"path": "SecurityPaper-themes/partials/toc.html",
"chars": 1296,
"preview": "{% import \"partials/language.html\" as lang with context %}\n<nav class=\"md-nav md-nav--secondary\">\n {% set toc_ = page.t"
},
{
"path": "docs/1.SDL介绍/1-什么是SDL.md",
"chars": 221,
"preview": "\n# 01.什么是SDL\n\n作者:Lost Maniac\n\n------\n\nSDL是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践,全称为Security Development Lifecycle。\n\nSDL是微软软件开发安全保"
},
{
"path": "docs/1.SDL介绍/2-企业为什么需求SDL.md",
"chars": 333,
"preview": "\n# 02.企业为什么需求SDL\n\n\n作者:Murviet\n\n-----\n\n在SDL方法中,目的是为了从安全漏洞产生的根源上解决应用安全问题,通过对软件开发流程的控制,保证产品的安全性。\n\n当一个企业对安全相对重视的情况下,在每年进行安全轮"
},
{
"path": "docs/1.SDL介绍/3-哪些企业需要SDL.md",
"chars": 444,
"preview": "\n# 03.哪些企业需要SDL\n\n作者:Murviet\n\n----\n\n哪些企业需要SDL\n\n随着社会的发展,现在基本上所有的企业都在利用计算机网络进行办公,几乎所有的商业信息都存储在了网络之上。如果对信息安全不够重视,一旦商业机密被他人窃取"
},
{
"path": "docs/1.SDL介绍/4-SDL所带来的优缺点.md",
"chars": 33,
"preview": "\n# 04.SDL所带来的优缺点\n\n作者:\n\n----\n\n未完成\n"
},
{
"path": "docs/2.SDL规范文档/1-安全设计Checklist.md",
"chars": 7594,
"preview": "\n# 01.安全设计Checklist\n\n作者:WeiHo@破晓团队(整理)\n\n协作:Lost Maniac、1024、pa55w0rd、doubiduo\n\n-------\n\n## 输入验证\n\n- 校验跨信任边界传递的不可信数据(策略检查数"
},
{
"path": "docs/2.SDL规范文档/10-SDL上线规定文档.md",
"chars": 1355,
"preview": "\n# 11. SDL上线规定文档\n\n\n作者:Lost Maniac\n\n协作:\n\n---\n\n## 1. 概述\n### 1.1. 编制目的\n\n为了提升公司各业务线产品的安全质量,降低安全风险,进一步提升公司整体安全水平,结合公司现有产品设计、开"
},
{
"path": "docs/2.SDL规范文档/11-web应用安全业务自查checklist.md",
"chars": 5766,
"preview": "\n# 11. Web应用安全业务自查checklist\n\n\n作者:realjac\n\n协作:Melody\n\n---\n\n## 1. 概述\n### 1.1. 编制目的\n\n* 此checklist用于业务线测试或开发人员在上线前进行安全自查\n* 安"
},
{
"path": "docs/2.SDL规范文档/2-php安全编码规范.md",
"chars": 3447,
"preview": "\n# 02.php安全编码规范\n\n作者:tinker\n\n协作:\n\n注解:请根据业务安全等级需要自行协调以下建议。\n\n---\n\n## 1.配置\nphp.ini基本安全配置\n\n---\n\n### 1.1应启用“cgi.force_redirect"
},
{
"path": "docs/2.SDL规范文档/3-java安全编码规范.md",
"chars": 14989,
"preview": "\n# 03.java安全编码规范\n\n\n作者:108haili\n\n协作:Lost Maniac\n\n-------\n\n## 1输入验证和数据合法性校验\n程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行"
},
{
"path": "docs/2.SDL规范文档/4-python安全编码规范.md",
"chars": 2044,
"preview": "\n# 04.python安全编码规范\n\n\n作者:I\n\n协作:\n\n-------\n\n## python语言安全\n\n本身要注意的有,一些危险函数,危险模块的调用,主要是系统调用。这个如果调用一定要对输入输出做好过滤,以下是代码中各种导致进行系统"
},
{
"path": "docs/2.SDL规范文档/5-nodejs安全编码规范.md",
"chars": 42,
"preview": "# 05.nodejs安全编码规范\n\n\n作者:\n\n协作:\n\n-------\n\n未完成"
},
{
"path": "docs/2.SDL规范文档/6-移动安全规范.md",
"chars": 59980,
"preview": "\n# 06.移动安全规范\n\n\n文档贡献者:johnathan \n\n\n-------\n\n## 1 移动安全入门\n\n移动安全带来了许多Web安全的挑战 - 广泛的受众,快速开发和持续的网络连接 - 加上更多传统胖客户端应用程序(例如缓冲区管理,"
},
{
"path": "docs/2.SDL规范文档/7-产品设计开发最佳实践.md",
"chars": 41,
"preview": "\n# 08.产品设计开发最佳实践\n\n\n作者:\n\n协作:\n\n-------\n\n未完成"
},
{
"path": "docs/2.SDL规范文档/8-常见协议安全开发实践.md",
"chars": 467,
"preview": "\n# 09. 常见协议安全\n\n\n作者:I\n\n协作:\n\n-------\n\n本文档通过介绍常见开发过程中因协议配置错误或代码漏洞而导致安全的问题去避免类似现象的发生。\n常见开发过程中的协议:\n\n* HTTPS\n* WebSocket\n* JWT"
},
{
"path": "docs/2.SDL规范文档/9-MySQL安全配置.md",
"chars": 12054,
"preview": "\n# 10. MySQL安全配置\n\n作者:Jun6l3\n\n协作:\n\n---\n\n数据库作为数据管理的平台,它的安全性首先由系统的内部安全和网络安全两部分来决定。对于系统管理员来说,首先要保证系统本身的安全,在安装MySQL数据库时,需要对基础"
},
{
"path": "docs/3.SDL落地方案/1-安全培训.md",
"chars": 2060,
"preview": "\n# 01.安全培训\n\n作者:Lost Maniac\n\n协作:李浩、袁文宇、I、Gòd、玄道k4n5ha0、johnathan、一条鱼、dubbo、夏韬、jsp-shell、108haili、1024、小乐天、fireeye、backlio"
},
{
"path": "docs/3.SDL落地方案/2-需求评估.md",
"chars": 2832,
"preview": "\n# 02.需求评估\n\n作者:I\n\n协作:\n\n----\n\n记录一次安全设计评审的过程,当然这也是我第一次进行安全评审。因此做一个总结。安全设计评审应该是SDL落地安全人员参与过程中首当其冲的地方。仅指安全人员自身的功用。如果按照`SDL`流"
},
{
"path": "docs/3.SDL落地方案/3-产品设计.md",
"chars": 6262,
"preview": "\n# 03.产品设计\n\n\n作者:Pa55w0rd\n\n协作:\n\n----\n\n\n## 1.应用系统架构安全设计要求\n\n在应用系统设计阶段,应充分考虑该架构的安全性,包括B/S、C/S等形式的安全,主要体现在应用数据和用户会话的安全,还应当考虑应"
},
{
"path": "docs/3.SDL落地方案/4-代码编写.md",
"chars": 577,
"preview": "\n# 04.代码编写\n\n\n作者:tinker\n\n协作:\n\n----\n\n## 1.编写《企业安全编码规范》\n根据公司所使用技术栈的不同,进行编码规范设计。\n\n## 2.制度流程建设\n建立完善的代码测试、反馈、上线流程。对开发人员代码质量问题、"
},
{
"path": "docs/3.SDL落地方案/5-渗透测试.md",
"chars": 2078,
"preview": "\n# 05.渗透测试\n\n作者:枫子\n\n协作:Lost Maniac\n\n----\n\n## 一、总则\n\n* 第一条 为了对信息系统的安全性作深入了解,及时发现信息系统中存在的安全薄弱环节,让技术人员了解当前信息系统的脆弱性和可能造成的影响,以"
},
{
"path": "docs/3.SDL落地方案/6-上线发布.md",
"chars": 3732,
"preview": "\n# 06.上线发布\n\n作者:Torjan\n\n协作:\n\n----\n\n\n\n# 1. 概述\n\n为进一步规范某公司应用系统上下线管理,实现系统建设、运行维护各阶段的平稳过渡和有序衔接,确保系统安全稳定可靠运行,特制定本办法。规范仅供参考。\n"
},
{
"path": "docs/3.SDL落地方案/7-应急响应.md",
"chars": 13681,
"preview": "\n# 07.应急响应\n\n作者:pa55w0rd\n\n协作\n\n----\n\n## 什么是应急响应和应急响应体系\n\n---\n\n### 基本概念\n\n**安全事件(Security Accident)** 是指影响一个系统正常工作的情况。这里的系统包括"
},
{
"path": "docs/4.构建企业安全/1-内功修炼第一步-挖漏洞.md",
"chars": 50,
"preview": "\n# 01.内功修炼第一步:挖漏洞\n\n作者:Lost Maniac\n\n协作:\n\n-----\n\n未完成"
},
{
"path": "docs/4.构建企业安全/2-内功修炼第二步-引起重视.md",
"chars": 52,
"preview": "\n# 02.内功修炼第二步:引起重视\n\n作者:Lost Maniac\n\n协作:\n\n\n-----\n\n未完成"
},
{
"path": "docs/4.构建企业安全/3-互联网安全运营的思考.md",
"chars": 1486,
"preview": "\n# 03.互联网企业安全运营的思考\n\n作者:Johnathan\n协作:\n---- \n\n## 1.信息安全运营的概念\n\n信息安全运营,简单理解就是让信息安全在企业(互联网企业,下文同)中跑起来。具体来讲就是依据信息安全管理和技术,围绕企业核"
},
{
"path": "docs/4.构建企业安全/4-如何利用Flink实现超大规模用户行为分析.md",
"chars": 3634,
"preview": "# 4.如何利用Flink实现超大规模用户行为分析\n\n作者:瀚思科技\n\n## 网络安全中的用户行为分析\n\n用户行为分析到底是什么?简而言之,其通过分析用户数据(例如交易数据,用户登录数据),找出异常行为以检测外部及内部人士的攻击活动。举例来"
},
{
"path": "docs/4.构建企业安全/5-APT 攻击基础科普.md",
"chars": 488,
"preview": "# 5-APT攻击基础科普\n\n作者:backlion\n\n## APT 的历史起源背景\n\nAPT 这个词汇最早起源于:2005 年英国和美国的 CERT 组织发布了关于有 针对性的社交工程电子邮件,放弃特洛伊木马以泄露敏感信息的第一个警告,尽"
},
{
"path": "docs/5.附录/01.相关术语.md",
"chars": 1739,
"preview": "\n# 01.相关术语\n\n作者:mour\n\n协作:Lost Maniac\n\n---\n\n## SDL\n\nSDL是在软件开发过程中帮助开发人员构建更安全的软件并解决安全问题,同时降低开发成本的一套流程方法。\n\n> The Security Dev"
},
{
"path": "docs/5.附录/02.文档变更规范.md",
"chars": 758,
"preview": "\n# 02.文档变更规范\n\n作者:Lost Maniac\n\n协作:\n\n-----\n\n为了确保大家不会误操作导致问题,特此规范如下\n\n\n### 如何增加大纲内容\n\n\n需要创建问卷调查,详细描述大纲内容需要增加到哪里,详细阐述原因,选项为:同意"
},
{
"path": "docs/5.附录/03.GitHub工作流.md",
"chars": 856,
"preview": "\n# 03.Github工作流\n\n作者:Pa55w0rd\n\n\n\n\nfork项目到自己账户,修改后提交给主分支,审核后即可展示。\n提交可以多种方式,如web、命令、客户端,这里演示web提交方式\n提交SDL落地方案-产品设计\n1. 选择相应的"
},
{
"path": "docs/5.附录/04.NAXSI安装测试与简介.md",
"chars": 8808,
"preview": "\n# 04.NAXSI安装测试与简介\n\n\n# NAXSI安装测试与简介\n\n## 一、安装和测试\n安装环境Ubuntu Server 16.04。\n\n### 1、安装ElasticSearch和Kibana作为日志存储和展示工具。\nubunt"
},
{
"path": "docs/6.Project/1-内部钓鱼系统.md",
"chars": 2123,
"preview": "\n# 01.内部钓鱼系统\n\n作者:Lost Maniac\n\n协作:\n\n-----\n\n## 简介\n---\n\n本项目是基于thinkphp写的一个内部钓鱼网站系统。用来测试甲方公司内部钓鱼,请勿用于非法用途。\n\n## 项目源码\n\n本项目托管在G"
},
{
"path": "docs/6.Project/2-工作流自动化代码审计.md",
"chars": 10250,
"preview": "\n# 02.工作流自动化代码审计\n\n作者:Lost Maniac\n\n协作:\n\n-----\n\n## 简介\n---\n\nsonar\n\n## 项目源码\n\n本项目托管在GitHub,地址为:https://github.com/sdlchina/ph"
},
{
"path": "docs/6.Project/3-泰式感知.md",
"chars": 166,
"preview": "\n# 03.泰式感知\n\n\n作者:Lost Maniac\n\n协作:\n\n-----\n\n## 简介\n\n泰式感知,命名是由玄道发起,经过十几个名字的激烈讨论和投票,最终获胜。\n\n## 功能\n\n泰式感知系统收集互联网大量安全舆情,通过订阅关键字,精准"
},
{
"path": "docs/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全.md",
"chars": 7450,
"preview": "# BeyondCorp -以全新方式保障企业安全\n\n翻译:lmowen\n\n## 作者\n\n**Rory Ward**是一名谷歌爱尔兰的站点可靠性工程经理。他曾经就职于Valista@爱尔兰,AOL@硅谷,Netscape,KIVA,Gene"
},
{
"path": "docs/_headers",
"chars": 61,
"preview": "/*\n Cache-Control : public, max-age=604800 , must-revalidate"
},
{
"path": "docs/index.md",
"chars": 8184,
"preview": "# 关于我们\n\n** 所有文档均由中国互联网一线安全工程师编写整理 **\n\n\n<span id=\"busuanzi_container_site_pv\">为安全同学服务<span id=\"busuanzi_value_site_pv\"></"
},
{
"path": "docs/update.md",
"chars": 2089,
"preview": "# 更新日志\n\n## 2019年8月26日\n\n更新内容:\n\n1. 增加“SDL落地方案-代码编写”部分\n\n## 2019年4月25日\n\n更新内容:\n\n1. 增加应用安全业务自查checklist\n2. 增加成员realjac\n3. 更新co"
},
{
"path": "mkdocs.yml",
"chars": 2680,
"preview": "site_name: Security Paper\nsite_description: 所有文档均由中国互联网一线安全工程师编写整理\nsite_author: Security Paper\nsite_url: https://www.sec"
},
{
"path": "requirements.txt",
"chars": 6,
"preview": "mkdocs"
}
]
About this extraction
This page contains the full source code of the SecurityPaper/SecurityPaper-web GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 122 files (1.8 MB), approximately 924.9k tokens, and a symbol index with 220 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.