').hide().insertBefore($target);
-
- $events.one(event_purge, function () {
- $inline.replaceWith($target);
- });
-
- prep($target);
- } else if (settings.get('iframe')) {
- // IFrame element won't be added to the DOM until it is ready to be displayed,
- // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
- prep(" ");
- } else if (settings.get('html')) {
- prep(settings.get('html'));
- } else if (isImage(settings, href)) {
-
- href = retinaUrl(settings, href);
-
- photo = settings.get('createImg');
-
- $(photo)
- .addClass(prefix + 'Photo')
- .bind('error.'+prefix,function () {
- prep($tag(div, 'Error').html(settings.get('imgError')));
- })
- .one('load', function () {
- if (request !== requests) {
- return;
- }
-
- // A small pause because some browsers will occassionaly report a
- // img.width and img.height of zero immediately after the img.onload fires
- setTimeout(function(){
- var percent;
-
- if (settings.get('retinaImage') && window.devicePixelRatio > 1) {
- photo.height = photo.height / window.devicePixelRatio;
- photo.width = photo.width / window.devicePixelRatio;
- }
-
- if (settings.get('scalePhotos')) {
- setResize = function () {
- photo.height -= photo.height * percent;
- photo.width -= photo.width * percent;
- };
- if (settings.mw && photo.width > settings.mw) {
- percent = (photo.width - settings.mw) / photo.width;
- setResize();
- }
- if (settings.mh && photo.height > settings.mh) {
- percent = (photo.height - settings.mh) / photo.height;
- setResize();
- }
- }
-
- if (settings.h) {
- photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px';
- }
-
- if ($related[1] && (settings.get('loop') || $related[index + 1])) {
- photo.style.cursor = 'pointer';
-
- $(photo).bind('click.'+prefix, function () {
- publicMethod.next();
- });
- }
-
- photo.style.width = photo.width + 'px';
- photo.style.height = photo.height + 'px';
- prep(photo);
- }, 1);
- });
-
- photo.src = href;
-
- } else if (href) {
- $loadingBay.load(href, settings.get('data'), function (data, status) {
- if (request === requests) {
- prep(status === 'error' ? $tag(div, 'Error').html(settings.get('xhrError')) : $(this).contents());
- }
- });
- }
- }
-
- // Navigates to the next page/image in a set.
- publicMethod.next = function () {
- if (!active && $related[1] && (settings.get('loop') || $related[index + 1])) {
- index = getIndex(1);
- launch($related[index]);
- }
- };
-
- publicMethod.prev = function () {
- if (!active && $related[1] && (settings.get('loop') || index)) {
- index = getIndex(-1);
- launch($related[index]);
- }
- };
-
- // Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close();
- publicMethod.close = function () {
- if (open && !closing) {
-
- closing = true;
- open = false;
- trigger(event_cleanup);
- settings.get('onCleanup');
- $window.unbind('.' + prefix);
- $overlay.fadeTo(settings.get('fadeOut') || 0, 0);
-
- $box.stop().fadeTo(settings.get('fadeOut') || 0, 0, function () {
- $box.hide();
- $overlay.hide();
- trigger(event_purge);
- $loaded.remove();
-
- setTimeout(function () {
- closing = false;
- trigger(event_closed);
- settings.get('onClosed');
- }, 1);
- });
- }
- };
-
- // Removes changes Colorbox made to the document, but does not remove the plugin.
- publicMethod.remove = function () {
- if (!$box) { return; }
-
- $box.stop();
- $[colorbox].close();
- $box.stop(false, true).remove();
- $overlay.remove();
- closing = false;
- $box = null;
- $('.' + boxElement)
- .removeData(colorbox)
- .removeClass(boxElement);
-
- $(document).unbind('click.'+prefix).unbind('keydown.'+prefix);
- };
-
- // A method for fetching the current element Colorbox is referencing.
- // returns a jQuery object.
- publicMethod.element = function () {
- return $(settings.el);
- };
-
- publicMethod.settings = defaults;
-
-}(jQuery, document, window));
diff --git a/pmaweb/static/css/font-awesome.css b/pmaweb/static/css/font-awesome.css
deleted file mode 100644
index 2dcdc220..00000000
--- a/pmaweb/static/css/font-awesome.css
+++ /dev/null
@@ -1,1801 +0,0 @@
-/*!
- * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */
-/* FONT PATH
- * -------------------------- */
-@font-face {
- font-family: 'FontAwesome';
- src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');
- src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-.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;
- transform: translate(0, 0);
-}
-/* makes the font 33% larger relative to the icon container */
-.fa-lg {
- font-size: 1.33333333em;
- line-height: 0.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: 0.14285714em;
- text-align: center;
-}
-.fa-li.fa-lg {
- left: -1.85714286em;
-}
-.fa-border {
- padding: .2em .25em .15em;
- border: solid 0.08em #eeeeee;
- border-radius: .1em;
-}
-.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 {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
- -webkit-transform: rotate(90deg);
- -ms-transform: rotate(90deg);
- transform: rotate(90deg);
-}
-.fa-rotate-180 {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
- -webkit-transform: rotate(180deg);
- -ms-transform: rotate(180deg);
- transform: rotate(180deg);
-}
-.fa-rotate-270 {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
- -webkit-transform: rotate(270deg);
- -ms-transform: rotate(270deg);
- transform: rotate(270deg);
-}
-.fa-flip-horizontal {
- 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 {
- 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: #ffffff;
-}
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
- readers do not read off random characters that represent icons */
-.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-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: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-rebel:before {
- content: "\f1d0";
-}
-.fa-ge:before,
-.fa-empire:before {
- content: "\f1d1";
-}
-.fa-git-square:before {
- content: "\f1d2";
-}
-.fa-git:before {
- content: "\f1d3";
-}
-.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-genderless:before,
-.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-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-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";
-}
diff --git a/pmaweb/static/css/font-awesome.min.css b/pmaweb/static/css/font-awesome.min.css
deleted file mode 100644
index 24fcc04c..00000000
--- a/pmaweb/static/css/font-awesome.min.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Font Awesome 4.3.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';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.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;transform:translate(0, 0)}.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}.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{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{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{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-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: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-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.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-genderless:before,.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-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-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"}
\ No newline at end of file
diff --git a/pmaweb/static/css/style.css b/pmaweb/static/css/style.css
deleted file mode 100644
index c9e9f42b..00000000
--- a/pmaweb/static/css/style.css
+++ /dev/null
@@ -1,186 +0,0 @@
-#logo {
- padding: 0;
- margin: 0 20px;
- background: url('../images/logo.png') no-repeat;
- width: 172px;
- height: 100px;
- font-size: 1px;
- color: white;
- display: inline-block;
- vertical-align: middle;
-}
-
-.sponsors {
- min-width: 250px;
-}
-
-.sponsors div {
- padding: 0.5em 0 0.5em 0;
-}
-
-.sponsors p a {
- font-size: smaller;
- color: #666699;
-}
-.sp {
- display: table;
- width: 100%;
-}
-.sp a {
- display:table-cell;
- vertical-align:middle;
- min-width: 264px;
- text-align: center;
-}
-.diamond {
- height: 250px;
-}
-.platinum {
- height: 130px;
-}
-.gold {
- height: 70px;
-}
-
-.logos a {
- display: inline-block;
- padding: 0.5em;
- vertical-align: middle;
- /* 250 + 2 * 7 padding */
- min-width: 264px;
- text-align: center;
-}
-
-.themeimg {
- height: 8em !important;
- max-width: 30em !important;
-}
-
-p.date {
- font-size: smaller;
-}
-
-p {
- max-width: 55em;
- margin: 1em;
-}
-
-.book img {
- margin: 1em;
- float: left;
- border: 1px solid black;
-}
-
-.screenshot {
- float: left;
- border: 1px solid #7584b3;
- margin: 0.2em;
- padding: 0.2em;
-}
-
-.screenshot img {
- max-height: 150px;
- overflow: hidden;
-}
-
-.bookbanner {
- float: left;
- margin: 1em;
- width: 150px;
- height: 185px;
- overflow: hidden;
-}
-
-p.award {
- font-size: large;
- font-weight: bold;
-}
-
-.td-bar {
- width: 400px;
-}
-
-.progress {
- margin-bottom: 0;
-}
-.progress-bar {
- min-width: 3em;
-}
-
-.td-size {
- text-align: right;
-}
-
-td.count {
- text-align: right;
-}
-
-em.big {
- font-style: normal;
- font-size: 1.2em;
-}
-div.subscribe {
- text-align: center;
-}
-.fa-google-plus-square {
- color: #dd4b39;
-}
-.fa-twitter-square {
- color: #55acee;
-}
-.fa-facebook-official {
- color: #3b5998;
-}
-.logo .fa {
- text-decoration: none;
- font-size: 150%;
-}
-.sfc-logo {
- text-align: center;
-}
-footer ul {
- padding:0;
- margin:1em;
- max-width:none;
- clear:both;
-}
-footer li{
- font-size:small;
- list-style:none;
- float:left;
- padding:1em;
- color:gray;
- border:none;
-}
-.security a {
- white-space: nowrap;
-}
-.ahead {
- display: block;
-}
-.img-margin {
- margin: 7px;
-}
-
-#cycler {
- position: relative;
-}
-#cycler img {
- position: absolute;
- z-index: 1;
-}
-#cycler .active{
- z-index: 3;
-}
-
-.boxes a {
- display: block;
- margin: 5px;
-}
-
-.featured-dl {
- font-weight: bold;
-}
-.images .col-md-3 {
- min-height: 300px;
-}
diff --git a/pmaweb/static/css/styles.css b/pmaweb/static/css/styles.css
new file mode 100644
index 00000000..00a97b3e
--- /dev/null
+++ b/pmaweb/static/css/styles.css
@@ -0,0 +1,20 @@
+#logo {
+ background: url('../images/logo.svg') no-repeat;
+ width: 172px;
+ height: 100px;
+ text-indent: -9999px;
+ display: inline-block;
+}
+
+.bi {
+ width: 1em;
+ height: 1em;
+ vertical-align: -.125em;
+ fill: currentcolor;
+}
+
+/* Lightbox carousel has a black background; in dark mode, control icons would be invisible. */
+[data-bs-theme=dark] .lightbox-carousel .carousel-control-next-icon,
+[data-bs-theme=dark] .lightbox-carousel .carousel-control-prev-icon {
+ filter: none;
+}
diff --git a/pmaweb/static/fonts/FontAwesome.otf b/pmaweb/static/fonts/FontAwesome.otf
deleted file mode 100644
index f7936cc1..00000000
Binary files a/pmaweb/static/fonts/FontAwesome.otf and /dev/null differ
diff --git a/pmaweb/static/fonts/fontawesome-webfont.eot b/pmaweb/static/fonts/fontawesome-webfont.eot
deleted file mode 100644
index 33b2bb80..00000000
Binary files a/pmaweb/static/fonts/fontawesome-webfont.eot and /dev/null differ
diff --git a/pmaweb/static/fonts/fontawesome-webfont.svg b/pmaweb/static/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 1ee89d43..00000000
--- a/pmaweb/static/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,565 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pmaweb/static/fonts/fontawesome-webfont.ttf b/pmaweb/static/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index ed9372f8..00000000
Binary files a/pmaweb/static/fonts/fontawesome-webfont.ttf and /dev/null differ
diff --git a/pmaweb/static/fonts/fontawesome-webfont.woff b/pmaweb/static/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 8b280b98..00000000
Binary files a/pmaweb/static/fonts/fontawesome-webfont.woff and /dev/null differ
diff --git a/pmaweb/static/fonts/fontawesome-webfont.woff2 b/pmaweb/static/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 3311d585..00000000
Binary files a/pmaweb/static/fonts/fontawesome-webfont.woff2 and /dev/null differ
diff --git a/pmaweb/static/images/BrowserStackLogo.png b/pmaweb/static/images/BrowserStackLogo.png
deleted file mode 100644
index 3cf70fb7..00000000
Binary files a/pmaweb/static/images/BrowserStackLogo.png and /dev/null differ
diff --git a/pmaweb/static/images/books/pma_cz_90x122.jpg b/pmaweb/static/images/books/pma_cz_90x122.jpg
deleted file mode 100644
index dd54699d..00000000
Binary files a/pmaweb/static/images/books/pma_cz_90x122.jpg and /dev/null differ
diff --git a/pmaweb/static/images/books/pma_en_100x123.png b/pmaweb/static/images/books/pma_en_100x123.png
deleted file mode 100644
index 84bcdfba..00000000
Binary files a/pmaweb/static/images/books/pma_en_100x123.png and /dev/null differ
diff --git a/pmaweb/static/images/books/pma_en_3.4_150x185.png b/pmaweb/static/images/books/pma_en_3.4_150x185.png
deleted file mode 100644
index dbeada02..00000000
Binary files a/pmaweb/static/images/books/pma_en_3.4_150x185.png and /dev/null differ
diff --git a/pmaweb/static/images/books/pma_en_mastering_2.11.png b/pmaweb/static/images/books/pma_en_mastering_2.11.png
new file mode 100644
index 00000000..33b9141e
Binary files /dev/null and b/pmaweb/static/images/books/pma_en_mastering_2.11.png differ
diff --git a/pmaweb/static/images/books/pma_en_mastering_3.4.png b/pmaweb/static/images/books/pma_en_mastering_3.4.png
new file mode 100644
index 00000000..7317f272
Binary files /dev/null and b/pmaweb/static/images/books/pma_en_mastering_3.4.png differ
diff --git a/pmaweb/static/images/books/pma_en_starter.jpg b/pmaweb/static/images/books/pma_en_starter.jpg
new file mode 100644
index 00000000..d22491e2
Binary files /dev/null and b/pmaweb/static/images/books/pma_en_starter.jpg differ
diff --git a/pmaweb/static/images/books/pma_es_100x123.png b/pmaweb/static/images/books/pma_es_100x123.png
deleted file mode 100644
index b0dac26e..00000000
Binary files a/pmaweb/static/images/books/pma_es_100x123.png and /dev/null differ
diff --git a/pmaweb/static/images/books/pma_starter_150x184.jpg b/pmaweb/static/images/books/pma_starter_150x184.jpg
deleted file mode 100644
index a6b5069e..00000000
Binary files a/pmaweb/static/images/books/pma_starter_150x184.jpg and /dev/null differ
diff --git a/pmaweb/static/images/cdn77_logo.png b/pmaweb/static/images/cdn77_logo.png
deleted file mode 100644
index a14843f2..00000000
Binary files a/pmaweb/static/images/cdn77_logo.png and /dev/null differ
diff --git a/pmaweb/static/images/conservancy.png b/pmaweb/static/images/conservancy.png
new file mode 100644
index 00000000..231e05f9
Binary files /dev/null and b/pmaweb/static/images/conservancy.png differ
diff --git a/pmaweb/static/images/github.png b/pmaweb/static/images/github.png
deleted file mode 100644
index 1a08a2e9..00000000
Binary files a/pmaweb/static/images/github.png and /dev/null differ
diff --git a/pmaweb/static/images/heads/deven.jpg b/pmaweb/static/images/heads/deven.jpg
deleted file mode 100644
index d62b626b..00000000
Binary files a/pmaweb/static/images/heads/deven.jpg and /dev/null differ
diff --git a/pmaweb/static/images/heads/isaac.jpg b/pmaweb/static/images/heads/isaac.jpg
deleted file mode 100644
index c1b04dee..00000000
Binary files a/pmaweb/static/images/heads/isaac.jpg and /dev/null differ
diff --git a/pmaweb/static/images/heads/mauricio.jpg b/pmaweb/static/images/heads/mauricio.jpg
deleted file mode 100644
index b5028560..00000000
Binary files a/pmaweb/static/images/heads/mauricio.jpg and /dev/null differ
diff --git a/pmaweb/static/images/logo.svg b/pmaweb/static/images/logo.svg
new file mode 100644
index 00000000..6ef23a87
--- /dev/null
+++ b/pmaweb/static/images/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/pmaweb/static/images/screenshots/advisor-small.png b/pmaweb/static/images/screenshots/advisor-small.png
deleted file mode 100644
index b338622a..00000000
Binary files a/pmaweb/static/images/screenshots/advisor-small.png and /dev/null differ
diff --git a/pmaweb/static/images/screenshots/designer-small.png b/pmaweb/static/images/screenshots/designer-small.png
deleted file mode 100644
index 43f26c07..00000000
Binary files a/pmaweb/static/images/screenshots/designer-small.png and /dev/null differ
diff --git a/pmaweb/static/images/screenshots/gis-small.png b/pmaweb/static/images/screenshots/gis-small.png
deleted file mode 100644
index e8ecde0d..00000000
Binary files a/pmaweb/static/images/screenshots/gis-small.png and /dev/null differ
diff --git a/pmaweb/static/images/screenshots/monitor-small.png b/pmaweb/static/images/screenshots/monitor-small.png
deleted file mode 100644
index bf5ebdfc..00000000
Binary files a/pmaweb/static/images/screenshots/monitor-small.png and /dev/null differ
diff --git a/pmaweb/static/images/screenshots/rtl-small.png b/pmaweb/static/images/screenshots/rtl-small.png
deleted file mode 100644
index 28bd1745..00000000
Binary files a/pmaweb/static/images/screenshots/rtl-small.png and /dev/null differ
diff --git a/pmaweb/static/images/screenshots/structure-small.png b/pmaweb/static/images/screenshots/structure-small.png
deleted file mode 100644
index 939a6b05..00000000
Binary files a/pmaweb/static/images/screenshots/structure-small.png and /dev/null differ
diff --git a/pmaweb/static/images/screenshots/transformations-small.png b/pmaweb/static/images/screenshots/transformations-small.png
deleted file mode 100644
index f8b812a4..00000000
Binary files a/pmaweb/static/images/screenshots/transformations-small.png and /dev/null differ
diff --git a/pmaweb/static/images/screenshots/users-small.png b/pmaweb/static/images/screenshots/users-small.png
deleted file mode 100644
index 0d7b0d02..00000000
Binary files a/pmaweb/static/images/screenshots/users-small.png and /dev/null differ
diff --git a/pmaweb/static/images/scrutinizer.png b/pmaweb/static/images/scrutinizer.png
deleted file mode 100644
index 546e60a6..00000000
Binary files a/pmaweb/static/images/scrutinizer.png and /dev/null differ
diff --git a/pmaweb/static/images/security-audit_250.png b/pmaweb/static/images/security-audit_250.png
deleted file mode 100644
index 5828c3a1..00000000
Binary files a/pmaweb/static/images/security-audit_250.png and /dev/null differ
diff --git a/pmaweb/static/images/sfc_logo.png b/pmaweb/static/images/sfc_logo.png
deleted file mode 100644
index 90913265..00000000
Binary files a/pmaweb/static/images/sfc_logo.png and /dev/null differ
diff --git a/pmaweb/static/images/4kdownload.png b/pmaweb/static/images/sponsors/4kdownload.png
similarity index 100%
rename from pmaweb/static/images/4kdownload.png
rename to pmaweb/static/images/sponsors/4kdownload.png
diff --git a/pmaweb/static/images/bountii.png b/pmaweb/static/images/sponsors/bountii.png
similarity index 100%
rename from pmaweb/static/images/bountii.png
rename to pmaweb/static/images/sponsors/bountii.png
diff --git a/pmaweb/static/images/sponsors/browserstack.svg b/pmaweb/static/images/sponsors/browserstack.svg
new file mode 100644
index 00000000..62964334
--- /dev/null
+++ b/pmaweb/static/images/sponsors/browserstack.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/pmaweb/static/images/buycheapestfollowers.png b/pmaweb/static/images/sponsors/buycheapestfollowers.png
similarity index 100%
rename from pmaweb/static/images/buycheapestfollowers.png
rename to pmaweb/static/images/sponsors/buycheapestfollowers.png
diff --git a/pmaweb/static/images/buzzoid.png b/pmaweb/static/images/sponsors/buzzoid.png
similarity index 100%
rename from pmaweb/static/images/buzzoid.png
rename to pmaweb/static/images/sponsors/buzzoid.png
diff --git a/pmaweb/static/images/sponsors/cdn77.svg b/pmaweb/static/images/sponsors/cdn77.svg
new file mode 100644
index 00000000..9c5d6a0e
--- /dev/null
+++ b/pmaweb/static/images/sponsors/cdn77.svg
@@ -0,0 +1 @@
+
diff --git a/pmaweb/static/images/celebian.png b/pmaweb/static/images/sponsors/celebian.png
similarity index 100%
rename from pmaweb/static/images/celebian.png
rename to pmaweb/static/images/sponsors/celebian.png
diff --git a/pmaweb/static/images/copycopter.png b/pmaweb/static/images/sponsors/copycopter.png
similarity index 100%
rename from pmaweb/static/images/copycopter.png
rename to pmaweb/static/images/sponsors/copycopter.png
diff --git a/pmaweb/static/images/famety.png b/pmaweb/static/images/sponsors/famety.png
similarity index 100%
rename from pmaweb/static/images/famety.png
rename to pmaweb/static/images/sponsors/famety.png
diff --git a/pmaweb/static/images/follower24.png b/pmaweb/static/images/sponsors/follower24.png
similarity index 100%
rename from pmaweb/static/images/follower24.png
rename to pmaweb/static/images/sponsors/follower24.png
diff --git a/pmaweb/static/images/sponsors/github.png b/pmaweb/static/images/sponsors/github.png
new file mode 100644
index 00000000..f10f640e
Binary files /dev/null and b/pmaweb/static/images/sponsors/github.png differ
diff --git a/pmaweb/static/images/sponsors/github.svg b/pmaweb/static/images/sponsors/github.svg
new file mode 100644
index 00000000..1378242d
--- /dev/null
+++ b/pmaweb/static/images/sponsors/github.svg
@@ -0,0 +1 @@
+
diff --git a/pmaweb/static/images/idigic.png b/pmaweb/static/images/sponsors/idigic.png
similarity index 100%
rename from pmaweb/static/images/idigic.png
rename to pmaweb/static/images/sponsors/idigic.png
diff --git a/pmaweb/static/images/megafamous.png b/pmaweb/static/images/sponsors/megafamous.png
similarity index 100%
rename from pmaweb/static/images/megafamous.png
rename to pmaweb/static/images/sponsors/megafamous.png
diff --git a/pmaweb/static/images/quickbookstoolhub.png b/pmaweb/static/images/sponsors/quickbookstoolhub.png
similarity index 100%
rename from pmaweb/static/images/quickbookstoolhub.png
rename to pmaweb/static/images/sponsors/quickbookstoolhub.png
diff --git a/pmaweb/static/images/ramotion.png b/pmaweb/static/images/sponsors/ramotion.png
similarity index 100%
rename from pmaweb/static/images/ramotion.png
rename to pmaweb/static/images/sponsors/ramotion.png
diff --git a/pmaweb/static/images/sponsors/scrutinizer.svg b/pmaweb/static/images/sponsors/scrutinizer.svg
new file mode 100644
index 00000000..ea1ad7fd
--- /dev/null
+++ b/pmaweb/static/images/sponsors/scrutinizer.svg
@@ -0,0 +1 @@
+
diff --git a/pmaweb/static/images/socialboosting.png b/pmaweb/static/images/sponsors/socialboosting.png
similarity index 100%
rename from pmaweb/static/images/socialboosting.png
rename to pmaweb/static/images/sponsors/socialboosting.png
diff --git a/pmaweb/static/images/socialboss.png b/pmaweb/static/images/sponsors/socialboss.png
similarity index 100%
rename from pmaweb/static/images/socialboss.png
rename to pmaweb/static/images/sponsors/socialboss.png
diff --git a/pmaweb/static/images/superviral.png b/pmaweb/static/images/sponsors/superviral.png
similarity index 100%
rename from pmaweb/static/images/superviral.png
rename to pmaweb/static/images/sponsors/superviral.png
diff --git a/pmaweb/static/images/twicsy.png b/pmaweb/static/images/sponsors/twicsy.png
similarity index 100%
rename from pmaweb/static/images/twicsy.png
rename to pmaweb/static/images/sponsors/twicsy.png
diff --git a/pmaweb/static/images/vape.png b/pmaweb/static/images/sponsors/vape.png
similarity index 100%
rename from pmaweb/static/images/vape.png
rename to pmaweb/static/images/sponsors/vape.png
diff --git a/pmaweb/static/images/vapehuset.png b/pmaweb/static/images/sponsors/vapehuset.png
similarity index 100%
rename from pmaweb/static/images/vapehuset.png
rename to pmaweb/static/images/sponsors/vapehuset.png
diff --git a/pmaweb/static/images/views4you.png b/pmaweb/static/images/sponsors/views4you.png
similarity index 100%
rename from pmaweb/static/images/views4you.png
rename to pmaweb/static/images/sponsors/views4you.png
diff --git a/pmaweb/static/images/viralyft.png b/pmaweb/static/images/sponsors/viralyft.png
similarity index 100%
rename from pmaweb/static/images/viralyft.png
rename to pmaweb/static/images/sponsors/viralyft.png
diff --git a/pmaweb/static/images/sponsors/weblate.svg b/pmaweb/static/images/sponsors/weblate.svg
new file mode 100644
index 00000000..49d849f8
--- /dev/null
+++ b/pmaweb/static/images/sponsors/weblate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/pmaweb/static/images/weblate-button.png b/pmaweb/static/images/weblate-button.png
deleted file mode 100644
index 1f7d7235..00000000
Binary files a/pmaweb/static/images/weblate-button.png and /dev/null differ
diff --git a/pmaweb/static/js/bs5-lightbox/index.bundle.min.js b/pmaweb/static/js/bs5-lightbox/index.bundle.min.js
new file mode 100644
index 00000000..15ab5cb3
--- /dev/null
+++ b/pmaweb/static/js/bs5-lightbox/index.bundle.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Lightbox for Bootstrap 5 v1.8.3 (https://trvswgnr.github.io/bs5-lightbox/)
+ * Copyright 2023 Travis Aaron Wagner (https://github.com/trvswgnr/)
+ * Licensed under MIT (https://github.com/trvswgnr/bs5-lightbox/blob/main/LICENSE)
+ */!function(){"use strict";var t={d:function(e,s){for(var a in s)t.o(s,a)&&!t.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:s[a]})},o:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}},e={};t.d(e,{default:function(){return i}});var s=window.bootstrap;const a={Modal:s.Modal,Carousel:s.Carousel};class o{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.hash=this.randomHash(),this.settings=Object.assign(Object.assign(Object.assign({},a.Modal.Default),a.Carousel.Default),{interval:!1,target:'[data-toggle="lightbox"]',gallery:"",size:"xl",constrain:!0}),this.settings=Object.assign(Object.assign({},this.settings),e),this.modalOptions=(()=>this.setOptionsFromSettings(a.Modal.Default))(),this.carouselOptions=(()=>this.setOptionsFromSettings(a.Carousel.Default))(),"string"==typeof t&&(this.settings.target=t,t=document.querySelector(this.settings.target)),this.el=t,this.type=t.dataset.type||"",this.src=this.getSrc(t),this.sources=this.getGalleryItems(),this.createCarousel(),this.createModal()}show(){document.body.appendChild(this.modalElement),this.modal.show()}hide(){this.modal.hide()}setOptionsFromSettings(t){return Object.keys(t).reduce(((t,e)=>Object.assign(t,{[e]:this.settings[e]})),{})}getSrc(t){let e=t.dataset.src||t.dataset.remote||t.href||"http://via.placeholder.com/1600x900";if("html"===t.dataset.type)return e;/\:\/\//.test(e)||(e=window.location.origin+e);const s=new URL(e);return(t.dataset.footer||t.dataset.caption)&&s.searchParams.set("caption",t.dataset.footer||t.dataset.caption),s.toString()}getGalleryItems(){let t;if(this.settings.gallery){if(Array.isArray(this.settings.gallery))return this.settings.gallery;t=this.settings.gallery}else this.el.dataset.gallery&&(t=this.el.dataset.gallery);return t?[...new Set(Array.from(document.querySelectorAll('[data-gallery="'.concat(t,'"]')),(t=>"".concat(t.dataset.type?t.dataset.type:"").concat(this.getSrc(t)))))]:["".concat(this.type?this.type:"").concat(this.src)]}getYoutubeId(t){if(!t)return!1;const e=t.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/);return!(!e||11!==e[2].length)&&e[2]}getYoutubeLink(t){const e=this.getYoutubeId(t);if(!e)return!1;const s=t.split("?");let a=s.length>1?"?"+s[1]:"";return"https://www.youtube.com/embed/".concat(e).concat(a)}getInstagramEmbed(t){if(/instagram/.test(t))return t+=/\/embed$/.test(t)?"":"/embed",'
')}isEmbed(t){const e=new RegExp("("+o.allowedEmbedTypes.join("|")+")").test(t),s=/\.(png|jpe?g|gif|svg|webp)/i.test(t)||"image"===this.el.dataset.type;return e||!s}createCarousel(){const t=document.createElement("template"),e=o.allowedMediaTypes.join("|"),s=this.sources.map(((t,s)=>{t=t.replace(/\/$/,"");const a=new RegExp("^(".concat(e,")"),"i"),o=/^html/.test(t),i=/^image/.test(t);a.test(t)&&(t=t.replace(a,""));const n=this.settings.constrain?"mw-100 mh-100 h-auto w-auto m-auto top-0 end-0 bottom-0 start-0":"h-100 w-100",l=new URLSearchParams(t.split("?")[1]);let r="",c=t;if(l.get("caption")){try{c=new URL(t),c.searchParams.delete("caption"),c=c.toString()}catch(e){c=t}r='
'.concat(l.get("caption"),"
")}let d='
'),h="";const u=this.getInstagramEmbed(t),m=this.getYoutubeLink(t);this.isEmbed(t)&&!i&&(m&&(t=m,h='title="YouTube video player" frameborder="0" allow="accelerometer autoplay clipboard-write encrypted-media gyroscope picture-in-picture"'),d=u||'
")),o&&(d=t);return'\n\t\t\t\t
\n\t\t\t\t\t').concat('
','\n\t\t\t\t\t
').concat(d,"
\n\t\t\t\t\t").concat(r,"\n\t\t\t\t
")})).join(""),i=this.sources.length<2?"":'\n\t\t\t
\n\t\t\t\t \n\t\t\t\tPrevious \n\t\t\t \n\t\t\t
\n\t\t\t\t \n\t\t\t\tNext \n\t\t\t ');let n="lightbox-carousel carousel slide";"fullscreen"===this.settings.size&&(n+=" position-absolute w-100 translate-middle top-50 start-50");const l='\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t').concat(s,"\n\t\t\t\t
\n\t\t\t\t").concat(i,"\n\t\t\t
");t.innerHTML=l.trim(),this.carouselElement=t.content.firstChild;const r=Object.assign(Object.assign({},this.carouselOptions),{keyboard:!1});this.carousel=new a.Carousel(this.carouselElement,r);const c=this.type&&"image"!==this.type?this.type+this.src:this.src;return this.carousel.to(this.findGalleryItemIndex(this.sources,c)),!0===this.carouselOptions.keyboard&&document.addEventListener("keydown",(t=>{if("ArrowLeft"===t.code){const t=document.getElementById("#lightboxCarousel-".concat(this.hash,"-prev"));return t&&t.click(),!1}if("ArrowRight"===t.code){const t=document.getElementById("#lightboxCarousel-".concat(this.hash,"-next"));return t&&t.click(),!1}})),this.carousel}findGalleryItemIndex(t,e){let s=0;for(const a of t){if(a.includes(e))return s;s++}return 0}createModal(){const t=document.createElement("template"),e='\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
').concat(' '," \n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
");return t.innerHTML=e.trim(),this.modalElement=t.content.firstChild,this.modalElement.querySelector(".modal-body").appendChild(this.carouselElement),this.modalElement.addEventListener("hidden.bs.modal",(()=>this.modalElement.remove())),this.modalElement.querySelector("[data-bs-dismiss]").addEventListener("click",(()=>this.modal.hide())),this.modal=new a.Modal(this.modalElement,this.modalOptions),this.modal}randomHash(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:8;return Array.from({length:t},(()=>Math.floor(36*Math.random()).toString(36))).join("")}}o.allowedEmbedTypes=["embed","youtube","vimeo","instagram","url"],o.allowedMediaTypes=[...o.allowedEmbedTypes,"image","html"],o.defaultSelector='[data-toggle="lightbox"]',o.initialize=function(t){t.preventDefault();new o(this).show()},document.querySelectorAll(o.defaultSelector).forEach((t=>t.addEventListener("click",o.initialize))),"undefined"!=typeof window&&window.bootstrap&&(window.bootstrap.Lightbox=o);var i=o;window.Lightbox=e.default}();
+//# sourceMappingURL=index.bundle.min.js.map
\ No newline at end of file
diff --git a/pmaweb/static/js/bs5-lightbox/index.bundle.min.js.map b/pmaweb/static/js/bs5-lightbox/index.bundle.min.js.map
new file mode 100644
index 00000000..2abe6ee7
--- /dev/null
+++ b/pmaweb/static/js/bs5-lightbox/index.bundle.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.bundle.min.js","mappings":";;;;4BACA,IAAIA,EAAsB,CCA1BA,EAAwB,SAASC,EAASC,GACzC,IAAI,IAAIC,KAAOD,EACXF,EAAoBI,EAAEF,EAAYC,KAASH,EAAoBI,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAG3E,ECPAH,EAAwB,SAASS,EAAKC,GAAQ,OAAOL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,EAAO,G,2CCAtG,IAAI,EAA+BI,OAAkB,UCQrD,MAAMC,EAAY,CACjBC,MAAK,QACLC,SAAQA,EAAAA,UAET,MAAMC,EACLC,YAAYC,GAAkB,IAAdC,EAAU,UAAH,6CAAG,CAAC,EAC1BC,KAAKC,KAAOD,KAAKE,aACjBF,KAAKG,SAAWpB,OAAOqB,OAAOrB,OAAOqB,OAAOrB,OAAOqB,OAAO,CAAC,EAAGX,EAAUC,MAAMW,SAAUZ,EAAUE,SAASU,SAAU,CACpHC,UAAU,EACVC,OAAQ,2BACRC,QAAS,GACTC,KAAM,KACNC,WAAW,IAEZV,KAAKG,SAAWpB,OAAOqB,OAAOrB,OAAOqB,OAAO,CAAC,EAAGJ,KAAKG,UAAWJ,GAChEC,KAAKW,aAAe,KAAOX,KAAKY,uBAAuBnB,EAAUC,MAAMW,SAAnD,GACpBL,KAAKa,gBAAkB,KAAOb,KAAKY,uBAAuBnB,EAAUE,SAASU,SAAtD,GACL,iBAAPP,IACVE,KAAKG,SAASI,OAAST,EACvBA,EAAKgB,SAASC,cAAcf,KAAKG,SAASI,SAE3CP,KAAKF,GAAKA,EACVE,KAAKgB,KAAOlB,EAAGmB,QAAQD,MAAQ,GAE/BhB,KAAKkB,IAAMlB,KAAKmB,OAAOrB,GACvBE,KAAKoB,QAAUpB,KAAKqB,kBACpBrB,KAAKsB,iBACLtB,KAAKuB,aACN,CACAC,OACCV,SAASW,KAAKC,YAAY1B,KAAK2B,cAC/B3B,KAAK4B,MAAMJ,MACZ,CACAK,OACC7B,KAAK4B,MAAMC,MACZ,CACAjB,uBAAuBzB,GACtB,OAAOJ,OAAO+C,KAAK3C,GAAK4C,QAAO,CAACC,EAAGC,IAAMlD,OAAOqB,OAAO4B,EAAG,CAAE,CAACC,GAAIjC,KAAKG,SAAS8B,MAAO,CAAC,EACxF,CACAd,OAAOrB,GACN,IAAIoB,EAAMpB,EAAGmB,QAAQC,KAAOpB,EAAGmB,QAAQiB,QAAUpC,EAAGqC,MAAQ,sCAC5D,GAAwB,SAApBrC,EAAGmB,QAAQD,KACd,OAAOE,EAEH,SAASkB,KAAKlB,KAClBA,EAAM1B,OAAO6C,SAASC,OAASpB,GAEhC,MAAMqB,EAAM,IAAIC,IAAItB,GAIpB,OAHIpB,EAAGmB,QAAQwB,QAAU3C,EAAGmB,QAAQyB,UACnCH,EAAII,aAAaC,IAAI,UAAW9C,EAAGmB,QAAQwB,QAAU3C,EAAGmB,QAAQyB,SAE1DH,EAAIM,UACZ,CACAxB,kBACC,IAAIyB,EACJ,GAAI9C,KAAKG,SAASK,QAAS,CAC1B,GAAIuC,MAAMC,QAAQhD,KAAKG,SAASK,SAC/B,OAAOR,KAAKG,SAASK,QAEtBsC,EAAgB9C,KAAKG,SAASK,OAC/B,MAAWR,KAAKF,GAAGmB,QAAQT,UAC1BsC,EAAgB9C,KAAKF,GAAGmB,QAAQT,SAKjC,OAHgBsC,EACb,IAAI,IAAIG,IAAIF,MAAMG,KAAKpC,SAASqC,iBAAiB,kBAAD,OAAmBL,EAAa,QAAQM,GAAC,UAAQA,EAAEnC,QAAQD,KAAOoC,EAAEnC,QAAQD,KAAO,IAAE,OAAGhB,KAAKmB,OAAOiC,QACpJ,CAAC,GAAD,OAAIpD,KAAKgB,KAAOhB,KAAKgB,KAAO,IAAE,OAAGhB,KAAKkB,KAE1C,CACAmC,aAAanC,GACZ,IAAKA,EAAK,OAAO,EACjB,MAAMoC,EAAUpC,EAAIqC,MAAM,gEAC1B,SAAOD,GAAiC,KAAtBA,EAAQ,GAAGE,SAAgBF,EAAQ,EACtD,CACAG,eAAevC,GACd,MAAMwC,EAAY1D,KAAKqD,aAAanC,GACpC,IAAKwC,EACJ,OAAO,EAGR,MAAMC,EAAMzC,EAAI0C,MAAM,KACtB,IAAIC,EAASF,EAAIH,OAAS,EAAI,IAAMG,EAAI,GAAK,GAE7C,MAAO,iCAAP,OAAwCD,GAAS,OAAGG,EACrD,CACAC,kBAAkB5C,GACjB,GAAI,YAAYkB,KAAKlB,GAEpB,OADAA,GAAO,WAAWkB,KAAKlB,GAAO,GAAK,SAC5B,gBAAP,OAAuBA,EAAG,mIAE5B,CACA6C,QAAQ7C,GACP,MACM6C,EADQ,IAAIC,OAAO,IAAMpE,EAASqE,kBAAkBC,KAAK,KAAO,KAChD9B,KAAKlB,GACrBiD,EAAQ,8BAA8B/B,KAAKlB,IAAiC,UAAzBlB,KAAKF,GAAGmB,QAAQD,KAEzE,OAAO+C,IAAYI,CACpB,CACA7C,iBACC,MAAM8C,EAAWtD,SAASuD,cAAc,YAClCC,EAAQ1E,EAAS2E,kBAAkBL,KAAK,KACxCM,EAAaxE,KAAKoB,QACtBqD,KAAI,CAACvD,EAAKwD,KACVxD,EAAMA,EAAIyD,QAAQ,MAAO,IACzB,MAAMC,EAAQ,IAAIZ,OAAO,KAAD,OAAMM,EAAK,KAAK,KAClCO,EAAS,QAAQzC,KAAKlB,GACtB4D,EAAgB,SAAS1C,KAAKlB,GAEhC0D,EAAMxC,KAAKlB,KACdA,EAAMA,EAAIyD,QAAQC,EAAO,KAE1B,MAAMG,EAAa/E,KAAKG,SAASO,UAAY,kEAAoE,cAC3GmD,EAAS,IAAImB,gBAAgB9D,EAAI0C,MAAM,KAAK,IAClD,IAAIlB,EAAU,GACVH,EAAMrB,EACV,GAAI2C,EAAO3E,IAAI,WAAY,CAC1B,IACCqD,EAAM,IAAIC,IAAItB,GACdqB,EAAII,aAAasC,OAAO,WACxB1C,EAAMA,EAAIM,UAGX,CAFE,MAAOqC,GACR3C,EAAMrB,CACP,CACAwB,EAAU,wEAAH,OAA2EmB,EAAO3E,IAAI,WAAU,YACxG,CACA,IAAIiG,EAAQ,aAAH,OAAgB5C,EAAG,4BAAoBwC,EAAU,2DACtDK,EAAa,GACjB,MAAMC,EAAiBrF,KAAK8D,kBAAkB5C,GACxCoE,EAActF,KAAKyD,eAAevC,GACpClB,KAAK+D,QAAQ7C,KAAS4D,IACrBQ,IACHpE,EAAMoE,EACNF,EAAa,4IAEdD,EAAQE,GAAkB,gBAAJ,OAAoBnE,EAAG,aAAKkE,EAAU,+BAEzDP,IACHM,EAAQjE,GAGT,MAAO,uCAAP,OAC6BwD,EAAe,GAAX,SAAa,mDAF9B,qKAGN,qFACuDS,EAAK,6BACnEzC,EAAO,uBAGVwB,KAAK,IACDqB,EACLvF,KAAKoB,QAAQoC,OAAS,EACnB,GAAE,gDAE2BxD,KAAKC,KAAI,6HAAqHD,KAAKC,KAAI,6NAIvID,KAAKC,KAAI,6HAAqHD,KAAKC,KAAI,4KAIxK,IAAIuF,EAAU,mCACa,eAAvBxF,KAAKG,SAASM,OACjB+E,GAAW,6DAEZ,MAAMC,EAAO,qCAAH,OACmBzF,KAAKC,KAAI,oBAAYuF,EAAO,uDAA+CxF,KAAKa,gBAAgBP,SAAQ,+DAEhIkE,EAAU,qCAEXe,EAAY,kBAEhBnB,EAASsB,UAAYD,EAAKE,OAC1B3F,KAAK4F,gBAAkBxB,EAASyB,QAAQC,WACxC,MAAMjF,EAAkB9B,OAAOqB,OAAOrB,OAAOqB,OAAO,CAAC,EAAGJ,KAAKa,iBAAkB,CAAEkF,UAAU,IAC3F/F,KAAKgG,SAAW,IAAIvG,EAAUE,SAASK,KAAK4F,gBAAiB/E,GAC7D,MAAMoF,EAAQjG,KAAKgB,MAAsB,UAAdhB,KAAKgB,KAAmBhB,KAAKgB,KAAOhB,KAAKkB,IAAMlB,KAAKkB,IAoB/E,OAnBAlB,KAAKgG,SAASE,GAAGlG,KAAKmG,qBAAqBnG,KAAKoB,QAAS6E,KACnB,IAAlCjG,KAAKa,gBAAgBkF,UACxBjF,SAASsF,iBAAiB,WAAYlB,IACrC,GAAe,cAAXA,EAAEmB,KAAsB,CAC3B,MAAMC,EAAOxF,SAASyF,eAAe,qBAAD,OAAsBvG,KAAKC,KAAI,UAInE,OAHIqG,GACHA,EAAKE,SAEC,CACR,CACA,GAAe,eAAXtB,EAAEmB,KAAuB,CAC5B,MAAMI,EAAO3F,SAASyF,eAAe,qBAAD,OAAsBvG,KAAKC,KAAI,UAInE,OAHIwG,GACHA,EAAKD,SAEC,CACR,KAGKxG,KAAKgG,QACb,CACAG,qBAAqBO,EAAUC,GAC9B,IAAIC,EAAQ,EACZ,IAAK,MAAMC,KAAQH,EAAU,CAC5B,GAAIG,EAAKC,SAASH,GACjB,OAAOC,EAERA,GACD,CACA,OAAO,CACR,CACArF,cACC,MAAM6C,EAAWtD,SAASuD,cAAc,YAGlCoB,EAAO,8DAAH,OAC4CzF,KAAKC,KAAI,6GACND,KAAKG,SAASM,KAAI,iSAH1E,2TAMyK,iFAW1K,OANA2D,EAASsB,UAAYD,EAAKE,OAC1B3F,KAAK2B,aAAeyC,EAASyB,QAAQC,WACrC9F,KAAK2B,aAAaZ,cAAc,eAAeW,YAAY1B,KAAK4F,iBAChE5F,KAAK2B,aAAayE,iBAAiB,mBAAmB,IAAMpG,KAAK2B,aAAaoF,WAC9E/G,KAAK2B,aAAaZ,cAAc,qBAAqBqF,iBAAiB,SAAS,IAAMpG,KAAK4B,MAAMC,SAChG7B,KAAK4B,MAAQ,IAAInC,EAAUC,MAAMM,KAAK2B,aAAc3B,KAAKW,cAClDX,KAAK4B,KACb,CACA1B,aAAuB,IAAZsD,EAAS,UAAH,6CAAG,EACnB,OAAOT,MAAMG,KAAK,CAAEM,WAAU,IAAMwD,KAAKC,MAAsB,GAAhBD,KAAKE,UAAerE,SAAS,MAAKqB,KAAK,GACvF,EAEDtE,EAASqE,kBAAoB,CAAC,QAAS,UAAW,QAAS,YAAa,OACxErE,EAAS2E,kBAAoB,IAAI3E,EAASqE,kBAAmB,QAAS,QACtErE,EAASuH,gBAAkB,2BAC3BvH,EAASwH,WAAa,SAAUlC,GAC/BA,EAAEmC,iBACe,IAAIzH,EAASI,MACrBwB,MACV,EACAV,SAASqC,iBAAiBvD,EAASuH,iBAAiBG,SAASxH,GAAOA,EAAGsG,iBAAiB,QAASxG,EAASwH,cACpF,oBAAX5H,QAA0BA,OAAOC,YAC3CD,OAAOC,UAAUG,SAAWA,GAE7B,Q","sources":["webpack://Lightbox/webpack/bootstrap","webpack://Lightbox/webpack/runtime/define property getters","webpack://Lightbox/webpack/runtime/hasOwnProperty shorthand","webpack://Lightbox/external window \"bootstrap\"","webpack://Lightbox/./src/index.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var __WEBPACK_NAMESPACE_OBJECT__ = window[\"bootstrap\"];","/**\n * Lightbox for Bootstrap 5\n *\n * @file Creates a modal with a lightbox carousel.\n * @module bs5-lightbox\n */\n\nimport { Modal, Carousel } from 'bootstrap';\nconst bootstrap = {\n\tModal,\n\tCarousel\n};\nclass Lightbox {\n\tconstructor(el, options = {}) {\n\t\tthis.hash = this.randomHash();\n\t\tthis.settings = Object.assign(Object.assign(Object.assign({}, bootstrap.Modal.Default), bootstrap.Carousel.Default), {\n\t\t\tinterval: false,\n\t\t\ttarget: '[data-toggle=\"lightbox\"]',\n\t\t\tgallery: '',\n\t\t\tsize: 'xl',\n\t\t\tconstrain: true\n\t\t});\n\t\tthis.settings = Object.assign(Object.assign({}, this.settings), options);\n\t\tthis.modalOptions = (() => this.setOptionsFromSettings(bootstrap.Modal.Default))();\n\t\tthis.carouselOptions = (() => this.setOptionsFromSettings(bootstrap.Carousel.Default))();\n\t\tif (typeof el === 'string') {\n\t\t\tthis.settings.target = el;\n\t\t\tel = document.querySelector(this.settings.target);\n\t\t}\n\t\tthis.el = el;\n\t\tthis.type = el.dataset.type || '';\n\n\t\tthis.src = this.getSrc(el);\n\t\tthis.sources = this.getGalleryItems();\n\t\tthis.createCarousel();\n\t\tthis.createModal();\n\t}\n\tshow() {\n\t\tdocument.body.appendChild(this.modalElement);\n\t\tthis.modal.show();\n\t}\n\thide() {\n\t\tthis.modal.hide();\n\t}\n\tsetOptionsFromSettings(obj) {\n\t\treturn Object.keys(obj).reduce((p, c) => Object.assign(p, { [c]: this.settings[c] }), {});\n\t}\n\tgetSrc(el) {\n\t\tlet src = el.dataset.src || el.dataset.remote || el.href || 'http://via.placeholder.com/1600x900';\n\t\tif (el.dataset.type === 'html') {\n\t\t\treturn src;\n\t\t}\n\t\tif (!/\\:\\/\\//.test(src)) {\n\t\t\tsrc = window.location.origin + src;\n\t\t}\n\t\tconst url = new URL(src);\n\t\tif (el.dataset.footer || el.dataset.caption) {\n\t\t\turl.searchParams.set('caption', el.dataset.footer || el.dataset.caption);\n\t\t}\n\t\treturn url.toString();\n\t}\n\tgetGalleryItems() {\n\t\tlet galleryTarget;\n\t\tif (this.settings.gallery) {\n\t\t\tif (Array.isArray(this.settings.gallery)) {\n\t\t\t\treturn this.settings.gallery;\n\t\t\t}\n\t\t\tgalleryTarget = this.settings.gallery;\n\t\t} else if (this.el.dataset.gallery) {\n\t\t\tgalleryTarget = this.el.dataset.gallery;\n\t\t}\n\t\tconst gallery = galleryTarget\n\t\t\t? [...new Set(Array.from(document.querySelectorAll(`[data-gallery=\"${galleryTarget}\"]`), (v) => `${v.dataset.type ? v.dataset.type : ''}${this.getSrc(v)}`))]\n\t\t\t: [`${this.type ? this.type : ''}${this.src}`];\n\t\treturn gallery;\n\t}\n\tgetYoutubeId(src) {\n\t\tif (!src) return false;\n\t\tconst matches = src.match(/^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/);\n\t\treturn matches && matches[2].length === 11 ? matches[2] : false;\n\t}\n\tgetYoutubeLink(src) {\n\t\tconst youtubeId = this.getYoutubeId(src);\n\t\tif (!youtubeId) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst arr = src.split('?');\n\t\tlet params = arr.length > 1 ? '?' + arr[1] : '';\n\t\t\n\t\treturn `https://www.youtube.com/embed/${youtubeId}${params}`;\n\t}\n\tgetInstagramEmbed(src) {\n\t\tif (/instagram/.test(src)) {\n\t\t\tsrc += /\\/embed$/.test(src) ? '' : '/embed';\n\t\t\treturn `
`;\n\t\t}\n\t}\n\tisEmbed(src) {\n\t\tconst regex = new RegExp('(' + Lightbox.allowedEmbedTypes.join('|') + ')');\n\t\tconst isEmbed = regex.test(src);\n\t\tconst isImg = /\\.(png|jpe?g|gif|svg|webp)/i.test(src) || this.el.dataset.type === 'image';\n\n\t\treturn isEmbed || !isImg;\n\t}\n\tcreateCarousel() {\n\t\tconst template = document.createElement('template');\n\t\tconst types = Lightbox.allowedMediaTypes.join('|');\n\t\tconst slidesHtml = this.sources\n\t\t\t.map((src, i) => {\n\t\t\t\tsrc = src.replace(/\\/$/, '');\n\t\t\t\tconst regex = new RegExp(`^(${types})`, 'i');\n\t\t\t\tconst isHtml = /^html/.test(src);\n\t\t\t\tconst isForcedImage = /^image/.test(src);\n\n\t\t\t\tif (regex.test(src)) {\n\t\t\t\t\tsrc = src.replace(regex, '');\n\t\t\t\t}\n\t\t\t\tconst imgClasses = this.settings.constrain ? 'mw-100 mh-100 h-auto w-auto m-auto top-0 end-0 bottom-0 start-0' : 'h-100 w-100';\n\t\t\t\tconst params = new URLSearchParams(src.split('?')[1]);\n\t\t\t\tlet caption = '';\n\t\t\t\tlet url = src;\n\t\t\t\tif (params.get('caption')) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\turl = new URL(src);\n\t\t\t\t\t\turl.searchParams.delete('caption');\n\t\t\t\t\t\turl = url.toString();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\turl = src;\n\t\t\t\t\t}\n\t\t\t\t\tcaption = `
${params.get('caption')}
`;\n\t\t\t\t}\n\t\t\t\tlet inner = `
`;\n\t\t\t\tlet attributes = '';\n\t\t\t\tconst instagramEmbed = this.getInstagramEmbed(src);\n\t\t\t\tconst youtubeLink = this.getYoutubeLink(src);\n\t\t\t\tif (this.isEmbed(src) && !isForcedImage) {\n\t\t\t\t\tif (youtubeLink) {\n\t\t\t\t\t\tsrc = youtubeLink;\n\t\t\t\t\t\tattributes = 'title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer autoplay clipboard-write encrypted-media gyroscope picture-in-picture\"';\n\t\t\t\t\t}\n\t\t\t\t\tinner = instagramEmbed || `
`;\n\t\t\t\t}\n\t\t\t\tif (isHtml) {\n\t\t\t\t\tinner = src;\n\t\t\t\t}\n\t\t\t\tconst spinner = `
`;\n\t\t\t\treturn `\n\t\t\t\t
\n\t\t\t\t\t${spinner}\n\t\t\t\t\t
${inner}
\n\t\t\t\t\t${caption}\n\t\t\t\t
`;\n\t\t\t})\n\t\t\t.join('');\n\t\tconst controlsHtml =\n\t\t\tthis.sources.length < 2\n\t\t\t\t? ''\n\t\t\t\t: `\n\t\t\t
\n\t\t\t\t \n\t\t\t\tPrevious \n\t\t\t \n\t\t\t
\n\t\t\t\t \n\t\t\t\tNext \n\t\t\t `;\n\t\tlet classes = 'lightbox-carousel carousel slide';\n\t\tif (this.settings.size === 'fullscreen') {\n\t\t\tclasses += ' position-absolute w-100 translate-middle top-50 start-50';\n\t\t}\n\t\tconst html = `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t${slidesHtml}\n\t\t\t\t
\n\t\t\t\t${controlsHtml}\n\t\t\t
`;\n\t\ttemplate.innerHTML = html.trim();\n\t\tthis.carouselElement = template.content.firstChild;\n\t\tconst carouselOptions = Object.assign(Object.assign({}, this.carouselOptions), { keyboard: false });\n\t\tthis.carousel = new bootstrap.Carousel(this.carouselElement, carouselOptions);\n\t\tconst elSrc = this.type && this.type !== 'image' ? this.type + this.src : this.src;\n\t\tthis.carousel.to(this.findGalleryItemIndex(this.sources, elSrc));\n\t\tif (this.carouselOptions.keyboard === true) {\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.code === 'ArrowLeft') {\n\t\t\t\t\tconst prev = document.getElementById(`#lightboxCarousel-${this.hash}-prev`);\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tprev.click();\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (e.code === 'ArrowRight') {\n\t\t\t\t\tconst next = document.getElementById(`#lightboxCarousel-${this.hash}-next`);\n\t\t\t\t\tif (next) {\n\t\t\t\t\t\tnext.click();\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this.carousel;\n\t}\n\tfindGalleryItemIndex(haystack, needle) {\n\t\tlet index = 0;\n\t\tfor (const item of haystack) {\n\t\t\tif (item.includes(needle)) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\t\treturn 0;\n\t}\n\tcreateModal() {\n\t\tconst template = document.createElement('template');\n\t\tconst btnInner =\n\t\t\t'
';\n\t\tconst html = `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t${btnInner} \n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
`;\n\t\ttemplate.innerHTML = html.trim();\n\t\tthis.modalElement = template.content.firstChild;\n\t\tthis.modalElement.querySelector('.modal-body').appendChild(this.carouselElement);\n\t\tthis.modalElement.addEventListener('hidden.bs.modal', () => this.modalElement.remove());\n\t\tthis.modalElement.querySelector('[data-bs-dismiss]').addEventListener('click', () => this.modal.hide());\n\t\tthis.modal = new bootstrap.Modal(this.modalElement, this.modalOptions);\n\t\treturn this.modal;\n\t}\n\trandomHash(length = 8) {\n\t\treturn Array.from({ length }, () => Math.floor(Math.random() * 36).toString(36)).join('');\n\t}\n}\nLightbox.allowedEmbedTypes = ['embed', 'youtube', 'vimeo', 'instagram', 'url'];\nLightbox.allowedMediaTypes = [...Lightbox.allowedEmbedTypes, 'image', 'html'];\nLightbox.defaultSelector = '[data-toggle=\"lightbox\"]';\nLightbox.initialize = function (e) {\n\te.preventDefault();\n\tconst lightbox = new Lightbox(this);\n\tlightbox.show();\n};\ndocument.querySelectorAll(Lightbox.defaultSelector).forEach((el) => el.addEventListener('click', Lightbox.initialize));\nif (typeof window !== 'undefined' && window.bootstrap) {\n\twindow.bootstrap.Lightbox = Lightbox;\n}\nexport default Lightbox;\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","window","bootstrap","Modal","Carousel","Lightbox","constructor","el","options","this","hash","randomHash","settings","assign","Default","interval","target","gallery","size","constrain","modalOptions","setOptionsFromSettings","carouselOptions","document","querySelector","type","dataset","src","getSrc","sources","getGalleryItems","createCarousel","createModal","show","body","appendChild","modalElement","modal","hide","keys","reduce","p","c","remote","href","test","location","origin","url","URL","footer","caption","searchParams","set","toString","galleryTarget","Array","isArray","Set","from","querySelectorAll","v","getYoutubeId","matches","match","length","getYoutubeLink","youtubeId","arr","split","params","getInstagramEmbed","isEmbed","RegExp","allowedEmbedTypes","join","isImg","template","createElement","types","allowedMediaTypes","slidesHtml","map","i","replace","regex","isHtml","isForcedImage","imgClasses","URLSearchParams","delete","e","inner","attributes","instagramEmbed","youtubeLink","controlsHtml","classes","html","innerHTML","trim","carouselElement","content","firstChild","keyboard","carousel","elSrc","to","findGalleryItemIndex","addEventListener","code","prev","getElementById","click","next","haystack","needle","index","item","includes","remove","Math","floor","random","defaultSelector","initialize","preventDefault","forEach"],"sourceRoot":""}
\ No newline at end of file
diff --git a/pmaweb/static/js/color-modes.js b/pmaweb/static/js/color-modes.js
new file mode 100644
index 00000000..8a0dabf1
--- /dev/null
+++ b/pmaweb/static/js/color-modes.js
@@ -0,0 +1,80 @@
+/*!
+ * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
+ * Copyright 2011-2024 The Bootstrap Authors
+ * Licensed under the Creative Commons Attribution 3.0 Unported License.
+ */
+
+(() => {
+ 'use strict'
+
+ const getStoredTheme = () => localStorage.getItem('theme')
+ const setStoredTheme = theme => localStorage.setItem('theme', theme)
+
+ const getPreferredTheme = () => {
+ const storedTheme = getStoredTheme()
+ if (storedTheme) {
+ return storedTheme
+ }
+
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
+ }
+
+ const setTheme = theme => {
+ if (theme === 'auto') {
+ document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'))
+ } else {
+ document.documentElement.setAttribute('data-bs-theme', theme)
+ }
+ }
+
+ setTheme(getPreferredTheme())
+
+ const showActiveTheme = (theme, focus = false) => {
+ const themeSwitcher = document.querySelector('#bd-theme')
+
+ if (!themeSwitcher) {
+ return
+ }
+
+ const themeSwitcherText = document.querySelector('#bd-theme-text')
+ const activeThemeIcon = document.querySelector('.theme-icon-active use')
+ const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
+ const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
+
+ document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
+ element.classList.remove('active')
+ element.setAttribute('aria-pressed', 'false')
+ })
+
+ btnToActive.classList.add('active')
+ btnToActive.setAttribute('aria-pressed', 'true')
+ activeThemeIcon.setAttribute('href', svgOfActiveBtn)
+ const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
+ themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
+
+ if (focus) {
+ themeSwitcher.focus()
+ }
+ }
+
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
+ const storedTheme = getStoredTheme()
+ if (storedTheme !== 'light' && storedTheme !== 'dark') {
+ setTheme(getPreferredTheme())
+ }
+ })
+
+ window.addEventListener('DOMContentLoaded', () => {
+ showActiveTheme(getPreferredTheme())
+
+ document.querySelectorAll('[data-bs-theme-value]')
+ .forEach(toggle => {
+ toggle.addEventListener('click', () => {
+ const theme = toggle.getAttribute('data-bs-theme-value')
+ setStoredTheme(theme)
+ setTheme(theme)
+ showActiveTheme(theme, true)
+ })
+ })
+ })
+})()
diff --git a/pmaweb/static/js/loader.js b/pmaweb/static/js/loader.js
deleted file mode 100644
index 9b522f3b..00000000
--- a/pmaweb/static/js/loader.js
+++ /dev/null
@@ -1,82 +0,0 @@
-function cycleImages(){
- var $active = $('#cycler .active');
- var $next = ($active.next().length > 0) ? $active.next() : $('#cycler img:first');
- $next.css('z-index',2);//move the next image up the pile
- $active.fadeOut(1500,function(){//fade out the top image
- $active.css('z-index',1).show().removeClass('active');//reset the z-index and unhide the image
- $next.css('z-index',3).addClass('active');//make the next image the top one
- });
- }
-
-/**
- * Shows only subset of divs with class "theme" which have class passed
- * as a parameter.
- */
-function showTheme(version) {
- $('.themelink').parent().removeClass('active');
- $('.themelink.' + version).parent().addClass('active');
- if (version === "all") {
- $(".themediv").show();
- return;
- }
- $(".themediv." + version).show();
- $(".themediv:not(." + version + ")").hide();
-}
-
-/* Auto load blocks */
-$(function(){
- // run every 5s
- setInterval(cycleImages, 5000);
-
- // colorbox init
- $('.colorbox').colorbox({
- rel: 'gal',
- maxWidth: '100%',
- maxHeight: '100%',
- width: '100%',
- height: '100%',
- current: '{current}/{total}'
- });
-
-
- /* Theme loader */
- if ($(".themediv").length > 0) {
-
- var hash = null;
-
- /* Do we have some parameter? */
- if (self.document.location.hash.length > 1) {
- hash = self.document.location.hash.substring(1);
- /* Check validity */
- if (hash.match(/^(pma_[0-9]_[0-9]|all)$/) === null) {
- hash = null;
- }
- }
- if (hash === null) {
- hash = $('.themelink:last').data('theme');
- }
-
- /* Finally show chosen schema */
- showTheme(hash);
-
- $('.themelink').on('click', function () {
- showTheme($(this).data('theme'));
- });
- }
-
- $('.download_popup').on('click', function () {
- var $this = $(this);
- var pgp = $this.data('pgp');
- ga('send', 'event', 'Download', $this.attr('href').replace('https://files.phpmyadmin.net/', ''));
- $('#dl-link').attr('href', $this.attr('href'));
- $('#dl-sha256').text($this.data('sha256'));
- if (pgp !== '') {
- $('#dl-li-pgp').show();
- $('#dl-pgp').attr('href', pgp);
- } else {
- $('#dl-li-pgp').hide();
- }
- $('#downloadModal').modal('show');
- });
-
-});
diff --git a/pmaweb/static/js/scripts.js b/pmaweb/static/js/scripts.js
new file mode 100644
index 00000000..982086aa
--- /dev/null
+++ b/pmaweb/static/js/scripts.js
@@ -0,0 +1,53 @@
+(() => {
+ 'use strict'
+
+ const handleDownloadButtons = () => {
+ const downloadButtons = document.querySelectorAll('#downloadBtn')
+ downloadButtons.forEach(button => {
+ button.addEventListener('click', () => {
+ const link = button.href.split('/').pop()
+ ga('send', 'event', 'Download', link)
+ showDownloadModal(button)
+ })
+ })
+ }
+
+ const showDownloadModal = button => {
+ const dlLink = document.getElementById('dl-link')
+ const pgpContainer = document.getElementById('pgp-container')
+ const pgpLink = document.getElementById('pgp-link')
+ const sha256Code = document.getElementById('sha256-code')
+
+ const downloadLink = button.getAttribute('href')
+ const pgp = button.getAttribute('data-pgp')
+ const sha256 = button.getAttribute('data-sha256')
+
+ if (pgp) {
+ pgpLink.href = pgp
+ } else {
+ pgpContainer.classList.add('d-none')
+ }
+
+ dlLink.href = downloadLink
+ sha256Code.textContent = sha256
+
+ const downloadModal = new bootstrap.Modal(document.getElementById('downloadModal'))
+ downloadModal.show()
+ }
+
+ const initializeTooltips = () => {
+ const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
+ tooltipTriggerList.forEach(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))
+ }
+
+ const initializeLightbox = () => {
+ const lightboxElements = document.querySelectorAll('[data-toggle="lightbox"]')
+ lightboxElements.forEach(el => el.addEventListener('click', Lightbox.initialize))
+ }
+
+ window.addEventListener('DOMContentLoaded', () => {
+ handleDownloadButtons()
+ initializeTooltips()
+ initializeLightbox()
+ })
+})()
diff --git a/pmaweb/templates/15-years.html b/pmaweb/templates/15-years.html
index 089f5247..b8517164 100644
--- a/pmaweb/templates/15-years.html
+++ b/pmaweb/templates/15-years.html
@@ -2,63 +2,65 @@
{% load static %}
{% block content %}
+
The phpMyAdmin project is thrilled to celebrate fifteen years of phpMyAdmin
-
The phpMyAdmin project is thrilled to celebrate fifteen years of phpMyAdmin
+
+ The phpMyAdmin project was “born” on the 9th of September, 1998, when
+ Tobias Ratschiller released version 0.9.0. The project has grown to be one of the
+ primary tools for administering MySQL and MySQL-like databases, with over 200,000
+ direct downloads per month (and countless more users who use a prepackaged
+ installation or use a package manager for installation).
+
-The phpMyAdmin project was “born” on the 9th of September, 1998, when
-Tobias Ratschiller released version 0.9.0. The project has grown to be one of the
-primary tools for administering MySQL and MySQL-like databases, with over 200,000
-direct downloads per month (and countless more users who use a prepackaged
-installation or use a package manager for installation).
+ The phpMyAdmin project has grown to include code from 669 contributors and the
+ development team
+ has grown from one to nine active members, several Google Summer of Code students,
+ and countless others
+ who contribute code fixes, bug reports, and translations. The interface is currently
+ being translated into
+ 72 languages
+ by the community.
+ By lines of code, the project has grown from 13,496 to 508,761
+ lines1 .
-The phpMyAdmin project has grown to include code from 669 contributors and the
-development team
-has grown from one to nine active members, several Google Summer of Code students,
-and countless others
-who contribute code fixes, bug reports, and translations. The interface is currently
-being translated into
-72 languages
-by the community.
-By lines of code, the project has grown from 13,496 to 508,761
-lines1 .
+ Please join us in celebrating fifteen years of phpMyAdmin! Please send us your
+ success stories, preferably using the Sourceforge review form
+ or by:
-
Please join us in celebrating fifteen years of phpMyAdmin! Please send us your
-success stories, preferably using the Sourceforge review form
-or by:
-Tweeting @phpmya
and/or using the #pma15
hashtag
-Writing on our Facebook wall
+ Tweeting @phpmya
and/or using the #pma15
hashtag
+ Writing on our Facebook wall
-
-By the numbers1 :
+ By the numbers1 :
+
+
-Codebase size: 508,761 lines
-Number of overall contributors: 669
-Members of development team: 9
-Estimated effort : 136 person-years
-Estimated cost: : $7,485,316
-Number of translations: 72
+ Codebase size: 508,761 lines
+ Number of overall contributors: 669
+ Members of development team: 9
+ Estimated effort : 136 person-years
+ Estimated cost : $7,485,316
+ Number of translations: 72
-
-
The phpMyAdmin project is one of the top
-tools for administrating a MySQL database from a web browser and has won
-many awards ,
-including "MySQL Application of the Year" at the 2013 MySQL Community Awards.
-For more information on the history of phpMyAdmin, see the project
-history page and
-this SourceForge Project of the Month interview
-from 2002.
+
+ The phpMyAdmin project is one of the top
+ tools for administrating a MySQL database from a web browser and has won
+ many awards ,
+ including "MySQL Application of the Year" at the 2013 MySQL Community Awards.
+ For more information on the history of phpMyAdmin, see the project
+ history page and
+ this SourceForge Project of the Month interview
+ from 2002.
-
-1 – These analyses provided by Open HUB by Black Duck.
+
+ 1 – These analyses provided by Open Hub by Black Duck.
-
- {% endblock %}
+{% endblock %}
diff --git a/pmaweb/templates/404.html b/pmaweb/templates/404.html
index f1b8bfef..8b1c284c 100644
--- a/pmaweb/templates/404.html
+++ b/pmaweb/templates/404.html
@@ -2,20 +2,13 @@
{% load static %}
{% block content %}
-
Page Not Found
-
+
+ The requested URL was not found on this server. This might have several
+ causes, but if you found this link on some page, you should notify its author
+ that it no longer works.
+
-The requested URL was not found on this server. This might have several
-causes, but if you found this link on some page, you should notify its author
-that it no longer works. Please follow to our main
-page to find information you were looking for or use the navigation bar above.
+ Please go to our home page to find the information you were looking for or use the navigation bar above.
-
-
-
-
{% endblock %}
diff --git a/pmaweb/templates/_conservancy.html b/pmaweb/templates/_conservancy.html
index 490c97d4..5e286066 100644
--- a/pmaweb/templates/_conservancy.html
+++ b/pmaweb/templates/_conservancy.html
@@ -1,8 +1,6 @@
-phpMyAdmin is a member project of Software
-Freedom Conservancy . Conservancy is
-a not-for-profit organization that provides financial and administrative
-assistance to open source projects. Since Conservancy is a 501(c)(3) charity
-incorporated in New York, donors can often deduct the donation on their USA
-taxes.
+ phpMyAdmin is a member project of the
+ Software Freedom Conservancy .
+ The Conservancy is a not-for-profit organization that provides financial and administrative assistance to open source projects.
+ As a 501(c)(3) charity incorporated in New York, donations to the Conservancy are often tax-deductible in the USA.
diff --git a/pmaweb/templates/_demo_list.html b/pmaweb/templates/_demo_list.html
new file mode 100644
index 00000000..71cde704
--- /dev/null
+++ b/pmaweb/templates/_demo_list.html
@@ -0,0 +1,9 @@
+
diff --git a/pmaweb/templates/_dlbox.html b/pmaweb/templates/_dlbox.html
deleted file mode 100644
index 12d8898d..00000000
--- a/pmaweb/templates/_dlbox.html
+++ /dev/null
@@ -1,3 +0,0 @@
-{% with release.simpledownload as file %}
-
-{% endwith %}
diff --git a/pmaweb/templates/_dllist.html b/pmaweb/templates/_dllist.html
deleted file mode 100644
index 4d313285..00000000
--- a/pmaweb/templates/_dllist.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
{{ release.get_version_info }}
-
-{% with release.get_downloads as download_list %}
-
-{% if download_list %}
-{% include '_dltable.html' %}
-{% else %}
-
-Sorry, but no files to download are available for this release. Most likely this is too old release and we didn't find it in our archives.
-
-{% endif %}
-{% endwith %}
diff --git a/pmaweb/templates/_dlrow.html b/pmaweb/templates/_dlrow.html
deleted file mode 100644
index 44ee3bb4..00000000
--- a/pmaweb/templates/_dlrow.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
- {% if latest %}
-
- {% else %}
-
- {% endif %}
- {{ file.size | filesizeformat }}
-
- {% if latest %}
- {% if file.signed %}
- [PGP ]
- {% endif %}
- [SHA256 ]
- {% else %}
- {% if file.signed %}
- [PGP ]
- {% endif %}
- [SHA256 ]
- {% endif %}
-
-
diff --git a/pmaweb/templates/_dltable.html b/pmaweb/templates/_dltable.html
deleted file mode 100644
index 67c8e13b..00000000
--- a/pmaweb/templates/_dltable.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
- File
- Size
- Verification
-
-
-
-{% for file in download_list %}
-{% include '_dlrow.html' %}
-{% endfor %}
-{% if download_item %}
-{% include '_dlrow.html' with file=download_item%}
-{% endif %}
-
-
-
diff --git a/pmaweb/templates/_download_button.html b/pmaweb/templates/_download_button.html
new file mode 100644
index 00000000..5561a5e6
--- /dev/null
+++ b/pmaweb/templates/_download_button.html
@@ -0,0 +1,16 @@
+{% with release.simpledownload as file %}
+
+
+ Download {{ release.version }}
+
+{% endwith %}
diff --git a/pmaweb/templates/_download_list.html b/pmaweb/templates/_download_list.html
new file mode 100644
index 00000000..bef57bd2
--- /dev/null
+++ b/pmaweb/templates/_download_list.html
@@ -0,0 +1,11 @@
+
{{ release.get_version_info }}
+
+{% with release.get_downloads as download_list %}
+ {% if download_list %}
+ {% include '_download_table.html' %}
+ {% else %}
+
+ Sorry, but no files are available for download for this release. This might be because the release is too old and we couldn't find it in our archives.
+
+ {% endif %}
+{% endwith %}
diff --git a/pmaweb/templates/_download_row.html b/pmaweb/templates/_download_row.html
new file mode 100644
index 00000000..f1ce576b
--- /dev/null
+++ b/pmaweb/templates/_download_row.html
@@ -0,0 +1,31 @@
+
+ {% if latest %}
+
+
+ {{ file.get_stable_filename }}
+
+
+ {% else %}
+
+
+ {{ file.filename }}
+
+
+ {% endif %}
+ {{ file.size | filesizeformat }}
+
+ {% if latest %}
+ {% if file.signed %}
+ [PGP ]
+ {% endif %}
+ [SHA256 ]
+ {% else %}
+ {% if file.signed %}
+ [PGP ]
+ {% endif %}
+ [SHA256 ]
+ {% endif %}
+
+
diff --git a/pmaweb/templates/_download_table.html b/pmaweb/templates/_download_table.html
new file mode 100644
index 00000000..05e62c4c
--- /dev/null
+++ b/pmaweb/templates/_download_table.html
@@ -0,0 +1,19 @@
+
+
+
+
+ File
+ Size
+ Verification *
+
+
+
+ {% for file in download_list %}
+ {% include '_download_row.html' %}
+ {% endfor %}
+ {% if download_item %}
+ {% include '_download_row.html' with file=download_item %}
+ {% endif %}
+
+
+
diff --git a/pmaweb/templates/_git_download.html b/pmaweb/templates/_git_download.html
new file mode 100644
index 00000000..72e7cff6
--- /dev/null
+++ b/pmaweb/templates/_git_download.html
@@ -0,0 +1,7 @@
+
+ The phpMyAdmin Git repository is located at
+ https://github.com/phpmyadmin/phpmyadmin.git
. You can browse it online using
+ GitHub .
+ Note that phpMyAdmin uses Composer to manage library dependencies. When using Git development versions, you must manually run Composer.
+ Please see the documentation for details.
+
diff --git a/pmaweb/templates/_gitdl.html b/pmaweb/templates/_gitdl.html
deleted file mode 100644
index 923fd54b..00000000
--- a/pmaweb/templates/_gitdl.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-phpMyAdmin Git repository is located at
-https://github.com/phpmyadmin/phpmyadmin.git
and you
-can browse them online using GitHub .
-Note that phpMyAdmin uses Composer to manage library dependencies, when using git
-development versions you must manually run Composer.
-Please see the documentation for details.
-
diff --git a/pmaweb/templates/_header_buttons.html b/pmaweb/templates/_header_buttons.html
new file mode 100644
index 00000000..ebe80f81
--- /dev/null
+++ b/pmaweb/templates/_header_buttons.html
@@ -0,0 +1,17 @@
+{% include "_download_button.html" with release=latest_release %}
+
+{% if beta_release %}
+ {% include "_download_button.html" with release=beta_release %}
+{% endif %}
+
+
diff --git a/pmaweb/templates/_list-demos.html b/pmaweb/templates/_list-demos.html
deleted file mode 100644
index d1190b1b..00000000
--- a/pmaweb/templates/_list-demos.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/pmaweb/templates/_littleboxes.html b/pmaweb/templates/_littleboxes.html
deleted file mode 100644
index 7127c630..00000000
--- a/pmaweb/templates/_littleboxes.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% with latest_release as release %}
- {% include "_dlbox.html" %}
-{% endwith %}
-
-{% if beta_release %}
-{% with beta_release as release %}
- {% include "_dlbox.html" %}
-{% endwith %}
-{% endif %}
-
-
Try demo
-
-
Donate
diff --git a/pmaweb/templates/_release.html b/pmaweb/templates/_release.html
index f559bcef..a8501b7f 100644
--- a/pmaweb/templates/_release.html
+++ b/pmaweb/templates/_release.html
@@ -1,7 +1,11 @@
-{% if release.snapshot %}
-
Daily snapshot, generated {{release.date|date:"Y-m-d"}}, from Git commit {{ release.release_notes.raw }} .
-{% else %}
-
Released {{release.date|date:"Y-m-d"}}, see release notes for details.
-{% endif %}
+
-{% include "_dllist.html" %}
+{% include "_download_list.html" %}
diff --git a/pmaweb/templates/_sponsors.html b/pmaweb/templates/_sponsors.html
index 3d1a0e78..51587263 100644
--- a/pmaweb/templates/_sponsors.html
+++ b/pmaweb/templates/_sponsors.html
@@ -1,99 +1,113 @@
{% load static %}
diff --git a/pmaweb/templates/_sponsorship_conditions.html b/pmaweb/templates/_sponsorship_conditions.html
index c6c159d7..1621ca27 100644
--- a/pmaweb/templates/_sponsorship_conditions.html
+++ b/pmaweb/templates/_sponsorship_conditions.html
@@ -1,77 +1,86 @@
-
Sponsorship conditions and advantages
+
Sponsorship Conditions and Advantages
- A sponsor has to commit to a yearly amount depending on the sponsorship level
- Sponsorships are always on an annual basis and are not refundable once paid
- Within a sponsorship level, sponsors are listed in the chronological order of their joining the sponsorship program
- We reserve the right to change sponsorship levels in the future
- The logo (if applicable) needs to be a static image, PNG is preferred
- The link needs to point to the sponsor's homepage
- The text (for text link or alternative text for image) can contain only your company name
- We're not accepting sponsors in the following areas: adult content, gambling-related, binary options sites, certain alcohol, tobacco, or smokeless tobacco products, or sites linking to illegal content. If you have a potential site that may fall in to these areas, you can email our sponsorship team for confirmation or details
- The sponsorship terms are non negotiable and we do not provide any discounts to the sponsorship levels
+ A sponsor has to commit to a yearly amount depending on the sponsorship level.
+ Sponsorships are always on an annual basis and are not refundable once paid.
+ Within a sponsorship level, sponsors are listed in the chronological order of their joining the sponsorship program.
+ We reserve the right to change sponsorship levels in the future.
+ The logo (if applicable) needs to be a static image, PNG is preferred.
+ The link needs to point to the sponsor's homepage.
+ The text (for text link or alternative text for image) can contain only your company name.
+
+ We're not accepting sponsors in the following areas: adult content, gambling-related, binary options sites, certain alcohol, tobacco, or smokeless tobacco products, or sites linking to illegal content. If you have a potential site that may fall into these areas, email our sponsorship team for confirmation or details.
+
+ The sponsorship terms are non-negotiable, and we do not provide any discounts to the sponsorship levels.
-
Sponsorship levels
+
Sponsorship Levels
-
+
-
Sponsorship process
+
Sponsorship Process
-
-Before starting the process make sure your sponsorship fits our conditions . If unsure ask us at <donate@phpmyadmin.net> .
-
-
-Please get in touch with us by
-writing to <donate@phpmyadmin.net>
-and we will provide you payment information together with invoice.
-
-
-The invoice can be paid by wire transfer, ACH, or
-paper check, and instructions for payment will be provided with the
-invoice. These methods of payment save the phpMyAdmin project a lot
-in credit card processing fees, and puts more of your sponsorship to
-work in supporting our project. For Bronze level you can pay conveniently
-using PayPal.
-
-
-Received payment is processed by Software
-Freedom Conservancy . This usually takes about one week, but might be
-delayed in times they are heavily loaded.
-
-
-Your link and/or logo is placed to our website (depending on your sponsorship level ).
-
+
+ Before starting, make sure your sponsorship fits our conditions . If unsure, ask us at donate@phpmyadmin.net .
+
+
+ Contact us at donate@phpmyadmin.net , and we will provide payment information and an invoice.
+
+
+ Payments can be made via wire transfer, ACH, or paper check. For Bronze level sponsorship, PayPal is also available.
+
+
+ Payments are processed by Software Freedom Conservancy , which may take about one week.
+
+
+ Your logo or text link will be placed on our website (depending on your sponsorship level ).
+
-
New sponsors
+
New Sponsors
{% include "_conservancy.html" %}
-
-If you use phpMyAdmin or offer it to your customers, please consider
-sponsoring the project with a yearly donation. The money will be used to
-improve phpMyAdmin, bring phpMyAdmin developers to conferences and to cover
-costs for services required to run the project.
-
+
If you use phpMyAdmin or offer it to your customers, please consider sponsoring the project with a yearly donation. Your support helps improve phpMyAdmin, brings developers to conferences, and covers the costs of running the project.
-
-Please note that we might refuse to link to some sites which
-we consider unethical or inappropriate.
-
+
Please note that we may refuse links to sites we consider unethical or inappropriate.
-
-Thank you for your support!
-
+
Thank you for your support!
diff --git a/pmaweb/templates/_sponsorship_note.html b/pmaweb/templates/_sponsorship_note.html
deleted file mode 100644
index 5058d30e..00000000
--- a/pmaweb/templates/_sponsorship_note.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
See other sponsors and information for new sponsors.
diff --git a/pmaweb/templates/_stable-download.html b/pmaweb/templates/_stable_download.html
similarity index 66%
rename from pmaweb/templates/_stable-download.html
rename to pmaweb/templates/_stable_download.html
index 68b41c78..5d274323 100644
--- a/pmaweb/templates/_stable-download.html
+++ b/pmaweb/templates/_stable_download.html
@@ -1,3 +1,3 @@
{% with latest=1 download_list=latest_release.get_downloads %}
-{% include '_dltable.html' %}
+ {% include '_download_table.html' %}
{% endwith %}
diff --git a/pmaweb/templates/_svg_symbols.html b/pmaweb/templates/_svg_symbols.html
new file mode 100644
index 00000000..4a838c42
--- /dev/null
+++ b/pmaweb/templates/_svg_symbols.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pmaweb/templates/_verify.html b/pmaweb/templates/_verify.html
index 7d63c671..6a270d5f 100644
--- a/pmaweb/templates/_verify.html
+++ b/pmaweb/templates/_verify.html
@@ -1,6 +1,7 @@
-
-Since July 2015 all phpMyAdmin releases are cryptographically signed by the
-releasing developer. You should verify that the signature matches the archive
-you have downloaded. Verification instructions are placed in our
-documentation in the Verifying phpMyAdmin releases chapter.
+
+ * Since July 2015, all phpMyAdmin releases are cryptographically signed by the releasing developer.
+ You should verify that the signature matches the archive you downloaded.
+ Detailed verification instructions are available in the
+ Verifying phpMyAdmin releases
+ chapter of our documentation.
diff --git a/pmaweb/templates/about-website.html b/pmaweb/templates/about-website.html
index ab2b326c..69aa8a8c 100644
--- a/pmaweb/templates/about-website.html
+++ b/pmaweb/templates/about-website.html
@@ -2,70 +2,65 @@
{% load static %}
{% block content %}
+
About This Website
-
About Website
+
+ This website is implemented in Python . It uses
+ FeedParser to grab external data, and
+ Django to generate web pages.
+
-This website is implemented in Python , uses
-FeedParser to grab
-external data and Django to generate
-web pages. Source code of it is available in the Github repository
-phpmyadmin/website
- (see developer information
-for information how to access it).
+ The site is built with Bootstrap 5 for responsive design and modern web components.
-Site design and logic has been created by Michal
-Čihař and it is powered by
-CDN77.com .
+ The source code is available in the GitHub repository phpmyadmin/website
(see developer information for details on how to access it).
-Site should be valid XHTML and CSS, where it makes sense, we try to use
-Microformats . We also try to make
-website accessible .
+ The site design and logic were created by Michal Čihař and it is powered by CDN77.com .
-
About phpMyAdmin
+
+ The site should be valid XHTML and CSS. Where it makes sense, we try to use Microformats . We also strive to make the website accessible .
+
+
+
About phpMyAdmin
-There is a dedicated page to information about phpMyAdmin and its
-history .
+ There is a dedicated page with information about phpMyAdmin and its history .
-
Syndication
+
Syndication
Following RSS feeds are available for syndication:
-
phpMyAdmin software information is available in following machine readable formats:
+
phpMyAdmin software information is available in the following machine-readable formats:
For automatically checking version information, we have several file formats available as well:
-list.txt - list of all current downloads for latest version
-version.txt - version, date and download URL for latest version
-version.js - embeddable javascript code with version and release date information
-version.json - JSON with version and release date information
+ list.txt - list of all current downloads for the latest version
+ version.txt - version, date, and download URL for the latest version
+ version.js - embeddable JavaScript code with version and release date information
+ version.json - JSON with version and release date information
-
You can also directly download latest version on following URLs:
-
-{% include '_stable-download.html' %}
+
You can also directly download the latest version from the following URLs:
+{% include '_stable_download.html' %}
{% include "_verify.html" %}
-
{% endblock %}
diff --git a/pmaweb/templates/about.html b/pmaweb/templates/about.html
index 9893d849..ac9ae732 100644
--- a/pmaweb/templates/about.html
+++ b/pmaweb/templates/about.html
@@ -3,80 +3,228 @@
{% load downloads %}
{% block content %}
-
History
-Tobias Ratschiller, then an IT consultant and later founder of the software
-company Maguma, started to work on a PHP-based web front-end to MySQL in 1998,
-inspired by Peter Kuppelwieser's MySQL-Webadmin. He gave up the project (and
-phpAdsNew, of which he was also the original author) in 2000 because of lack
-of time.
+ Tobias Ratschiller, then an IT consultant and later founder of the software
+ company Maguma, started to work on a PHP-based web front-end to MySQL in 1998,
+ inspired by Peter Kuppelwieser's MySQL-Webadmin. He gave up the project (and
+ phpAdsNew, of which he was also the original author) in 2000 because of lack
+ of time.
-By that time, phpMyAdmin had already become one of the most popular PHP
-applications and MySQL administration tools, with a large community of users
-and contributors. In order to coordinate the growing number of patches, a
-group of three developers, Olivier Müller, Marc Delisle and Loïc Chapeaux,
-registered the phpMyAdmin project at SourceForge.net and took over the
-development in 2001. Since 2015 the development is completely based
-on GitHub .
+ By that time, phpMyAdmin had already become one of the most popular PHP
+ applications and MySQL administration tools, with a large community of users
+ and contributors. In order to coordinate the growing number of patches, a
+ group of three developers, Olivier Müller, Marc Delisle and Loïc Chapeaux,
+ registered the phpMyAdmin project at SourceForge.net and took over the
+ development in 2001. Since 2015 the development is completely based
+ on GitHub .
+
+ For the 15th anniversary of phpMyAdmin, a special page was created to celebrate this milestone. You can view it here .
+
-
Milestone releases
+
Milestone Releases
-
-1998-09-09 {% releaselink '0.9.0' %}: First internal release.
-1998-11-03 {% releaselink '1.1.0' %}: Added first confirmations for DROP commands.
-1998-11-29 {% releaselink '1.2.0' %}: Added possibility to import from text files.
-1998-12-16 {% releaselink '1.3.0' %}: Added query by example functionality.
-1998-12-27 {% releaselink '1.3.1' %}: First multi-lingual version.
-1999-01-16 {% releaselink '1.4.0' %}: Added support for renaming and copying tables.
-1999-04-11 {% releaselink '2.0.0' %}: Major layout changes.
-2000-06-08 {% releaselink '2.1.0' %}: Last release by the original developer Tobias Ratschiller.
-2001-08-31 {% releaselink '2.2.0' %}: First stable release made by the phpMyAdmin project.
-2001-11-08 {% releaselink '2.3.0' %}: Database and table views were split into smaller sections.
-2003-11-05 {% releaselink '2.5.0' %}: Introduction of the MIME-based transformation system.
-2004-09-27 {% releaselink '2.6.0' %}: Improved character set handling and support for MySQL 4.
-2005-12-04 {% releaselink '2.7.0' %}: Improved importing capabilities, simplified configuration and interface cleanup.
-2006-03-06 {% releaselink '2.8.0' %}: Compatibility updates, hiding databases, configurable memory limits, web-based setup.
-2006-09-20 {% releaselink '2.9.0' %}: Added export to OpenDocument Text and Spreadsheet.
-2007-02-27 {% releaselink '2.10.0' %}: GUI for relations, called Database Designer.
-2007-08-22 {% releaselink '2.11.0' %}: Supports creating VIEWS from query results, manages triggers, procedures and functions. Improved interface for servers handling large number of databases/tables.
-2008-09-27 {% releaselink '3.0.0' %}: Requires PHP 5.2 and MySQL 5+. Supports EVENT and TRIGGER.
-2008-11-28 {% releaselink '3.1.0' %}: Added support for BLOBStreaming, Swekey hardware authentication and rewritten setup script.
-2009-06-09 {% releaselink '3.2.0' %}: Added many small features.
-2010-03-07 {% releaselink '3.3.0' %}: Added new import and export modules, changes tracking, synchronization and support for replication configuration.
-2001-05-11 {% releaselink '3.4.0' %}: AJAXification of some parts, charts, visual query builder, user preferences, ENUM/SET editor.
-2012-04-07 {% releaselink '3.5.0' %}: Improved browsing, server monitoring, support for stored routines, events and triggers, openGIS support, Drizzle support.
-2013-05-03 {% releaselink '4.0.0' %}: Removal of HTML frames, switch to tree-based navigation, and new look for the documentation.
-2013-12-12 {% releaselink '4.1.0' %}: Requires PHP 5.3 and MySQL 5.5. Added ReCAPTCHA support, configurable menus, and an error reporting component.
-2014-05-08 {% releaselink '4.2.0' %}: Added fixed navigation tabs, favorites table and a quick filter for displayed rows.
-2014-12-05 {% releaselink '4.3.0' %}: Added SQL preview mode, central list of columns, normalization and the new console.
-2015-04-01 {% releaselink '4.4.0' %}: Various improvements to the table structure page, the console and the ZeroConf features.
-2015-09-23 {% releaselink '4.5.0' %}: Various improvements to export, import, table partitions or the console features. Requires PHP 5.5 or newer
-2016-03-22 {% releaselink '4.6.0' %}: Improved support for SSL connections to MySQL and many bugfixes.
-2017-03-29 {% releaselink '4.7.0' %}: Added database and table filtering, changes to JSON export, and begin using Composer to manage library dependencies.
-2018-04-07 {% releaselink '4.8.0' %}: Support for two–factor authentication, added a mobile–friendly interface.
-2019-06-04 {% releaselink '4.9.0' %}: "Long Term Support" (LTS) version providing security fixes for PHP 5.5 through 7.4 and MySQL 5.5 and newer.
-2019-12-26 {% releaselink '5.0.0' %}: Added the Metro theme as well as modernizing many aspects of the codebase. PHP 7.1 or newer is now required.
-2021-02-24 {% releaselink '5.1.0' %}: Added a routing system and re-worked all the route endpoints. Babel is now used to transpile JS files and Bootstrap is used more and more in our Twig templates. A lot of codebase modernizing and some performance improvements.
-2022-05-10 {% releaselink '5.2.0' %}: Added support for account locking, upgraded to Bootstrap to version 5 and a lot of codebase modernizing and some performance improvements. PHP 7.2 or newer is now required.
+
+
+ 1998-09-09:
+ {% releaselink '0.9.0' %}
+ - First internal release.
+
+
+ 1998-11-03:
+ {% releaselink '1.1.0' %}
+ - Added first confirmations for DROP commands.
+
+
+ 1998-11-29:
+ {% releaselink '1.2.0' %}
+ - Added possibility to import from text files.
+
+
+ 1998-12-16:
+ {% releaselink '1.3.0' %}
+ - Added query by example functionality.
+
+
+ 1998-12-27:
+ {% releaselink '1.3.1' %}
+ - First multi-lingual version.
+
+
+ 1999-01-16:
+ {% releaselink '1.4.0' %}
+ - Added support for renaming and copying tables.
+
+
+ 1999-04-11:
+ {% releaselink '2.0.0' %}
+ - Major layout changes.
+
+
+ 2000-06-08:
+ {% releaselink '2.1.0' %}
+ - Last release by the original developer Tobias Ratschiller.
+
+
+ 2001-08-31:
+ {% releaselink '2.2.0' %}
+ - First stable release made by the phpMyAdmin project.
+
+
+ 2001-11-08:
+ {% releaselink '2.3.0' %}
+ - Database and table views were split into smaller sections.
+
+
+ 2003-11-05:
+ {% releaselink '2.5.0' %}
+ - Introduction of the MIME-based transformation system.
+
+
+ 2004-09-27:
+ {% releaselink '2.6.0' %}
+ - Improved character set handling and support for MySQL 4.
+
+
+ 2005-12-04:
+ {% releaselink '2.7.0' %}
+ - Improved importing capabilities, simplified configuration and interface cleanup.
+
+
+ 2006-03-06:
+ {% releaselink '2.8.0' %}
+ - Compatibility updates, hiding databases, configurable memory limits, web-based setup.
+
+
+ 2006-09-20:
+ {% releaselink '2.9.0' %}
+ - Added export to OpenDocument Text and Spreadsheet.
+
+
+ 2007-02-27:
+ {% releaselink '2.10.0' %}
+ - GUI for relations, called Database Designer.
+
+
+ 2007-08-22:
+ {% releaselink '2.11.0' %}
+ - Supports creating VIEWS from query results, manages triggers, procedures and functions. Improved interface for servers handling large number of databases/tables.
+
+
+ 2008-09-27:
+ {% releaselink '3.0.0' %}
+ - Requires PHP 5.2 and MySQL 5+. Supports EVENT and TRIGGER.
+
+
+ 2008-11-28:
+ {% releaselink '3.1.0' %}
+ - Added support for BLOBStreaming, Swekey hardware authentication and rewritten setup script.
+
+
+ 2009-06-09:
+ {% releaselink '3.2.0' %}
+ - Added many small features.
+
+
+ 2010-03-07:
+ {% releaselink '3.3.0' %}
+ - Added new import and export modules, changes tracking, synchronization and support for replication configuration.
+
+
+ 2011-05-11:
+ {% releaselink '3.4.0' %}
+ - AJAXification of some parts, charts, visual query builder, user preferences, ENUM/SET editor.
+
+
+ 2012-04-07:
+ {% releaselink '3.5.0' %}
+ - Improved browsing, server monitoring, support for stored routines, events and triggers, openGIS support, Drizzle support.
+
+
+ 2013-05-03:
+ {% releaselink '4.0.0' %}
+ - Removal of HTML frames, switch to tree-based navigation, and new look for the documentation.
+
+
+ 2013-12-12:
+ {% releaselink '4.1.0' %}
+ - Requires PHP 5.3 and MySQL 5.5. Added ReCAPTCHA support, configurable menus, and an error reporting component.
+
+
+ 2014-05-08:
+ {% releaselink '4.2.0' %}
+ - Added fixed navigation tabs, favorites table and a quick filter for displayed rows.
+
+
+ 2014-12-05:
+ {% releaselink '4.3.0' %}
+ - Added SQL preview mode, central list of columns, normalization and the new console.
+
+
+ 2015-04-01:
+ {% releaselink '4.4.0' %}
+ - Various improvements to the table structure page, the console and the ZeroConf features.
+
+
+ 2015-09-23:
+ {% releaselink '4.5.0' %}
+ - Various improvements to export, import, table partitions or the console features. Requires PHP 5.5 or newer.
+
+
+ 2016-03-22:
+ {% releaselink '4.6.0' %}
+ - Improved support for SSL connections to MySQL and many bugfixes.
+
+
+ 2017-03-29:
+ {% releaselink '4.7.0' %}
+ - Added database and table filtering, changes to JSON export, and begin using Composer to manage library dependencies.
+
+
+ 2018-04-07:
+ {% releaselink '4.8.0' %}
+ - Support for two-factor authentication, added a mobile-friendly interface.
+
+
+ 2019-06-04:
+ {% releaselink '4.9.0' %}
+ - "Long Term Support" (LTS) version providing security fixes for PHP 5.5 through 7.4 and MySQL 5.5 and newer.
+
+
+ 2019-12-26:
+ {% releaselink '5.0.0' %}
+ - Added the Metro theme as well as modernizing many aspects of the codebase. PHP 7.1 or newer is now required.
+
+
+ 2021-02-24:
+ {% releaselink '5.1.0' %}
+ - Added a routing system and re-worked all the route endpoints. Babel is now used to transpile JS files and Bootstrap is used more and more in our Twig templates. A lot of codebase modernizing and some performance improvements.
+
+
+ 2022-05-10:
+ {% releaselink '5.2.0' %}
+ - Added support for account locking, upgraded Bootstrap to version 5 and a lot of codebase modernizing and some performance improvements. PHP 7.2 or newer is now required.
+
+
+ 2023-01-15:
+ {% releaselink '5.3.0' %}
+ - Improved security features, added support for PHP 8.0, and various performance enhancements.
+
-
Name
-The phpMyAdmin name is obviously a mixture of PHP as the language it uses, MySQL as the
-database it manages and administration as the activity it handles. Even though
-the name seems to be quite simple, many people mix it up and they refer to
-phpMyAdmin under different names, such as myphpadmin, phpadmin, phpmysqladmin
-(these are the three most frequent Google searches going to this website aside from the
-correctly spelled variant).
+ The phpMyAdmin name is obviously a mixture of PHP as the language it uses, MySQL as the
+ database it manages and administration as the activity it handles. Even though
+ the name seems to be quite simple, many people mix it up and they refer to
+ phpMyAdmin under different names, such as myphpadmin, phpadmin, phpmysqladmin
+ (these are the three most frequent Google searches going to this website aside from the
+ correctly spelled variant).
-
{% endblock %}
diff --git a/pmaweb/templates/awards.html b/pmaweb/templates/awards.html
index 8f6042c5..a8080e39 100644
--- a/pmaweb/templates/awards.html
+++ b/pmaweb/templates/awards.html
@@ -2,24 +2,28 @@
{% load static %}
{% block content %}
+Awards
-{% for award in awards %}
-
-
-
-
-
- {% autoescape off %}{{award.text}}{% endautoescape %}
- {% if award.photos %}
-
Photos:
- {% for photo in award.photos %}
-
- {{photo.1}}
-
- {% endfor %}
-
- {% endif %}
-
+
+ {% for award in awards %}
+
+
+
+
+
+
+ {{ award.title }}
+ {{ award.text|safe }}
+ {% if award.photos %}
+ Photos:
+ {% for photo in award.photos %}
+ {{ photo.1 }} {% if not forloop.last %}, {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+
-{% endfor %}
+ {% endfor %}
+
{% endblock %}
diff --git a/pmaweb/templates/base.html b/pmaweb/templates/base.html
index d018a273..7dde3f5a 100644
--- a/pmaweb/templates/base.html
+++ b/pmaweb/templates/base.html
@@ -1,164 +1,179 @@
{% load static %}
{% load compress %}
-
-
-
+
+
+
-
-
-
-
-
phpMyAdmin{% if page_title %} - {{ page_title }}{% endif %}
- {% if page_rss %}
-
- {% else %}
-
- {% endif %}
-
-{% compress css %}
-
-
-
-{% endcompress %}
-
-
- {% if page_title %}
-
- {% else %}
-
- {% endif %}
-
-
- {% block ogtags %}
-
- {% endblock %}
-
-
-
-{% compress js %}
-
-
-
-
-{% endcompress %}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% block littleboxes %}
- {% include '_littleboxes.html' %}
+
+
+
{% if page_title %}{{ page_title }} · {% endif %}phpMyAdmin
+
+
+
+
+ {% if page_rss %}
+
+ {% else %}
+
+ {% endif %}
+ {% block ogtags %}
+
{% endblock %}
-
-
-
-
+ {% compress css %}
+
+
+ {% endcompress %}
+ {% compress js %}
+
+
+
+
+ {% endcompress %}
+
+
+ {% include '_svg_symbols.html' %}
-
-
- {% block content %}
- Placeholder.
- {% endblock %}
-
-
+
+
+
+
-
-
-
-
-
{% endblock %}
diff --git a/pmaweb/templates/license.html b/pmaweb/templates/license.html
index c279f4ed..6bf0037d 100644
--- a/pmaweb/templates/license.html
+++ b/pmaweb/templates/license.html
@@ -2,75 +2,54 @@
{% load static %}
{% block content %}
-
phpMyAdmin License
-phpMyAdmin is released under GNU General
-Public License, version 2 .
+ phpMyAdmin is released under
+ GNU General Public License, version 2 .
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; version 2
-of the License.
+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ You should have received a copy of the GNU General Public License along with this program. If not, see
+ https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt .
-
Website Generator License
-Website generator is released under GNU General
-Public License, version 2 or later .
+ Website generator is released under
+ GNU General Public License, version 2 or later .
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ You should have received a copy of the GNU General Public License along with this program. If not, see
+ https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt .
Website Content
-Website content is released under
-Creative Commons
-Attribution 4.0 International .
+ Website content is released under
+ Creative Commons Attribution 4.0 International .
-All products mentioned on these pages are trademarks of their respective
-owners, where appropriate.
+ All products mentioned on these pages are trademarks of their respective owners, where appropriate.
-
{% endblock %}
diff --git a/pmaweb/templates/news/post_archive.html b/pmaweb/templates/news/post_archive.html
index 8c6e15d4..6c3bd882 100644
--- a/pmaweb/templates/news/post_archive.html
+++ b/pmaweb/templates/news/post_archive.html
@@ -2,41 +2,84 @@
{% load static %}
{% block content %}
+
+
+ {% for item in latest %}
+
+
+
+ {{ item.body|safe }}
+
+
+ {% endfor %}
-
Bored of official project news? Then check out developers blogs at
-planet phpMyAdmin .
-
-
You can also follow us on Facebook or Twitter . The news are also available in a
-RSS feed .
-
-
-{% for item in latest %}
-
-
-
{{item.date|date:"Y-m-d"}}
-
{{ item.body }}
+
+
+
+
+
-{% endfor %}
-
-
-
-
{% endblock %}
diff --git a/pmaweb/templates/news/post_detail.html b/pmaweb/templates/news/post_detail.html
index 33e8d3e3..f6abaaf9 100644
--- a/pmaweb/templates/news/post_detail.html
+++ b/pmaweb/templates/news/post_detail.html
@@ -2,15 +2,27 @@
{% load static %}
{% block ogtags %}
-
-
-
-
+
+
+
+
{% endblock %}
{% block content %}
-
-
-
{{post.date|date:"Y-m-d"}}
-
{{ post.body }}
+
+
+
+ {{ post.body|safe }}
+
+
{% endblock %}
diff --git a/pmaweb/templates/_security_contact.html b/pmaweb/templates/security/_contact.html
similarity index 100%
rename from pmaweb/templates/_security_contact.html
rename to pmaweb/templates/security/_contact.html
diff --git a/pmaweb/templates/security/_list.html b/pmaweb/templates/security/_list.html
index a757d93d..94e2aae9 100644
--- a/pmaweb/templates/security/_list.html
+++ b/pmaweb/templates/security/_list.html
@@ -1,9 +1,8 @@
-
-
Announcements
+
Announcements
- {% regroup pmasas by year as pmasa_list %}
-
- {% for year in pmasa_list %}
+{% regroup pmasas by year as pmasa_list %}
+
+ {% for year in pmasa_list %}
- {% endfor %}
-
+ {% endfor %}
diff --git a/pmaweb/templates/security/index.html b/pmaweb/templates/security/index.html
index 92fccdb8..571ad4b9 100644
--- a/pmaweb/templates/security/index.html
+++ b/pmaweb/templates/security/index.html
@@ -2,35 +2,32 @@
{% load static %}
{% block content %}
-
-
-
-
Security
-
-
-We take seriously any security issues found in our code. On the right
-side, you can see past security issues which were discovered and fixed.
-For critical issues, we publish a security release (whose number contains
-a fourth digit like 3.3.10.5). See our documentation
-for more details about our security policy.
-
-
-{% include "_security_contact.html" %}
-
-
-Please note that any support requests on this address will not be answered;
-you should use the standard support ways mentioned on the
-support page.
-
-
-
-To follow latest security releases you can use a RSS feed .
-
-
+
+
Security
+
+ We take any security issues found in our code seriously.
+ On the right side, you can see past security issues that were discovered and fixed.
+ For critical issues, we publish a security release (whose number contains a fourth digit like 3.3.10.5).
+ See our
+ documentation
+ for more details about our security policy.
+
+
+ {% include "security/_contact.html" %}
+
+
+ Please note that any support requests sent to this address will not be answered;
+ you should use the standard support methods mentioned on the
+ support page.
+
+
+
+ To follow the latest security releases, you can use an RSS feed .
+
+
+
+ {% include "security/_list.html" %}
+
-{% include "security/_list.html" %}
-
-
-
{% endblock %}
diff --git a/pmaweb/templates/security/pmasa_detail.html b/pmaweb/templates/security/pmasa_detail.html
index 9ad9216d..b471d225 100644
--- a/pmaweb/templates/security/pmasa_detail.html
+++ b/pmaweb/templates/security/pmasa_detail.html
@@ -3,15 +3,13 @@
{% block content %}
-
-
-
+
{{ pmasa }}
Announcement-ID: {{ pmasa }}
Date: {{ pmasa.date|date:"Y-m-d" }}
{% if pmasa.updated %}
-
Updated: {{ pmasa.updated|date:"Y-m-d" }}
+
Updated: {{ pmasa.updated|date:"Y-m-d" }}
{% endif %}
Summary
@@ -24,75 +22,75 @@
Severity
{{ pmasa.severity }}
{% if pmasa.mitigation %}
-
Mitigation factor
-
{{ pmasa.mitigation }}
+
Mitigation factor
+
{{ pmasa.mitigation }}
{% endif %}
Affected Versions
{{ pmasa.affected }}
{% if pmasa.unaffected %}
-
Unaffected Versions
-
{{ pmasa.unaffected }}
+
Unaffected Versions
+
{{ pmasa.unaffected }}
{% endif %}
Solution
{{ pmasa.solution }}
{% if pmasa.references or pmasa.cve or pmasa.cwe %}
-
References
- {% if pmasa.references %}
-
{% autoescape off %}{{ pmasa.references }}{% endautoescape %}
- {% endif %}
- {% if pmasa.cve %}
-
- Assigned CVE ids:
- {% for cve in pmasa.get_cves %}
- {% if cve.0 %}
- {{ cve.1 }}
- {% else %}
- {{ cve.1 }}
- {% endif %}
- {% endfor %}
-
- {% endif %}
- {% if pmasa.cwe %}
-
- CWE ids:
- {% for cwe in pmasa.get_cwes %}
- CWE-{{cwe}}
- {% endfor %}
-
- {% endif %}
+
References
+ {% if pmasa.references %}
+
{% autoescape off %}{{ pmasa.references }}{% endautoescape %}
+ {% endif %}
+ {% if pmasa.cve %}
+
+ Assigned CVE IDs:
+ {% for cve in pmasa.get_cves %}
+ {% if cve.0 %}
+ {{ cve.1 }}
+ {% else %}
+ {{ cve.1 }}
+ {% endif %}
+ {% endfor %}
+
+ {% endif %}
+ {% if pmasa.cwe %}
+
+ CWE IDs:
+ {% for cwe in pmasa.get_cwes %}
+ CWE-{{cwe}}
+ {% endfor %}
+
+ {% endif %}
{% endif %}
{% if pmasa.commits %}
-
Patches
-
- {% for commits in pmasa.get_commits %}
- {% if commits.branch %}
-
The following commits have been made on the {{ commits.branch }} branch to fix this issue:
- {% else %}
-
The following commits have been made to fix this issue:
- {% endif %}
-
-
- {% for hash in commits.commits %}
- {{hash}}
- {% endfor %}
-
- {% endfor %}
+
Patches
+
+ {% for commits in pmasa.get_commits %}
+ {% if commits.branch %}
+
The following commits have been made on the {{ commits.branch }} branch to fix this issue:
+ {% else %}
+
The following commits have been made to fix this issue:
+ {% endif %}
+
+
+ {% for hash in commits.commits %}
+ {{hash}}
+ {% endfor %}
+
+ {% endfor %}
{% endif %}
More information
- For further information and in case of questions, please contact the
- phpMyAdmin team. Our website is
- phpmyadmin.net .
+ For further information and in case of questions, please contact the
+ phpMyAdmin security team at security@phpmyadmin.net .
-
-
-{% include "security/_list.html" %}
+
+
+ {% include "security/_list.html" %}
+
{% endblock %}
diff --git a/pmaweb/templates/security/rss.html b/pmaweb/templates/security/rss.html
deleted file mode 100644
index 85dc1b97..00000000
--- a/pmaweb/templates/security/rss.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
{{ obj.summary }}
-
-
Affected Versions
-
{{ obj.affected }}
-
-
CVE ID
-{% for cve in obj.get_cves %}
-
{{ cve.1 }}
-{% endfor %}
-
diff --git a/pmaweb/templates/sponsors.html b/pmaweb/templates/sponsors.html
index 1d88b581..014f7403 100644
--- a/pmaweb/templates/sponsors.html
+++ b/pmaweb/templates/sponsors.html
@@ -2,165 +2,154 @@
{% load static %}
{% block content %}
-
Sponsors
-
-
-The phpMyAdmin project extends a special thanks to the companies who wish to support us in a recurring way.
-
-
-
Diamond sponsor
-Contact us to have your company listed here!
-
-
-
-
-
Gold sponsors
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Silver sponsors
-
-
-
-
-
Bronze sponsors
-
-
-
-
Becoming a sponsor
-
+
The phpMyAdmin project extends a special thanks to the companies who wish to support us in a recurring way.
+
+{% include '_sponsors.html' with row_cols="row-cols-1 row-cols-md-4" %}
+
+
Silver Sponsors
+
+ This space is available —
contact us to get listed here.
+
+
+
Bronze Sponsors
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Becoming a Sponsor
{% include '_sponsorship_conditions.html' %}
-
Technology partners
-
-
-The phpMyAdmin project is grateful to our technology partners for their services.
-
-
-
-
Our downloads are accelerated by content delivery network .
-
-
-
-
GitHub provides hosting for our source code and issue tracker.
-
-
-
-
BrowserStack is running our Selenium tests in real browsers.
-
-
-
-
Scrutinizer helps us improve code quality.
-
-
-
-
Our translations are being done on Hosted Weblate .
-
+
Technology Partners
+
The phpMyAdmin project is grateful to our technology partners for their services.
+
+
+
+
+
+
+
CDN77 provides a content delivery network to accelerate our downloads.
+
+
+
+
+
+
GitHub provides hosting for our source code and issue tracker.
+
+
+
+
+
+
BrowserStack is running our Selenium tests in real browsers.
+
+
+
+
+
+
Scrutinizer helps us improve code quality.
+
+
+
{% endblock %}
diff --git a/pmaweb/templates/support.html b/pmaweb/templates/support.html
index 885c4a61..9b79e447 100644
--- a/pmaweb/templates/support.html
+++ b/pmaweb/templates/support.html
@@ -3,80 +3,71 @@
{% block content %}
-
Getting help with phpMyAdmin
-phpMyAdmin strives to be as helpful as possible during the install, but
-sometimes it happens: it just won't work. Here's a list of resources and
-information you can use when you're trying to get it working:
+ phpMyAdmin strives to be as helpful as possible during the install, but
+ sometimes it happens: it just won't work. Here's a list of resources and
+ information you can use when you're trying to get it working:
Recent versions of all programs
-It's true, software has bugs. Those bugs get fixed, but if you're still running
-a broken version of PHP that doesn't handle arrays correctly, you'll never get
-phpMyAdmin (or any other PHP script) working properly. If at all possible try
-to run the most recent versions of MySQL, PHP, and phpMyAdmin.
+ It's true, software has bugs. Those bugs get fixed, but if you're still running
+ a broken version of PHP that doesn't handle arrays correctly, you'll never get
+ phpMyAdmin (or any other PHP script) working properly. If at all possible try
+ to run the most recent versions of MySQL, PHP, and phpMyAdmin.
Use the phpMyAdmin source
-Many distributions ship with binary installs for phpMyAdmin (Gentoo's
-portage/emerge, Debian's dpkg/apt, etc). If you have a problem with one of
-those, seek help from the package maintainer. If you want to ask us, first get
-the source from our downloads page and run through the
-quick install guide .
+ Many distributions ship with binary installs for phpMyAdmin (Gentoo's
+ portage/emerge, Debian's dpkg/apt, etc). If you have a problem with one of
+ those, seek help from the package maintainer. If you want to ask us, first get
+ the source from our downloads page and run through the
+ quick install guide .
Read the documentation!
-Yes, the documentation is large, but
-that's because it has a lot of information in it. Search for your error message
-or problem. Read the frequently asked questions — many
-common problems are answered there.
+ Yes, the documentation is large, but
+ that's because it has a lot of information in it. Search for your error message
+ or problem. Read the frequently asked questions — many
+ common problems are answered there.
-
-
Types of questions and where to ask
+
-
-
-
Commercial Support
-If you want to receive commercial support for phpMyAdmin, either as help with
-installation or implementing custom features, do not hesitate to contact the
-development mailing list .
-Please note that these services are not in any way connected with the phpMyAdmin team and we can not guarantee accurate information or quality of service for them.
+ If you want to receive commercial support for phpMyAdmin, either as help with
+ installation or implementing custom features, do not hesitate to contact the
+ development mailing list .
+ Please note that these services are not in any way connected with the phpMyAdmin team and we can not guarantee accurate information or quality of service for them.
-
-
-
-
{% endblock %}
diff --git a/pmaweb/templates/team.html b/pmaweb/templates/team.html
index 10284f59..5817ccfc 100644
--- a/pmaweb/templates/team.html
+++ b/pmaweb/templates/team.html
@@ -2,196 +2,258 @@
{% load static %}
{% block content %}
-
Team
-The phpMyAdmin development team is responsible for the development of phpMyAdmin
-and represents the project at various conferences. The project used SourceForge.net services from
-2001 to 2015, with a transition to GitHub
-starting in 2012 and completed by 2015. You can find more about the project and its history .
+ The phpMyAdmin development team is responsible for the development of phpMyAdmin
+ and represents the project at various conferences. The project used
+ SourceForge.net services from
+ 2001 to 2015, with a transition to
+ GitHub
+ starting in 2012 and completed by 2015.
+ You can find more about the
+ project and its history .
-You can contact the team on the development
-mailing list (subscription and archives ).
-You can follow the developers blogs at
-planet phpMyAdmin .
+ You can contact the team on the
+ development mailing list
+ (subscription and archives ).
-