From 441f22fe723a5ee293c85712322046936913fedf Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 18 Apr 2019 17:30:26 +0100 Subject: [PATCH] Add page indexer --- traces/.htaccess | 1 + traces/_h5ai/.htaccess | 165 +++++ traces/_h5ai/CHANGELOG.md | 598 ++++++++++++++++++ traces/_h5ai/README.md | 72 +++ traces/_h5ai/private/cache/README.md | 9 + traces/_h5ai/private/cache/cmds.json | 1 + traces/_h5ai/private/conf/l10n/af.json | 18 + traces/_h5ai/private/conf/l10n/bg.json | 18 + traces/_h5ai/private/conf/l10n/cs.json | 18 + traces/_h5ai/private/conf/l10n/da.json | 18 + traces/_h5ai/private/conf/l10n/de.json | 22 + traces/_h5ai/private/conf/l10n/el.json | 18 + traces/_h5ai/private/conf/l10n/en.json | 23 + traces/_h5ai/private/conf/l10n/es.json | 22 + traces/_h5ai/private/conf/l10n/et.json | 22 + traces/_h5ai/private/conf/l10n/fi.json | 18 + traces/_h5ai/private/conf/l10n/fr.json | 22 + traces/_h5ai/private/conf/l10n/he.json | 17 + traces/_h5ai/private/conf/l10n/hi.json | 18 + traces/_h5ai/private/conf/l10n/hr.json | 18 + traces/_h5ai/private/conf/l10n/hu.json | 16 + traces/_h5ai/private/conf/l10n/it.json | 18 + traces/_h5ai/private/conf/l10n/ja.json | 20 + traces/_h5ai/private/conf/l10n/ko.json | 22 + traces/_h5ai/private/conf/l10n/lv.json | 22 + traces/_h5ai/private/conf/l10n/nb.json | 15 + traces/_h5ai/private/conf/l10n/nl.json | 22 + traces/_h5ai/private/conf/l10n/pl.json | 22 + traces/_h5ai/private/conf/l10n/pt.json | 18 + traces/_h5ai/private/conf/l10n/ro.json | 15 + traces/_h5ai/private/conf/l10n/ru.json | 20 + traces/_h5ai/private/conf/l10n/sk.json | 13 + traces/_h5ai/private/conf/l10n/sl.json | 18 + traces/_h5ai/private/conf/l10n/sr.json | 15 + traces/_h5ai/private/conf/l10n/sv.json | 16 + traces/_h5ai/private/conf/l10n/tr.json | 14 + traces/_h5ai/private/conf/l10n/uk.json | 18 + traces/_h5ai/private/conf/l10n/zh-cn.json | 23 + traces/_h5ai/private/conf/l10n/zh-tw.json | 23 + traces/_h5ai/private/conf/options.json | 392 ++++++++++++ traces/_h5ai/private/conf/types.json | 76 +++ traces/_h5ai/private/php/class-bootstrap.php | 45 ++ traces/_h5ai/private/php/core/class-api.php | 109 ++++ .../_h5ai/private/php/core/class-context.php | 294 +++++++++ .../_h5ai/private/php/core/class-fallback.php | 54 ++ .../_h5ai/private/php/core/class-filesize.php | 96 +++ traces/_h5ai/private/php/core/class-item.php | 91 +++ traces/_h5ai/private/php/core/class-json.php | 65 ++ .../_h5ai/private/php/core/class-logger.php | 28 + .../_h5ai/private/php/core/class-request.php | 38 ++ .../_h5ai/private/php/core/class-session.php | 20 + traces/_h5ai/private/php/core/class-setup.php | 185 ++++++ traces/_h5ai/private/php/core/class-theme.php | 32 + traces/_h5ai/private/php/core/class-util.php | 89 +++ .../_h5ai/private/php/ext/class-archive.php | 183 ++++++ traces/_h5ai/private/php/ext/class-custom.php | 65 ++ traces/_h5ai/private/php/ext/class-search.php | 40 ++ traces/_h5ai/private/php/ext/class-thumb.php | 253 ++++++++ traces/_h5ai/private/php/pages/index.php | 2 + traces/_h5ai/private/php/pages/info.php | 2 + traces/_h5ai/public/.htaccess | 13 + traces/_h5ai/public/cache/README.md | 9 + traces/_h5ai/public/css/styles.css | 2 + traces/_h5ai/public/ext/README.md | 4 + traces/_h5ai/public/images/fallback/file.png | Bin 0 -> 118 bytes .../public/images/fallback/folder-parent.png | Bin 0 -> 108 bytes .../_h5ai/public/images/fallback/folder.png | Bin 0 -> 99 bytes .../public/images/favicon/favicon-152.png | Bin 0 -> 219 bytes .../public/images/favicon/favicon-16-32.ico | Bin 0 -> 5430 bytes .../public/images/favicon/favicon-16.png | Bin 0 -> 96 bytes .../public/images/favicon/favicon-32.png | Bin 0 -> 120 bytes .../_h5ai/public/images/favicon/favicon.svg | 3 + traces/_h5ai/public/images/themes/README.md | 9 + .../public/images/themes/comity/ar-apk.svg | 3 + .../public/images/themes/comity/ar-deb.svg | 16 + .../public/images/themes/comity/ar-rpm.svg | 11 + .../public/images/themes/comity/txt-css.svg | 13 + .../public/images/themes/comity/txt-go.svg | 29 + .../public/images/themes/comity/txt-html.svg | 10 + .../public/images/themes/comity/txt-js.svg | 3 + .../public/images/themes/comity/txt-less.svg | 8 + .../public/images/themes/comity/txt-md.svg | 3 + .../public/images/themes/comity/txt-php.svg | 3 + .../public/images/themes/comity/txt-py.svg | 8 + .../public/images/themes/comity/txt-rb.svg | 3 + .../public/images/themes/comity/txt-rust.svg | 3 + .../images/themes/comity/txt-script.svg | 3 + .../public/images/themes/comity/x-pdf.svg | 3 + .../_h5ai/public/images/themes/default/ar.svg | 3 + .../public/images/themes/default/aud.svg | 3 + .../public/images/themes/default/bin.svg | 3 + .../public/images/themes/default/file.svg | 3 + .../images/themes/default/folder-page.svg | 3 + .../images/themes/default/folder-parent.svg | 3 + .../public/images/themes/default/folder.svg | 3 + .../public/images/themes/default/img.svg | 3 + .../public/images/themes/default/txt.svg | 3 + .../public/images/themes/default/vid.svg | 3 + .../_h5ai/public/images/themes/default/x.svg | 3 + traces/_h5ai/public/images/ui/back.svg | 3 + traces/_h5ai/public/images/ui/crumb.svg | 3 + traces/_h5ai/public/images/ui/download.svg | 3 + traces/_h5ai/public/images/ui/filter.svg | 5 + traces/_h5ai/public/images/ui/info-toggle.svg | 3 + traces/_h5ai/public/images/ui/paypal.svg | 6 + .../_h5ai/public/images/ui/preview-close.svg | 3 + .../public/images/ui/preview-fullscreen.svg | 3 + .../_h5ai/public/images/ui/preview-next.svg | 3 + .../images/ui/preview-no-fullscreen.svg | 3 + .../_h5ai/public/images/ui/preview-prev.svg | 3 + traces/_h5ai/public/images/ui/preview-raw.svg | 3 + traces/_h5ai/public/images/ui/search.svg | 5 + traces/_h5ai/public/images/ui/selected.svg | 3 + traces/_h5ai/public/images/ui/sidebar.svg | 3 + traces/_h5ai/public/images/ui/sort.svg | 3 + traces/_h5ai/public/images/ui/spinner.svg | 6 + .../_h5ai/public/images/ui/tree-indicator.svg | 3 + traces/_h5ai/public/images/ui/tree-toggle.svg | 3 + .../_h5ai/public/images/ui/view-details.svg | 3 + traces/_h5ai/public/images/ui/view-grid.svg | 3 + traces/_h5ai/public/images/ui/view-icons.svg | 3 + traces/_h5ai/public/index.php | 17 + traces/_h5ai/public/js/scripts.js | 5 + 123 files changed, 3917 insertions(+) create mode 100644 traces/.htaccess create mode 100644 traces/_h5ai/.htaccess create mode 100644 traces/_h5ai/CHANGELOG.md create mode 100644 traces/_h5ai/README.md create mode 100644 traces/_h5ai/private/cache/README.md create mode 100644 traces/_h5ai/private/cache/cmds.json create mode 100644 traces/_h5ai/private/conf/l10n/af.json create mode 100644 traces/_h5ai/private/conf/l10n/bg.json create mode 100644 traces/_h5ai/private/conf/l10n/cs.json create mode 100644 traces/_h5ai/private/conf/l10n/da.json create mode 100644 traces/_h5ai/private/conf/l10n/de.json create mode 100644 traces/_h5ai/private/conf/l10n/el.json create mode 100644 traces/_h5ai/private/conf/l10n/en.json create mode 100644 traces/_h5ai/private/conf/l10n/es.json create mode 100644 traces/_h5ai/private/conf/l10n/et.json create mode 100644 traces/_h5ai/private/conf/l10n/fi.json create mode 100644 traces/_h5ai/private/conf/l10n/fr.json create mode 100644 traces/_h5ai/private/conf/l10n/he.json create mode 100644 traces/_h5ai/private/conf/l10n/hi.json create mode 100644 traces/_h5ai/private/conf/l10n/hr.json create mode 100644 traces/_h5ai/private/conf/l10n/hu.json create mode 100644 traces/_h5ai/private/conf/l10n/it.json create mode 100644 traces/_h5ai/private/conf/l10n/ja.json create mode 100644 traces/_h5ai/private/conf/l10n/ko.json create mode 100644 traces/_h5ai/private/conf/l10n/lv.json create mode 100644 traces/_h5ai/private/conf/l10n/nb.json create mode 100644 traces/_h5ai/private/conf/l10n/nl.json create mode 100644 traces/_h5ai/private/conf/l10n/pl.json create mode 100644 traces/_h5ai/private/conf/l10n/pt.json create mode 100644 traces/_h5ai/private/conf/l10n/ro.json create mode 100644 traces/_h5ai/private/conf/l10n/ru.json create mode 100644 traces/_h5ai/private/conf/l10n/sk.json create mode 100644 traces/_h5ai/private/conf/l10n/sl.json create mode 100644 traces/_h5ai/private/conf/l10n/sr.json create mode 100644 traces/_h5ai/private/conf/l10n/sv.json create mode 100644 traces/_h5ai/private/conf/l10n/tr.json create mode 100644 traces/_h5ai/private/conf/l10n/uk.json create mode 100644 traces/_h5ai/private/conf/l10n/zh-cn.json create mode 100644 traces/_h5ai/private/conf/l10n/zh-tw.json create mode 100644 traces/_h5ai/private/conf/options.json create mode 100644 traces/_h5ai/private/conf/types.json create mode 100644 traces/_h5ai/private/php/class-bootstrap.php create mode 100644 traces/_h5ai/private/php/core/class-api.php create mode 100644 traces/_h5ai/private/php/core/class-context.php create mode 100644 traces/_h5ai/private/php/core/class-fallback.php create mode 100644 traces/_h5ai/private/php/core/class-filesize.php create mode 100644 traces/_h5ai/private/php/core/class-item.php create mode 100644 traces/_h5ai/private/php/core/class-json.php create mode 100644 traces/_h5ai/private/php/core/class-logger.php create mode 100644 traces/_h5ai/private/php/core/class-request.php create mode 100644 traces/_h5ai/private/php/core/class-session.php create mode 100644 traces/_h5ai/private/php/core/class-setup.php create mode 100644 traces/_h5ai/private/php/core/class-theme.php create mode 100644 traces/_h5ai/private/php/core/class-util.php create mode 100644 traces/_h5ai/private/php/ext/class-archive.php create mode 100644 traces/_h5ai/private/php/ext/class-custom.php create mode 100644 traces/_h5ai/private/php/ext/class-search.php create mode 100644 traces/_h5ai/private/php/ext/class-thumb.php create mode 100644 traces/_h5ai/private/php/pages/index.php create mode 100644 traces/_h5ai/private/php/pages/info.php create mode 100644 traces/_h5ai/public/.htaccess create mode 100644 traces/_h5ai/public/cache/README.md create mode 100644 traces/_h5ai/public/css/styles.css create mode 100644 traces/_h5ai/public/ext/README.md create mode 100644 traces/_h5ai/public/images/fallback/file.png create mode 100644 traces/_h5ai/public/images/fallback/folder-parent.png create mode 100644 traces/_h5ai/public/images/fallback/folder.png create mode 100644 traces/_h5ai/public/images/favicon/favicon-152.png create mode 100644 traces/_h5ai/public/images/favicon/favicon-16-32.ico create mode 100644 traces/_h5ai/public/images/favicon/favicon-16.png create mode 100644 traces/_h5ai/public/images/favicon/favicon-32.png create mode 100644 traces/_h5ai/public/images/favicon/favicon.svg create mode 100644 traces/_h5ai/public/images/themes/README.md create mode 100644 traces/_h5ai/public/images/themes/comity/ar-apk.svg create mode 100644 traces/_h5ai/public/images/themes/comity/ar-deb.svg create mode 100644 traces/_h5ai/public/images/themes/comity/ar-rpm.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-css.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-go.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-html.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-js.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-less.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-md.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-php.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-py.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-rb.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-rust.svg create mode 100644 traces/_h5ai/public/images/themes/comity/txt-script.svg create mode 100644 traces/_h5ai/public/images/themes/comity/x-pdf.svg create mode 100644 traces/_h5ai/public/images/themes/default/ar.svg create mode 100644 traces/_h5ai/public/images/themes/default/aud.svg create mode 100644 traces/_h5ai/public/images/themes/default/bin.svg create mode 100644 traces/_h5ai/public/images/themes/default/file.svg create mode 100644 traces/_h5ai/public/images/themes/default/folder-page.svg create mode 100644 traces/_h5ai/public/images/themes/default/folder-parent.svg create mode 100644 traces/_h5ai/public/images/themes/default/folder.svg create mode 100644 traces/_h5ai/public/images/themes/default/img.svg create mode 100644 traces/_h5ai/public/images/themes/default/txt.svg create mode 100644 traces/_h5ai/public/images/themes/default/vid.svg create mode 100644 traces/_h5ai/public/images/themes/default/x.svg create mode 100644 traces/_h5ai/public/images/ui/back.svg create mode 100644 traces/_h5ai/public/images/ui/crumb.svg create mode 100644 traces/_h5ai/public/images/ui/download.svg create mode 100644 traces/_h5ai/public/images/ui/filter.svg create mode 100644 traces/_h5ai/public/images/ui/info-toggle.svg create mode 100644 traces/_h5ai/public/images/ui/paypal.svg create mode 100644 traces/_h5ai/public/images/ui/preview-close.svg create mode 100644 traces/_h5ai/public/images/ui/preview-fullscreen.svg create mode 100644 traces/_h5ai/public/images/ui/preview-next.svg create mode 100644 traces/_h5ai/public/images/ui/preview-no-fullscreen.svg create mode 100644 traces/_h5ai/public/images/ui/preview-prev.svg create mode 100644 traces/_h5ai/public/images/ui/preview-raw.svg create mode 100644 traces/_h5ai/public/images/ui/search.svg create mode 100644 traces/_h5ai/public/images/ui/selected.svg create mode 100644 traces/_h5ai/public/images/ui/sidebar.svg create mode 100644 traces/_h5ai/public/images/ui/sort.svg create mode 100644 traces/_h5ai/public/images/ui/spinner.svg create mode 100644 traces/_h5ai/public/images/ui/tree-indicator.svg create mode 100644 traces/_h5ai/public/images/ui/tree-toggle.svg create mode 100644 traces/_h5ai/public/images/ui/view-details.svg create mode 100644 traces/_h5ai/public/images/ui/view-grid.svg create mode 100644 traces/_h5ai/public/images/ui/view-icons.svg create mode 100644 traces/_h5ai/public/index.php create mode 100644 traces/_h5ai/public/js/scripts.js diff --git a/traces/.htaccess b/traces/.htaccess new file mode 100644 index 0000000..bc35599 --- /dev/null +++ b/traces/.htaccess @@ -0,0 +1 @@ +DirectoryIndex /_h5ai/public/index.php \ No newline at end of file diff --git a/traces/_h5ai/.htaccess b/traces/_h5ai/.htaccess new file mode 100644 index 0000000..95e775b --- /dev/null +++ b/traces/_h5ai/.htaccess @@ -0,0 +1,165 @@ +## details here: https://github.com/h5bp/server-configs-apache + + + +## SECURITY ################################################################### + +DirectoryIndex disabled +FileETag None +ServerSignature Off + +# Apache < 2.3 + + Order allow,deny + Deny from all + Satisfy All + + +# Apache ≥ 2.3 + + Require all denied + + + + Header set X-Content-Type-Options "nosniff" + Header unset ETag + Header unset X-Powered-By + + + + Options -Indexes + + + + +## COMPAT ##################################################################### + +AddDefaultCharset utf-8 + + + AddCharset utf-8 .css .html .js .json .php .svg + + AddType application/font-woff woff + AddType application/font-woff2 woff2 + AddType application/json json + AddType application/javascript js + AddType application/vnd.ms-fontobject eot + AddType application/x-font-ttf ttc ttf + AddType image/jpeg jpeg jpg + AddType image/png png + AddType image/svg+xml svg svgz + AddType image/x-icon ico + AddType font/opentype otf + AddType text/css css + AddType text/html html + + + + +## SPEED ###################################################################### + + + ExpiresActive on + ExpiresDefault "access plus 1 month" + + ExpiresByType application/json "access plus 0 seconds" + + ExpiresByType text/html "access plus 1 minute" + + ExpiresByType image/x-icon "access plus 1 week" + + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + + + + + + SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding + RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding + + + + # Apache ≥ 2.3 + + # mod_filter as module only available for Apache ≥ 2.3.7 + + AddOutputFilterByType DEFLATE "application/atom+xml" \ + "application/javascript" \ + "application/json" \ + "application/ld+json" \ + "application/manifest+json" \ + "application/rdf+xml" \ + "application/rss+xml" \ + "application/schema+json" \ + "application/vnd.geo+json" \ + "application/vnd.ms-fontobject" \ + "application/x-font-ttf" \ + "application/x-javascript" \ + "application/x-web-app-manifest+json" \ + "application/xhtml+xml" \ + "application/xml" \ + "font/eot" \ + "font/opentype" \ + "image/bmp" \ + "image/svg+xml" \ + "image/vnd.microsoft.icon" \ + "image/x-icon" \ + "text/cache-manifest" \ + "text/css" \ + "text/html" \ + "text/javascript" \ + "text/plain" \ + "text/vcard" \ + "text/vnd.rim.location.xloc" \ + "text/vtt" \ + "text/x-component" \ + "text/x-cross-domain-policy" \ + "text/xml" + + + + # Apache < 2.3 + + AddOutputFilterByType DEFLATE "application/atom+xml" \ + "application/javascript" \ + "application/json" \ + "application/ld+json" \ + "application/manifest+json" \ + "application/rdf+xml" \ + "application/rss+xml" \ + "application/schema+json" \ + "application/vnd.geo+json" \ + "application/vnd.ms-fontobject" \ + "application/x-font-ttf" \ + "application/x-javascript" \ + "application/x-web-app-manifest+json" \ + "application/xhtml+xml" \ + "application/xml" \ + "font/eot" \ + "font/opentype" \ + "image/bmp" \ + "image/svg+xml" \ + "image/vnd.microsoft.icon" \ + "image/x-icon" \ + "text/cache-manifest" \ + "text/css" \ + "text/html" \ + "text/javascript" \ + "text/plain" \ + "text/vcard" \ + "text/vnd.rim.location.xloc" \ + "text/vtt" \ + "text/x-component" \ + "text/x-cross-domain-policy" \ + "text/xml" + + + + AddEncoding gzip gz + AddEncoding gzip svgz + + diff --git a/traces/_h5ai/CHANGELOG.md b/traces/_h5ai/CHANGELOG.md new file mode 100644 index 0000000..b575191 --- /dev/null +++ b/traces/_h5ai/CHANGELOG.md @@ -0,0 +1,598 @@ +# Changelog + + +## v0.29.2 - *2019-03-22* + +* update `babel-loader` to 7.1.1 +* update `eslint` to 5.15.3 +* update `ghu` to 0.13.0 +* update `jsdom` to 14.0.0 +* update `kjua` to 0.2.0 +* update `lolight` to 1.0.0 +* update `scar` to 1.2.0 + + +## v0.29.1 - *2019-01-20* + +* replace `babel-preset-es2015` with `babel-preset-env` +* update `eslint` to 5.14.1 +* update `ghu` to 0.12.0 +* update `jsdom` to 9.2.0 +* update `kjua` to 0.1.2 +* update `lolight` to 0.6.0 +* update `marked` to 0.6.1 +* update `normalize.css` to 8.0.1 +* update `scar` to 1.0.0 + + +## v0.29.0 - *2016-08-12* + +* back to cleaner visual experience +* add option to disable sidebar +* add options to filter/search ignore case +* replace PHP `getenv` calls with `$_SERVER` lookups +* add `view.fallbackMode` option to generally serve only fallback mode +* serve fallback mode for text browsers (`curl`, `links`, `lynx`, `w3m`) +* change type `txt-svg` to `img-svg`, no thumbs but preview +* fix a tree indentation glitch +* fix shell command detection on Windows +* fix Piwik anayltics +* fix `.htaccess` auth issues +* fix drag-select on scrollable content +* fix download-all function +* fix audio and video preview loading +* fix thumbnail request issues +* add `rust` type and icon +* add `autoplay` option to audio and video preview +* add `--dereference` to `shell-du` to follow sym links +* remove *Install* section from `README.md`, causes too much trouble +* remove peer5 support +* update build process to use `node 6.0+`, no need for babel now +* replace `jquery-qrcode` with [`kjua`](https://larsjung.de/kjua/) +* replace `prism` with [`lolight`](https://larsjung.de/lolight/) +* move deps to `package.json` (`normalize.css`, `kjua`, `lolight` and `marked`) +* remove `jQuery` +* remove `lodash` +* remove [`modulejs`](https://larsjung.de/modulejs/) for now +* reduce JS code by 60% (~250kb -> ~100kb) +* update languages (`et`, `nl`, `pl`) + + +## v0.28.0 - *2015-12-19* + +* now require PHP 5.5.0+ +* change index path to `/_h5ai/public/index.php` +* now only `/_h5ai/public/` needs to be web-accessible +* add support for custom script and style additions +* add options to set font families +* add search +* add ignorecase sorting option to tree +* add wide links in tree view +* add IE edge mode +* add frontend tests +* fix some styles in IE10 +* fix preview bottom bar for small screen widths +* lots of code cleanup and refactorings +* change API +* update build process, now uses [`ghu`](https://larsjung.de/ghu/) +* switch from jshint and jscs to [`eslint`](http://eslint.org/) +* update `jQuery` to 2.1.4 +* update `lodash` to 3.9.3 (add debounce and trim) +* update `marked` to 0.3.5 +* update `modulejs` to 1.13.0 +* update `prism` to 2015-12-19 +* update h5bp styles to 5.2.0 +* update `normalize.css` to 3.0.3 +* remove `Moment.js` + + +## v0.27.0 - *2015-04-06* + +* new layout +* add editorconfig +* drop support for IE9 (gets fallback) +* update sidebar settings +* add info sidebar +* add opt-out for click'n'drag selection +* add package name option for single selections +* add initial support for Peer5 +* add option to down-sample images for preview +* add option for natural sorting in tree sidebar +* fix problems with files/folders named `0` +* change font from `Ubuntu` to `Roboto` (smaller footprint, clearer for small sizes) +* switch back to Google Fonts +* improve PDF thumbnail quality +* improve drag-select +* improve image preview +* prevent listing `_h5ai` folder and subfolders +* update build process, now uses [`mkr`](https://larsjung.de/mkr/) and [`fQuery`](https://larsjung.de/fquery/) +* update `jQuery` to 2.1.3 +* update `jQuery.qrcode` to 0.11.0 +* update `Lo-Dash` to 3.6.0 +* update `Modernizr` to 2.8.3 +* update `modulejs` to 1.4.0 +* update `Moment.js` to 2.9.0 +* update `Prism` to 2015-04-05 +* remove deprecated Google Analytics code +* remove `jQuery.fracs` +* remove `jQuery.scrollpanel` +* remove `jQuery.mousewheel` +* update languages (`af`, `es`, `ja`, `ko`, `ru`, `zh-cn`) + + +## v0.26.1 - *2014-08-17* + +* fix links + + +## v0.26.0 - *2014-08-16* + +* remove True Type fonts +* outsource themes to [h5ai-themes](https://github.com/lrsjng/h5ai-themes) +* add filesize fallback for large files and 32bit PHP +* fix server detection +* add config file tests to info page +* remove JSON shim +* add caching of command checks +* update `jQuery.mousewheel` to 3.1.12 +* update `jQuery.qrcode` to 0.8.0 +* replace `markdown` with [`marked`](https://github.com/chjj/marked) 0.3.2 +* update `modulejs` to 0.4.5 +* update `Moment.js` to 2.8.1 +* replace `underscore` with [`Lo-Dash`](https://github.com/lodash/lodash) 2.4.1 +* replace `SyntaxHighlighter` with [`Prism`](http://prismjs.com) 2014-08-04 + + +## v0.25.2 - *2014-07-01* + +* add optional info page protection +* fix `short_open_tag` issues for PHP < 5.4.0 +* fix default folder download (`alwaysVisible` option) +* minor fixes + + +## v0.25.1 - *2014-06-25* + +* fix broken paths for filenames containing '+' characters +* fix Google Universal Analytics +* fix file type check + + +## v0.25.0 - *2014-06-22* + +* add sidebar +* add initial theme support +* add icons from [Evolvere Icon Theme](http://franksouza183.deviantart.com/art/Evolvere-Icon-theme-440718295) +* add PHP variant to calc folder sizes +* add scroll position reset on location change (issue [#279](https://github.com/lrsjng/h5ai/issues/279)) +* add option to hide unreadable files +* add option where to place folders (top, inplace, bottom) +* add markdown support for custom header and footer files +* add video and audio preview via HTML5 elements (no fallback, works best in Chrome) +* add filter reset on location change +* add option to make download button always visible +* add Google UA support +* extend selectable icon sizes (add 128px, 192px, 256px, 384px) +* improve preview GUI +* disable thumbs in `cache` folder +* fix QR code URI origin (issue [#287](https://github.com/lrsjng/h5ai/issues/287)) +* replace PHP backtick operator with `exec` +* remove server side file manipulation extensions `dropbox`, `delete` and `rename` +* update `H5BP` to 4.3.0 +* update `jQuery` to 2.1.1 +* update `json2.js` to 2014-02-04 +* update `markdown-js` to 0.5.0 +* update `Modernizr` to 2.8.2 +* update `Moment.js` to 2.6.0 +* update `Underscore.js` to 1.6.0 +* update languages (`bg`, `ko`, `pt`, `sl`, `sv`, `zh-cn`) + + +## v0.24.1 - *2014-04-09* + +* security fixes! (issues [#268](https://github.com/lrsjng/h5ai/issues/268), [#269](https://github.com/lrsjng/h5ai/issues/269)) +* fix WinOS command detection +* update languages (`fi`, `fr`, `hi`, `it`, `zh-tw`) + + +## v0.24.0 - *2013-09-04* + +* updates image and text preview +* adds variable icon sizes +* adds optional natural sort of items +* adds optional checkboxes to select items +* adds text preview modes: none, fixed, markdown +* optionally hide folders in main view +* makes use of EXIF thumbnails optional +* fixes file deletion of multiple files +* fixes `setParentFolderLabels = false` +* fixes shell-arg and RegExp escape issues +* cleans code +* updates info page `/_h5ai` +* adds `aiff` to `audio` types +* adds `da` translation by Ronnie Milbo +* updates to `pl` translation by Mark + + +## v0.23.0 - *2013-07-21* + +* removes `aai` mode! +* drops support for IE7+8 (simple fallback, same as no javascript) +* uses History API if available (way faster browsing) +* faster thumbnail generation if EXIF thumbnails available +* adds optional custom headers/footers that are propageted to all subfolders +* optional hide parent folder links +* some fixes on previews +* speeds up packaged downloads +* add line wrap and line highlighting (on hover) to text preview +* new design (colors, images) +* now uses scalable images for the interface +* fixes filter (ignore parent folder, display of `no match`) +* lots of small fixes +* updates `H5BP` to 4.2.0 +* updates `jQuery` to 2.0.3 +* updates `jQuery.mousewheel` to 3.1.3 +* updates `Moment.js` to 2.1.0 +* updates `markdown-js` to 0.4.0-9c21acdf08 +* updates `json2.js` to 2013-05-26 +* adds `uk` translation by Viktor Matveenko +* updates to `pl` translation by Mark + + +## v0.22.1 - *2012-10-16* + +* bug fix concerning API requests in PHP mode +* minor changes in responsive styles + + +## v0.22 - *2012-10-14* + +* general changes h5ai directory layout and configuration +* splits configuration file (`config.json`) into files `options.json`, `types.json` and `langs.json` +* localization now in separate files +* adds auto-refresh +* adds drag'n'drop upload (PHP, experimental) +* adds file deletion (PHP, experimental) +* cleans and improves PHP code +* PHP no longer respects htaccess restrictions (so be careful) +* PHP ignore patterns might include paths now +* improves separation between aai and php mode +* improves performance in aai mode +* adds optional binary prefixes for file sizes +* improves filter: autofocus on keypress, clear on `ESC` +* download packages now packaged relative to current folder +* download package name changable +* splits type `js` into `js` and `json` +* prevents some errors with files > 2GB on 32bit OS +* adds max subfolder size in tree view +* adds ctrl-click file selection +* adds Piwik analytics extension +* temp download packages are now stored in the `cache`-folder and deleted as soon as possible +* updates translations +* adds `he` translation by [Tomer Cohen](https://github.com/tomer) +* updates 3rd party libs + + +## v0.21 - *2012-08-06* + +* fixes misaligned image previews +* adds no JavaScript fallback to PHP version +* fixes duplicate tree entries and empty main views +* adds Google Analytics support (async) +* improves filter (now ignorecase, now only checks if chars in right order) +* adds keyboard support to image preview (space, enter, backspace, left, right, up, down, f, esc) +* adds text file preview and highlighting with [SyntaxHighlighter](http://alexgorbatchev.com/SyntaxHighlighter/) (same keys as img preview) +* adds Markdown preview with [markdown-js](https://github.com/evilstreak/markdown-js) +* adds new type `markdown` +* changes language code `gr` to `el` +* adds localization for filter placeholder +* adds `hu` translation by [Rodolffo](https://github.com/Rodolffo) +* updates to [jQuery.qrcode](https://larsjung.de/qrcode/) 0.2 +* updates to [jQuery.scrollpanel](https://larsjung.de/scrollpanel/) 0.1 +* updates to [modulejs](https://larsjung.de/modulejs/) 0.2 +* updates to [Moment.js](http://momentjs.com) 1.7.0 +* updates to [Underscore.js](http://underscorejs.org) 1.3.3 + + +## v0.20 - *2012-05-11* + +* adds image preview +* adds thumbnails for video and pdf +* adds support for lighttpd, nginx and cherokee and maybe other webservers with PHP +* adds folder size in PHP version via shell `du` +* fixes some localization problems +* updates info page at `/_h5ai/` +* switches to JSHint + + +## v0.19 - *2012-04-19* + +* adds lots of config options +* changes in `config.js` and `h5ai.htaccess` +* fixes js problems in IE 7+8 +* hides broken tree view in IE < 9, adds a message to the footer +* removes hash changes since they break logical browser history +* fixes thumbnail size for portrait images in icon view +* fixes problems with file type recognition +* adds an info page at `/_h5ai/` +* sort order is preserved while browsing +* removes PHP error messages on thumbnail generation +* fixes PHP some problems with packed download +* adds support for tarred downloads +* changes crumb image for folders with an index file +* adds `index.php` to use h5ai in non-Apache environments +* switches from [Datejs](http://www.datejs.com) to [Moment.js](http://momentjs.com) +* adds [underscore.js](http://underscorejs.org) +* fixes mousewheel problems, updates [jQuery.mousewheel](https://github.com/brandonaaron/jquery-mousewheel) to 3.0.6 +* updates `lv` translation +* adds `ro` translation by [Jakob Cosoroabă](https://github.com/midday) +* adds `ja` translation by [metasta](https://github.com/metasta) +* adds `nb` translation by [Sindre Sorhus](https://github.com/sindresorhus) +* adds `sr` translation by [vBm](https://github.com/vBm) +* adds `gr` translation by [xhmikosr](https://github.com/xhmikosr) + + +## v0.18 - *2012-02-24* + +* adds optional QRCode display +* adds optional filtering for displayed files and folders +* updates design +* improves zipped download +* adds support for zipped download of htaccess restricted files +* changes h5ai.htaccess +* custom headers/footers are now optional and disabled by default +* fixes problems with folder recognition in the JS version +* fixes include problems in PHP version +* fixes path problems on servers running on Windows in PHP version +* fixes broken links in custom headers/footers while zipped download enabled +* fixes problems with thumbnails for files with single or double quotes in filename +* improves url hashes +* updates year in `LICENSE.TXT` +* updates es translation +* adds `zh-tw` translation by [Yao Wei](https://github.com/medicalwei) +* updates `zh-cn` translation + + +## v0.17 - *2011-11-28* + +* h5ai is now located in `_h5ai` to reduce collisions +* switches from HTML5 Boilerplate reset to normalization +* adds some style changes for small devices +* configuration (options, types, translations) now via `config.js` +* icons for JS version are now configured via `config.js` +* sort order configuration changed +* sorting is now done without page reload +* adds `customHeader` and `customFooter` to `config.js` +* supports restricted folders to some extent +* some style changes on tree and language menu +* fixes total file/folder count in status bar +* adds support for use with userdir (requires some manual changes) + + +## v0.16 - *2011-11-02* + +* sorts translations in `options.js` +* improves HTML head sections +* refactors JavaScript and PHP a lot +* improves/fixes file selection for zipped download +* fixes scrollbar and header/footer link issues (didn't work when zipped download enabled) +* adds support for ctrl-select +* `dateFormat` in `options.js` changed, now affecting JS and PHP version +* `dateFormat` is localizable by adding it to a translation in `options.js` +* PHP version is now configurable via `php/config.php` (set custom doc root and other PHP related things) +* image thumbs and zipped download is disabled by default now, but works fine if PHP is configured + + +## v0.15.2 - *2011-09-18* + +* adds `it` translation by [Salvo Gentile](https://github.com/SalvoGentile) and [Marco Patriarca](https://github.com/Fexys) +* switches build process from scripp to wepp + + +## v0.15.1 - *2011-09-06* + +* fixes security issues with the zipped download feature +* makes zipped download optional (but enabled by default) + + +## v0.15 - *2011-09-04* + +* adds zipped download for selected files +* cleans and refactores + + +## v0.14.1 - *2011-09-01* + +* display meta information in bottom bar (icon view) +* adds `zh-cn` translation by [Dongsheng Cai](https://github.com/dongsheng) +* adds `pl` translation by Radosław Zając +* adds `ru` translation by Богдан Илюхин + + +## v0.14 - *2011-08-16* + +* adds image thumbnails for PHP version +* new option `slideTree` to turn off auto slide in + + +## v0.13.2 - *2011-08-12* + +* changes in `/h5ai/.htaccess` ... PHP configuration ... + + +## v0.13.1 - *2011-08-12* + +* fixes initial tree display +* adds sort order option +* adds/fixes some translations +* adds `lv` translation by Sandis Veinbergs + + +## v0.13 - *2011-08-06* + +* adds PHP implementation! (should work with PHP 5.2+) +* adds new options +* changes layout of the bottom bar to display status information +* adds language selector to the bottom bar +* quotes keys in `options.js` to make it valid json +* changes value of option `lang` from `undefined` to `null` +* adds some new keys to `h5aiLangs` +* adds browser caching rules for css and js +* adds `pt` translation by [Jonnathan](https://github.com/jonnsl) +* adds `bg` translation by George Andonov + + +## v0.12.3 - *2011-07-30* + +* adds `tr` translation by [Batuhan Icoz](https://github.com/batuhanicoz) + + +## v0.12.2 - *2011-07-30* + +* adds `es` translation by Jose David Calderon Serrano + + +## v0.12.1 - *2011-07-29* + +* fixes unchecked use of console.log + + +## v0.12 - *2011-07-28* + +* improves performance + + +## v0.11 - *2011-07-27* + +* changes license to MIT license, see `LICENSE.txt` + + +## v0.10.2 - *2011-07-26* + +* improves tree scrollbar + + +## v0.10.1 - *2011-07-24* + +* fixes problems with ' in links + + +## v0.10 - *2011-07-24* + +* fixes problems with XAMPP on Windows (see `dot.htaccess` comments for instructions) +* fixes tree fade-in-fade-out effect for small displays ([issue #6](https://github.com/lrsjng/h5ai/issues/6)) +* adds custom scrollbar to tree ([issue #6](https://github.com/lrsjng/h5ai/issues/6)) +* fixes broken links caused by URI encoding/decoding ([issue #9](https://github.com/lrsjng/h5ai/issues/9)) +* adds "empty" to localization (hope Google Translate did a good job here) + + +## v0.9 - *2011-07-18* + +* links hover states between crumb, extended view and tree +* fixes size of tree view (now there's a ugly scrollbar, hopefully will be fixed) +* refactores js to improve performance and cleaned code +* adds caching for folder status codes and content +* adds `fr` translation by [Nicolas](https://github.com/Nicosmos) +* adds `nl` translation by [Stefan de Konink](https://github.com/skinkie) +* adds `sv` translation by Oscar Carlsson + + +## v0.8 - *2011-07-08* + +* removes slashes from folder labels +* optionally rename parent folder entries to real folder names, see `options.js` +* long breadcrumbs (multiple rows) no longer hide content +* error folder icons are opaque now +* refactores js a lot (again...) + + +## v0.7 - *2011-07-07* + +* removes shadows +* smarter tree side bar + + +## v0.6 - *2011-07-05* + +* refactores js +* adds localization, see `options.js` + + +## v0.5.3 - *2011-07-04* + +* refactores js +* adds basic options support via `options.js` +* adds comments to `options.js` +* adds optional tree sidebar + + +## v0.5.2 - *2011-07-02* + +* details view adjusts to window width +* links icon for *.gz and *.bz2 + + +## v0.5.1 - *2011-07-01* + +* disables tree sidebar for now, since it had unwanted side effects + + +## v0.5 - *2011-07-01* + +* adds tree sidebar +* some refactorings + + +## v0.4 - *2011-06-27* + +* adds better fallback, in case JavaScript is disabled +* rewrites js, fixed middle-button click etc. problems +* refactors css +* sorts, adds and moves icons and images +* updates dot.access + + +## v0.3.2 - *2011-06-24* + +* removes lib versions from file names +* adds 'empty' indicator for icons view + + +## v0.3.1 - *2011-06-24* + +* refactores js +* adds `folderClick` and `fileClick` callback hooks +* fixes .emtpy style + + +## v0.3 - *2011-06-23* + +* includes build stuff, files previously found in the base directory are now located in folder `target` +* styles and scripts are now minified +* adds Modernizr 2.0.4 for future use +* updates jQuery to version 1.6.1 + + +## v0.2.3 - *2011-06-17* + +* more refactoring in main.js + + +## v0.2.2 - *2011-06-16* + +* refactores a lot, adds some comments +* includes fixes from [NumEricR](https://github.com/NumEricR) +* adds top/bottom message support, only basicly styled + + +## v0.2.1 - *2011-06-16* + +* fixes croped filenames +* fixes missing .png extension in header +* adds some color to the links +* adds changelog + + +## v0.2 - *2011-06-15* + +* adds icon view diff --git a/traces/_h5ai/README.md b/traces/_h5ai/README.md new file mode 100644 index 0000000..66eb547 --- /dev/null +++ b/traces/_h5ai/README.md @@ -0,0 +1,72 @@ +# h5ai + +[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github] + +A modern HTTP web server index for Apache httpd, lighttpd, nginx and Cherokee. + + +## Important + +* Do **not** install any files from the `src` folder, they need to be + preprocessed to work correctly! +* Find a preprocessed package and detailed install instructions on the + [project page][web]. +* For bug reports and feature requests please use [issues][github-issues]. + + +## Build + +There are installation ready packages for the latest [releases][release] and +[dev builds][develop]. But to build **h5ai** yourself either `git clone` or +download the repository. From within the root folder run the following +commands to find a fresh zipball in folder `build` (tested on linux only, +requires [`node 6.0+`][node] to be installed). + +~~~sh +> npm install +> npm run build +~~~ + + +## License + +The MIT License (MIT) + +Copyright (c) 2019 Lars Jung (https://larsjung.de) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## References + +**h5ai** profits from other projects, all of them licensed under the MIT license +too. Exceptions are some [Material Design icons][material-design-icons] (CC BY 4.0). + + +[web]: https://larsjung.de/h5ai/ +[github]: https://github.com/lrsjng/h5ai +[github-issues]: https://github.com/lrsjng/h5ai/issues +[release]: https://release.larsjung.de/h5ai/ +[develop]: https://release.larsjung.de/h5ai/develop/ +[node]: https://nodejs.org +[material-design-icons]: https://github.com/google/material-design-icons + +[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square +[web-img]: https://img.shields.io/badge/web-larsjung.de/h5ai-a0a060.svg?style=flat-square +[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square diff --git a/traces/_h5ai/private/cache/README.md b/traces/_h5ai/private/cache/README.md new file mode 100644 index 0000000..60bc416 --- /dev/null +++ b/traces/_h5ai/private/cache/README.md @@ -0,0 +1,9 @@ +# Cache + +Private cache. + +This directory is used for server side caching. To use caching make this +directory writable for your webserver. + +There is no critical data in here. You can savely remove any content. This +will clear the cache. diff --git a/traces/_h5ai/private/cache/cmds.json b/traces/_h5ai/private/cache/cmds.json new file mode 100644 index 0000000..b92ad64 --- /dev/null +++ b/traces/_h5ai/private/cache/cmds.json @@ -0,0 +1 @@ +{"command":true,"which":true,"avconv":false,"convert":false,"du":true,"ffmpeg":false,"gm":false,"tar":true,"zip":false} \ No newline at end of file diff --git a/traces/_h5ai/private/conf/l10n/af.json b/traces/_h5ai/private/conf/l10n/af.json new file mode 100644 index 0000000..5150c7b --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/af.json @@ -0,0 +1,18 @@ +{ + "lang": "afrikaans", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "besonderhede", + "download": "aflaai", + "empty": "leeg", + "files": "lêers", + "filter": "filter", + "folders": "gidse", + "grid": "rooster", + "icons": "ikone", + "lastModified": "Laas verander", + "name": "Naam", + "noMatch": "geen resultaat", + "parentDirectory": "Hoër Vlak", + "size": "Grootte" +} diff --git a/traces/_h5ai/private/conf/l10n/bg.json b/traces/_h5ai/private/conf/l10n/bg.json new file mode 100644 index 0000000..6808e62 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/bg.json @@ -0,0 +1,18 @@ +{ + "lang": "български", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "детайли", + "download": "изтегляне", + "empty": "празна", + "files": "файлове", + "filter": "филтър", + "folders": "директории", + "grid": "мрежа", + "icons": "икони", + "lastModified": "Последна промяна", + "name": "Име", + "noMatch": "няма съвпадение", + "parentDirectory": "Предходна директория", + "size": "Размер" +} diff --git a/traces/_h5ai/private/conf/l10n/cs.json b/traces/_h5ai/private/conf/l10n/cs.json new file mode 100644 index 0000000..1e34e61 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/cs.json @@ -0,0 +1,18 @@ +{ + "lang": "čeština", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "Podrobnosti", + "download": "Stáhnout", + "empty": "Prázdná složka", + "files": "souborů", + "filter": "Filtr", + "folders": "složek", + "grid": "Seznam", + "icons": "Velké ikony", + "lastModified": "Datum změny", + "name": "Název", + "noMatch": "Žádná shoda", + "parentDirectory": "Nadřazený adresář", + "size": "Velikost" +} diff --git a/traces/_h5ai/private/conf/l10n/da.json b/traces/_h5ai/private/conf/l10n/da.json new file mode 100644 index 0000000..3b8fa06 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/da.json @@ -0,0 +1,18 @@ +{ + "lang": "dansk", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detaljer", + "download": "download", + "empty": "tom", + "files": "filer", + "filter": "filter", + "folders": "mapper", + "grid": "grid", + "icons": "ikoner", + "lastModified": "Sidst ændret", + "name": "Navn", + "noMatch": "ingen match", + "parentDirectory": "Overordnet mappe", + "size": "Størrelse" +} diff --git a/traces/_h5ai/private/conf/l10n/de.json b/traces/_h5ai/private/conf/l10n/de.json new file mode 100644 index 0000000..6d8c613 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/de.json @@ -0,0 +1,22 @@ +{ + "lang": "deutsch", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "Details", + "download": "Download", + "empty": "leer", + "files": "Dateien", + "filter": "filtern", + "folders": "Ordner", + "grid": "Gitter", + "icons": "Icons", + "language": "Sprache", + "lastModified": "Geändert", + "name": "Name", + "noMatch": "keine Treffer", + "parentDirectory": "Übergeordnetes Verzeichnis", + "search": "suchen", + "size": "Größe", + "tree": "Baum", + "view": "Ansicht" +} diff --git a/traces/_h5ai/private/conf/l10n/el.json b/traces/_h5ai/private/conf/l10n/el.json new file mode 100644 index 0000000..2d9c00d --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/el.json @@ -0,0 +1,18 @@ +{ + "lang": "ελληνικά", + + "dateFormat": "DD/MM/YYYY HH:mm", + "details": "λεπτομέρειες", + "download": "μεταμόρφωση", + "empty": "κενό", + "files": "αρχεία", + "filter": "φίλτρο", + "folders": "φάκελοι", + "grid": "πλέγμα", + "icons": "εικονίδια", + "lastModified": "Τελευταία τροποποίηση", + "name": "Όνομα", + "noMatch": "κανένα αποτέλεσμα", + "parentDirectory": "Προηγούμενος Κατάλογος", + "size": "Μέγεθος" +} diff --git a/traces/_h5ai/private/conf/l10n/en.json b/traces/_h5ai/private/conf/l10n/en.json new file mode 100644 index 0000000..05e9b4e --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/en.json @@ -0,0 +1,23 @@ +/* only here as a reference, these values are the hardcoded defaults */ +{ + "lang": "english", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "details", + "download": "download", + "empty": "empty", + "files": "files", + "filter": "filter", + "folders": "folders", + "grid": "grid", + "icons": "icons", + "language": "Language", + "lastModified": "Last modified", + "name": "Name", + "noMatch": "no match", + "parentDirectory": "Parent Directory", + "search": "search", + "size": "Size", + "tree": "Tree", + "view": "View" +} diff --git a/traces/_h5ai/private/conf/l10n/es.json b/traces/_h5ai/private/conf/l10n/es.json new file mode 100644 index 0000000..e42a5b9 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/es.json @@ -0,0 +1,22 @@ +{ + "lang": "español", + + "dateFormat": "DD/MM/YYYY HH:mm", + "details": "Detalles", + "download": "Descargar", + "empty": "vacío", + "files": "Archivos", + "filter": "Filtrar", + "folders": "Directorios", + "grid": "Cuadrícula", + "icons": "Íconos", + "language": "Idioma", + "lastModified": "Última modificación", + "name": "Nombre", + "noMatch": "Sin coincidencias", + "parentDirectory": "Directorio superior", + "search": "buscar", + "size": "Tamaño", + "tree": "Arbol", + "view": "Vista" +} diff --git a/traces/_h5ai/private/conf/l10n/et.json b/traces/_h5ai/private/conf/l10n/et.json new file mode 100644 index 0000000..8f3d1dc --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/et.json @@ -0,0 +1,22 @@ +{ + "lang": "estonian", + + "dateFormat": "DD-MM-YYYY HH.mm", + "details": "täpsem info", + "download": "laadi alla", + "empty": "tühi", + "files": "failid", + "filter": "filter", + "folders": "kataloogid", + "grid": "võre", + "icons": "ikoonid", + "language": "Keel", + "lastModified": "Viimati muudetud", + "name": "Nimi", + "noMatch": "ei leitud sobivat", + "parentDirectory": "Emakataloog", + "search": "otsi", + "size": "Suurus", + "tree": "Puu", + "view": "Vaade" +} diff --git a/traces/_h5ai/private/conf/l10n/fi.json b/traces/_h5ai/private/conf/l10n/fi.json new file mode 100644 index 0000000..c19c0ed --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/fi.json @@ -0,0 +1,18 @@ +{ + "lang": "finnish", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "tiedot", + "download": "lataa", + "empty": "tyhjä", + "files": "tiedostoa", + "filter": "suodata", + "folders": "hakemistoa", + "grid": "ruudukko", + "icons": "ikonit", + "lastModified": "Viimeksi muokattu", + "name": "Nimi", + "noMatch": "ei osumia", + "parentDirectory": "Ylähakemisto", + "size": "Koko" +} diff --git a/traces/_h5ai/private/conf/l10n/fr.json b/traces/_h5ai/private/conf/l10n/fr.json new file mode 100644 index 0000000..9a4ac45 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/fr.json @@ -0,0 +1,22 @@ +{ + "lang": "français", + + "dateFormat": "DD/MM/YYYY HH:mm", + "details": "détails", + "download": "télécharger", + "empty": "vide", + "files": "Fichiers", + "filter": "filtrer", + "folders": "Répertoires", + "grid": "grille", + "icons": "icônes", + "language": "Langue", + "lastModified": "Dernière modification", + "name": "Nom", + "noMatch": "rien trouvé", + "parentDirectory": "Dossier parent", + "search": "rechercher", + "size": "Taille", + "tree": "Arborescence", + "view": "Disposition" +} diff --git a/traces/_h5ai/private/conf/l10n/he.json b/traces/_h5ai/private/conf/l10n/he.json new file mode 100644 index 0000000..bb37f7f --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/he.json @@ -0,0 +1,17 @@ +{ + "lang": "עברית", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "פרטים", + "download": "הורדה", + "empty": "ריק", + "files": "קבצים", + "filter": "סינון", + "folders": "תיקיות", + "icons": "צלמיות", + "lastModified": "שינוי אחרון", + "name": "שם", + "noMatch": "אין תוצאות", + "parentDirectory": "תיקיית הורה", + "size": "גודל" +} diff --git a/traces/_h5ai/private/conf/l10n/hi.json b/traces/_h5ai/private/conf/l10n/hi.json new file mode 100644 index 0000000..5941733 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/hi.json @@ -0,0 +1,18 @@ +{ + "lang": "हिंदी", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "विस्तार", + "download": "डाउनलोड", + "empty": "खाली", + "files": "फ़ाइलें", + "filter": "फ़िल्टर", + "folders": "फोल्डर", + "grid": "ग्रिड", + "icons": "आइकॉन", + "lastModified": "पिछला परिवर्तन", + "name": "नाम", + "noMatch": "कोई समानता नहीं", + "parentDirectory": "मूल डायरेक्टरी", + "size": "माप" +} diff --git a/traces/_h5ai/private/conf/l10n/hr.json b/traces/_h5ai/private/conf/l10n/hr.json new file mode 100644 index 0000000..c044db4 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/hr.json @@ -0,0 +1,18 @@ +{ + "lang": "hrvatski", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "detalji", + "download": "preuzmi", + "empty": "prazno", + "files": "datoteka", + "filter": "filter", + "folders": "direktorij(a)", + "grid": "mreža", + "icons": "ikone", + "lastModified": "Posljednja izmjena", + "name": "Naziv", + "noMatch": "nema rezultata", + "parentDirectory": "Natrag", + "size": "Veličina" +} diff --git a/traces/_h5ai/private/conf/l10n/hu.json b/traces/_h5ai/private/conf/l10n/hu.json new file mode 100644 index 0000000..b2c1b34 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/hu.json @@ -0,0 +1,16 @@ +{ + "lang": "magyar", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "részletek", + "download": "letöltés", + "empty": "üres", + "files": "fájlok", + "folders": "mappák", + "icons": "ikonok", + "lastModified": "Utoljára módosítva", + "name": "Név", + "noMatch": "nincs találat", + "parentDirectory": "Szülő könyvtár", + "size": "Méret" +} diff --git a/traces/_h5ai/private/conf/l10n/it.json b/traces/_h5ai/private/conf/l10n/it.json new file mode 100644 index 0000000..cd83337 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/it.json @@ -0,0 +1,18 @@ +{ + "lang": "italiano", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "dettagli", + "download": "download", + "empty": "vuota", + "files": "file", + "filter": "filtra", + "folders": "cartelle", + "grid": "griglia", + "icons": "icone", + "lastModified": "Ultima modifica", + "name": "Nome", + "noMatch": "nessun risultato", + "parentDirectory": "Cartella Superiore", + "size": "Dimensione" +} diff --git a/traces/_h5ai/private/conf/l10n/ja.json b/traces/_h5ai/private/conf/l10n/ja.json new file mode 100644 index 0000000..88266e7 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/ja.json @@ -0,0 +1,20 @@ +{ + "lang": "日本語", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "詳細", + "download": "ダウンロード", + "empty": "(空)", + "files": "ファイル", + "filter": "フィルター", + "folders": "フォルダー", + "grid": "グリッド", + "icons": "アイコン", + "language": "言語", + "lastModified": "最終変更日時", + "name": "名前", + "noMatch": "一致する項目が見つかりません", + "parentDirectory": "親ディレクトリへ", + "size": "サイズ", + "view": "ビュー" +} diff --git a/traces/_h5ai/private/conf/l10n/ko.json b/traces/_h5ai/private/conf/l10n/ko.json new file mode 100644 index 0000000..8c48cdb --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/ko.json @@ -0,0 +1,22 @@ +{ + "lang": "한국어", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "자세히", + "download": "다운로드", + "empty": "빈 폴더", + "files": "파일", + "filter": "필터", + "folders": "폴더", + "grid": "그리드", + "icons": "아이콘", + "language": "언어", + "lastModified": "최근 수정일", + "name": "파일명", + "noMatch": "해당파일이 없습니다.", + "parentDirectory": "상위폴더", + "search": "검색", + "size": "크기", + "tree": "트리", + "view": "보기" +} diff --git a/traces/_h5ai/private/conf/l10n/lv.json b/traces/_h5ai/private/conf/l10n/lv.json new file mode 100644 index 0000000..fa672ce --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/lv.json @@ -0,0 +1,22 @@ +{ + "lang": "latviešu", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "detaļas", + "download": "lejupielādēt", + "empty": "tukšs", + "files": "faili", + "filter": "filtrēt", + "folders": "mapes", + "grid": "režģis", + "icons": "ikonas", + "language": "Valoda", + "lastModified": "Pēdējoreiz modificēts", + "name": "Nosaukums", + "noMatch": "nav sakritības", + "parentDirectory": "Vecākdirektorijs", + "search": "meklēt", + "size": "Izmērs", + "tree": "Koks", + "view": "Skats" +} diff --git a/traces/_h5ai/private/conf/l10n/nb.json b/traces/_h5ai/private/conf/l10n/nb.json new file mode 100644 index 0000000..44a1797 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/nb.json @@ -0,0 +1,15 @@ +{ + "lang": "norwegian", + + "details": "detaljer", + "download": "last ned", + "empty": "tom", + "files": "filer", + "folders": "mapper", + "icons": "ikoner", + "lastModified": "Sist endret", + "name": "Navn", + "noMatch": "ingen treff", + "parentDirectory": "Overordnet mappe", + "size": "Størrelse" +} diff --git a/traces/_h5ai/private/conf/l10n/nl.json b/traces/_h5ai/private/conf/l10n/nl.json new file mode 100644 index 0000000..8310f05 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/nl.json @@ -0,0 +1,22 @@ +{ + "lang": "nederlands", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "details", + "download": "download", + "empty": "leeg", + "files": "bestanden", + "filter": "filter", + "folders": "mappen", + "grid": "grid", + "icons": "iconen", + "language": "Taal", + "lastModified": "Laatste wijziging", + "name": "Naam", + "noMatch": "geen overeenkomst", + "parentDirectory": "Bovenliggende map", + "search": "zoeken", + "size": "Grootte", + "tree": "Boom", + "view": "Bekijk" +} diff --git a/traces/_h5ai/private/conf/l10n/pl.json b/traces/_h5ai/private/conf/l10n/pl.json new file mode 100644 index 0000000..da56967 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/pl.json @@ -0,0 +1,22 @@ +{ + "lang": "polski", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "szczegóły", + "download": "pobierz", + "empty": "pusty", + "files": "plików", + "filter": "filtr", + "folders": "folderów", + "grid": "kafelki", + "icons": "ikony", + "language": "Język", + "lastModified": "Ostatnia modyfikacja", + "name": "Nazwa", + "noMatch": "nie znaleziono", + "parentDirectory": "Katalog nadrzędny", + "search": "szukaj", + "size": "Rozmiar", + "tree": "Drzewo", + "view": "Układ" +} diff --git a/traces/_h5ai/private/conf/l10n/pt.json b/traces/_h5ai/private/conf/l10n/pt.json new file mode 100644 index 0000000..acd7fea --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/pt.json @@ -0,0 +1,18 @@ +{ + "lang": "português", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detalhes", + "download": "descarregar", + "empty": "vazio", + "files": "arquivos", + "filter": "filtro", + "folders": "pastas", + "grid": "grelha", + "icons": "ícones", + "lastModified": "última modificação", + "name": "Nome", + "noMatch": "sem resultados", + "parentDirectory": "diretório acima", + "size": "Tamanho" +} diff --git a/traces/_h5ai/private/conf/l10n/ro.json b/traces/_h5ai/private/conf/l10n/ro.json new file mode 100644 index 0000000..4981dfe --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/ro.json @@ -0,0 +1,15 @@ +{ + "lang": "română", + + "details": "detalii", + "download": "descarcă", + "empty": "gol", + "files": "fişiere", + "folders": "dosar", + "icons": "pictograme", + "lastModified": "ultima modificare", + "name": "nume", + "noMatch": "0 rezultate", + "parentDirectory": "dosar părinte", + "size": "mărime" +} diff --git a/traces/_h5ai/private/conf/l10n/ru.json b/traces/_h5ai/private/conf/l10n/ru.json new file mode 100644 index 0000000..8056a0d --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/ru.json @@ -0,0 +1,20 @@ +{ + "lang": "русский", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "Детали", + "download": "Скачать", + "empty": "Пусто", + "files": "Файлы", + "filter": "Фильтр", + "folders": "Папки", + "grid": "Сетка", + "icons": "Иконки", + "language": "Язык", + "lastModified": "Последние изменения", + "name": "Имя", + "noMatch": "Нет совпадений", + "parentDirectory": "Главная директория", + "size": "Размер", + "view": "Вид" +} diff --git a/traces/_h5ai/private/conf/l10n/sk.json b/traces/_h5ai/private/conf/l10n/sk.json new file mode 100644 index 0000000..cfc9e45 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/sk.json @@ -0,0 +1,13 @@ +{ + "lang": "slovenčina", + + "details": "podrobnosti", + "empty": "prázdny", + "files": "súborov", + "folders": "priečinkov", + "icons": "ikony", + "lastModified": "Upravené", + "name": "Názov", + "parentDirectory": "Nadriadený priečinok", + "size": "Velkosť" +} diff --git a/traces/_h5ai/private/conf/l10n/sl.json b/traces/_h5ai/private/conf/l10n/sl.json new file mode 100644 index 0000000..5cdda21 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/sl.json @@ -0,0 +1,18 @@ +{ + "lang": "slovenščina", + + "dateFormat": "DD. MM. YYYY HH:mm", + "details": "podrobnosti", + "download": "prenesi", + "empty": "prazno", + "files": "datoteke", + "filter": "filter", + "folders": "mape", + "grid": "mreža", + "icons": "ikone", + "lastModified": "Zadnja sprememba", + "name": "Ime", + "noMatch": "ni zadetkov", + "parentDirectory": "Nadrejena mapa", + "size": "Velikost" +} diff --git a/traces/_h5ai/private/conf/l10n/sr.json b/traces/_h5ai/private/conf/l10n/sr.json new file mode 100644 index 0000000..845eeab --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/sr.json @@ -0,0 +1,15 @@ +{ + "lang": "srpski", + + "details": "detalji", + "download": "download", + "empty": "prazno", + "files": "fajlovi", + "folders": "direktorijum", + "icons": "ikone", + "lastModified": "Poslednja modifikacija", + "name": "Ime", + "noMatch": "bez poklapanja", + "parentDirectory": "Roditeljski direktorijum", + "size": "Veličina" +} diff --git a/traces/_h5ai/private/conf/l10n/sv.json b/traces/_h5ai/private/conf/l10n/sv.json new file mode 100644 index 0000000..75638e5 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/sv.json @@ -0,0 +1,16 @@ +{ + "lang": "svenska", + + "details": "detaljerad", + "download": "ladda ner", + "empty": "tom", + "files": "filer", + "folders": "kataloger", + "grid": "rutnät", + "icons": "ikoner", + "lastModified": "Senast ändrad", + "name": "Filnamn", + "noMatch": "ingen matchning", + "parentDirectory": "Till överordnad mapp", + "size": "Filstorlek" +} diff --git a/traces/_h5ai/private/conf/l10n/tr.json b/traces/_h5ai/private/conf/l10n/tr.json new file mode 100644 index 0000000..45cfc92 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/tr.json @@ -0,0 +1,14 @@ +{ + "lang": "türkçe", + + "details": "detaylar", + "download": "indir", + "empty": "boş", + "files": "dosyalar", + "folders": "klasörler", + "icons": "ikonlar", + "lastModified": "Son Düzenleme", + "name": "İsim", + "parentDirectory": "Üst Dizin", + "size": "Boyut" +} diff --git a/traces/_h5ai/private/conf/l10n/uk.json b/traces/_h5ai/private/conf/l10n/uk.json new file mode 100644 index 0000000..62908f5 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/uk.json @@ -0,0 +1,18 @@ +{ + "lang": "українська", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "Деталі", + "download": "Завантажити", + "empty": "Порожньо", + "files": "Файли(ів)", + "filter": "Фільтр", + "folders": "Тек(и)", + "grid": "Гратка", + "icons": "Піктограми", + "lastModified": "Останні зміни", + "name": "Ім'я", + "noMatch": "Немає співпадінь", + "parentDirectory": "Головна тека", + "size": "Розмір" +} diff --git a/traces/_h5ai/private/conf/l10n/zh-cn.json b/traces/_h5ai/private/conf/l10n/zh-cn.json new file mode 100644 index 0000000..7cdba51 --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/zh-cn.json @@ -0,0 +1,23 @@ +{ + "lang": "简体中文", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "详情", + "download": "下载", + "empty": "空文件夹", + "files": "文件", + "filter": "过滤", + "folders": "文件夹", + "grid": "网格", + "icons": "图标", + "language": "语言", + "lastModified": "修改时间", + "name": "文件名", + "noMatch": "无匹配项", + "parentDirectory": "父文件夹", + "search": "搜索", + "size": "大小", + "tree": "树形目录", + "view": "视图", + "info": "信息" +} diff --git a/traces/_h5ai/private/conf/l10n/zh-tw.json b/traces/_h5ai/private/conf/l10n/zh-tw.json new file mode 100644 index 0000000..7567f0d --- /dev/null +++ b/traces/_h5ai/private/conf/l10n/zh-tw.json @@ -0,0 +1,23 @@ +{ + "lang": "正體中文", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "詳細資料", + "download": "下載", + "empty": "空資料夾", + "files": "檔案", + "filter": "過濾", + "folders": "資料夾", + "grid": "網格", + "icons": "圖示", + "language": "語言", + "lastModified": "上次修改", + "name": "檔名", + "noMatch": "沒有符合的檔案", + "parentDirectory": "上層目錄", + "search": "搜尋", + "size": "大小", + "tree": "樹形目錄", + "view": "檢視", + "info": "資訊" +} diff --git a/traces/_h5ai/private/conf/options.json b/traces/_h5ai/private/conf/options.json new file mode 100644 index 0000000..69a7add --- /dev/null +++ b/traces/_h5ai/private/conf/options.json @@ -0,0 +1,392 @@ +/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */ +{ + /* + Password hash. + + SHA512 hash of the info page password, the preset password is the empty string. + Online hash generator: http://md5hashing.net/hashing/sha512 + */ + "passhash": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + + + + /* + Resources. + + Additional script and style tags added to all pages. Paths not beginning + with "http://", "https://" or "/" will be looked up relative to + "_h5ai/public/ext/" (no check for existence). + + - scripts: array of strings + - styles: array of strings + */ + "resources": { + "scripts": [], + "styles": [ + "//fonts.googleapis.com/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700" + ] + }, + + + + /* + General view options. + + - binaryPrefix: boolean, set to true uses 1024B=1KiB when formatting file sizes (see http://en.wikipedia.org/wiki/Binary_prefix) + - disableSidebar: boolean, hides sidebar and toggle button + - fallbackMode: boolean, serve fallback mode + - fastBrowsing: boolean, use History API if available (no need to reload the whole page) + - fonts: array of strings, fonts to use in regular context + - fontsMono: array of strings, fonts to use in monopspaced context + - hidden: array of strings, don't list items matching these regular expressions + - hideFolders: boolean, hide all folders in the main view + - hideIf403: boolean, hide files and folders that are not readable by the server + - hideParentFolder: boolean, hide parent folder links in the main view + - maxIconSize: number, max size for icons in the main view + - modes: array of strings, subset of ["details", "grid", "icons"] + the first value indicates the default view mode. If only one value + is given the view mode is fixed and the selector buttons are hidden. + The user selected view mode is also stored local in modern browsers + so that it will be persistent. + - modeToggle: boolean, show a view mode toggle in the toolbar, or "next" + - setParentFolderLabels: boolean, set parent folder labels to real folder names + - sizes: array of numbers + the first value indicates the default view size. If only one value + is given the view size is fixed and the selector buttons are hidden. + The user selected view size is also stored local in modern browsers + so that it will be persistent. + - theme: string, name of one of the folders in "_h5ai/images/themes", defaults to "default" + - unmanaged: array of strings, don't manage folders containing one of those files + - unmanagedInNewWindow: boolean, open unmanaged links in new window/tab + */ + "view": { + "binaryPrefix": false, + "disableSidebar": false, + "fallbackMode": false, + "fastBrowsing": true, + "fonts": ["Ubuntu", "Roboto", "Helvetica", "Arial", "sans-serif"], + "fontsMono": ["Ubuntu Mono", "Monaco", "Lucida Sans Typewriter", "monospace"], + "hidden": ["^\\.", "^_h5ai"], + "hideFolders": false, + "hideIf403": true, + "hideParentFolder": false, + "maxIconSize": 40, + "modes": ["details", "grid", "icons"], + "modeToggle": false, + "setParentFolderLabels": true, + "sizes": [20, 40, 60, 80, 100, 140, 180, 220, 260, 300], + "theme": "comity", + "unmanaged": ["index.html", "index.htm", "index.php"], + "unmanagedInNewWindow": false + }, + + + + /*** Extensions (in alphabetical order) ***/ + + /* + Watch and update current folder content. + + - interval: number, update interval in milliseconds, at least 1000 + */ + "autorefresh": { + "enabled": false, + "interval": 5000 + }, + + /* + Show a clickable breadcrumb. + */ + "crumb": { + "enabled": true + }, + + /* + Allow customized header and footer files. + First checks for files "_h5ai.header.html" and "_h5ai.footer.html" in the current directory. + If not successful it checks all parent directories (starting in the current directory) for + files "_h5ai.headers.html" and "_h5ai.footers.html". + Note the different filenames: "header" (only current) - "headers" (current and sub directories)! + The file's content will be placed inside a
tag above/below the main content. + If a file's extension is ".md" instead of ".html" its content will be interpreted as markdown. + */ + "custom": { + "enabled": true + }, + + /* + Enable packaged download of selected entries. + To select files the "select"-extension needs to be enabled. + + - type: string, "php-tar", "shell-tar" or "shell-zip" + - packageName: string, basename of the download package, null for current filename or foldername + - alwaysVisible: boolean, always show download button (defaults to download the current folder) + */ + "download": { + "enabled": true, + "type": "php-tar", + "packageName": null, + "alwaysVisible": false + }, + + /* + Allow filtering the displayed files and folders in current folder. + Checks for substrings. + + If advanced is enabled it checks entries for right order of characters, + i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated + sequences get OR-ed. Searches will be treated as JavaScript regular + expressions if you prefix them with "re:". + + - advanced: boolean, use advanced pattern parsing + - debounceTime: number, debounce wait time in milliseconds + - ignorecase: boolean, ignore case + */ + "filter": { + "enabled": false, + "advanced": true, + "debounceTime": 100, + "ignorecase": true + }, + + /* + Calc the size of folders. + This operation is real slow. The calculated sizes differ slightly for both + calculation types since "php" only adds the file size, while "shell-du" + also adds the sizes for the actual folder files. + + - type: string, "php" (sloooow) or "shell-du" (sloow) + */ + "foldersize": { + "enabled": true, + "type": "php" + }, + + /* + Adds Google Universial Analytics asynchronous tracking code. + see: https://developers.google.com/analytics/devguides/collection/analyticsjs/ + + - id: string, account ID + */ + "google-analytics-ua": { + "enabled": false, + "id": "UA-000000-0" + }, + + /* + Enable a generic info side bar. + + - show: boolean, initial visible to first time users + - qrcode: boolean, show a QR-Code + - qrColor: string, QR-Code fill color + */ + "info": { + "enabled": true, + "show": false, + "qrcode": true, + "qrFill": "#999", + "qrBack": "#fff" + }, + + /* + Localization, for example "en", "de" etc. - see "_h5ai/conf/l10n" folder for + possible values. Adjust it to your needs. If lang is not found + it defaults to "en". + + - lang: string, default language + - useBroserLang: boolean, try to use browser language + */ + "l10n": { + "enabled": true, + "lang": "en", + "useBrowserLang": true + }, + + /* + Adds Piwik tracker javascript code. + + - baseURL: string, do not include the protocol, e.g. "mydomain.tld/piwik" + - idSite: number + */ + "piwik-analytics": { + "enabled": false, + "baseURL": "some/url", + "idSite": 1 + }, + + /* + Play a audio preview on click. + + - autoplay: start playing as soon as ready + - types: array of strings + */ + "preview-aud": { + "enabled": true, + "autoplay": true, + "types": ["aud"] + }, + + /* + Show an image preview on click. + + - types: array of strings + - size: number, sample size, or false for original size + */ + "preview-img": { + "enabled": true, + "size": false, + "types": ["img", "img-bmp", "img-gif", "img-ico", "img-jpg", "img-png", "img-raw", "img-svg"] + }, + + /* + Show text file preview on click. + + Available styles are: + 0: floating text + 1: fixed width text + 2: markdown + 3: syntax highlighting + + - styles: dict string to int, maps types to styles + */ + "preview-txt": { + "enabled": true, + "styles": { + "txt": 1, + "txt-authors": 1, + "txt-c": 3, + "txt-cpp": 3, + "txt-css": 3, + "txt-diff": 1, + "txt-go": 3, + "txt-h": 3, + "txt-hpp": 3, + "txt-install": 1, + "txt-js": 3, + "txt-json": 3, + "txt-less": 3, + "txt-license": 1, + "txt-log": 1, + "txt-makefile": 1, + "txt-md": 2, + "txt-py": 3, + "txt-rb": 3, + "txt-readme": 1, + "txt-rtf": 1, + "txt-rust": 3, + "txt-script": 3, + "txt-xml": 1 + } + }, + + /* + Play a video preview on click. + + - autoplay: start playing as soon as ready + - types: array of strings + */ + "preview-vid": { + "enabled": true, + "autoplay": true, + "types": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"] + }, + + /* + Allow searching files and folders in and below current folder. + Checks for substrings. + + If advanced is enabled it checks entries for right order of characters, + i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated + sequences get OR-ed. Searches will be treated as JavaScript regular + expressions if you prefix them with "re:". + + - advanced: boolean, use advanced pattern parsing + - debounceTime: number, debounce wait time in milliseconds + - ignorecase: boolean, ignore case + */ + "search": { + "enabled": false, + "advanced": true, + "debounceTime": 300, + "ignorecase": true + }, + + /* + Make entries selectable. + At the moment only needed for packaged download. + + - clickndrag: boolean, allow first mouse button + drag selection + - checkboxes: boolean, show a checkbox on mouse over item + */ + "select": { + "enabled": true, + "clickndrag": true, + "checkboxes": true + }, + + /* + Default sort order. + "column" and "reverse" are locally stored. + + - column: number, 0 for "Name", 1 for "Date", 2 for "Size" + - reverse: boolean, false for ascending, true for descending + - ignorecase: boolean, compare ignorecase + - natural: boolean, use natural sort order + - folders: number, where to place folders, 0 for "top", 1 for "in place", 2 for "bottom" + */ + "sort": { + "enabled": true, + "column": 0, + "reverse": false, + "ignorecase": true, + "natural": true, + "folders": 0 + }, + + /* + Show thumbnails for image files. Needs the "/_h5ai/cache" folder to be + writable for the web Server. + + - img: array of strings + - mov: array of strings + - doc: array of strings + - delay: number, delay in milliseconds after "dom-ready" before thumb-requesting starts + - size: number, size in pixel of the generated thumbnails + - exif: boolean, use included EXIF thumbs if possible + - chunksize: int, number of thumbs per request + */ + "thumbnails": { + "enabled": true, + "img": ["img-bmp", "img-gif", "img-ico", "img-jpg", "img-png"], + "mov": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"], + "doc": ["x-pdf", "x-ps"], + "delay": 1, + "size": 240, + "exif": false, + "chunksize": 20 + }, + + /* + Replace window title with current breadcrumb. + */ + "title": { + "enabled": true + }, + + /* + Show a folder tree. + Note that this might affect performance significantly. + + - show: boolean, initial visible to first time users + - maxSubfolders: number, max number of subfolders to show in tree + - naturalSort: boolean, use natural sort order for folders + - ignorecase: boolean, sort ignorecase + */ + "tree": { + "enabled": true, + "show": true, + "maxSubfolders": 50, + "naturalSort": true, + "ignorecase": true + } +} diff --git a/traces/_h5ai/private/conf/types.json b/traces/_h5ai/private/conf/types.json new file mode 100644 index 0000000..0b83a3e --- /dev/null +++ b/traces/_h5ai/private/conf/types.json @@ -0,0 +1,76 @@ +/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */ +{ + "ar": ["*.tar.bz2", "*.crx"], + "ar-apk": ["*.apk"], + "ar-deb": ["*.deb"], + "ar-gz": ["*.gz", "*.tar.gz", "*.tgz"], + "ar-rar": ["*.rar"], + "ar-rpm": ["*.rpm"], + "ar-tar": ["*.tar"], + "ar-zip": ["*.7z", "*.bz2", "*.jar", "*.lzma", "*.war", "*.z", "*.Z", "*.zip"], + "aud": ["*.aif", "*.aiff", "*.flac", "*.m4a", "*.mid", "*.mp3", "*.mpa", "*.ra", "*.ogg", "*.wav", "*.wma"], + "aud-pls": ["*.m3u", "*.m3u8", "*.pls"], + "bin": ["*.class", "*.o", "*.so"], + "bin-exe": ["*.bat", "*.cmd", "*.exe"], + "img": ["*.xpm"], + "img-bmp": ["*.bmp"], + "img-gif": ["*.gif"], + "img-ico": ["*.ico"], + "img-jpg": ["*.jpg", "*.jpeg"], + "img-png": ["*.png"], + "img-raw": ["*.cr2", "*.nef"], + "img-svg": ["*.svg"], + "img-tiff": ["*.tiff"], + "txt": ["*.text", "*.txt"], + "txt-build": ["*.pom", "build.xml", "pom.xml"], + "txt-c": ["*.c"], + "txt-cpp": ["*.cpp"], + "txt-css": ["*.css"], + "txt-diff": ["*.diff", "*.patch"], + "txt-go": ["*.go"], + "txt-h": ["*.h"], + "txt-html": ["*.htm", "*.html", "*.shtml", "*.xhtml"], + "txt-hpp": ["*.hpp"], + "txt-java": ["*.java"], + "txt-scala": ["*.scala"], + "txt-js": ["*.js"], + "txt-json": ["*.json"], + "txt-less": ["*.less"], + "txt-log": ["*.log", "changelog*"], + "txt-md": ["*.markdown", "*.md"], + "txt-php": ["*.php"], + "txt-py": ["*.py"], + "txt-rb": ["*.rb"], + "txt-rss": ["*.rss"], + "txt-rtf": ["*.rtf"], + "txt-rust": ["*.rs", "*.rlib"], + "txt-script": ["*.conf", "*.bsh", "*.csh", "*.ini", "*.ksh", "*.sh", "*.shar", "*.tcl", "*.zsh"], + "txt-source": [], + "txt-tex": ["*.tex"], + "txt-vcal": ["*.vcal"], + "txt-xml": ["*.xml"], + "vid": [], + "vid-avi": ["*.avi"], + "vid-flv": ["*.flv"], + "vid-mkv": ["*.mkv"], + "vid-mov": ["*.mov"], + "vid-mp4": ["*.mp4", "*.m4v"], + "vid-mpg": ["*.mpg"], + "vid-rm": ["*.rm"], + "vid-swf": ["*.swf"], + "vid-ts": ["*.ts"], + "vid-vob": ["*.vob"], + "vid-webm": ["*.webm"], + "vid-wmv": ["*.wmv"], + "x": [], + "x-bak": ["*.bak", "*~"], + "x-calc": ["*.ods", "*.ots", "*.xlr", "*.xls", "*.xlsx"], + "x-disc": ["*.cue", "*.iso"], + "x-doc": ["*.doc", "*.docx", "*.odm", "*.odt", "*.ott"], + "x-draw": ["*.drw"], + "x-eps": ["*.eps"], + "x-pdf": ["*.pdf"], + "x-pres": ["*.odp", "*.otp", "*.pps", "*.ppt", "*.pptx"], + "x-ps": ["*.ps"], + "x-psd": ["*.psd"] +} diff --git a/traces/_h5ai/private/php/class-bootstrap.php b/traces/_h5ai/private/php/class-bootstrap.php new file mode 100644 index 0000000..4356523 --- /dev/null +++ b/traces/_h5ai/private/php/class-bootstrap.php @@ -0,0 +1,45 @@ +query_boolean('refresh', false)); + $context = new Context($session, $request, $setup); + + if ($context->is_api_request()) { + (new Api($context))->apply(); + } elseif ($context->is_info_request()) { + $public_href = $setup->get('PUBLIC_HREF'); + $x_head_tags = $context->get_x_head_html(); + $fallback_mode = false; + require __DIR__ . '/pages/info.php'; + } else { + $public_href = $setup->get('PUBLIC_HREF'); + $x_head_tags = $context->get_x_head_html(); + $fallback_mode = $context->is_fallback_mode(); + $fallback_html = (new Fallback($context))->get_html(); + require __DIR__ . '/pages/index.php'; + } + } + + public static function autoload($class_name) { + $filename = 'class-' . strtolower($class_name) . '.php'; + + foreach (Bootstrap::$autopaths as $path) { + $file = __DIR__ . '/' . $path . '/' . $filename; + if (file_exists($file)) { + require_once $file; + return true; + } + } + } +} diff --git a/traces/_h5ai/private/php/core/class-api.php b/traces/_h5ai/private/php/core/class-api.php new file mode 100644 index 0000000..30eadd1 --- /dev/null +++ b/traces/_h5ai/private/php/core/class-api.php @@ -0,0 +1,109 @@ +context = $context; + $this->request = $context->get_request(); + $this->setup = $context->get_setup(); + } + + public function apply() { + $action = $this->request->query('action'); + $supported = ['download', 'get', 'login', 'logout']; + Util::json_fail(Util::ERR_UNSUPPORTED, 'unsupported action', !in_array($action, $supported)); + + $methodname = 'on_' . $action; + $this->$methodname(); + } + + private function on_download() { + Util::json_fail(Util::ERR_DISABLED, 'download disabled', !$this->context->query_option('download.enabled', false)); + + $as = $this->request->query('as'); + $type = $this->request->query('type'); + $base_href = $this->request->query('baseHref'); + $hrefs = $this->request->query('hrefs', ''); + + $archive = new Archive($this->context); + + set_time_limit(0); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $as . '"'); + header('Connection: close'); + $ok = $archive->output($type, $base_href, $hrefs); + + Util::json_fail(Util::ERR_FAILED, 'packaging failed', !$ok); + exit; + } + + private function on_get() { + $response = []; + + foreach (['langs', 'options', 'types'] as $name) { + if ($this->request->query_boolean($name, false)) { + $methodname = 'get_' . $name; + $response[$name] = $this->context->$methodname(); + } + } + + if ($this->request->query_boolean('setup', false)) { + $response['setup'] = $this->setup->to_jsono($this->context->is_admin()); + } + + if ($this->request->query_boolean('theme', false)) { + $theme = new Theme($this->context); + $response['theme'] = $theme->get_icons(); + } + + if ($this->request->query('items', false)) { + $href = $this->request->query('items.href'); + $what = $this->request->query_numeric('items.what'); + $response['items'] = $this->context->get_items($href, $what); + } + + if ($this->request->query('custom', false)) { + Util::json_fail(Util::ERR_DISABLED, 'custom disabled', !$this->context->query_option('custom.enabled', false)); + $href = $this->request->query('custom'); + $custom = new Custom($this->context); + $response['custom'] = $custom->get_customizations($href); + } + + if ($this->request->query('l10n', false)) { + Util::json_fail(Util::ERR_DISABLED, 'l10n disabled', !$this->context->query_option('l10n.enabled', false)); + $iso_codes = $this->request->query_array('l10n'); + $iso_codes = array_filter($iso_codes); + $response['l10n'] = $this->context->get_l10n($iso_codes); + } + + if ($this->request->query('search', false)) { + Util::json_fail(Util::ERR_DISABLED, 'search disabled', !$this->context->query_option('search.enabled', false)); + $href = $this->request->query('search.href'); + $pattern = $this->request->query('search.pattern'); + $ignorecase = $this->request->query_boolean('search.ignorecase', false); + $search = new Search($this->context); + $response['search'] = $search->get_items($href, $pattern, $ignorecase); + } + + if ($this->request->query('thumbs', false)) { + Util::json_fail(Util::ERR_DISABLED, 'thumbnails disabled', !$this->context->query_option('thumbnails.enabled', false)); + Util::json_fail(Util::ERR_UNSUPPORTED, 'thumbnails not supported', !$this->setup->get('HAS_PHP_JPEG')); + $thumbs = $this->request->query_array('thumbs'); + $response['thumbs'] = $this->context->get_thumbs($thumbs); + } + + Util::json_exit($response); + } + + private function on_login() { + $pass = $this->request->query('pass'); + Util::json_exit(['asAdmin' => $this->context->login_admin($pass)]); + } + + private function on_logout() { + Util::json_exit(['asAdmin' => $this->context->logout_admin()]); + } +} diff --git a/traces/_h5ai/private/php/core/class-context.php b/traces/_h5ai/private/php/core/class-context.php new file mode 100644 index 0000000..5484f8f --- /dev/null +++ b/traces/_h5ai/private/php/core/class-context.php @@ -0,0 +1,294 @@ +session = $session; + $this->request = $request; + $this->setup = $setup; + + $this->options = Json::load($this->setup->get('CONF_PATH') . '/options.json'); + + $this->passhash = $this->query_option('passhash', ''); + $this->options['hasCustomPasshash'] = strcasecmp($this->passhash, Context::$DEFAULT_PASSHASH) !== 0; + unset($this->options['passhash']); + } + + public function get_session() { + return $this->session; + } + + public function get_request() { + return $this->request; + } + + public function get_setup() { + return $this->setup; + } + + public function get_options() { + return $this->options; + } + + public function query_option($keypath = '', $default = null) { + return Util::array_query($this->options, $keypath, $default); + } + + public function get_types() { + return Json::load($this->setup->get('CONF_PATH') . '/types.json'); + } + + public function login_admin($pass) { + $this->session->set(Context::$AS_ADMIN_SESSION_KEY, strcasecmp(hash('sha512', $pass), $this->passhash) === 0); + return $this->session->get(Context::$AS_ADMIN_SESSION_KEY); + } + + public function logout_admin() { + $this->session->set(Context::$AS_ADMIN_SESSION_KEY, false); + return $this->session->get(Context::$AS_ADMIN_SESSION_KEY); + } + + public function is_admin() { + return $this->session->get(Context::$AS_ADMIN_SESSION_KEY); + } + + public function is_api_request() { + return strtolower($this->setup->get('REQUEST_METHOD')) === 'post'; + } + + public function is_info_request() { + return Util::starts_with($this->setup->get('REQUEST_HREF') . '/', $this->setup->get('PUBLIC_HREF')); + } + + public function is_text_browser() { + return preg_match('/curl|links|lynx|w3m/i', $this->setup->get('HTTP_USER_AGENT')) === 1; + } + + public function is_fallback_mode() { + return $this->query_option('view.fallbackMode', false) || $this->is_text_browser(); + } + + public function to_href($path, $trailing_slash = true) { + $rel_path = substr($path, strlen($this->setup->get('ROOT_PATH'))); + $parts = explode('/', $rel_path); + $encoded_parts = []; + foreach ($parts as $part) { + if ($part != '') { + $encoded_parts[] = rawurlencode($part); + } + } + + return Util::normalize_path($this->setup->get('ROOT_HREF') . implode('/', $encoded_parts), $trailing_slash); + } + + public function to_path($href) { + $rel_href = substr($href, strlen($this->setup->get('ROOT_HREF'))); + return Util::normalize_path($this->setup->get('ROOT_PATH') . '/' . rawurldecode($rel_href)); + } + + public function is_hidden($name) { + // always hide + if ($name === '.' || $name === '..') { + return true; + } + + foreach ($this->query_option('view.hidden', []) as $re) { + $re = Util::wrap_pattern($re); + if (preg_match($re, $name)) { + return true; + } + } + + return false; + } + + public function read_dir($path) { + $names = []; + if (is_dir($path)) { + foreach (scandir($path) as $name) { + if ( + $this->is_hidden($name) + || $this->is_hidden($this->to_href($path) . $name) + || (!is_readable($path . '/' . $name) && $this->query_option('view.hideIf403', false)) + ) { + continue; + } + $names[] = $name; + } + } + return $names; + } + + public function is_managed_href($href) { + return $this->is_managed_path($this->to_path($href)); + } + + public function is_managed_path($path) { + if (!is_dir($path) || strpos($path, '../') !== false || strpos($path, '/..') !== false || $path === '..') { + return false; + } + + if (strpos($path, $this->setup->get('PUBLIC_PATH')) === 0) { + return false; + } + + if (strpos($path, $this->setup->get('PRIVATE_PATH')) === 0) { + return false; + } + + foreach ($this->query_option('view.unmanaged', []) as $name) { + if (file_exists($path . '/' . $name)) { + return false; + } + } + + while ($path !== $this->setup->get('ROOT_PATH')) { + if (@is_dir($path . '/_h5ai/private/conf')) { + return false; + } + $parent_path = Util::normalize_path(dirname($path)); + if ($parent_path === $path) { + return false; + } + $path = $parent_path; + } + return true; + } + + public function get_current_path() { + $current_href = Util::normalize_path($this->setup->get('REQUEST_HREF'), true); + $current_path = $this->to_path($current_href); + + if (!is_dir($current_path)) { + $current_path = Util::normalize_path(dirname($current_path), false); + } + + return $current_path; + } + + public function get_items($href, $what) { + if (!$this->is_managed_href($href)) { + return []; + } + + $cache = []; + $folder = Item::get($this, $this->to_path($href), $cache); + + // add content of subfolders + if ($what >= 2 && $folder !== null) { + foreach ($folder->get_content($cache) as $item) { + $item->get_content($cache); + } + $folder = $folder->get_parent($cache); + } + + // add content of this folder and all parent folders + while ($what >= 1 && $folder !== null) { + $folder->get_content($cache); + $folder = $folder->get_parent($cache); + } + + uasort($cache, ['Item', 'cmp']); + $result = []; + foreach ($cache as $p => $item) { + $result[] = $item->to_json_object(); + } + + return $result; + } + + public function get_langs() { + $langs = []; + $l10n_path = $this->setup->get('CONF_PATH') . '/l10n'; + if (is_dir($l10n_path)) { + if ($dir = opendir($l10n_path)) { + while (($file = readdir($dir)) !== false) { + if (Util::ends_with($file, '.json')) { + $translations = Json::load($l10n_path . '/' . $file); + $langs[basename($file, '.json')] = $translations['lang']; + } + } + closedir($dir); + } + } + ksort($langs); + return $langs; + } + + public function get_l10n($iso_codes) { + $results = []; + + foreach ($iso_codes as $iso_code) { + $file = $this->setup->get('CONF_PATH') . '/l10n/' . $iso_code . '.json'; + $results[$iso_code] = Json::load($file); + $results[$iso_code]['isoCode'] = $iso_code; + } + + return $results; + } + + public function get_thumbs($requests) { + $hrefs = []; + + foreach ($requests as $req) { + $thumb = new Thumb($this); + $hrefs[] = $thumb->thumb($req['type'], $req['href'], $req['width'], $req['height']); + } + + return $hrefs; + } + + private function prefix_x_head_href($href) { + if (preg_match('@^(https?://|/)@i', $href)) { + return $href; + } + + return $this->setup->get('PUBLIC_HREF') . 'ext/' . $href; + } + + private function get_fonts_html() { + $fonts = $this->query_option('view.fonts', []); + $fonts_mono = $this->query_option('view.fontsMono', []); + + $html = ''; + + return $html; + } + + public function get_x_head_html() { + $scripts = $this->query_option('resources.scripts', []); + $styles = $this->query_option('resources.styles', []); + + $html = ''; + + foreach ($styles as $href) { + $html .= ''; + } + + foreach ($scripts as $href) { + $html .= ''; + } + + $html .= $this->get_fonts_html(); + + return $html; + } +} diff --git a/traces/_h5ai/private/php/core/class-fallback.php b/traces/_h5ai/private/php/core/class-fallback.php new file mode 100644 index 0000000..7bd317f --- /dev/null +++ b/traces/_h5ai/private/php/core/class-fallback.php @@ -0,0 +1,54 @@ +context = $context; + } + + public function get_html($path = null) { + if (!$path) { + $path = $this->context->get_current_path(); + } + $fallback_images_href = $this->context->get_setup()->get('PUBLIC_HREF') . 'images/fallback/'; + + $cache = []; + $folder = Item::get($this->context, $path, $cache); + $items = $folder->get_content($cache); + uasort($items, ['Item', 'cmp']); + + $html = ''; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + + if ($folder->get_parent($cache)) { + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + foreach ($items as $item) { + $type = $item->is_folder ? 'folder' : 'file'; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + $html .= '
NameLast modifiedSize
folder-parentParent Directory
' . $type . '' . basename($item->path) . '' . date('Y-m-d H:i', $item->date) . '' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . '
'; + + return $html; + } +} diff --git a/traces/_h5ai/private/php/core/class-filesize.php b/traces/_h5ai/private/php/core/class-filesize.php new file mode 100644 index 0000000..477f9e2 --- /dev/null +++ b/traces/_h5ai/private/php/core/class-filesize.php @@ -0,0 +1,96 @@ +size($path, $withFoldersize, $withDu); + } + + public static function getCachedSize($path, $withFoldersize, $withDu) { + if (array_key_exists($path, Filesize::$cache)) { + return Filesize::$cache[$path]; + } + + $size = Filesize::getSize($path, $withFoldersize, $withDu); + + Filesize::$cache[$path] = $size; + return $size; + } + + + private function __construct() {} + + private function read_dir($path) { + $paths = []; + if (is_dir($path)) { + foreach (scandir($path) as $name) { + if ($name !== '.' && $name !== '..') { + $paths[] = $path . '/' . $name; + } + } + } + return $paths; + } + + private function php_filesize($path, $recursive = false) { + // if (PHP_INT_SIZE < 8) { + // } + $size = @filesize($path); + + if (!is_dir($path) || !$recursive) { + return $size; + } + + foreach ($this->read_dir($path) as $p) { + $size += $this->php_filesize($p, true); + } + return $size; + } + + + private function exec($cmdv) { + $cmd = implode(' ', array_map('escapeshellarg', $cmdv)); + $lines = []; + $rc = null; + exec($cmd, $lines, $rc); + return $lines; + } + + private function exec_du_all($paths) { + $cmdv = array_merge(['du', '-sbL'], $paths); + $lines = $this->exec($cmdv); + + $sizes = []; + foreach ($lines as $line) { + $parts = preg_split('/[\s]+/', $line, 2); + $size = intval($parts[0], 10); + $path = $parts[1]; + $sizes[$path] = $size; + } + return $sizes; + } + + private function exec_du($path) { + $sizes = $this->exec_du_all([$path]); + return $sizes[$path]; + } + + + private function size($path, $withFoldersize = false, $withDu = false) { + if (is_file($path)) { + return $this->php_filesize($path); + } + + if (is_dir($path) && $withFoldersize) { + if ($withDu) { + return $this->exec_du($path); + } + + return $this->php_filesize($path, true); + } + + return null; + } +} diff --git a/traces/_h5ai/private/php/core/class-item.php b/traces/_h5ai/private/php/core/class-item.php new file mode 100644 index 0000000..2b9ce34 --- /dev/null +++ b/traces/_h5ai/private/php/core/class-item.php @@ -0,0 +1,91 @@ +is_folder && !$item2->is_folder) { + return -1; + } + if (!$item1->is_folder && $item2->is_folder) { + return 1; + } + + return strcasecmp($item1->path, $item2->path); + } + + public static function get($context, $path, &$cache) { + if (!Util::starts_with($path, $context->get_setup()->get('ROOT_PATH'))) { + return null; + } + + if (is_array($cache) && array_key_exists($path, $cache)) { + return $cache[$path]; + } + + $item = new Item($context, $path); + + if (is_array($cache)) { + $cache[$path] = $item; + } + return $item; + } + + public $context; + public $path; + public $href; + public $date; + public $size; + public $is_folder; + public $is_content_fetched; + + private function __construct($context, $path) { + $this->context = $context; + + $this->path = Util::normalize_path($path, false); + $this->is_folder = is_dir($this->path); + $this->href = $context->to_href($this->path, $this->is_folder); + $this->date = @filemtime($this->path); + $this->size = Util::filesize($context, $this->path); + $this->is_content_fetched = false; + } + + public function to_json_object() { + $obj = [ + 'href' => $this->href, + 'time' => $this->date * 1000, // seconds (PHP) to milliseconds (JavaScript) + 'size' => $this->size + ]; + + if ($this->is_folder) { + $obj['managed'] = $this->context->is_managed_href($this->href); + $obj['fetched'] = $this->is_content_fetched; + } + + return $obj; + } + + public function get_parent(&$cache) { + $parent_path = Util::normalize_path(dirname($this->path), false); + if ($parent_path !== $this->path && Util::starts_with($parent_path, $this->context->get_setup()->get('ROOT_PATH'))) { + return Item::get($this->context, $parent_path, $cache); + } + return null; + } + + public function get_content(&$cache) { + $items = []; + + if (!$this->context->is_managed_href($this->href)) { + return $items; + } + + $files = $this->context->read_dir($this->path); + foreach ($files as $file) { + $item = Item::get($this->context, $this->path . '/' . $file, $cache); + $items[$item->path] = $item; + } + + $this->is_content_fetched = true; + + return $items; + } +} diff --git a/traces/_h5ai/private/php/core/class-json.php b/traces/_h5ai/private/php/core/class-json.php new file mode 100644 index 0000000..f662b9f --- /dev/null +++ b/traces/_h5ai/private/php/core/class-json.php @@ -0,0 +1,65 @@ +params = $data !== null ? $data : $params; + } + + public function query($keypath = '', $default = Util::NO_DEFAULT) { + $value = Util::array_query($this->params, $keypath, Util::NO_DEFAULT); + + if ($value === Util::NO_DEFAULT) { + Util::json_fail(Util::ERR_MISSING_PARAM, 'parameter \'' . $keypath . '\' is missing', $default === Util::NO_DEFAULT); + return $default; + } + + return $value; + } + + public function query_boolean($keypath = '', $default = Util::NO_DEFAULT) { + $value = $this->query($keypath, $default); + return filter_var($value, FILTER_VALIDATE_BOOLEAN); + } + + public function query_numeric($keypath = '', $default = Util::NO_DEFAULT) { + $value = $this->query($keypath, $default); + Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is not numeric', !is_numeric($value)); + return intval($value, 10); + } + + public function query_array($keypath = '', $default = Util::NO_DEFAULT) { + $value = $this->query($keypath, $default); + Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is no array', !is_array($value)); + return $value; + } +} diff --git a/traces/_h5ai/private/php/core/class-session.php b/traces/_h5ai/private/php/core/class-session.php new file mode 100644 index 0000000..630d78f --- /dev/null +++ b/traces/_h5ai/private/php/core/class-session.php @@ -0,0 +1,20 @@ +store = &$store; + } + + public function set($key, $value) { + $key = Session::$KEY_PREFIX . $key; + $this->store[$key] = $value; + } + + public function get($key, $default = null) { + $key = Session::$KEY_PREFIX . $key; + return array_key_exists($key, $this->store) ? $this->store[$key] : $default; + } +} diff --git a/traces/_h5ai/private/php/core/class-setup.php b/traces/_h5ai/private/php/core/class-setup.php new file mode 100644 index 0000000..d0c3fb2 --- /dev/null +++ b/traces/_h5ai/private/php/core/class-setup.php @@ -0,0 +1,185 @@ +store = []; + $this->refresh = $refresh; + + $this->add_globals_and_envs(); + $this->add_php_checks(); + $this->add_app_metadata(); + $this->add_server_metadata_and_check(); + $this->add_paths(); + $this->add_sys_cmd_checks(); + } + + private function set($key, $value) { + if (array_key_exists($key, $this->store)) { + Logger::log('setup key already taken', [ + 'key' => $key, + 'value' => $value, + 'found' => $this->store[$key] + ]); + exit; + } + if (!is_string($value) && !is_bool($value)) { + Logger::log('setup value neither string nor boolean', [ + 'key' => $key, + 'value' => $value + ]); + exit; + } + + $this->store[$key] = $value; + } + + public function get($key) { + if (!array_key_exists($key, $this->store)) { + Logger::log('setup key not found', ['key' => $key]); + exit; + } + + return $this->store[$key]; + } + + private function add_globals_and_envs() { + $this->set('PHP_VERSION', PHP_VERSION); + $this->set('MIN_PHP_VERSION', MIN_PHP_VERSION); + $this->set('PHP_ARCH', (PHP_INT_SIZE * 8) . '-bit'); + + $this->set('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']); + $this->set('REQUEST_HREF', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); + $this->set('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']); + $this->set('SERVER_SOFTWARE', $_SERVER['SERVER_SOFTWARE']); + $this->set('HTTP_USER_AGENT', $_SERVER['HTTP_USER_AGENT']); + } + + private function add_php_checks() { + $this->set('HAS_PHP_EXIF', function_exists('exif_thumbnail')); + + $has_php_jpeg = false; + if (function_exists('gd_info')) { + $infos = gd_info(); + $has_php_jpeg = array_key_exists('JPEG Support', $infos) && $infos['JPEG Support']; + } + $this->set('HAS_PHP_JPEG', $has_php_jpeg); + } + + private function add_app_metadata() { + $this->set('NAME', 'h5ai'); + $this->set('VERSION', H5AI_VERSION); + $this->set('FILE_PREFIX', '_h5ai'); + } + + private function add_server_metadata_and_check() { + $server_software = $this->get('SERVER_SOFTWARE'); + $server_name = null; + $server_version = null; + + if ($server_software && preg_match('#^(.*?)(?:/(.*?))?(?: |$)#', strtolower($server_software), $matches)) { + $server_name = $matches[1]; + $server_version = count($matches) > 2 ? $matches[2] : ''; + } + + $this->set('SERVER_NAME', $server_name); + $this->set('SERVER_VERSION', $server_version); + $this->set('HAS_SERVER', in_array($server_name, ['apache', 'lighttpd', 'nginx', 'cherokee'])); + } + + private function add_paths() { + $script_name = $this->get('SCRIPT_NAME'); + if ($this->get('SERVER_NAME') === 'lighttpd') { + $script_name = preg_replace('#^.*?//#', '/', $script_name); + } + + $this->set('H5AI_HREF', Util::normalize_path(dirname(dirname($script_name)), true)); + $this->set('H5AI_PATH', Util::normalize_path(dirname(dirname(dirname(dirname(__FILE__)))), false)); + + $this->set('ROOT_HREF', Util::normalize_path(dirname($this->get('H5AI_HREF')), true)); + $this->set('ROOT_PATH', Util::normalize_path(dirname($this->get('H5AI_PATH')), false)); + + $this->set('PUBLIC_HREF', Util::normalize_path($this->get('H5AI_HREF') . '/public/', true)); + $this->set('PUBLIC_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/public/', false)); + + $this->set('INDEX_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/index.php', false)); + $this->set('CACHE_PUB_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/cache', true)); + $this->set('CACHE_PUB_PATH', Util::normalize_path($this->get('PUBLIC_PATH') . '/cache', false)); + $this->set('HAS_WRITABLE_CACHE_PUB', @is_writable($this->get('CACHE_PUB_PATH'))); + + $this->set('PRIVATE_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/private', false)); + $this->set('CONF_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/conf', false)); + $this->set('CACHE_PRV_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/cache', false)); + $this->set('HAS_WRITABLE_CACHE_PRV', @is_writable($this->get('CACHE_PRV_PATH'))); + } + + private function add_sys_cmd_checks() { + $cmds_cache_path = Util::normalize_path($this->get('CACHE_PRV_PATH') . '/cmds.json', false); + + $cmds = Json::load($cmds_cache_path); + if (sizeof($cmds) === 0 || $this->refresh) { + $cmds['command'] = Util::exec_0('command -v command'); + $cmds['which'] = Util::exec_0('which which') || Util::exec_0('which which.exe'); + + $cmd = false; + if ($cmds['command']) { + $cmd = 'command -v'; + } elseif ($cmds['which']) { + $cmd = 'which'; + } + + foreach (['avconv', 'convert', 'du', 'ffmpeg', 'gm', 'tar', 'zip'] as $c) { + $cmds[$c] = ($cmd !== false) && (Util::exec_0($cmd . ' ' . $c) || Util::exec_0($cmd . ' ' . $c . '.exe')); + } + + Json::save($cmds_cache_path, $cmds); + } + foreach ($cmds as $c => $has) { + $this->set('HAS_CMD_' . strtoupper($c), $has); + } + } + + public function to_jsono($as_admin = false) { + $keys = [ + 'PUBLIC_HREF', + 'ROOT_HREF' + ]; + + if ($as_admin) { + $keys = array_merge($keys, [ + 'VERSION', + + 'PHP_VERSION', + 'MIN_PHP_VERSION', + 'PHP_ARCH', + 'HAS_PHP_EXIF', + 'HAS_PHP_JPEG', + + 'SERVER_NAME', + 'SERVER_VERSION', + 'HAS_SERVER', + + 'INDEX_HREF', + + 'HAS_WRITABLE_CACHE_PUB', + 'HAS_WRITABLE_CACHE_PRV', + + 'HAS_CMD_AVCONV', + 'HAS_CMD_CONVERT', + 'HAS_CMD_DU', + 'HAS_CMD_FFMPEG', + 'HAS_CMD_GM', + 'HAS_CMD_TAR', + 'HAS_CMD_ZIP' + ]); + } + + $jsono = ['AS_ADMIN' => $as_admin]; + foreach ($keys as $key) { + $jsono[$key] = $this->get($key); + } + return $jsono; + } +} diff --git a/traces/_h5ai/private/php/core/class-theme.php b/traces/_h5ai/private/php/core/class-theme.php new file mode 100644 index 0000000..8fcaddd --- /dev/null +++ b/traces/_h5ai/private/php/core/class-theme.php @@ -0,0 +1,32 @@ +context = $context; + } + + public function get_icons() { + $public_path = $this->context->get_setup()->get('PUBLIC_PATH'); + $theme = $this->context->query_option('view.theme', '-NONE-'); + $theme_path = $public_path . '/images/themes/' . $theme; + + $icons = []; + + if (is_dir($theme_path)) { + if ($dir = opendir($theme_path)) { + while (($name = readdir($dir)) !== false) { + $path_parts = pathinfo($name); + if (in_array(@$path_parts['extension'], Theme::$EXTENSIONS)) { + $icons[$path_parts['filename']] = $theme . '/' . $name; + } + } + closedir($dir); + } + } + + return $icons; + } +} diff --git a/traces/_h5ai/private/php/core/class-util.php b/traces/_h5ai/private/php/core/class-util.php new file mode 100644 index 0000000..ce6c802 --- /dev/null +++ b/traces/_h5ai/private/php/core/class-util.php @@ -0,0 +1,89 @@ + $err, 'msg' => $msg]); + } + } + + public static function array_query($array, $keypath = '', $default = Util::NO_DEFAULT) { + $value = $array; + + $keys = array_filter(explode('.', $keypath)); + foreach ($keys as $key) { + if (!is_array($value) || !array_key_exists($key, $value)) { + return $default; + } + $value = $value[$key]; + } + + return $value; + } + + public static function starts_with($sequence, $head) { + return substr($sequence, 0, strlen($head)) === $head; + } + + public static function ends_with($sequence, $tail) { + $len = strlen($tail); + return $len === 0 ? true : substr($sequence, -$len) === $tail; + } + + public static function wrap_pattern($pattern) { + return Util::RE_DELIMITER . str_replace(Util::RE_DELIMITER, '\\' . Util::RE_DELIMITER, $pattern) . Util::RE_DELIMITER; + } + + public static function passthru_cmd($cmd) { + $rc = null; + passthru($cmd, $rc); + return $rc; + } + + public static function exec_cmdv($cmdv) { + if (!is_array($cmdv)) { + $cmdv = func_get_args(); + } + $cmd = implode(' ', array_map('escapeshellarg', $cmdv)); + + $lines = []; + $rc = null; + exec($cmd, $lines, $rc); + return implode("\n", $lines); + } + + public static function exec_0($cmd) { + $lines = []; + $rc = null; + try { + @exec($cmd, $lines, $rc); + return $rc === 0; + } catch (Exception $e) {} + return false; + } + + public static function filesize($context, $path) { + $withFoldersize = $context->query_option('foldersize.enabled', false); + $withDu = $context->get_setup()->get('HAS_CMD_DU') && $context->query_option('foldersize.type', null) === 'shell-du'; + return Filesize::getCachedSize($path, $withFoldersize, $withDu); + } +} diff --git a/traces/_h5ai/private/php/ext/class-archive.php b/traces/_h5ai/private/php/ext/class-archive.php new file mode 100644 index 0000000..fec07de --- /dev/null +++ b/traces/_h5ai/private/php/ext/class-archive.php @@ -0,0 +1,183 @@ +context = $context; + } + + public function output($type, $base_href, $hrefs) { + $this->base_path = $this->context->to_path($base_href); + if (!$this->context->is_managed_path($this->base_path)) { + return false; + } + + $this->dirs = []; + $this->files = []; + + $this->add_hrefs($hrefs); + + if (count($this->dirs) === 0 && count($this->files) === 0) { + if ($type === 'php-tar') { + $this->add_dir($this->base_path, '/'); + } else { + $this->add_dir($this->base_path, '.'); + } + } + + if ($type === 'php-tar') { + return $this->php_tar($this->dirs, $this->files); + } elseif ($type === 'shell-tar') { + return $this->shell_cmd(Archive::$TAR_PASSTHRU_CMD); + } elseif ($type === 'shell-zip') { + return $this->shell_cmd(Archive::$ZIP_PASSTHRU_CMD); + } + return false; + } + + private function shell_cmd($cmd) { + $cmd = str_replace('[ROOTDIR]', escapeshellarg($this->base_path), $cmd); + $cmd = str_replace('[DIRS]', count($this->dirs) ? implode(' ', array_map('escapeshellarg', $this->dirs)) : '', $cmd); + $cmd = str_replace('[FILES]', count($this->files) ? implode(' ', array_map('escapeshellarg', $this->files)) : '', $cmd); + try { + Util::passthru_cmd($cmd); + } catch (Exeption $err) { + return false; + } + return true; + } + + private function php_tar($dirs, $files) { + $filesizes = []; + $total_size = 512 * count($dirs); + foreach (array_keys($files) as $real_file) { + $size = filesize($real_file); + + $filesizes[$real_file] = $size; + $total_size += 512 + $size; + if ($size % 512 != 0) { + $total_size += 512 - ($size % 512); + } + } + + header('Content-Length: ' . $total_size); + + foreach ($dirs as $real_dir => $archived_dir) { + echo $this->php_tar_header($archived_dir, 0, @filemtime($real_dir . DIRECTORY_SEPARATOR . '.'), 5); + } + + foreach ($files as $real_file => $archived_file) { + $size = $filesizes[$real_file]; + + echo $this->php_tar_header($archived_file, $size, @filemtime($real_file), 0); + $this->print_file($real_file); + + if ($size % 512 != 0) { + echo str_repeat(Archive::NULL_BYTE, 512 - ($size % 512)); + } + } + + return true; + } + + private function php_tar_header($filename, $size, $mtime, $type) { + $name = substr(basename($filename), -99); + $prefix = substr(Util::normalize_path(dirname($filename)), -154); + if ($prefix === '.') { + $prefix = ''; + } + + $header = + str_pad($name, 100, Archive::NULL_BYTE) // filename [100] + . '0000755' . Archive::NULL_BYTE // file mode [8] + . '0000000' . Archive::NULL_BYTE // uid [8] + . '0000000' . Archive::NULL_BYTE // gid [8] + . str_pad(decoct($size), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file size [12] + . str_pad(decoct($mtime), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file modification time [12] + . ' ' // checksum [8] + . str_pad($type, 1) // file type [1] + . str_repeat(Archive::NULL_BYTE, 100) // linkname [100] + . 'ustar' . Archive::NULL_BYTE // magic [6] + . '00' // version [2] + . str_repeat(Archive::NULL_BYTE, 80) // uname, gname, defmajor, devminor [32 + 32 + 8 + 8] + . str_pad($prefix, 155, Archive::NULL_BYTE) // filename [155] + . str_repeat(Archive::NULL_BYTE, 12); // fill [12] + assert(strlen($header) === 512); + + // checksum + $checksum = array_sum(array_map('ord', str_split($header))); + $checksum = str_pad(decoct($checksum), 6, '0', STR_PAD_LEFT) . Archive::NULL_BYTE . ' '; + $header = substr_replace($header, $checksum, 148, 8); + + return $header; + } + + private function print_file($file) { + // Send file content in segments to not hit PHP's memory limit (default: 128M) + if ($fd = fopen($file, 'rb')) { + while (!feof($fd)) { + print fread($fd, Archive::$SEGMENT_SIZE); + @ob_flush(); + @flush(); + } + fclose($fd); + } + } + + private function add_hrefs($hrefs) { + foreach ($hrefs as $href) { + if (trim($href) === '') { + continue; + } + + $d = Util::normalize_path(dirname($href), true); + $n = basename($href); + + if ($this->context->is_managed_href($d) && !$this->context->is_hidden($n)) { + + $real_file = $this->context->to_path($href); + $archived_file = preg_replace('!^' . preg_quote(Util::normalize_path($this->base_path, true)) . '!', '', $real_file); + + if (is_dir($real_file)) { + $this->add_dir($real_file, $archived_file); + } else { + $this->add_file($real_file, $archived_file); + } + } + } + } + + private function add_file($real_file, $archived_file) { + if (is_readable($real_file)) { + $this->files[$real_file] = $archived_file; + } + } + + private function add_dir($real_dir, $archived_dir) { + if ($this->context->is_managed_path($real_dir)) { + $this->dirs[$real_dir] = $archived_dir; + + $files = $this->context->read_dir($real_dir); + foreach ($files as $file) { + $real_file = $real_dir . '/' . $file; + $archived_file = $archived_dir . '/' . $file; + + if (is_dir($real_file)) { + $this->add_dir($real_file, $archived_file); + } else { + $this->add_file($real_file, $archived_file); + } + } + } + } +} diff --git a/traces/_h5ai/private/php/ext/class-custom.php b/traces/_h5ai/private/php/ext/class-custom.php new file mode 100644 index 0000000..ab1628e --- /dev/null +++ b/traces/_h5ai/private/php/ext/class-custom.php @@ -0,0 +1,65 @@ +context = $context; + } + + private function read_custom_file($path, $name, &$content, &$type) { + $file_prefix = $this->context->get_setup()->get('FILE_PREFIX'); + + foreach (Custom::$EXTENSIONS as $ext) { + $file = $path . '/' . $file_prefix . '.' . $name . '.' . $ext; + if (is_readable($file)) { + $content = file_get_contents($file); + $type = $ext; + return; + } + } + } + + public function get_customizations($href) { + if (!$this->context->query_option('custom.enabled', false)) { + return [ + 'header' => ['content' => null, 'type' => null], + 'footer' => ['content' => null, 'type' => null] + ]; + } + + $root_path = $this->context->get_setup()->get('FILE_PREFIX'); + $path = $this->context->to_path($href); + + $header = null; + $header_type = null; + $footer = null; + $footer_type = null; + + $this->read_custom_file($path, 'header', $header, $header_type); + $this->read_custom_file($path, 'footer', $footer, $footer_type); + + while ($header === null || $footer === null) { + if ($header === null) { + $this->read_custom_file($path, 'headers', $header, $header_type); + } + if ($footer === null) { + $this->read_custom_file($path, 'footers', $footer, $footer_type); + } + if ($path === $root_path) { + break; + } + $parent_path = Util::normalize_path(dirname($path)); + if ($parent_path === $path) { + break; + } + $path = $parent_path; + } + + return [ + 'header' => ['content' => $header, 'type' => $header_type], + 'footer' => ['content' => $footer, 'type' => $footer_type] + ]; + } +} diff --git a/traces/_h5ai/private/php/ext/class-search.php b/traces/_h5ai/private/php/ext/class-search.php new file mode 100644 index 0000000..124954d --- /dev/null +++ b/traces/_h5ai/private/php/ext/class-search.php @@ -0,0 +1,40 @@ +context = $context; + } + + public function get_paths($root, $pattern = null, $ignorecase = false) { + $paths = []; + if ($pattern && $this->context->is_managed_path($root)) { + $re = Util::wrap_pattern($pattern); + if ($ignorecase) { + $re .= 'i'; + } + $names = $this->context->read_dir($root); + foreach ($names as $name) { + $path = $root . '/' . $name; + if (preg_match($re, @basename($path))) { + $paths[] = $path; + } + if (@is_dir($path)) { + $paths = array_merge($paths, $this->get_paths($path, $pattern, $ignorecase)); + } + } + } + return $paths; + } + + public function get_items($href, $pattern = null, $ignorecase = false) { + $cache = []; + $root = $this->context->to_path($href); + $paths = $this->get_paths($root, $pattern, $ignorecase); + $items = array_map(function ($path) { + return Item::get($this->context, $path, $cache)->to_json_object(); + }, $paths); + return $items; + } +} diff --git a/traces/_h5ai/private/php/ext/class-thumb.php b/traces/_h5ai/private/php/ext/class-thumb.php new file mode 100644 index 0000000..d52d3e8 --- /dev/null +++ b/traces/_h5ai/private/php/ext/class-thumb.php @@ -0,0 +1,253 @@ +context = $context; + $this->setup = $context->get_setup(); + $this->thumbs_path = $this->setup->get('CACHE_PUB_PATH') . '/' . Thumb::$THUMB_CACHE; + $this->thumbs_href = $this->setup->get('CACHE_PUB_HREF') . Thumb::$THUMB_CACHE; + + if (!is_dir($this->thumbs_path)) { + @mkdir($this->thumbs_path, 0755, true); + } + } + + public function thumb($type, $source_href, $width, $height) { + $source_path = $this->context->to_path($source_href); + if (!file_exists($source_path) || Util::starts_with($source_path, $this->setup->get('CACHE_PUB_PATH'))) { + return null; + } + + $capture_path = $source_path; + if ($type === 'img') { + $capture_path = $source_path; + } elseif ($type === 'mov') { + if ($this->setup->get('HAS_CMD_AVCONV')) { + $capture_path = $this->capture(Thumb::$AVCONV_CMDV, $source_path); + } elseif ($this->setup->get('HAS_CMD_FFMPEG')) { + $capture_path = $this->capture(Thumb::$FFMPEG_CMDV, $source_path); + } + } elseif ($type === 'doc') { + if ($this->setup->get('HAS_CMD_CONVERT')) { + $capture_path = $this->capture(Thumb::$CONVERT_CMDV, $source_path); + } elseif ($this->setup->get('HAS_CMD_GM')) { + $capture_path = $this->capture(Thumb::$GM_CONVERT_CMDV, $source_path); + } + } + + return $this->thumb_href($capture_path, $width, $height); + } + + private function thumb_href($source_path, $width, $height) { + if (!file_exists($source_path)) { + return null; + } + + $name = 'thumb-' . sha1($source_path) . '-' . $width . 'x' . $height . '.jpg'; + $thumb_path = $this->thumbs_path . '/' . $name; + $thumb_href = $this->thumbs_href . '/' . $name; + + if (!file_exists($thumb_path) || filemtime($source_path) >= filemtime($thumb_path)) { + $image = new Image(); + + $et = false; + if ($this->setup->get('HAS_PHP_EXIF') && $this->context->query_option('thumbnails.exif', false) === true && $height != 0) { + $et = @exif_thumbnail($source_path); + } + if($et !== false) { + file_put_contents($thumb_path, $et); + $image->set_source($thumb_path); + $image->normalize_exif_orientation($source_path); + } else { + $image->set_source($source_path); + } + + $image->thumb($width, $height); + $image->save_dest_jpeg($thumb_path, 80); + } + + return file_exists($thumb_path) ? $thumb_href : null; + } + + private function capture($cmdv, $source_path) { + if (!file_exists($source_path)) { + return null; + } + + $capture_path = $this->thumbs_path . '/capture-' . sha1($source_path) . '.jpg'; + + if (!file_exists($capture_path) || filemtime($source_path) >= filemtime($capture_path)) { + foreach ($cmdv as &$arg) { + $arg = str_replace('[SRC]', $source_path, $arg); + $arg = str_replace('[DEST]', $capture_path, $arg); + } + + Util::exec_cmdv($cmdv); + } + + return file_exists($capture_path) ? $capture_path : null; + } +} + +class Image { + private $source_file; + private $source; + private $width; + private $height; + private $type; + private $dest; + + public function __construct($filename = null) { + $this->source_file = null; + $this->source = null; + $this->width = null; + $this->height = null; + $this->type = null; + + $this->dest = null; + + $this->set_source($filename); + } + + public function __destruct() { + $this->release_source(); + $this->release_dest(); + } + + public function set_source($filename) { + $this->release_source(); + $this->release_dest(); + + if (is_null($filename)) { + return; + } + + $this->source_file = $filename; + + list($this->width, $this->height, $this->type) = @getimagesize($this->source_file); + + if (!$this->width || !$this->height) { + $this->source_file = null; + $this->width = null; + $this->height = null; + $this->type = null; + return; + } + + $this->source = imagecreatefromstring(file_get_contents($this->source_file)); + } + + public function save_dest_jpeg($filename, $quality = 80) { + if (!is_null($this->dest)) { + @imagejpeg($this->dest, $filename, $quality); + @chmod($filename, 0775); + } + } + + public function release_dest() { + if (!is_null($this->dest)) { + @imagedestroy($this->dest); + $this->dest = null; + } + } + + public function release_source() { + if (!is_null($this->source)) { + @imagedestroy($this->source); + $this->source_file = null; + $this->source = null; + $this->width = null; + $this->height = null; + $this->type = null; + } + } + + public function thumb($width, $height) { + if (is_null($this->source)) { + return; + } + + $src_r = 1.0 * $this->width / $this->height; + + if ($height == 0) { + if ($src_r >= 1) { + $height = 1.0 * $width / $src_r; + } else { + $height = $width; + $width = 1.0 * $height * $src_r; + } + if ($width > $this->width) { + $width = $this->width; + $height = $this->height; + } + } + + $ratio = 1.0 * $width / $height; + + if ($src_r <= $ratio) { + $src_w = $this->width; + $src_h = $src_w / $ratio; + $src_x = 0; + } else { + $src_h = $this->height; + $src_w = $src_h * $ratio; + $src_x = 0.5 * ($this->width - $src_w); + } + + $width = intval($width); + $height = intval($height); + $src_x = intval($src_x); + $src_w = intval($src_w); + $src_h = intval($src_h); + + $this->dest = imagecreatetruecolor($width, $height); + $icol = imagecolorallocate($this->dest, 255, 255, 255); + imagefill($this->dest, 0, 0, $icol); + imagecopyresampled($this->dest, $this->source, 0, 0, $src_x, 0, $width, $height, $src_w, $src_h); + } + + public function rotate($angle) { + if (is_null($this->source) || ($angle !== 90 && $angle !== 180 && $angle !== 270)) { + return; + } + + $this->source = imagerotate($this->source, $angle, 0); + if ( $angle === 90 || $angle === 270 ) { + list($this->width, $this->height) = [$this->height, $this->width]; + } + } + + public function normalize_exif_orientation($exif_source_file = null) { + if (is_null($this->source) || !function_exists('exif_read_data')) { + return; + } + + if ($exif_source_file === null) { + $exif_source_file = $this->source_file; + } + + $exif = exif_read_data($exif_source_file); + switch (@$exif['Orientation']) { + case 3: + $this->rotate(180); + break; + case 6: + $this->rotate(270); + break; + case 8: + $this->rotate(90); + break; + } + } +} diff --git a/traces/_h5ai/private/php/pages/index.php b/traces/_h5ai/private/php/pages/index.php new file mode 100644 index 0000000..7885a87 --- /dev/null +++ b/traces/_h5ai/private/php/pages/index.php @@ -0,0 +1,2 @@ +index - powered by h5ai v0.29.2 (https://larsjung.de/h5ai/) +
Works best with JavaScript enabled!Works best in modern browsers!powered by h5ai
\ No newline at end of file diff --git a/traces/_h5ai/private/php/pages/info.php b/traces/_h5ai/private/php/pages/info.php new file mode 100644 index 0000000..59a8e08 --- /dev/null +++ b/traces/_h5ai/private/php/pages/info.php @@ -0,0 +1,2 @@ +h5ai info page - v0.29.2 +
Works best with JavaScript enabled!Works best in modern browsers!powered by h5ai
\ No newline at end of file diff --git a/traces/_h5ai/public/.htaccess b/traces/_h5ai/public/.htaccess new file mode 100644 index 0000000..3f14990 --- /dev/null +++ b/traces/_h5ai/public/.htaccess @@ -0,0 +1,13 @@ +## make this folder accessible + +# Apache < 2.3 + + Order allow,deny + Allow from all + Satisfy All + + +# Apache ≥ 2.3 + + Require all granted + diff --git a/traces/_h5ai/public/cache/README.md b/traces/_h5ai/public/cache/README.md new file mode 100644 index 0000000..fd2974c --- /dev/null +++ b/traces/_h5ai/public/cache/README.md @@ -0,0 +1,9 @@ +# Cache + +Public cache. + +This directory is used for server side caching. To use caching make this +directory writable for your webserver. + +There is no critical data in here. You can savely remove any content. This +will clear the cache. diff --git a/traces/_h5ai/public/css/styles.css b/traces/_h5ai/public/css/styles.css new file mode 100644 index 0000000..87bf906 --- /dev/null +++ b/traces/_h5ai/public/css/styles.css @@ -0,0 +1,2 @@ +/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */ +@charset "utf-8";/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}::-moz-selection{color:#fff;background:#ff4081;text-shadow:none}::selection{color:#fff;background:#ff4081;text-shadow:none}*:focus{outline:0}code,pre{font-family:"Ubuntu Mono","Monaco","Lucida Sans Typewriter","monospace";font-size:15px;font-weight:normal;color:rgba(0,0,0,0.87)}audio,canvas,iframe,img,svg,video{vertical-align:middle}textarea{resize:vertical}.hidden{display:none!important}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.raised{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}.popup{box-shadow:0 1px 20px 0 rgba(0,0,0,0.5)}.rounded{border-radius:2px}.clear-appearance{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none}.eased-transition{transition:all .2s ease-in-out}.flex-base{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}.flex-column{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:column}.flex-row{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row}.el-button{border-radius:2px;transition:all .2s ease-in-out;color:#fff;background:#42a5f5;cursor:pointer;text-decoration:none}.el-button:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}.el-input{border-radius:2px;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:#fff;border:0;outline:0;background:#fafafa;border:1px solid rgba(0,0,0,0.05)}#cm-overlay{position:fixed;left:0;top:0;right:0;bottom:0;overflow:hidden;z-index:200}#cm-overlay .cm-panel{box-shadow:0 1px 20px 0 rgba(0,0,0,0.5);border-radius:2px;display:block;position:absolute;left:100px;top:100px;color:rgba(0,0,0,0.87);background:#fff;z-index:10;overflow:auto;min-width:200px}#cm-overlay .cm-panel ul{margin:0;padding:0;list-style:none;text-align:left}#cm-overlay .cm-label{padding:8px 16px;white-space:nowrap;font-weight:bold}#cm-overlay .cm-entry{padding:8px 16px;white-space:nowrap;cursor:pointer}#cm-overlay .cm-entry:hover{color:#42a5f5;background:rgba(0,0,0,0.03)}#cm-overlay .cm-icon{position:relative;top:-2px}#cm-overlay .cm-icon img{width:20px;height:20px}#cm-overlay .cm-icon.no-icon{opacity:0}#cm-overlay .cm-text{margin:0 0 0 12px}#cm-overlay .cm-sep{height:1px;margin:8px 0;padding:0;border-top:1px solid rgba(0,0,0,0.08)}#crumbbar{overflow:hidden;height:48px;font-size:16px;padding:0 8px}#crumbbar a,#crumbbar a:active,#crumbbar a:visited{color:rgba(0,0,0,0.87);cursor:pointer;text-decoration:none}#crumbbar a.active,#crumbbar a:active.active,#crumbbar a:visited.active{font-weight:bold}#crumbbar a:hover,#crumbbar a:active:hover,#crumbbar a:visited:hover{color:#42a5f5}#crumbbar a:focus,#crumbbar a:active:focus,#crumbbar a:visited:focus{outline:0}#crumbbar .crumb{transition:all .2s ease-in-out;display:inline-block}#crumbbar .sep{width:24px;height:24px;padding:12px 0;line-height:48px;display:inline-block;vertical-align:top}#crumbbar .crumb:first-of-type .sep{width:0}#crumbbar .label{line-height:48px;display:inline-block;vertical-align:top;padding:0 8px}#crumbbar .hint{width:20px;height:20px;padding:16px 0 0 0;line-height:48px;display:inline-block;vertical-align:top;position:relative;top:-2px}#content-header,#content-footer{margin:16px;padding:8px;color:rgba(0,0,0,0.87)}#content-header a,#content-footer a,#content-header a:active,#content-footer a:active,#content-header a:visited,#content-footer a:visited{color:#42a5f5;text-decoration:none;cursor:pointer}#content-header a:hover,#content-footer a:hover,#content-header a:active:hover,#content-footer a:active:hover,#content-header a:visited:hover,#content-footer a:visited:hover{color:#212121}#content-header h1,#content-footer h1,#content-header h2,#content-footer h2,#content-header h3,#content-footer h3,#content-header h4,#content-footer h4,#content-header h5,#content-footer h5,#content-header h6,#content-footer h6,#content-header p,#content-footer p{margin:.1em 0}#filter input{display:none;border:0;font-size:16px;color:rgba(0,0,0,0.87);background:transparent;outline:0;width:160px;padding:0 12px 0 4px;line-height:48px;vertical-align:top}#filter.active input{display:inline-block}#filter.pending input{color:rgba(0,0,0,0.26)}#info{overflow:auto;flex:0 0 auto;order:99;padding:32px 32px 32px 48px;white-space:nowrap;overflow-x:hidden;width:240px}#info .icon{width:240px;height:180px}#info .icon img{border-radius:2px;display:block;overflow:hidden;margin:0 auto;width:180px;height:180px}#info .icon .thumb{width:240px}#info .block{border-top:1px solid rgba(0,0,0,0.05);border-bottom:1px solid rgba(0,0,0,0.05);margin:0 0 24px 0;padding:24px 0}#info .label{font-size:16px;margin-bottom:16px}#info .time,#info .size,#info .content{line-height:20px;height:20px}#info .qrcode{margin:0 auto;width:200px}#info .qrcode img{display:block}#pv-content-aud{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%}#pv-content-img{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%;background-color:#f8f8f8;background-image:-webkit-linear-gradient(45deg,#e8e8e8 25%,transparent 25%,transparent 75%,#e8e8e8 75%,#e8e8e8),-webkit-linear-gradient(45deg,#e8e8e8 25%,transparent 25%,transparent 75%,#e8e8e8 75%,#e8e8e8);background-size:60px 60px;background-position:0 0,30px 30px}#pv-content-img.loading{opacity:.5;margin-top:32px;width:240px;height:240px;border-radius:1000px;overflow:hidden}#pv-content-txt{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);box-sizing:border-box;max-width:960px;text-align:left;background:#fff;margin:0 auto;padding:8px;overflow:auto}#pv-content-txt a,#pv-content-txt a:active,#pv-content-txt a:visited{color:#2080ff;text-decoration:none;cursor:pointer}#pv-content-txt a:hover,#pv-content-txt a:active:hover,#pv-content-txt a:visited:hover{color:#68a9ff}pre#pv-content-txt code{line-height:1.2em}div#pv-content-txt{font-size:1.1em;padding:8px 24px}div#pv-content-txt code{color:#008200}#pv-content-vid{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%}#pv-content-vid:-webkit-full-screen{top:auto!important;left:auto!important}#pv-overlay{position:fixed;left:0;top:0;right:0;bottom:0;z-index:100;background:rgba(0,0,0,0.5);transition:background-color .3s ease-in-out;text-align:center}#pv-overlay.fullscreen{background:#212121}#pv-container{position:absolute}#pv-spinner{position:absolute}#pv-spinner .back{width:240px;height:240px;margin:-120px -120px;border-radius:120px;opacity:.5;overflow:hidden}#pv-spinner .spinner{width:100px;height:100px;margin:-50px -50px}#pv-prev-area,#pv-next-area{position:absolute;top:50%;cursor:pointer}#pv-prev-area img,#pv-next-area img{transition:all .2s ease-in-out;display:block;width:48px;height:48px;margin:-36px 0;padding:12px;opacity:.5}#pv-prev-area:hover img,#pv-next-area:hover img{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);opacity:1;background:rgba(27,27,27,0.8)}#pv-prev-area{left:0}#pv-prev-area img{border-radius:0 8px 8px 0;padding-left:48px}#pv-next-area{right:0}#pv-next-area img{border-radius:8px 0 0 8px;padding-right:48px}#pv-buttons{list-style:none;list-style-image:none;margin:0;padding:0}#pv-buttons img{position:relative;width:24px;height:24px;padding:12px}#pv-buttons .bar-label{transition:all .2s ease-in-out;display:block;color:#fff;height:48px;line-height:48px;padding:0 12px;opacity:.7}#pv-buttons .bar-button{transition:all .2s ease-in-out;display:block;line-height:48px;opacity:.7;cursor:pointer}#pv-buttons .bar-button:hover{opacity:1;background:rgba(255,255,255,0.1)}#pv-buttons .bar-left{float:left}#pv-buttons .bar-right{float:right}#pv-bottombar{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:fixed;z-index:5;left:0;right:0;bottom:0;background:#1b1b1b;height:48px}#pv-overlay.fullscreen #pv-bottombar{opacity:.5}@media only screen and (max-width:700px){#pv-prev-area,#pv-next-area{display:none!important}}#search input{display:none;border:0;font-size:16px;color:rgba(0,0,0,0.87);background:transparent;outline:0;width:160px;padding:0 12px 0 4px;line-height:48px;vertical-align:top}#search.active input{display:inline-block}#search.pending input{color:rgba(0,0,0,0.26)}#selection-rect{position:absolute;left:0;top:0;z-index:2;border:1px dashed rgba(0,0,0,0.15);background:rgba(0,0,0,0.1)}html.drag-select,html.drag-select *{cursor:move!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.drag-select #view .item:hover,html.drag-select * #view .item:hover{box-shadow:none!important}#view .selector{display:none;position:absolute;left:0;top:0;width:22px;height:22px;background:#42a5f5;cursor:pointer;border-radius:0 0 2px 0;opacity:.6}#view .selector:hover{opacity:.8}#view .selector img{width:100%;height:100%}#view .item:hover .selector{display:block}#view .item.selected:not(.selecting),#view .item.selecting:not(.selected){color:#fff;background:#42a5f5}#view .item.selected:not(.selecting) .selector,#view .item.selecting:not(.selected) .selector{display:block;opacity:1}#view .item.selected:not(.selecting):hover,#view .item.selecting:not(.selected):hover{color:#fff;background:#42a5f5}#view .no-match{display:none;margin-top:36px;text-align:center;color:rgba(0,0,0,0.05);font-size:5em;font-weight:bold}#tree{overflow:auto;flex:0 0 auto;order:1;padding:32px 32px 32px 16px;white-space:nowrap;max-width:250px;overflow-x:hidden}#tree a,#tree a:active,#tree a.visited{display:block;margin-left:20px;padding:3px 0;text-decoration:none;color:rgba(0,0,0,0.87)}#tree a:hover,#tree a:active:hover,#tree a.visited:hover{color:#42a5f5}#tree .active>a{font-weight:bold}#tree .indicator{display:block;float:left;padding:3px 0;position:relative;top:-2px;cursor:pointer}#tree .indicator img{width:20px;height:20px;zoom:1}#tree .item{clear:left}#tree .item.open>.indicator img{-webkit-transform:rotate(90deg);transform:rotate(90deg)}#tree .item.unknown>.indicator{opacity:.3}#tree .item.none>.indicator{opacity:0;cursor:inherit}#tree .item.unknown>.content,#tree .item.none>.content,#tree .item.closed>.content{display:none}#tree .icon{position:relative;top:-2px}#tree .icon img{width:20px;height:20px}#tree .label{margin:0 0 0 4px}#tree .content{margin:0;padding:0 0 0 20px}#tree .summary{color:rgba(0,0,0,0.26);padding:0 0 0 8px}#root.info #content{flex:1 1 auto;order:50;color:rgba(0,0,0,0.87);text-align:center}#root.info code{margin:0 .2em;padding:2px 4px;border-radius:4px;letter-spacing:.05em;background:#fafafa;border:1px solid rgba(0,0,0,0.05);font-size:.9em}#root.info #header a{transition:all .2s ease-in-out;font-size:4em;font-weight:300;margin:.8em 0 0 0;color:rgba(0,0,0,0.87);text-decoration:none}#root.info #header a:hover{color:#42a5f5}#root.info #support{margin:24px auto;padding:18px 0 6px 0;width:292px;background:#fafafa;border:1px solid rgba(0,0,0,0.05);border-radius:4px}#root.info #support input[type="image"]{border:0;width:100px;padding:12px 48px}#root.info #pass{border-radius:2px;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:#fff;border:0;outline:0;background:#fafafa;border:1px solid rgba(0,0,0,0.05);display:inline-block;margin:8px;padding:0 12px;line-height:28px;width:200px;vertical-align:top}#root.info #login,#root.info #logout{border-radius:2px;transition:all .2s ease-in-out;color:#fff;background:#42a5f5;cursor:pointer;text-decoration:none;display:inline-block;margin:8px;padding:0 12px;line-height:28px;vertical-align:top}#root.info #login:hover,#root.info #logout:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#root.info #hint{margin:12px auto;width:320px}#root.info #tests{display:inline-block;text-align:left;list-style-type:none;margin:48px 0;padding:0}#root.info #tests .test{background:#fff;margin:12px 0 0 0;padding:8px 12px 12px 12px;border-bottom:1px solid rgba(0,0,0,0.05)}#root.info #tests .label{display:inline-block;width:250px;font-size:1.4em}#root.info #tests .result{display:inline-block;width:250px;text-align:right;font-size:1.4em;font-weight:bold}#root.info #tests .result.passed{color:#4caf50}#root.info #tests .result.failed{color:#f44336}#root.info #tests .info{margin:4px 0 0 0}#content{overflow:auto;flex:1 1 auto;order:50;position:relative}#fallback{display:none;max-width:960px;margin:16px auto;padding:32px 16px}#fallback table{display:block;width:100%;border-collapse:collapse;background:#fff}#fallback th,#fallback td{padding:6px;text-align:left;border:0;border-bottom:1px solid #f0f0f0}#fallback th{color:#aaa;font-weight:normal;line-height:36px}#fallback td{overflow:hidden;white-space:nowrap}#fallback a,#fallback a:active,#fallback a:visited{display:block;color:inherit;text-decoration:none;cursor:pointer}#fallback a:hover,#fallback a:active:hover,#fallback a:visited:hover{color:#42a5f5}#fallback .fb-i{width:20px;padding-left:12px}#fallback .fb-i img{width:20px;height:20px;position:relative;top:-1px}#fallback .fb-n{width:682px;max-width:682px}#fallback .fb-d{text-align:right;width:160px;min-width:160px}#fallback .fb-s{text-align:right;width:70px;min-width:70px;padding-right:12px}#fallback-hints{display:none;overflow:hidden;text-align:right;background:#fafafa;border-bottom:1px solid rgba(0,0,0,0.05)}#fallback-hints a,#fallback-hints a:active,#fallback-hints a:visited{transition:all .2s ease-in-out;display:inline-block;line-height:48px;color:rgba(0,0,0,0.54);text-decoration:none;outline:0}#fallback-hints a:hover,#fallback-hints a:active:hover,#fallback-hints a:visited:hover{color:#42a5f5}#fallback-hints .backlink{margin:0 16px}#fallback-hints .noJsMsg,#fallback-hints .noBrowserMsg{display:none;margin:0 16px;color:#f44336}html.no-js #root,html.no-browser #root{position:static;overflow:auto}html.no-js #fallback,html.no-browser #fallback,html.no-js #fallback-hints,html.no-browser #fallback-hints{display:block}html.no-js .noJsMsg{display:inline!important}html.no-browser .noBrowserMsg{display:inline!important}#mainrow{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row;flex:1 1 auto;order:50;height:0}#notification{position:fixed;left:50%;width:200px;margin-left:-100px;z-index:100;padding:3px 6px 6px 6px;color:#fff;background:rgba(0,0,0,0.2);border-radius:0 0 4px 4px;text-align:center;overflow:hidden}#root{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:column;position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;background:#fff;line-height:1.4}#root,input,select{font-family:"Ubuntu","Roboto","Helvetica","Arial","sans-serif";font-size:13px;font-weight:normal;color:rgba(0,0,0,0.87)}#sidebar{overflow-x:hidden;overflow-y:auto;flex:0 0 auto;order:0;background:#fafafa;border-right:1px solid rgba(0,0,0,0.05);padding:16px;position:absolute;top:48px;min-height:100%;z-index:1}#sidebar .block{display:block;margin:0 0 24px 0;width:168px}#sidebar .block h1{font-size:1em;margin:2px 0 6px 0}#sidebar .button{border-radius:2px;transition:all .2s ease-in-out;display:inline-block;margin:4px;color:rgba(0,0,0,0.87);cursor:pointer}#sidebar .button:hover{background:rgba(0,0,0,0.03)}#sidebar .button.active{background:rgba(0,0,0,0.03);box-shadow:inset 0 0 4px 0 rgba(0,0,0,0.4)}#sidebar .button img{width:24px;height:24px;padding:12px}#sidebar .select{border-radius:2px;background:transparent;overflow:hidden;outline:0;width:160px;margin:4px;line-height:48px}#sidebar input,#sidebar select{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:transparent;width:100%;border:0 solid #000;cursor:pointer;outline:0}#sidebar input:hover,#sidebar select:hover{background:rgba(0,0,0,0.03)}#sidebar select{width:187px;padding:0 8px;height:48px;line-height:48px}#sidebar input[type='range']{border-radius:2px;width:144px;margin:4px;padding:8px;vertical-align:middle;height:32px;line-height:32px}#sidebar .range-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar .range-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar input[type='range']::-webkit-slider-runnable-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-moz-range-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-fill-lower{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-fill-upper{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-webkit-slider-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px;margin-top:-5px}#sidebar input[type='range']::-moz-range-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar input[type='range']::-ms-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar #view-size{display:block}#topbar{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row;overflow:hidden;flex:0 0 auto;order:1;background:#fafafa;border-bottom:1px solid rgba(0,0,0,0.05);z-index:1}#toolbar{overflow:hidden;flex:0 0 auto;order:1;height:48px}#toolbar .tool{transition:all .2s ease-in-out;display:inline-block;cursor:pointer}#toolbar .tool img{display:inline-block;width:24px;height:24px;padding:12px}#toolbar .tool:hover{background:rgba(0,0,0,0.03)}#flowbar{overflow:hidden;flex:1 1 auto;order:2;height:48px}#backlink{transition:all .2s ease-in-out;display:block;flex:0 0 auto;order:99;text-align:center;padding:6px 12px;overflow:hidden;height:36px}#backlink,#backlink:active,#backlink:visited{color:rgba(0,0,0,0.26);cursor:pointer;text-decoration:none}#backlink:hover{color:#42a5f5;background:rgba(0,0,0,0.03)}#backlink:focus{outline:0}#backlink div{line-height:18px;white-space:nowrap}#view.view-details{margin:32px}#view.view-details .header{position:relative;white-space:nowrap;display:list-item;border-bottom:1px solid rgba(0,0,0,0.07);border-radius:2px 2px 0 0}#view.view-details .header .label,#view.view-details .header .date,#view.view-details .header .size{transition:all .2s ease-in-out;line-height:24px;padding:0 8px 16px 8px;opacity:.4;outline:0}#view.view-details .header .label:hover,#view.view-details .header .date:hover,#view.view-details .header .size:hover{opacity:1;color:#42a5f5}#view.view-details .header .sort{display:none;position:relative;top:-2px;width:20px;height:20px;padding:0 4px}#view.view-details .header .ascending .sort{display:inline}#view.view-details .header .descending .sort{display:inline;-webkit-transform:rotate(180deg);transform:rotate(180deg);zoom:1}#view.view-details .item{overflow:hidden;border-bottom:1px solid rgba(0,0,0,0.07)}#view.view-details .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);z-index:1}#view.view-details .item:last-child{border-radius:0 0 2px 2px}#view.view-details .square{display:inline-block;position:absolute;left:16px;top:-1px;padding:8px}#view.view-details .square .thumb{border-radius:2px;box-shadow:0 0 1px 0 rgba(0,0,0,0.2)}#view.view-details .label,#view.view-details .date,#view.view-details .size{padding:0 8px}#view.view-details .date{position:absolute;right:116px;top:0}#view.view-details .size{position:absolute;right:16px;top:0}#view.view-details .item .label,#view.view-details .item .date,#view.view-details .item .size{line-height:30px}#view.view-details .square{width:16px;height:16px}#view.view-details .square img{width:16px;height:16px}#view.view-details .label{margin:0 246px 0 48px}#view.view-details.width-0 .label{margin-right:4px}#view.view-details.width-0 .date{display:none}#view.view-details.width-0 .size{display:none}#view.view-details.width-1 .label{margin-right:64px}#view.view-details.width-1 .date{display:none}#view.view-grid{margin:28px}#view.view-grid .item{border-radius:2px;overflow:hidden;float:left;margin:8px}#view.view-grid .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#view.view-grid .square{display:inline-block;vertical-align:top}#view.view-grid .label{display:inline-block;vertical-align:top;width:180px;padding:0 8px}#view.view-grid .date,#view.view-grid .size{display:none}#view.view-grid .label{line-height:48px}#view.view-grid .square{width:48px;height:48px}#view.view-grid .square img{width:48px;height:48px}#view.view-icons{margin:28px}#view.view-icons .item{border-radius:2px;overflow:hidden;float:left;margin:8px}#view.view-icons .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#view.view-icons .landscape{display:block;background:#fafafa}#view.view-icons .label{padding:0 6px;line-height:24px;text-align:center}#view.view-icons .date,#view.view-icons .size{display:none}#view.view-icons .item{width:128px}#view.view-icons .landscape{width:128px;height:96px}#view.view-icons .landscape img{width:96px;height:96px}#view.view-icons .landscape .thumb{width:128px}#view a,#view a:active,#view a:visited{display:block;color:inherit;cursor:pointer;text-decoration:none}#view ul{margin:0;padding:0;list-style:none}#view .header{display:none}#view .item{position:relative;white-space:nowrap;background:#fff}#view .item:hover{color:#42a5f5;background:#fafafa}#view .folder-parent .date,#view .folder-parent .size{display:none}#view .icon{display:none;text-align:center}#view .icon img{position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}#view .icon .thumb{max-width:none;max-height:none}#view .label{display:block;overflow:hidden;text-align:left;text-overflow:ellipsis}#view .date{text-align:right;width:130px}#view .size{text-align:right;width:80px}#view #view-hint{display:block;margin-top:36px;text-align:center;color:rgba(0,0,0,0.05);font-size:5em;font-weight:bold}@media only screen and (max-width:700px){#crumbbar .crumb:not(.active){display:none}#crumbbar .crumb.active .sep{width:0}#tree,#info{display:none!important}}@media print{*,*:before,*:after,*:first-letter ,*:first-line {background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}#toolbar,#sidebar,#tree,#info{display:none!important}} \ No newline at end of file diff --git a/traces/_h5ai/public/ext/README.md b/traces/_h5ai/public/ext/README.md new file mode 100644 index 0000000..7f9460c --- /dev/null +++ b/traces/_h5ai/public/ext/README.md @@ -0,0 +1,4 @@ +# Extensions + +This directory is used for additional script and style files. You have to add +them manualy to the `resources` section in `_h5ai/private/conf/options.json`. diff --git a/traces/_h5ai/public/images/fallback/file.png b/traces/_h5ai/public/images/fallback/file.png new file mode 100644 index 0000000000000000000000000000000000000000..c796a825dc0d1f519a95280ea35fa9202b11b3bf GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=t*47)NCo5DGuFHe20TYDOxSZ+ z_?d3=DewOqpL{(U>zS2u`=n!`NVDOIGA5A*237@U#uK|ZbT&Br*$E2I R*8&Y<@O1TaS?83{1OS-LCuslx literal 0 HcmV?d00001 diff --git a/traces/_h5ai/public/images/fallback/folder-parent.png b/traces/_h5ai/public/images/fallback/folder-parent.png new file mode 100644 index 0000000000000000000000000000000000000000..38da20dc9262f05651d048f7bbeabf65c50a917f GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=v8Rh;NCji^0$T~z#Kc5i1s~JH zPR`E%oi~b^@^VW)Yn#~gGEw1aoZP;)tU&YE7kPV_7+x9Y3kGj{{|cy`!PC{xWt~$( F696kY9+Ch6 literal 0 HcmV?d00001 diff --git a/traces/_h5ai/public/images/fallback/folder.png b/traces/_h5ai/public/images/fallback/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..d4722e788e8e965c019daf82408d6b77f43def6f GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=mZytjNCjiE#6blUlP~sWGGb!a w9A-97k?t~>AY@~})+c3=^W%mIV0) zGc^2vpzvi^xHC|o%+tj&q=ND78E;0W03K$?f`+y$PApgUYl(dDJ6-R7AV$SA{`sut zNjG(7EKM=vPSc!uwkgspZF9mjoI+(K#z>(0z!_BFGwF-&J4?=amST}JZGkRe@O1Ta JS?83{1OUMlPdESo literal 0 HcmV?d00001 diff --git a/traces/_h5ai/public/images/favicon/favicon-16-32.ico b/traces/_h5ai/public/images/favicon/favicon-16-32.ico new file mode 100644 index 0000000000000000000000000000000000000000..be172231b6902c8f86a2695285a78e4b0f745e6c GIT binary patch literal 5430 zcmeH~;SGX7422)+0E}?Ij9cguFoRpj1kT|YY<9ki{3xOELaxTdUeX-*a_xhUatT0# z9oiP06Rro~2q2|t{h)rQcA~~h?wE8=0QFxSUDxF;F+a*f&VeS)a zw)mCgS~b6=XMP0|LsJ+x?tAA*o}4p@abd`L^cr&T#0UZ_1gvkxOJClCmycC9{51iK zlb5dD0WTk`Zun~g7AG%VyT|+Y;%wCo{+fWr$xGMn(f?kYt-8Tq6RYgr+Ar*|t5;6)VCSUB$WW>a- tIc#ARkz@+;;9E9}aWPwul)(oEhHuWskKC<%qk&o&JYD@<);T3K0RX3>7Rvwt literal 0 HcmV?d00001 diff --git a/traces/_h5ai/public/images/favicon/favicon-32.png b/traces/_h5ai/public/images/favicon/favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..2f97d12e445524bb2af5951cf17593dd823938c3 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzdrud~kP61P=e7$nDDWH&n6~A4 zV)2SP|GrCee~EWYnYnb + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/README.md b/traces/_h5ai/public/images/themes/README.md new file mode 100644 index 0000000..650e0f7 --- /dev/null +++ b/traces/_h5ai/public/images/themes/README.md @@ -0,0 +1,9 @@ +# Themes + +This directory will contain any themes you add. At the moment there are only +icon themes supported. The folder structure is: `/.`, +with `` one of `svg`, `png` or `jpg`. + +To select a theme use the option `view > theme` in file `conf/options.json`. + +You will find the previously included icon themes [here](https://github.com/lrsjng/h5ai-themes). diff --git a/traces/_h5ai/public/images/themes/comity/ar-apk.svg b/traces/_h5ai/public/images/themes/comity/ar-apk.svg new file mode 100644 index 0000000..a7cc5cd --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/ar-apk.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/ar-deb.svg b/traces/_h5ai/public/images/themes/comity/ar-deb.svg new file mode 100644 index 0000000..f1efae9 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/ar-deb.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/ar-rpm.svg b/traces/_h5ai/public/images/themes/comity/ar-rpm.svg new file mode 100644 index 0000000..4146098 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/ar-rpm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-css.svg b/traces/_h5ai/public/images/themes/comity/txt-css.svg new file mode 100644 index 0000000..487a535 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-css.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-go.svg b/traces/_h5ai/public/images/themes/comity/txt-go.svg new file mode 100644 index 0000000..0d21bb0 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-go.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-html.svg b/traces/_h5ai/public/images/themes/comity/txt-html.svg new file mode 100644 index 0000000..356e855 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-html.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-js.svg b/traces/_h5ai/public/images/themes/comity/txt-js.svg new file mode 100644 index 0000000..91a3279 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-js.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-less.svg b/traces/_h5ai/public/images/themes/comity/txt-less.svg new file mode 100644 index 0000000..fd15b02 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-less.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-md.svg b/traces/_h5ai/public/images/themes/comity/txt-md.svg new file mode 100644 index 0000000..a2fba14 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-md.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-php.svg b/traces/_h5ai/public/images/themes/comity/txt-php.svg new file mode 100644 index 0000000..84e1e22 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-php.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-py.svg b/traces/_h5ai/public/images/themes/comity/txt-py.svg new file mode 100644 index 0000000..d5dc003 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-py.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-rb.svg b/traces/_h5ai/public/images/themes/comity/txt-rb.svg new file mode 100644 index 0000000..a642dc2 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-rb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-rust.svg b/traces/_h5ai/public/images/themes/comity/txt-rust.svg new file mode 100644 index 0000000..0a71e77 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-rust.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/txt-script.svg b/traces/_h5ai/public/images/themes/comity/txt-script.svg new file mode 100644 index 0000000..f8704e8 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/txt-script.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/comity/x-pdf.svg b/traces/_h5ai/public/images/themes/comity/x-pdf.svg new file mode 100644 index 0000000..5266630 --- /dev/null +++ b/traces/_h5ai/public/images/themes/comity/x-pdf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/ar.svg b/traces/_h5ai/public/images/themes/default/ar.svg new file mode 100644 index 0000000..e25cded --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/ar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/aud.svg b/traces/_h5ai/public/images/themes/default/aud.svg new file mode 100644 index 0000000..dd955fc --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/aud.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/bin.svg b/traces/_h5ai/public/images/themes/default/bin.svg new file mode 100644 index 0000000..34f1f45 --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/bin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/file.svg b/traces/_h5ai/public/images/themes/default/file.svg new file mode 100644 index 0000000..66bcac7 --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/file.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/folder-page.svg b/traces/_h5ai/public/images/themes/default/folder-page.svg new file mode 100644 index 0000000..4ca3ec2 --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/folder-page.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/folder-parent.svg b/traces/_h5ai/public/images/themes/default/folder-parent.svg new file mode 100644 index 0000000..e114689 --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/folder-parent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/folder.svg b/traces/_h5ai/public/images/themes/default/folder.svg new file mode 100644 index 0000000..3e971cf --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/folder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/img.svg b/traces/_h5ai/public/images/themes/default/img.svg new file mode 100644 index 0000000..e754e82 --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/img.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/txt.svg b/traces/_h5ai/public/images/themes/default/txt.svg new file mode 100644 index 0000000..d5c0dc9 --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/txt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/vid.svg b/traces/_h5ai/public/images/themes/default/vid.svg new file mode 100644 index 0000000..dd955fc --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/vid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/themes/default/x.svg b/traces/_h5ai/public/images/themes/default/x.svg new file mode 100644 index 0000000..66bcac7 --- /dev/null +++ b/traces/_h5ai/public/images/themes/default/x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/back.svg b/traces/_h5ai/public/images/ui/back.svg new file mode 100644 index 0000000..3275e21 --- /dev/null +++ b/traces/_h5ai/public/images/ui/back.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/crumb.svg b/traces/_h5ai/public/images/ui/crumb.svg new file mode 100644 index 0000000..8dfd404 --- /dev/null +++ b/traces/_h5ai/public/images/ui/crumb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/download.svg b/traces/_h5ai/public/images/ui/download.svg new file mode 100644 index 0000000..5721c4e --- /dev/null +++ b/traces/_h5ai/public/images/ui/download.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/filter.svg b/traces/_h5ai/public/images/ui/filter.svg new file mode 100644 index 0000000..d6d4c78 --- /dev/null +++ b/traces/_h5ai/public/images/ui/filter.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/info-toggle.svg b/traces/_h5ai/public/images/ui/info-toggle.svg new file mode 100644 index 0000000..ebc0e5c --- /dev/null +++ b/traces/_h5ai/public/images/ui/info-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/paypal.svg b/traces/_h5ai/public/images/ui/paypal.svg new file mode 100644 index 0000000..a17415e --- /dev/null +++ b/traces/_h5ai/public/images/ui/paypal.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/preview-close.svg b/traces/_h5ai/public/images/ui/preview-close.svg new file mode 100644 index 0000000..ef5f8a0 --- /dev/null +++ b/traces/_h5ai/public/images/ui/preview-close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/preview-fullscreen.svg b/traces/_h5ai/public/images/ui/preview-fullscreen.svg new file mode 100644 index 0000000..bf04ad7 --- /dev/null +++ b/traces/_h5ai/public/images/ui/preview-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/preview-next.svg b/traces/_h5ai/public/images/ui/preview-next.svg new file mode 100644 index 0000000..1b72100 --- /dev/null +++ b/traces/_h5ai/public/images/ui/preview-next.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/preview-no-fullscreen.svg b/traces/_h5ai/public/images/ui/preview-no-fullscreen.svg new file mode 100644 index 0000000..d2a3efb --- /dev/null +++ b/traces/_h5ai/public/images/ui/preview-no-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/preview-prev.svg b/traces/_h5ai/public/images/ui/preview-prev.svg new file mode 100644 index 0000000..a592b22 --- /dev/null +++ b/traces/_h5ai/public/images/ui/preview-prev.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/preview-raw.svg b/traces/_h5ai/public/images/ui/preview-raw.svg new file mode 100644 index 0000000..7a8a69d --- /dev/null +++ b/traces/_h5ai/public/images/ui/preview-raw.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/search.svg b/traces/_h5ai/public/images/ui/search.svg new file mode 100644 index 0000000..d6d4c78 --- /dev/null +++ b/traces/_h5ai/public/images/ui/search.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/selected.svg b/traces/_h5ai/public/images/ui/selected.svg new file mode 100644 index 0000000..50ac249 --- /dev/null +++ b/traces/_h5ai/public/images/ui/selected.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/sidebar.svg b/traces/_h5ai/public/images/ui/sidebar.svg new file mode 100644 index 0000000..4e38c05 --- /dev/null +++ b/traces/_h5ai/public/images/ui/sidebar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/sort.svg b/traces/_h5ai/public/images/ui/sort.svg new file mode 100644 index 0000000..5b0ed8d --- /dev/null +++ b/traces/_h5ai/public/images/ui/sort.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/spinner.svg b/traces/_h5ai/public/images/ui/spinner.svg new file mode 100644 index 0000000..a5f7a7b --- /dev/null +++ b/traces/_h5ai/public/images/ui/spinner.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/traces/_h5ai/public/images/ui/tree-indicator.svg b/traces/_h5ai/public/images/ui/tree-indicator.svg new file mode 100644 index 0000000..8dfd404 --- /dev/null +++ b/traces/_h5ai/public/images/ui/tree-indicator.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/tree-toggle.svg b/traces/_h5ai/public/images/ui/tree-toggle.svg new file mode 100644 index 0000000..9914792 --- /dev/null +++ b/traces/_h5ai/public/images/ui/tree-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/view-details.svg b/traces/_h5ai/public/images/ui/view-details.svg new file mode 100644 index 0000000..5e756e0 --- /dev/null +++ b/traces/_h5ai/public/images/ui/view-details.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/view-grid.svg b/traces/_h5ai/public/images/ui/view-grid.svg new file mode 100644 index 0000000..8f4c48c --- /dev/null +++ b/traces/_h5ai/public/images/ui/view-grid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/images/ui/view-icons.svg b/traces/_h5ai/public/images/ui/view-icons.svg new file mode 100644 index 0000000..8601293 --- /dev/null +++ b/traces/_h5ai/public/images/ui/view-icons.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/traces/_h5ai/public/index.php b/traces/_h5ai/public/index.php new file mode 100644 index 0000000..89f99e8 --- /dev/null +++ b/traces/_h5ai/public/index.php @@ -0,0 +1,17 @@ +=0},g=function(e){return d(e,function(e){return!!e})},m=function(e,t){return!!e&&e instanceof t},v=function(e){return Array.from(e)},b=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)<0})},w=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)>=0})},y=function(e,t){return et?1:0},x=function(e,t){var n=a(t)?t:function(e){return e[t]},r=function(e,t){return y(n(e),n(t))};return l(e).sort(r)},k=function(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(e,t)}};e.exports={is:r,isStr:o,isFn:a,isNum:s,hasLength:c,keys:u,values:l,each:f,filter:d,map:p,includes:h,compact:g,isInstanceOf:m,toArray:v,difference:b,intersection:w,cmp:y,sortBy:x,debounce:k}},function(e,t,n){(function(t){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:g;try{return p(t.querySelectorAll(e))}catch(e){return[]}},b=function(e){return d(e,h.Element)},w=function(e){return d(e,h.Document)},y=function(e){return u(e)&&e.window===e&&w(e.document)},x=function(e){return b(e)||w(e)||y(e)},k=function(e,t,n){return e.addEventListener(t,n)},_=function(e,t,n){return e.removeEventListener(t,n)},C=new Promise(function(e){/^(i|c|loade)/.test(g.readyState)?e():k(g,"DOMContentLoaded",function(){return e()})}),S=function(){return C},A=new Promise(function(e){k(h,"load",function(){return e()})}),T=function(){return A},E=function e(t){if(d(t,e))return t;var n=void 0;return l(t)?(t=t.trim(),n="<"===t[0]?m(t):v(t)):n=x(t)?[t]:c(t)?t:[t],n=s(n,x),Object.assign(Object.create(e.prototype),n,{length:n.length})};E.prototype={constructor:E,each:function(e){return a(this,e),this},map:function(e){return f(this,e)},find:function(e){var t;return E((t=[]).concat.apply(t,r(this.map(function(t){return v(e,t)}))))},on:function(e,t){return this.each(function(n){return k(n,e,t)})},off:function(e,t){return this.each(function(n){return _(n,e,t)})},attr:function(e,t){return void 0===t?this.length?this[0].getAttribute(e):void 0:this.each(function(n){return n.setAttribute(e,t)})},rmAttr:function(e){return this.each(function(t){return t.removeAttribute(e)})},prop:function(e,t){return void 0===t?this.length?this[0][e]:void 0:this.each(function(n){n[e]=t})},rmProp:function(e){return this.each(function(t){return delete t[e]})},val:function(e){return void 0===e?this.length?this[0].value:void 0:this.each(function(t){t.value=e})},html:function(e){return void 0===e?this.map(function(e){return e.innerHTML}).join(""):this.each(function(t){t.innerHTML=e})},text:function(e){return void 0===e?this.map(function(e){return e.textContent}).join(""):this.each(function(t){t.textContent=e})},clr:function(){return this.html("")},rm:function(){return this.each(function(e){var t=e.parentNode;t&&t.removeChild(e)})},rpl:function(e){return this.each(function(t){var n=t.parentNode;n&&n.replaceChild(E(e)[0],t)})},app:function(e){return this.each(function(t){E(e).each(function(e){return t.appendChild(e)})})},appTo:function(e){return E(e).app(this),this},pre:function(e){return this.each(function(t){E(e).each(function(e){var n=t.firstChild;n?t.insertBefore(e,n):t.appendChild(e)})})},preTo:function(e){return E(e).pre(this),this},cls:function(){return arguments.length?(this.each(function(e){e.className=""}),this.addCls.apply(this,arguments)):this.length?p(this[0].classList):[]},hasCls:function(e){return p(this).every(function(t){return t.classList.contains(e)})},addCls:function(){for(var e=arguments.length,t=Array(e),n=0;nd)return 1}for(var p=0,h=Math.max(u.length,l.length);pm)return 1}return 0};e.exports={naturalCmp:s}},function(e,t){"use strict";var n=function(e){return e.replace(/[\-\[\]{}()*+?.,\\$\^|#\s]/g,"\\$&")},r=function(e,t){return t?"re:"===e.substr(0,3)?e.substr(3):e.trim().split(/\s+/).map(function(e){return e.split("").map(function(e){return n(e)}).join(".*?")}).join("|"):n(e)};e.exports={parsePattern:r}},function(e,t,n){"use strict";var r=n(8),i=r.request,o=e.exports={_update:function(e){return i(e).then(function(e){return Object.assign(o,e)})}}},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.dom,a=t.window.XMLHttpRequest,s=function(e){return new Promise(function(t){var n=new a,r=function(){if(n.readyState===a.DONE)try{t(JSON.parse(n.responseText))}catch(e){t({err:e,txt:n.responseText})}};n.open("POST","?",!0),n.onreadystatechange=r,n.setRequestHeader("Content-Type","application/json;charset=utf-8"),n.send(JSON.stringify(e))})},c=function(e){var t=o('
');i(e,function(e,n){o('').attr("name",n).attr("value",e).appTo(t)}),t.appTo("body"),t[0].submit(),t.rm()};e.exports={request:s,formRequest:c}}).call(t,function(){return this}())},function(e,t,n){function r(e){return n(i(e))}function i(e){return o[e]||function(){throw new Error("Cannot find module '"+e+"'.")}()}var o={"./index":10,"./index.js":10,"./info":50,"./info.js":50};r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=9},function(e,t,n){(function(e){"use strict";n(11),n(24),n(25),n(26),n(27),n(29),n(30),n(31),n(32),n(34),n(36),n(37),n(44),n(45),n(46),n(47),n(48),n(49);var t=e.window.document.location.href;n(20).setLocation(t,!0)}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(12),s=n(13),c=n(14),u=n(15),l=n(17),f=n(18),d=Object.assign({modeToggle:!1},c.view),p='

View

',h='
\n viewmode-[MODE]\n
',g='',m='
\n viewmode\n
',v=void 0,b=void 0,w=function(e,t){o("#viewmode-settings .mode").rmCls("active"),o("#viewmode-"+e).addCls("active"),o("#viewmode-size").val(b.indexOf(t)),"next"===d.modeToggle&&(e=v[(v.indexOf(e)+1)%v.length]),o("#viewmode-toggle img").attr("src",s.image("view-"+e))},y=function(){if(!(v.length<2&&b.length<2)){var e=o(p);if(v.length>1&&i(v,function(t){o(h.replace(/\[MODE\]/g,t)).on("click",function(){f.setMode(t)}).appTo(e)}),b.length>1){var t=b.length-1;o(g).attr("max",t).on("input",function(e){return f.setSize(b[e.target.valueAsNumber])}).on("change",function(e){return f.setSize(b[e.target.valueAsNumber])}).appTo(e)}e.appTo(u.$el)}},x=function(){var e=f.getMode(),t=(v.indexOf(e)+1)%v.length,n=v[t];f.setMode(n)},k=function(){d.modeToggle&&v.length>1&&o(m).on("click",x).appTo(l.$toolbar)},_=function(){v=f.getModes(),b=f.getSizes(),y(),k(),w(f.getMode(),f.getSize()),a.sub("view.mode.changed",w)};_()},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.isStr,o=r.isFn,a=r.dom,s={},c=function(e,t){i(e)&&o(t)&&(s[e]||(s[e]=[]),s[e].push(t))},u=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r
',d='',p=function(){var e=i(f).hide(),t=i(d),n=t.find("img"),r=function(r){var i=s.get(l);r&&(i=!i,s.put(l,i)),i?(t.addCls("active"),n.attr("src",o.image("back")),e.show()):(t.rmCls("active"),n.attr("src",o.image("sidebar")),e.hide())};return u.disableSidebar||(e.appTo(c.$mainrow),t.appTo(c.$toolbar).on("click",function(){return r(!0)}),r()),{$el:e}};e.exports=p()},function(e,t){(function(t){"use strict";var n=t.window.localStorage,r="_h5ai",i=function(){try{return JSON.parse(n[r])}catch(e){}return{}},o=function(e){n[r]=JSON.stringify(e)},a=function(e,t){var n=i();n[e]=t,o(n)},s=function(e){return i()[e]};e.exports={put:a,get:s}}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o="body",a='
\n
\n
\n \n
powered
\n
by h5ai
\n
\n
',s='
\n
\n
',c=function(){var e=i(o).attr("id","root").clr().app(a).app(s);return{$root:e,$topbar:e.find("#topbar"),$toolbar:e.find("#toolbar"),$flowbar:e.find("#flowbar"),$mainrow:e.find("#mainrow"),$content:e.find("#content")}};e.exports=c()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=r.includes,s=r.intersection,c=r.dom,u=n(12),l=n(19),f=n(20),d=n(13),p=n(16),h=n(14),g=n(17),m=["details","grid","icons"],v=[20,40,60,80,100,150,200,250,300,350,400],b=Object.assign({binaryPrefix:!1,hideFolders:!1,hideParentFolder:!1,maxIconSize:40,modes:m,setParentFolderLabels:!1,sizes:v},h.view),w=b.sizes.sort(function(e,t){return e-t}),y=s(b.modes,m),x="view",k='
\n \n
\n
',_='
  • \n \n \n \n \n \n \n \n
  • ',C=c(k),S=C.find("#items"),A=C.find("#view-hint"),T=function(e,t,n){return Math.min(n,Math.max(t,e))},E=function(e){var t=T(e,20,80),n=T(e,40,160),r=T(e,80,1e3),i=Math.round(4*r/3),o="!important;",a="#view.view-details.view-size-"+e,s="#view.view-grid.view-size-"+e,c="#view.view-icons.view-size-"+e,u=[a+" .item .label {line-height: "+(t+14)+"px "+o+"}",a+" .item .date {line-height: "+(t+14)+"px "+o+"}",a+" .item .size {line-height: "+(t+14)+"px "+o+"}",a+" .square {width: "+t+"px "+o+" height: "+t+"px "+o+"}",a+" .square img {width: "+t+"px "+o+" height: "+t+"px "+o+"}",a+" .label {margin-left: "+(t+32)+"px "+o+"}",s+" .item .label {line-height: "+n+"px "+o+"}",s+" .square {width: "+n+"px "+o+" height: "+n+"px "+o+"}",s+" .square img {width: "+n+"px "+o+" height: "+n+"px "+o+"}",c+" .item {width: "+i+"px "+o+"}",c+" .landscape {width: "+i+"px "+o+" height: "+r+"px "+o+"}",c+" .landscape img {width: "+r+"px "+o+" height: "+r+"px "+o+"}",c+" .landscape .thumb {width: "+i+"px "+o+"}"];return u.join("\n")},M=function(){var e=o(w,function(e){return E(e)});e.push("#view .icon img {max-width: "+b.maxIconSize+"px; max-height: "+b.maxIconSize+"px;}"),c("").text(e.join("\n")).appTo("head")},D=function(e,t){var n=p.get(x);e=e||n&&n.mode,t=t||n&&n.size,e=a(b.modes,e)?e:b.modes[0],t=a(b.sizes,t)?t:b.sizes[0],p.put(x,{mode:e,size:t}),i(y,function(t){t===e?C.addCls("view-"+t):C.rmCls("view-"+t)}),i(w,function(e){e===t?C.addCls("view-size-"+e):C.rmCls("view-size-"+e)}),u.pub("view.mode.changed",e,t)},P=function(){return y},z=function(){return p.get(x).mode},L=function(e){return D(e,null)},$=function(){return w},H=function(){return p.get(x).size},O=function(e){return D(null,e)},B=function(e){var t=e.target._item;u.pub("item.mouseenter",t)},R=function(e){var t=e.target._item;u.pub("item.mouseleave",t)},N=function(e){var t=c(_),n=t.find("a"),r=t.find(".icon img"),i=t.find(".label"),o=t.find(".date"),a=t.find(".size");return t.addCls(e.isFolder()?"folder":"file").on("mouseenter",B).on("mouseleave",R),f.setLink(n,e),i.text(e.label).attr("title",e.label),o.attr("data-time",e.time).text(l.formatDate(e.time)),a.attr("data-bytes",e.size).text(l.formatSize(e.size)),e.icon=d.icon(e.type),e.isFolder()&&!e.isManaged&&(t.addCls("page"),e.icon=d.icon("folder-page")),e.isCurrentParentFolder()&&(e.icon=d.icon("folder-parent"),b.setParentFolderLabels||i.addCls("l10n-parentDirectory"),t.addCls("folder-parent")),r.attr("src",e.icon).attr("alt",e.type),e.$view=t,t[0]._item=e,t},I=function(){var e=S.find(".item").length===S.find(".folder-parent").length;e?A.show():A.hide()},j=function(e){var t=o(S.find(".item"),function(e){return e._item});S.find(".item").rm(),i(e,function(e){return S.app(N(e))}),g.$content[0].scrollLeft=0,g.$content[0].scrollTop=0,I(),u.pub("view.changed",e,t)},F=function(e,t){i(e,function(e){N(e).hide().appTo(S).show()}),i(t,function(e){e.$view.hide().rm()}),I(),u.pub("view.changed",e,t)},q=function(e){A.rmCls().addCls("l10n-"+e),I()},Y=function(e){e||(e=f.getItem());var t=[];e.parent&&!b.hideParentFolder&&t.push(e.parent),i(e.content,function(e){e.isFolder()&&b.hideFolders||t.push(e)}),q("empty"),j(t)},Z=function(e,t,n){var r=[];i(t,function(e){e.isFolder()&&b.hideFolders||r.push(e)}),q("empty"),F(r,n)},U=function(){var e=C[0].offsetWidth;C.rmCls("width-0").rmCls("width-1"),e<320?C.addCls("width-0"):e<480&&C.addCls("width-1")},V=function(){M(),D(),C.appTo(g.$content),A.hide(),l.setDefaultMetric(b.binaryPrefix),u.sub("location.changed",Y),u.sub("location.refreshed",Z),u.sub("resize",U),U()};V(),e.exports={$el:C,setItems:j,changeItems:F,setLocation:Y,setHint:q,getModes:P,getMode:z,setMode:L,getSizes:$,getSize:H,setSize:O}},function(e,t,n){"use strict";var r=n(2),i=r.isNum,o={t:1e3,k:1e3,u:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]},a={t:1024,k:1024,u:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},s=o,c=[[/YYYY/,"Y",4],[/YY/,"Y",2],[/Y/,"Y",0],[/MM/,"M",2],[/M/,"M",0],[/DD/,"D",2],[/D/,"D",0],[/HH/,"H",2],[/H/,"H",0],[/mm/,"m",2],[/m/,"m",0],[/ss/,"s",2],[/s/,"s",0]],u="YYYY-MM-DD HH:mm",l=function(e){s=e?a:o},f=function(e,t){if(t=t||s,!i(e)||e<0)return"";for(var n=0,r=t.u.length-1;e>=t.t&&n').hide().appTo(o.$root),t=function(t){t?e.html(t).show():e.hide()};return{set:t}};e.exports=a()},function(e,t,n){"use strict";var r=n(2),i=r.keys,o=r.each,a=r.filter,s=r.sortBy,c=r.isStr,u=r.isNum,l=n(8),f=n(20),d=n(14),p=n(23),h=/\/$/,g=/^(.*\/)([^\/]+\/?)$/,m={},v=function(e,t){return c(e)&&e.startsWith(t)},b=function(e){e=e.replace(h,"");try{e=decodeURIComponent(e)}catch(e){}return e},w=function(e){if("/"===e)return{parent:null,name:"/"};var t=g.exec(e);if(!t)return null;var n={parent:t[1],name:t[2]};return n.parent&&!v(n.parent,d.rootHref)&&(n.parent=null),n},y=function(e){if(c(e))e={href:e};else if(!e||!c(e.href))return null;var t=f.forceEncoding(e.href);if(!v(t,d.rootHref))return null;var n=m[t]||_(t);return u(e.time)&&(n.time=e.time),u(e.size)&&(n.size=e.size),e.managed&&(n.isManaged=!0),e.fetched&&(n.isContentFetched=!0),n},x=function e(t){t=f.forceEncoding(t);var n=m[t];n&&(delete m[t],n.parent&&delete n.parent.content[n.absHref],o(n.content,function(t){e(t.absHref)}))},k=function(e){return new Promise(function(t){var n=y(e);n.isContentFetched?t(n):l.request({action:"get",items:{href:n.absHref,what:1}}).then(function(e){e.items&&o(e.items,function(e){y(e)}),t(n)})})},_=function e(t){var n=w(t),r=Object.assign(Object.create(e.prototype),{absHref:t,type:p.getType(t),label:b("/"===t?f.getDomain():n.name),time:null,size:null,parent:null,isManaged:null,content:{}});return m[t]=r,n.parent&&(r.parent=y(n.parent),r.parent.content[r.absHref]=r,i(r.parent.content).length>1&&(r.parent.isContentFetched=!0)),r};_.prototype={constructor:_,isFolder:function(){return h.test(this.absHref)},isCurrentFolder:function(){return this.absHref===f.getAbsHref()},isInCurrentFolder:function(){return!!this.parent&&this.parent.isCurrentFolder()},isCurrentParentFolder:function(){var e=y(f.getAbsHref());return!!e&&this===e.parent},isDomain:function(){return"/"===this.absHref},isRoot:function(){return this.absHref===d.rootHref},isEmpty:function(){return 0===i(this.content).length},fetchContent:function(){return k(this.absHref)},getCrumb:function(){for(var e=this,t=[e];e.parent;)e=e.parent,t.unshift(e);return t},getSubfolders:function(){return s(a(this.content,function(e){return e.isFolder()}),function(e){return e.label.toLowerCase()})},getStats:function(){var e=0,t=0;o(this.content,function(n){n.isFolder()?e+=1:t+=1});for(var n=0,r=this;r.parent;)n+=1,r=r.parent;return{folders:e,files:t,depth:n}}},e.exports={get:y,remove:x}},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=n(7),s=/\/$/,c={},u=function(e){return e.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$]/g,"\\$&")},l=function(e){i(e,function(e,t){var n="^("+o(e,function(e){return"("+u(e).replace(/\*/g,".*")+")"}).join("|")+")$";c[t]=new RegExp(n,"i")})},f=function(e){if(s.test(e))return"folder";var t=e.lastIndexOf("/"),n=t>=0?e.substr(t+1):e,r=void 0;return i(c,function(e,t){c[t].test(n)&&(r=t)}),r?r:"file"};l(Object.assign({},a.types)),e.exports={getType:f}},function(e,t,n){(function(e){"use strict";var t=n(12),r=n(20),i=n(14),o=e.window,a=Object.assign({enabled:!1,interval:5e3},i.autorefresh),s=null,c=function(){r.refresh()},u=function(){o.clearTimeout(s)},l=function(){o.clearTimeout(s),s=o.setTimeout(c,a.interval)},f=function(){a.enabled&&(a.interval=Math.max(1e3,a.interval),t.sub("location.beforeChange",u),t.sub("location.beforeRefresh",u),t.sub("location.changed",l),t.sub("location.refreshed",l))};f()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(13),s=n(14),c=Object.assign({enabled:!1},s.contextmenu),u='
    ',l='
      ',f='
    • ',d='
    • ',p='
    • ',h=function(e){for(;!e._cmId&&e.parentNode;)e=e.parentNode;return e._cmId},g=function(e){var t=o(u),n=function(n){n.stopPropagation(),n.preventDefault();var r=h(n.target);n.target!==t[0]&&void 0===r||(t.rm(),e(r))};return t.on("contextmenu",n).on("click",n)},m=function(e){var t=o(l),n=t.find("ul"),r=void 0;return i(e,function(e){"-"===e.type?o(f).appTo(n):"l"===e.type?o(p).appTo(n).find(".cm-text").text(e.text):"e"===e.type&&(r=o(d).appTo(n),r[0]._cmId=e.id,r.find(".cm-text").text(e.text),e.icon?r.find(".cm-icon img").attr("src",a.icon(e.icon)):r.find(".cm-icon").addCls("no-icon"))}),t},v=function(e,t,n,r){var i=4;t.css({left:0,top:0,opacity:0}),e.show();var o=e[0].getBoundingClientRect(),a=t[0].getBoundingClientRect(),s=o.left,c=o.top,u=o.width,l=o.height,f=a.width,d=a.height,p=n,h=r;f>u-2*i&&(p=i,f=u-2*i),d>l-2*i&&(h=i,d=l-2*i),ps+u-i&&(p=s+u-i-f),hc+l-i&&(h=c+l-i-d),t.css({left:p+"px",top:h+"px",width:f+"px",height:d+"px",opacity:1})},b=function(e,t,n,r){var i=g(r),o=m(n);i.hide().app(o).appTo("body"),v(i,o,e,t)},w=function(){if(c.enabled){var e=[{type:"e",id:"e1",text:"testing context menus"},{type:"e",id:"e2",text:"another entry"},{type:"e",id:"e3",text:"one with icon",icon:"folder"},{type:"-"},{type:"e",id:"e4",text:"one with icon",icon:"x"},{type:"e",id:"e5",text:"one with icon",icon:"img"}];o("#view").on("contextmenu",function(t){t.preventDefault(),b(t.pageX,t.pageY,e)})}};w()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(12),s=n(20),c=n(13),u=n(14),l=n(17),f=Object.assign({enabled:!1},u.crumb),d='
      ',p='\n >\n \n ',h='has index page',g=function(e){var t=o(p);return s.setLink(t,e),t.find(".label").text(e.label),e.isCurrentFolder()&&t.addCls("active"),e.isManaged||t.app(o(h)),e._$crumb=t,t[0]._item=e,t},m=function(e){var t=e._$crumb,n=o("#crumbbar");t&&t.parent()[0]===n[0]?(n.children().rmCls("active"),t.addCls("active")):(n.clr(),i(e.getCrumb(),function(e){n.app(g(e))}))},v=function(){f.enabled&&(o(d).appTo(l.$flowbar),a.sub("location.changed",m))};v()},function(e,t,n){"use strict";var r=n(28),i=n(2),o=i.each,a=i.dom,s=n(8),c=n(12),u=n(14),l=Object.assign({enabled:!1},u.custom),f=function(e,t){var n=a("#content-"+t);if(e&&e[t].content){var i=e[t].content;"md"===e[t].type&&(i=r(i)),n.html(i).show()}else n.hide()},d=function(e){s.request({action:"get",custom:e.absHref}).then(function(e){var t=e&&e.custom;o(["header","footer"],function(e){return f(t,e)})})},p=function(){l.enabled&&(a('
      ').hide().preTo("#content"),a('').hide().appTo("#content"),c.sub("location.changed",d))};p()},function(e,t,n){(function(t){!function(t){"use strict";function n(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||b.defaults,this.rules=w.normal,this.options.pedantic?this.rules=w.pedantic:this.options.gfm&&(this.options.tables?this.rules=w.tables:this.rules=w.gfm)}function r(e,t){if(this.options=t||b.defaults,this.links=e,this.rules=y.normal,this.renderer=this.options.renderer||new i,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.pedantic?this.rules=y.pedantic:this.options.gfm&&(this.options.breaks?this.rules=y.breaks:this.rules=y.gfm)}function i(e){this.options=e||b.defaults}function o(){}function a(e){this.tokens=[],this.token=null,this.options=e||b.defaults,this.options.renderer=this.options.renderer||new i,this.renderer=this.options.renderer,this.renderer.options=this.options,this.slugger=new s}function s(){this.seen={}}function c(e,t){if(t){if(c.escapeTest.test(e))return e.replace(c.escapeReplace,function(e){return c.replacements[e]})}else if(c.escapeTestNoEncode.test(e))return e.replace(c.escapeReplaceNoEncode,function(e){return c.replacements[e]});return e}function u(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function l(e,t){return e=e.source||e,t=t||"",{replace:function(t,n){return n=n.source||n,n=n.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,n),this},getRegex:function(){return new RegExp(e,t)}}}function f(e,t,n){if(e){try{var r=decodeURIComponent(u(n)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return null}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return null}t&&!k.test(n)&&(n=d(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(e){return null}return n}function d(e,t){return x[" "+e]||(/^[^:]+:\/*[^\/]*$/.test(e)?x[" "+e]=e+"/":x[" "+e]=m(e,"/",!0)),e=x[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^\/]*)[\s\S]*/,"$1")+t:e+t}function p(){}function h(e){for(var t,n,r=1;r=0&&"\\"===n[i];)r=!r; +return r?"|":" |"}),r=n.split(/ \|/),i=0;if(r.length>t)r.splice(t);else for(;r.lengthAn error occurred:

      "+c(e.message+"",!0)+"
      ";throw e}}var w={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:p,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:p,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:p,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};w._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,w._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,w.def=l(w.def).replace("label",w._label).replace("title",w._title).getRegex(),w.bullet=/(?:[*+-]|\d{1,9}\.)/,w.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,w.item=l(w.item,"gm").replace(/bull/g,w.bullet).getRegex(),w.list=l(w.list).replace(/bull/g,w.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+w.def.source+")").getRegex(),w._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",w._comment=//,w.html=l(w.html,"i").replace("comment",w._comment).replace("tag",w._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),w.paragraph=l(w.paragraph).replace("hr",w.hr).replace("heading",w.heading).replace("lheading",w.lheading).replace("tag",w._tag).getRegex(),w.blockquote=l(w.blockquote).replace("paragraph",w.paragraph).getRegex(),w.normal=h({},w),w.gfm=h({},w.normal,{fences:/^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),w.gfm.paragraph=l(w.paragraph).replace("(?!","(?!"+w.gfm.fences.source.replace("\\1","\\2")+"|"+w.list.source.replace("\\1","\\3")+"|").getRegex(),w.tables=h({},w.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),w.pedantic=h({},w.normal,{html:l("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",w._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),n.rules=w,n.lex=function(e,t){var r=new n(t);return r.lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,t){e=e.replace(/^ +$/gm,"");for(var n,r,i,o,a,s,c,u,l,f,d,p,h,v,b,y;e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:m(i,"\n")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2]?i[2].trim():i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))&&(s={type:"table",header:g(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]},s.header.length===s.align.length)){for(e=e.substring(i[0].length),d=0;d ?/gm,""),this.token(i,t),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),o=i[2],v=o.length>1,c={type:"list_start",ordered:v,start:v?+o:"",loose:!1},this.tokens.push(c),i=i[0].match(this.rules.item),u=[],n=!1,h=i.length,d=0;d1?1===a.length:a.length>1||this.options.smartLists&&a!==o)&&(e=i.slice(d+1).join("\n")+e,d=h-1)),r=n||/\n\n(?!\s*$)/.test(s),d!==h-1&&(n="\n"===s.charAt(s.length-1),r||(r=n)),r&&(c.loose=!0),b=/^\[[ xX]\] /.test(s),y=void 0,b&&(y=" "!==s[1],s=s.replace(/^\[[ xX]\] +/,"")),l={type:"list_item_start",task:b,checked:y,loose:r},u.push(l),this.tokens.push(l),this.token(s,!1),this.tokens.push({type:"list_item_end"});if(c.loose)for(h=u.length,d=0;d?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:p,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:p,text:/^(`+|[^`])[\s\S]*?(?=[\\?@\\[^_{|}~",y.em=l(y.em).replace(/punctuation/g,y._punctuation).getRegex(),y._escapes=/\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/g,y._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,y._email=/[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,y.autolink=l(y.autolink).replace("scheme",y._scheme).replace("email",y._email).getRegex(),y._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,y.tag=l(y.tag).replace("comment",w._comment).replace("attribute",y._attribute).getRegex(),y._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,y._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/,y._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,y.link=l(y.link).replace("label",y._label).replace("href",y._href).replace("title",y._title).getRegex(),y.reflink=l(y.reflink).replace("label",y._label).getRegex(),y.normal=h({},y),y.pedantic=h({},y.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:l(/^!?\[(label)\]\((.*?)\)/).replace("label",y._label).getRegex(),reflink:l(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",y._label).getRegex()}),y.gfm=h({},y.normal,{escape:l(y.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:l(y.text).replace("]|","~]|").replace("|$","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|$").getRegex()}),y.gfm.url=l(y.gfm.url,"i").replace("email",y.gfm._extended_email).getRegex(),y.breaks=h({},y.gfm,{br:l(y.br).replace("{2,}","*").getRegex(),text:l(y.gfm.text).replace("{2,}","*").getRegex()}),r.rules=y,r.output=function(e,t,n){var i=new r(t,n);return i.output(e)},r.prototype.output=function(e){for(var t,n,i,o,a,s,u="";e;)if(a=this.rules.escape.exec(e))e=e.substring(a[0].length),u+=c(a[1]);else if(a=this.rules.tag.exec(e))!this.inLink&&/^/i.test(a[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(a[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(a[0])&&(this.inRawBlock=!1),e=e.substring(a[0].length),u+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(a[0]):c(a[0]):a[0];else if(a=this.rules.link.exec(e)){var l=v(a[2],"()");if(l>-1){var f=a[2].length-l;a[2]=a[2].substring(0,l),a[0]=a[0].substring(0,a[0].length-f)}e=e.substring(a[0].length),this.inLink=!0,i=a[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i),t?(i=t[1],o=t[3]):o=""):o=a[3]?a[3].slice(1,-1):"",i=i.trim().replace(/^<([\s\S]*)>$/,"$1"),u+=this.outputLink(a,{href:r.escapes(i),title:r.escapes(o)}),this.inLink=!1}else if((a=this.rules.reflink.exec(e))||(a=this.rules.nolink.exec(e))){if(e=e.substring(a[0].length),t=(a[2]||a[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){u+=a[0].charAt(0),e=a[0].substring(1)+e;continue}this.inLink=!0,u+=this.outputLink(a,t),this.inLink=!1}else if(a=this.rules.strong.exec(e))e=e.substring(a[0].length),u+=this.renderer.strong(this.output(a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.em.exec(e))e=e.substring(a[0].length),u+=this.renderer.em(this.output(a[6]||a[5]||a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.code.exec(e))e=e.substring(a[0].length),u+=this.renderer.codespan(c(a[2].trim(),!0));else if(a=this.rules.br.exec(e))e=e.substring(a[0].length),u+=this.renderer.br();else if(a=this.rules.del.exec(e))e=e.substring(a[0].length),u+=this.renderer.del(this.output(a[1]));else if(a=this.rules.autolink.exec(e))e=e.substring(a[0].length),"@"===a[2]?(n=c(this.mangle(a[1])),i="mailto:"+n):(n=c(a[1]),i=n),u+=this.renderer.link(i,null,n);else if(this.inLink||!(a=this.rules.url.exec(e))){if(a=this.rules.text.exec(e))e=e.substring(a[0].length),u+=this.inRawBlock?this.renderer.text(a[0]):this.renderer.text(c(this.smartypants(a[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===a[2])n=c(a[0]),i="mailto:"+n;else{do s=a[0],a[0]=this.rules._backpedal.exec(a[0])[0];while(s!==a[0]);n=c(a[0]),i="www."===a[1]?"http://"+n:n}e=e.substring(a[0].length),u+=this.renderer.link(i,null,n)}return u},r.escapes=function(e){return e?e.replace(r.rules._escapes,"$1"):e},r.prototype.outputLink=function(e,t){var n=t.href,r=t.title?c(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,c(e[1]))},r.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},r.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,i=0;i.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},i.prototype.code=function(e,t,n){var r=(t||"").match(/\S*/)[0];if(this.options.highlight){var i=this.options.highlight(e,r);null!=i&&i!==e&&(n=!0,e=i)}return r?'
      '+(n?e:c(e,!0))+"
      \n":"
      "+(n?e:c(e,!0))+"
      "},i.prototype.blockquote=function(e){return"
      \n"+e+"
      \n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},i.prototype.hr=function(){return this.options.xhtml?"
      \n":"
      \n"},i.prototype.list=function(e,t,n){var r=t?"ol":"ul",i=t&&1!==n?' start="'+n+'"':"";return"<"+r+i+">\n"+e+"\n"},i.prototype.listitem=function(e){return"
    • "+e+"
    • \n"},i.prototype.checkbox=function(e){return" "},i.prototype.paragraph=function(e){return"

      "+e+"

      \n"},i.prototype.table=function(e,t){return t&&(t=""+t+""),"\n\n"+e+"\n"+t+"
      \n"},i.prototype.tablerow=function(e){return"\n"+e+"\n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' align="'+t.align+'">':"<"+n+">";return r+e+"\n"},i.prototype.strong=function(e){return""+e+""},i.prototype.em=function(e){return""+e+""},i.prototype.codespan=function(e){return""+e+""},i.prototype.br=function(){return this.options.xhtml?"
      ":"
      "},i.prototype.del=function(e){return""+e+""},i.prototype.link=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r='
      "},i.prototype.image=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r=''+n+'":">"},i.prototype.text=function(e){return e},o.prototype.strong=o.prototype.em=o.prototype.codespan=o.prototype.del=o.prototype.text=function(e){return e},o.prototype.link=o.prototype.image=function(e,t,n){return""+n},o.prototype.br=function(){return""},a.parse=function(e,t){var n=new a(t);return n.parse(e)},a.prototype.parse=function(e){this.inline=new r(e.links,this.options),this.inlineText=new r(e.links,h({},this.options,{renderer:new o})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},a.prototype.next=function(){return this.token=this.tokens.pop()},a.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},a.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},a.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,u(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,i="",o="";for(n="",e=0;e?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do this.seen[n]++,t=n+"-"+this.seen[n];while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},c.escapeTest=/[&<>"']/,c.escapeReplace=/[&<>"']/g,c.replacements={"&":"&","<":"<",">":">",'"':""","'":"'"},c.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,c.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var x={},k=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;p.exec=p,b.options=b.setOptions=function(e){return h(b.defaults,e),b},b.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new i,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},b.defaults=b.getDefaults(),b.Parser=a,b.parser=a.parse,b.Renderer=i,b.TextRenderer=o,b.Lexer=n,b.lexer=n.lex,b.InlineLexer=r,b.inlineLexer=r.output,b.Slugger=s,b.parse=b,e.exports=b}(this||("undefined"!=typeof window?window:t))}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(8),s=n(12),c=n(20),u=n(13),l=n(14),f=Object.assign({enabled:!1,type:"php-tar",packageName:"package",alwaysVisible:!1},l.download),d='
      \n download\n
      ',p=[],h=void 0,g=function(e){p=e.slice(0),p.length?h.show():f.alwaysVisible||h.hide()},m=function(){var e=f.type,t=f.packageName,n="shell-zip"===e?"zip":"tar";t||(t=1===p.length?p[0].label:c.getItem().label);var r={action:"download",as:t+"."+n,type:e,baseHref:c.getAbsHref(),hrefs:""};i(p,function(e,t){r["hrefs["+t+"]"]=e.absHref}),a.formRequest(r)},v=function(){f.enabled&&(h=o(d).hide().appTo("#toolbar").on("click",m),f.alwaysVisible&&h.show(),s.sub("selection",g))};v()},function(e,t,n){"use strict";var r=n(2),i=r.filter,o=r.debounce,a=r.parsePattern,s=r.dom,c=n(12),u=n(20),l=n(13),f=n(14),d=n(18),p=Object.assign({enabled:!1,advanced:!1,debounceTime:100,ignorecase:!0},f.filter),h='
      \n filter\n \n
      ',g=!1,m="",v=void 0,b=void 0,w=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e!==m){if(m=e,!e)return void d.setLocation();v.addCls("pending");var t=new RegExp(e,p.ignorecase?"i":""),n=i(u.getItem().content,function(e){return t.test(e.label)});v.rmCls("pending"),d.setHint("noMatch"),d.setItems(n)}},y=function(){g?(v.addCls("active"),b[0].focus(),w(a(b.val(),p.advanced))):(w(),v.rmCls("active"))},x=function(){g=!g,y()},k=function(){g=!1,b.val(""),y()},_=function(){p.enabled&&(v=s(h).appTo("#toolbar"),b=v.find("input"),v.find("img").on("click",x),b.on("keyup",o(y,p.debounceTime)),c.sub("location.changed",k))};_()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.map,i=n(12),o=n(14),a=e.window,s=Object.assign({enabled:!1,id:"UA-000000-0"},o["google-analytics-ua"]),c=function(){!function(e,t,n,r,i,o,a){e.GoogleAnalyticsObject=i,e[i]=e[i]||function(){(e[i].q=e[i].q||[]).push(arguments)},e[i].l=1*new Date,o=t.createElement(n),a=t.getElementsByTagName(n)[0],o.async=1,o.src=r,a.parentNode.insertBefore(o,a)}(window,document,"script","//www.google-analytics.com/analytics.js","ga")},u=function(){s.enabled&&(c(),a.ga("create",s.id,"auto"),i.sub("location.changed",function(e){var t=a.location;a.ga("send","pageview",{location:t.protocol+"//"+t.host+e.absHref,title:r(e.getCrumb(),function(e){return e.label}).join(" > ")})}))};u()}).call(t,function(){return this}())},function(e,t,n){(function(e){"use strict";var t=n(33),r=n(2),i=r.isNum,o=r.dom,a=n(12),s=n(19),c=n(13),u=n(14),l=n(16),f=Object.assign({enabled:!1,show:!1,qrcode:!0,qrColor:"#999"},u.info),d='
      \n
      \n
      \n
      \n
      \n
      \n
      \n ,\n \n
      \n
      \n
      \n
      ',p='
      \n

      Info

      \n
      \n view-info\n
      \n
      ',h="ext/info",g=void 0,m=void 0,v=void 0,b=void 0,w=void 0,y=void 0,x=void 0,k=void 0,_=void 0,C=function(){l.get(h)?(o("#view-info").addCls("active"),o("#info").show()):(o("#view-info").rmCls("active"),o("#info").hide())},S=function(n){var r=n.thumbRational||n.icon,o=!!n.thumbRational;if(!n.isCurrentFolder()&&r||(r=c.icon("folder")),g.attr("src",r),o?g.addCls("thumb"):g.rmCls("thumb"),m.text(n.label),i(n.time)?v.text(s.formatDate(n.time)):v.text("."),i(n.size)?(b.text(s.formatSize(n.size)),b.show()):b.hide(),n.isContentFetched){var a=n.getStats();y.text(a.folders),x.text(a.files),w.show()}else w.hide();if(f.qrcode){var u=e.window.location;k.clr().app(t({render:"image",size:200,fill:f.qrFill,back:f.qrBack,text:u.protocol+"//"+u.host+n.absHref,crisp:!0,quiet:1}))}},A=function(e){S(e)},T=function(){S(_)},E=function(e){_=e,S(_)},M=function(){if(f.enabled){var e=o(d).hide().appTo("#mainrow");g=e.find(".icon img"),m=e.find(".label"),v=e.find(".time"),b=e.find(".size"),w=e.find(".content"),y=e.find(".folders"),x=e.find(".files"),k=e.find(".qrcode"),f.qrcode||k.rm(),o(p).appTo("#sidebar").find("#view-info").on("click",function(e){l.put(h,!l.get(h)),C(),a.pub("resize"),e.preventDefault()}),"boolean"!=typeof l.get(h)&&l.put(h,f.show),C(),a.sub("location.changed",E),a.sub("item.mouseenter",A),a.sub("item.mouseleave",T)}};M()}).call(t,function(){return this}())},function(e,t,n){var r,i,o;!function(t,n){e.exports=n()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";var r=n(1),i=r.create_canvas,o=r.canvas_to_img,a=r.dpr,s=n(2),c=n(3),u=n(4);e.exports=function(e){var t=Object.assign({},s,e),n=c(t.text,t.ecLevel,t.minVersion,t.quiet),r=t.ratio||a,l=i(t.size,r),f=l.getContext("2d");return f.scale(r,r),u(n,f,t),"image"===t.render?o(l):l}},function(e,t){"use strict";var n=window,r=n.document,i=n.devicePixelRatio||1,o=function(e){return r.createElement(e)},a=function(e,t){return e.getAttribute(t)},s=function(e,t,n){return e.setAttribute(t,n)},c=function(e,t){var n=o("canvas");return s(n,"width",e*t),s(n,"height",e*t),n.style.width=e+"px",n.style.height=e+"px",n},u=function(e){var t=o("img");return s(t,"crossorigin","anonymous"),s(t,"src",e.toDataURL("image/png")),s(t,"width",a(e,"width")),s(t,"height",a(e,"height")),t.style.width=e.style.width,t.style.height=e.style.height,t};e.exports={create_canvas:c,canvas_to_img:u,dpr:i}},function(e,t){"use strict";e.exports={render:"image",crisp:!0,minVersion:1,ecLevel:"L",size:200,ratio:null,fill:"#333",back:"#fff",text:"no text",rounded:0,quiet:0,mode:"plain",mSize:30,mPosX:50,mPosY:50,label:"no label",fontname:"sans",fontcolor:"#333",image:null}},function(n,a){"use strict";var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=/code length overflow/i,u=function(){var n=function(){function e(t,n){if("undefined"==typeof t.length)throw new Error(t.length+"/"+n);var r=function(){for(var e=0;e=7&&_(e),null==g&&(g=T(l,f,m)),S(g,t)},w=function(e,t){for(var n=-1;n<=7;n+=1)if(!(e+n<=-1||p<=e+n))for(var r=-1;r<=7;r+=1)t+r<=-1||p<=t+r||(0<=n&&n<=6&&(0==r||6==r)||0<=r&&r<=6&&(0==n||6==n)||2<=n&&n<=4&&2<=r&&r<=4?d[e+n][t+r]=!0:d[e+n][t+r]=!1)},y=function(){for(var e=0,t=0,n=0;n<8;n+=1){b(!0,n);var r=o.getLostPoint(v);(0==n||e>r)&&(e=r,t=n)}return t},x=function(){for(var e=8;e>n&1);d[Math.floor(n/3)][n%3+p-8-3]=r}for(var n=0;n<18;n+=1){var r=!e&&1==(t>>n&1);d[n%3+p-8-3][Math.floor(n/3)]=r}},C=function(e,t){for(var n=f<<3|t,r=o.getBCHTypeInfo(n),i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<6?d[i][8]=a:i<8?d[i+1][8]=a:d[p-15+i][8]=a}for(var i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<8?d[8][p-i-1]=a:i<9?d[8][15-i-1+1]=a:d[8][15-i-1]=a}d[p-8][8]=!e},S=function(e,t){for(var n=-1,r=p-1,i=7,a=0,s=o.getMaskFunction(t),c=p-1;c>0;c-=2)for(6==c&&(c-=1);;){for(var u=0;u<2;u+=1)if(null==d[r][c-u]){var l=!1;a>>i&1));var f=s(r,c-u);f&&(l=!l),d[r][c-u]=l,i-=1,i==-1&&(a+=1,i=7)}if(r+=n,r<0||p<=r){r-=n,n=-n;break}}},A=function(t,n){for(var r=0,i=0,a=0,s=new Array(n.length),c=new Array(n.length),u=0;u=0?g.getAt(m):0}}for(var v=0,d=0;d8*d)throw new Error("code length overflow. ("+u.getLengthInBits()+">"+8*d+")");for(u.getLengthInBits()+4<=8*d&&u.put(0,4);u.getLengthInBits()%8!=0;)u.putBit(!1);for(;!(u.getLengthInBits()>=8*d)&&(u.put(i,8),!(u.getLengthInBits()>=8*d));)u.put(a,8);return A(u,r)};return v.addData=function(e){var t=u(e);m.push(t),g=null},v.isDark=function(e,t){if(e<0||p<=e||t<0||p<=t)throw new Error(e+","+t);return d[e][t]},v.getModuleCount=function(){return p},v.make=function(){b(!1,y())},v.createTableTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n="";n+='";for(var i=0;i';n+=""}return n+="",n+="
      "},v.createImgTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n=v.getModuleCount()*e+2*t,r=t,i=n-t;return h(n,n,function(t,n){if(r<=t&&t>>8),t.push(255&a)):t.push(r)}}return t}};var n={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},r={L:1,M:0,Q:3,H:2},i={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},o=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,o=7973,s=21522,c={},u=function(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t};return c.getBCHTypeInfo=function(e){for(var t=e<<10;u(t)-u(r)>=0;)t^=r<=0;)t^=o<5&&(n+=3+o-5)}for(var r=0;r=256;)t-=255;return e[t]},r}(),s=function(){var e=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(e,t){var n={};return n.totalCount=e,n.dataCount=t,n},n={},i=function(t,n){switch(n){case r.L:return e[4*(t-1)+0];case r.M:return e[4*(t-1)+1];case r.Q:return e[4*(t-1)+2];case r.H:return e[4*(t-1)+3];default:return}};return n.getRSBlocks=function(e,n){var r=i(e,n);if("undefined"==typeof r)throw new Error("bad rs block @ typeNumber:"+e+"/errorCorrectLevel:"+n);for(var o=r.length/3,a=new Array,s=0;s>>7-t%8&1)},n.put=function(e,t){for(var r=0;r>>t-r-1&1))},n.getLengthInBits=function(){return t},n.putBit=function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1},n},u=function(e){var r=n.MODE_8BIT_BYTE,i=t.stringToBytes(e),o={};return o.getMode=function(){return r},o.getLength=function(e){return i.length},o.write=function(e){for(var t=0;t>>8)},t.writeBytes=function(e,n,r){n=n||0,r=r||e.length;for(var i=0;i0&&(t+=","),t+=e[n];return t+="]"},t},f=function(){var e=0,t=0,n=0,r="",i={},o=function(e){r+=String.fromCharCode(a(63&e))},a=function(e){if(e<0);else{if(e<26)return 65+e;if(e<52)return 97+(e-26);if(e<62)return 48+(e-52);if(62==e)return 43;if(63==e)return 47}throw new Error("n:"+e)};return i.writeByte=function(r){for(e=e<<8|255&r,t+=8,n+=1;t>=6;)o(e>>>t-6),t-=6},i.flush=function(){if(t>0&&(o(e<<6-t),e=0,t=0),n%3!=0)for(var i=3-n%3,a=0;a=t.length){if(0==i)return-1;throw new Error("unexpected end of file./"+i)}var e=t.charAt(n);if(n+=1,"="==e)return i=0,-1;e.match(/^\s$/)||(r=r<<6|a(e.charCodeAt(0)),i+=6)}var o=r>>>i-8&255;return i-=8,o};var a=function(e){if(65<=e&&e<=90)return e-65;if(97<=e&&e<=122)return e-97+26;if(48<=e&&e<=57)return e-48+52;if(43==e)return 62;if(47==e)return 63;throw new Error("c:"+e)};return o},p=function(e,t){var n=e,r=t,i=new Array(e*t),o={};o.setPixel=function(e,t,r){i[t*n+e]=r},o.write=function(e){e.writeString("GIF87a"),e.writeShort(n),e.writeShort(r),e.writeByte(128),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(255),e.writeByte(255),e.writeByte(255),e.writeString(","),e.writeShort(0),e.writeShort(0),e.writeShort(n),e.writeShort(r),e.writeByte(0);var t=2,i=s(t);e.writeByte(t);for(var o=0;i.length-o>255;)e.writeByte(255),e.writeBytes(i,o,255),o+=255;e.writeByte(i.length-o),e.writeBytes(i,o,i.length-o),e.writeByte(0),e.writeString(";")};var a=function(e){var t=e,n=0,r=0,i={};return i.write=function(e,i){if(e>>>i!=0)throw new Error("length over");for(;n+i>=8;)t.writeByte(255&(e<>>=8-n,r=0,n=0;r|=e<0&&t.writeByte(r)},i},s=function(e){for(var t=1<>6,128|63&r):r<55296||r>=57344?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t}return t(e)}}(n),n}(),l=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;n=Math.max(1,n);for(var r=n;r<=40;r+=1)try{var i=function(){var n=u(r,t);n.addData(e),n.make();var i=n.getModuleCount(),o=function(e,t){return e>=0&&e=0&&t0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"L",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=l(e,t,n);if(i){var o=i.isDark;i.moduleCount+=2*r,i.isDark=function(e,t){return o(e-r,t-r)}}return i};n.exports=f},function(e,t,n){"use strict";var r=n(5),i=n(6),o=function(e,t){e.fillStyle=t.back,e.fillRect(0,0,t.size,t.size)},a=function(e,t,n,r,i,o){e.isDark(i,o)&&t.rect(o*r,i*r,r,r)},s=function(e,t,n){if(e){var i=n.rounded>0&&n.rounded<=100?r:a,o=e.moduleCount,s=n.size/o,c=0;n.crisp&&(s=Math.floor(s),c=Math.floor((n.size-s*o)/2)),t.translate(c,c),t.beginPath();for(var u=0;u2&&e[i.substr(0,2)]&&(t=i.substr(0,2)))}e[t]||(t="en"),x(t).then(y)},_=function(e){var t=o(g),n=t.find("select").on("change",function(t){var n=t.target.value;f.put(v,n),k(e,n,!1)});r(e,function(e,t){o(m).attr("value",t).addCls(t).text(t+" - "+(i(e)?e:e.lang)).appTo(n)}),t.appTo("#sidebar")},C=function(){p.enabled&&_(u),s.sub("view.changed",function(){k(u,p.lang,p.useBrowserLang)})};C()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(7),i=r.langs;e.exports=Object.assign({},i)},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.dom,i=t.awaitLoad,o=n(12),a=n(14),s=e.window,c=Object.assign({enabled:!1,baseURL:"not-set",idSite:0},a["piwik-analytics"]),u=function(){if(c.enabled){var e=("https:"===s.location.protocol?"https://":"http://")+c.baseURL+"/",t=[],n=null;r("").attr("src",e+"piwik.js").appTo("body"),i().then(function(){if(n=s.Piwik&&s.Piwik.getTracker(e+"piwik.php",c.idSite))for(n.enableLinkTracking();t.length;)n.trackPageView(t.shift())}),o.sub("location.changed",function(e){var r=e.getCrumb().map(function(e){return e.label}).join(" > ");n?n.trackPageView(r):t.push(r)})}};u()}).call(t,function(){return this}())},function(e,t,n){"use strict";n(38),n(39),n(40),n(41),n(43)},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.isFn,a=r.dom,s=r.includes,c=r.compact,u=n(12),l=n(13),f=n(14),d=n(16),p=t.window,h=Object.assign({enabled:!0},f.preview),g='
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      ',m="ext/preview",v=d.get(m)||!1,b=null,w=!1,y=null,x=null,k=function(){var e=a("#pv-container"),t=e[0],n=e.children()[0];if(t&&n){var r=t.offsetWidth,i=t.offsetHeight,o=n.offsetWidth,s=n.offsetHeight;a(n).css({left:.5*(r-o)+"px",top:.5*(i-s)+"px"})}},_=function(){var e=p.document.documentElement,t=e.clientWidth,n=e.clientHeight,r=v?0:20,i=v?0:48;a("#pv-container").css({width:t-2*r+"px",height:n-2*r-i+"px",left:r+"px",top:r+"px"}),a("#pv-spinner").css({left:.5*t+"px",top:.5*n+"px"}),v?(a("#pv-overlay").addCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-no-fullscreen"))):(a("#pv-overlay").rmCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-fullscreen"))),k(),o(x&&x.adjust)&&x.adjust()},C=function(e,t){a("#pv-bar-idx").text(e+"/"+t).show()},S=function(e){a("#pv-bar-raw").show().find("a").attr("href",e)},A=function(e){a("#pv-buttons .bar-left").rm(),i(e,function(e){a("
    • ").addCls("bar-left").addCls("bar-label").text(e).appTo("#pv-buttons")})},T=function(){var e=a("#pv-overlay .hof");p.clearTimeout(b),e.show(),v&&(b=p.setTimeout(function(){return e.hide()},2e3))},E=function(){return x&&x.moveIdx(1)},M=function(){return x&&x.moveIdx(-1)},D=function(){v=!v,d.put(m,v),T(),_()},P=function(e){e.stopPropagation(),e.preventDefault()},z=function(e){var t=e.keyCode;27===t?(P(e),$()):8===t||37===t?(P(e),M()):13===t||32===t||39===t?(P(e),E()):70===t&&(P(e),D())},L=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").show(),a(p).on("keydown",z),_()},$=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").hide(),a(p).off("keydown",z)},H=function e(t,n,r){p.clearTimeout(y);var i=a("#pv-spinner");if(!t)return w=!1,void i.hide();if(!w&&r)return void(y=p.setTimeout(function(){return e(!0,n)},r));var o=i.find(".back");n?o.attr("src",n).show():o.hide(),w=!0,i.show()},O=function e(t,n,r,i){var o=Object.assign(Object.create(e.prototype),{items:t,load:r,adjust:i});return o.setIdx(n),o};O.prototype={setIdx:function(e){var t=this;this.idx=(e+this.items.length)%this.items.length,this.item=this.items[this.idx],C(this.idx+1,this.items.length),S(this.item.absHref),A([this.item.label]);var n=this.item;Promise.resolve().then(function(){i(a("#pv-container *"),function(e){"function"==typeof e.unload&&e.unload()}),a("#pv-container").hide().clr(),H(!0,n.thumbSquare||n.icon,200)}).then(function(){return t.load(n)}).then(function(e){n===t.item&&(a("#pv-container").clr().app(e).show(),H(!1),_())})},moveIdx:function(e){this.setIdx(this.idx+e)}};var B=function(e,t,n){var r=function(r){r.$view&&s(e,r.type)&&r.$view.find("a").on("click",function(i){i.preventDefault();var o=c(a("#items .item").map(function(t){var n=t._item;return s(e,n.type)?n:null}));x=O(o,o.indexOf(r),t,n),L()})};u.sub("view.changed",function(e){return i(e,r)})},R=function(){h.enabled&&(a(g).hide().appTo("body").on("keydown",z).on("mousemove",T).on("mousedown",T).on("click",function(e){"pv-overlay"!==e.target.id&&"pv-container"!==e.target.id||$()}).on("mousedown",P).on("mousemove",P).on("keydown",P).on("keypress",P),a("#pv-spinner").hide(),a("#pv-bar-prev, #pv-prev-area").on("click",M),a("#pv-bar-next, #pv-next-area").on("click",E),a("#pv-bar-close").on("click",$),a("#pv-bar-fullscreen").on("click",D),a(p).on("resize",_).on("load",_))};e.exports={setLabels:A,register:B,get item(){return x&&x.item}},R()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(19),a=n(14),s=n(38),c=Object.assign({enabled:!1,autoplay:!0,types:[]},a["preview-aud"]),u='