commit a1e49121cc22c4a3954fc6b3836e29012e5f72ad
Author: paulmataruso
Date: Sat Oct 26 20:34:27 2024 +0000
First Upload
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..984897a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+Docker-Compose stack with nginx, php-fpm and h5ai file server. This stack will expose the
+entiree /var/nginx folder, the html webroot folder, and the /var/log/nginx folder to the host.
+nginx is linked to php-fpm, and php-fpm container exposed on "php-fpm:9000" (EG "fpm container name:fpm port")
+
+Copy .env.example to .env and define
+
+HTTP_PORT=8888
+HTTPS_PORT=8889
+
+Use whatever ports you need to.
+
+You will need to chmod -R 777 ./docker-persist to avoid some file access issuies.
+
+Edit the /docker-persist/nginx/conf.d/h5ai.conf file to reflect the correct hostname you want, if you need to.
+
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..3d10bc7
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,21 @@
+version: '3'
+
+services:
+ nginx:
+ image: nginx:latest
+ ports:
+ - ${HTTP_PORT}:80
+ - ${HTTPS_PORT}:443
+ volumes:
+ - ./docker-persist/html:/usr/share/nginx/html #Expose HTML webroot to host
+ - ./docker-persist/nginx:/etc/nginx #Expose nging conf folder to host
+ - ./docker-persist/log:/var/log/nginx #Expose nginx log folder to host
+ restart: always
+ links:
+ - php-fpm
+ php-fpm:
+ image: php:8-fpm
+ volumes:
+ - ./docker-persist/html:/usr/share/nginx/html #Expose HTML webroot to php-fpm
+ restart: always
+
diff --git a/docker-persist/html/TESTfile.txt b/docker-persist/html/TESTfile.txt
new file mode 100755
index 0000000..93e9139
--- /dev/null
+++ b/docker-persist/html/TESTfile.txt
@@ -0,0 +1,2 @@
+this is a test file to show everything is working
+---
diff --git a/docker-persist/html/_h5ai/.htaccess b/docker-persist/html/_h5ai/.htaccess
new file mode 100755
index 0000000..95e775b
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/cache/README.md b/docker-persist/html/_h5ai/private/cache/README.md
new file mode 100755
index 0000000..60bc416
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/cache/cmds.json b/docker-persist/html/_h5ai/private/cache/cmds.json
new file mode 100644
index 0000000..4263d9e
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/cache/cmds.json
@@ -0,0 +1 @@
+{"command":true,"which":true,"where":false,"avconv":false,"convert":false,"du":true,"ffmpeg":false,"gm":false,"tar":true,"zip":false}
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/private/conf/l10n/af.json b/docker-persist/html/_h5ai/private/conf/l10n/af.json
new file mode 100755
index 0000000..5150c7b
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/bg.json b/docker-persist/html/_h5ai/private/conf/l10n/bg.json
new file mode 100755
index 0000000..6808e62
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/cs.json b/docker-persist/html/_h5ai/private/conf/l10n/cs.json
new file mode 100755
index 0000000..1e34e61
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/da.json b/docker-persist/html/_h5ai/private/conf/l10n/da.json
new file mode 100755
index 0000000..3b8fa06
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/de.json b/docker-persist/html/_h5ai/private/conf/l10n/de.json
new file mode 100755
index 0000000..6d8c613
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/el.json b/docker-persist/html/_h5ai/private/conf/l10n/el.json
new file mode 100755
index 0000000..2d9c00d
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/en.json b/docker-persist/html/_h5ai/private/conf/l10n/en.json
new file mode 100755
index 0000000..05e9b4e
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/es.json b/docker-persist/html/_h5ai/private/conf/l10n/es.json
new file mode 100755
index 0000000..e42a5b9
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/et.json b/docker-persist/html/_h5ai/private/conf/l10n/et.json
new file mode 100755
index 0000000..8f3d1dc
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/fi.json b/docker-persist/html/_h5ai/private/conf/l10n/fi.json
new file mode 100755
index 0000000..c19c0ed
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/fr.json b/docker-persist/html/_h5ai/private/conf/l10n/fr.json
new file mode 100755
index 0000000..9a4ac45
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/he.json b/docker-persist/html/_h5ai/private/conf/l10n/he.json
new file mode 100755
index 0000000..bb37f7f
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/hi.json b/docker-persist/html/_h5ai/private/conf/l10n/hi.json
new file mode 100755
index 0000000..5941733
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/hr.json b/docker-persist/html/_h5ai/private/conf/l10n/hr.json
new file mode 100755
index 0000000..c044db4
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/hu.json b/docker-persist/html/_h5ai/private/conf/l10n/hu.json
new file mode 100755
index 0000000..b2c1b34
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/id.json b/docker-persist/html/_h5ai/private/conf/l10n/id.json
new file mode 100755
index 0000000..1987f59
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/conf/l10n/id.json
@@ -0,0 +1,22 @@
+{
+ "lang": "Bahasa Indonesia",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "rincian",
+ "download": "unduh",
+ "empty": "kosong",
+ "files": "berkas",
+ "filter": "saring",
+ "folders": "pelipat",
+ "grid": "jaring",
+ "icons": "ikon",
+ "language": "Bahasa",
+ "lastModified": "Di modifikasi",
+ "name": "Nama",
+ "noMatch": "tidak cocok",
+ "parentDirectory": "Direktori induk",
+ "search": "cari",
+ "size": "Ukuran",
+ "tree": "Pohon",
+ "view": "Tampil"
+}
diff --git a/docker-persist/html/_h5ai/private/conf/l10n/it.json b/docker-persist/html/_h5ai/private/conf/l10n/it.json
new file mode 100755
index 0000000..4547c62
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/conf/l10n/it.json
@@ -0,0 +1,22 @@
+{
+ "lang": "italiano",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "dettagli",
+ "download": "download",
+ "empty": "vuota",
+ "files": "file",
+ "filter": "filtra",
+ "folders": "cartelle",
+ "grid": "griglia",
+ "icons": "icone",
+ "language": "Linugua",
+ "lastModified": "Ultima modifica",
+ "name": "Nome",
+ "noMatch": "nessun risultato",
+ "parentDirectory": "Cartella Superiore",
+ "search": "cerca",
+ "size": "Dimensione",
+ "tree": "Albero",
+ "view": "Vista"
+}
diff --git a/docker-persist/html/_h5ai/private/conf/l10n/ja.json b/docker-persist/html/_h5ai/private/conf/l10n/ja.json
new file mode 100755
index 0000000..88266e7
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/ko.json b/docker-persist/html/_h5ai/private/conf/l10n/ko.json
new file mode 100755
index 0000000..8c48cdb
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/lv.json b/docker-persist/html/_h5ai/private/conf/l10n/lv.json
new file mode 100755
index 0000000..fa672ce
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/nb.json b/docker-persist/html/_h5ai/private/conf/l10n/nb.json
new file mode 100755
index 0000000..44a1797
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/nl.json b/docker-persist/html/_h5ai/private/conf/l10n/nl.json
new file mode 100755
index 0000000..8310f05
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/pl.json b/docker-persist/html/_h5ai/private/conf/l10n/pl.json
new file mode 100755
index 0000000..da56967
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/pt-br.json b/docker-persist/html/_h5ai/private/conf/l10n/pt-br.json
new file mode 100755
index 0000000..1b0d609
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/conf/l10n/pt-br.json
@@ -0,0 +1,22 @@
+{
+ "lang": "português do Brasil",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "detalhes",
+ "download": "download",
+ "empty": "vazio",
+ "files": "arquivos",
+ "filter": "filtro",
+ "folders": "pastas",
+ "grid": "grade",
+ "icons": "ícones",
+ "language": "Idioma",
+ "lastModified": "Última modificação",
+ "name": "Nome",
+ "noMatch": "sem resultados",
+ "parentDirectory": "Diretório acima",
+ "search": "pesquisa",
+ "size": "Tamanho",
+ "tree": "Árvore",
+ "view": "Visualização"
+}
diff --git a/docker-persist/html/_h5ai/private/conf/l10n/pt-pt.json b/docker-persist/html/_h5ai/private/conf/l10n/pt-pt.json
new file mode 100755
index 0000000..bc95686
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/conf/l10n/pt-pt.json
@@ -0,0 +1,22 @@
+{
+ "lang": "português de Portugal",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "detalhes",
+ "download": "descarregar",
+ "empty": "vazio",
+ "files": "arquivos",
+ "filter": "filtro",
+ "folders": "pastas",
+ "grid": "grelha",
+ "icons": "ícones",
+ "language": "Idioma",
+ "lastModified": "última modificação",
+ "name": "Nome",
+ "noMatch": "sem resultados",
+ "parentDirectory": "Diretório acima",
+ "search": "pesquisa",
+ "size": "Tamanho",
+ "tree": "Árvore",
+ "view": "Visualização"
+}
diff --git a/docker-persist/html/_h5ai/private/conf/l10n/ro.json b/docker-persist/html/_h5ai/private/conf/l10n/ro.json
new file mode 100755
index 0000000..4981dfe
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/ru.json b/docker-persist/html/_h5ai/private/conf/l10n/ru.json
new file mode 100755
index 0000000..8056a0d
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sk.json b/docker-persist/html/_h5ai/private/conf/l10n/sk.json
new file mode 100755
index 0000000..cfc9e45
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sl.json b/docker-persist/html/_h5ai/private/conf/l10n/sl.json
new file mode 100755
index 0000000..5cdda21
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sr.json b/docker-persist/html/_h5ai/private/conf/l10n/sr.json
new file mode 100755
index 0000000..845eeab
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sv.json b/docker-persist/html/_h5ai/private/conf/l10n/sv.json
new file mode 100755
index 0000000..75638e5
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/tr.json b/docker-persist/html/_h5ai/private/conf/l10n/tr.json
new file mode 100755
index 0000000..45cfc92
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/uk.json b/docker-persist/html/_h5ai/private/conf/l10n/uk.json
new file mode 100755
index 0000000..62908f5
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/zh-cn.json b/docker-persist/html/_h5ai/private/conf/l10n/zh-cn.json
new file mode 100755
index 0000000..7cdba51
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/zh-tw.json b/docker-persist/html/_h5ai/private/conf/l10n/zh-tw.json
new file mode 100755
index 0000000..7567f0d
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/options.json b/docker-persist/html/_h5ai/private/conf/options.json
new file mode 100755
index 0000000..384d8de
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/conf/options.json
@@ -0,0 +1,397 @@
+/* h5ai v0.30.0 - 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/public/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.
+
+ - stopSearchingAtRoot: boolean, only search for header and footer files until the web root
+ directory. if `false`, will search for header/footer up the entire directory structure,
+ even above the web root
+ */
+ "custom": {
+ "enabled": true,
+ "stopSearchingAtRoot": 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/public/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/docker-persist/html/_h5ai/private/conf/types.json b/docker-persist/html/_h5ai/private/conf/types.json
new file mode 100755
index 0000000..faaffae
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/conf/types.json
@@ -0,0 +1,76 @@
+/* h5ai v0.30.0 - 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/docker-persist/html/_h5ai/private/php/class-bootstrap.php b/docker-persist/html/_h5ai/private/php/class-bootstrap.php
new file mode 100755
index 0000000..4356523
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-api.php b/docker-persist/html/_h5ai/private/php/core/class-api.php
new file mode 100755
index 0000000..d850e65
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/php/core/class-api.php
@@ -0,0 +1,110 @@
+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);
+ session_write_close();
+ 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/docker-persist/html/_h5ai/private/php/core/class-context.php b/docker-persist/html/_h5ai/private/php/core/class-context.php
new file mode 100755
index 0000000..0a72cea
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/php/core/class-context.php
@@ -0,0 +1,304 @@
+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) {
+ if (!in_array($iso_code, Context::$L10N_ISO_CODES)) {
+ continue;
+ }
+
+ $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/docker-persist/html/_h5ai/private/php/core/class-fallback.php b/docker-persist/html/_h5ai/private/php/core/class-fallback.php
new file mode 100755
index 0000000..7bd317f
--- /dev/null
+++ b/docker-persist/html/_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 .= 'Name ';
+ $html .= 'Last modified ';
+ $html .= 'Size ';
+ $html .= ' ';
+
+ if ($folder->get_parent($cache)) {
+ $html .= '';
+ $html .= ' ';
+ $html .= 'Parent Directory ';
+ $html .= ' ';
+ $html .= ' ';
+ $html .= ' ';
+ }
+
+ foreach ($items as $item) {
+ $type = $item->is_folder ? 'folder' : 'file';
+
+ $html .= '';
+ $html .= ' ';
+ $html .= '' . basename($item->path) . ' ';
+ $html .= '' . date('Y-m-d H:i', $item->date) . ' ';
+ $html .= '' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . ' ';
+ $html .= ' ';
+ }
+
+ $html .= '
';
+
+ return $html;
+ }
+}
diff --git a/docker-persist/html/_h5ai/private/php/core/class-filesize.php b/docker-persist/html/_h5ai/private/php/core/class-filesize.php
new file mode 100755
index 0000000..477f9e2
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-item.php b/docker-persist/html/_h5ai/private/php/core/class-item.php
new file mode 100755
index 0000000..2b9ce34
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-json.php b/docker-persist/html/_h5ai/private/php/core/class-json.php
new file mode 100755
index 0000000..f662b9f
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-session.php b/docker-persist/html/_h5ai/private/php/core/class-session.php
new file mode 100755
index 0000000..630d78f
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-setup.php b/docker-persist/html/_h5ai/private/php/core/class-setup.php
new file mode 100755
index 0000000..cbb85f8
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/php/core/class-setup.php
@@ -0,0 +1,188 @@
+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');
+ $cmds['where'] = Util::exec_0('where where.exe');
+
+ $cmd = false;
+ if ($cmds['command']) {
+ $cmd = 'command -v';
+ } elseif ($cmds['which']) {
+ $cmd = 'which';
+ } elseif ($cmds['where']) {
+ $cmd = 'where';
+ }
+
+ 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/docker-persist/html/_h5ai/private/php/core/class-theme.php b/docker-persist/html/_h5ai/private/php/core/class-theme.php
new file mode 100755
index 0000000..8fcaddd
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-util.php b/docker-persist/html/_h5ai/private/php/core/class-util.php
new file mode 100755
index 0000000..ce6c802
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/ext/class-archive.php b/docker-persist/html/_h5ai/private/php/ext/class-archive.php
new file mode 100755
index 0000000..e1d9001
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/php/ext/class-archive.php
@@ -0,0 +1,188 @@
+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) {
+ if (!is_array($hrefs)) {
+ $hrefs = array($hrefs);
+ }
+
+ foreach ($hrefs as $href) {
+ if (trim($href) === '') {
+ continue;
+ }
+
+ $href = Util::normalize_path($href, false);
+ $d = dirname($href);
+ $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/docker-persist/html/_h5ai/private/php/ext/class-custom.php b/docker-persist/html/_h5ai/private/php/ext/class-custom.php
new file mode 100755
index 0000000..1a84bd2
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/php/ext/class-custom.php
@@ -0,0 +1,73 @@
+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;
+ }
+
+ // Stop once we reach the root
+ if (
+ $this->context->query_option('custom.stopSearchingAtRoot', true) &&
+ $path === $this->context->get_setup()->get('ROOT_PATH')
+ ) {
+ break;
+ }
+ $path = $parent_path;
+ }
+
+ return [
+ 'header' => ['content' => $header, 'type' => $header_type],
+ 'footer' => ['content' => $footer, 'type' => $footer_type]
+ ];
+ }
+}
diff --git a/docker-persist/html/_h5ai/private/php/ext/class-search.php b/docker-persist/html/_h5ai/private/php/ext/class-search.php
new file mode 100755
index 0000000..124954d
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/ext/class-thumb.php b/docker-persist/html/_h5ai/private/php/ext/class-thumb.php
new file mode 100755
index 0000000..d52d3e8
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/pages/index.php b/docker-persist/html/_h5ai/private/php/pages/index.php
new file mode 100755
index 0000000..be2aabd
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/php/pages/index.php
@@ -0,0 +1,2 @@
+index - powered by h5ai v0.30.0 (https://larsjung.de/h5ai/)
+= $x_head_tags; ?>= $fallback_html; ?>
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/private/php/pages/info.php b/docker-persist/html/_h5ai/private/php/pages/info.php
new file mode 100755
index 0000000..9f46f14
--- /dev/null
+++ b/docker-persist/html/_h5ai/private/php/pages/info.php
@@ -0,0 +1,2 @@
+h5ai info page - v0.30.0
+= $x_head_tags; ?>
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/.htaccess b/docker-persist/html/_h5ai/public/.htaccess
new file mode 100755
index 0000000..3f14990
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/cache/README.md b/docker-persist/html/_h5ai/public/cache/README.md
new file mode 100755
index 0000000..fd2974c
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/css/styles.css b/docker-persist/html/_h5ai/public/css/styles.css
new file mode 100755
index 0000000..4edf3ff
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/css/styles.css
@@ -0,0 +1,2 @@
+/* h5ai v0.30.0 - 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;image-orientation:from-image;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{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;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%;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/docker-persist/html/_h5ai/public/ext/README.md b/docker-persist/html/_h5ai/public/ext/README.md
new file mode 100755
index 0000000..7f9460c
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/images/fallback/file.png b/docker-persist/html/_h5ai/public/images/fallback/file.png
new file mode 100755
index 0000000..c796a82
Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/fallback/file.png differ
diff --git a/docker-persist/html/_h5ai/public/images/fallback/folder-parent.png b/docker-persist/html/_h5ai/public/images/fallback/folder-parent.png
new file mode 100755
index 0000000..38da20d
Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/fallback/folder-parent.png differ
diff --git a/docker-persist/html/_h5ai/public/images/fallback/folder.png b/docker-persist/html/_h5ai/public/images/fallback/folder.png
new file mode 100755
index 0000000..d4722e7
Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/fallback/folder.png differ
diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-152.png b/docker-persist/html/_h5ai/public/images/favicon/favicon-152.png
new file mode 100755
index 0000000..3666dfc
Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-152.png differ
diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-16-32.ico b/docker-persist/html/_h5ai/public/images/favicon/favicon-16-32.ico
new file mode 100755
index 0000000..be17223
Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-16-32.ico differ
diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-16.png b/docker-persist/html/_h5ai/public/images/favicon/favicon-16.png
new file mode 100755
index 0000000..d7dd0f9
Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-16.png differ
diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-32.png b/docker-persist/html/_h5ai/public/images/favicon/favicon-32.png
new file mode 100755
index 0000000..2f97d12
Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-32.png differ
diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon.svg b/docker-persist/html/_h5ai/public/images/favicon/favicon.svg
new file mode 100755
index 0000000..489efbe
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/favicon/favicon.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/README.md b/docker-persist/html/_h5ai/public/images/themes/README.md
new file mode 100755
index 0000000..650e0f7
--- /dev/null
+++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/images/themes/comity/ar-apk.svg b/docker-persist/html/_h5ai/public/images/themes/comity/ar-apk.svg
new file mode 100755
index 0000000..a7cc5cd
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/ar-apk.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/ar-deb.svg b/docker-persist/html/_h5ai/public/images/themes/comity/ar-deb.svg
new file mode 100755
index 0000000..f1efae9
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/ar-deb.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/ar-rpm.svg b/docker-persist/html/_h5ai/public/images/themes/comity/ar-rpm.svg
new file mode 100755
index 0000000..4146098
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/ar-rpm.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-css.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-css.svg
new file mode 100755
index 0000000..487a535
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-css.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-go.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-go.svg
new file mode 100755
index 0000000..0d21bb0
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-go.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-html.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-html.svg
new file mode 100755
index 0000000..356e855
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-html.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-js.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-js.svg
new file mode 100755
index 0000000..91a3279
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-js.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-less.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-less.svg
new file mode 100755
index 0000000..fd15b02
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-less.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-md.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-md.svg
new file mode 100755
index 0000000..a2fba14
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-md.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-php.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-php.svg
new file mode 100755
index 0000000..84e1e22
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-php.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-py.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-py.svg
new file mode 100755
index 0000000..d5dc003
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-py.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-rb.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rb.svg
new file mode 100755
index 0000000..a642dc2
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rb.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-rust.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rust.svg
new file mode 100755
index 0000000..0a71e77
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rust.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-script.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-script.svg
new file mode 100755
index 0000000..f8704e8
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-script.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/x-pdf.svg b/docker-persist/html/_h5ai/public/images/themes/comity/x-pdf.svg
new file mode 100755
index 0000000..5266630
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/comity/x-pdf.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/ar.svg b/docker-persist/html/_h5ai/public/images/themes/default/ar.svg
new file mode 100755
index 0000000..e25cded
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/ar.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/aud.svg b/docker-persist/html/_h5ai/public/images/themes/default/aud.svg
new file mode 100755
index 0000000..dd955fc
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/aud.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/bin.svg b/docker-persist/html/_h5ai/public/images/themes/default/bin.svg
new file mode 100755
index 0000000..34f1f45
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/bin.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/file.svg b/docker-persist/html/_h5ai/public/images/themes/default/file.svg
new file mode 100755
index 0000000..66bcac7
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/file.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/folder-page.svg b/docker-persist/html/_h5ai/public/images/themes/default/folder-page.svg
new file mode 100755
index 0000000..4ca3ec2
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/folder-page.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/folder-parent.svg b/docker-persist/html/_h5ai/public/images/themes/default/folder-parent.svg
new file mode 100755
index 0000000..e114689
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/folder-parent.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/folder.svg b/docker-persist/html/_h5ai/public/images/themes/default/folder.svg
new file mode 100755
index 0000000..3e971cf
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/folder.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/img.svg b/docker-persist/html/_h5ai/public/images/themes/default/img.svg
new file mode 100755
index 0000000..e754e82
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/img.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/txt.svg b/docker-persist/html/_h5ai/public/images/themes/default/txt.svg
new file mode 100755
index 0000000..d5c0dc9
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/txt.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/vid.svg b/docker-persist/html/_h5ai/public/images/themes/default/vid.svg
new file mode 100755
index 0000000..dd955fc
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/vid.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/themes/default/x.svg b/docker-persist/html/_h5ai/public/images/themes/default/x.svg
new file mode 100755
index 0000000..66bcac7
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/themes/default/x.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/back.svg b/docker-persist/html/_h5ai/public/images/ui/back.svg
new file mode 100755
index 0000000..3275e21
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/back.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/crumb.svg b/docker-persist/html/_h5ai/public/images/ui/crumb.svg
new file mode 100755
index 0000000..8dfd404
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/crumb.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/download.svg b/docker-persist/html/_h5ai/public/images/ui/download.svg
new file mode 100755
index 0000000..5721c4e
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/download.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/filter.svg b/docker-persist/html/_h5ai/public/images/ui/filter.svg
new file mode 100755
index 0000000..3e5f19a
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/filter.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/docker-persist/html/_h5ai/public/images/ui/info-toggle.svg b/docker-persist/html/_h5ai/public/images/ui/info-toggle.svg
new file mode 100755
index 0000000..ebc0e5c
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/info-toggle.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/paypal.svg b/docker-persist/html/_h5ai/public/images/ui/paypal.svg
new file mode 100755
index 0000000..a17415e
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/paypal.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-close.svg b/docker-persist/html/_h5ai/public/images/ui/preview-close.svg
new file mode 100755
index 0000000..ef5f8a0
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/preview-close.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-fullscreen.svg b/docker-persist/html/_h5ai/public/images/ui/preview-fullscreen.svg
new file mode 100755
index 0000000..bf04ad7
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/preview-fullscreen.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-next.svg b/docker-persist/html/_h5ai/public/images/ui/preview-next.svg
new file mode 100755
index 0000000..1b72100
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/preview-next.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-no-fullscreen.svg b/docker-persist/html/_h5ai/public/images/ui/preview-no-fullscreen.svg
new file mode 100755
index 0000000..d2a3efb
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/preview-no-fullscreen.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-prev.svg b/docker-persist/html/_h5ai/public/images/ui/preview-prev.svg
new file mode 100755
index 0000000..a592b22
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/preview-prev.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-raw.svg b/docker-persist/html/_h5ai/public/images/ui/preview-raw.svg
new file mode 100755
index 0000000..7a8a69d
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/preview-raw.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/search.svg b/docker-persist/html/_h5ai/public/images/ui/search.svg
new file mode 100755
index 0000000..d6d4c78
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/search.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/selected.svg b/docker-persist/html/_h5ai/public/images/ui/selected.svg
new file mode 100755
index 0000000..50ac249
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/selected.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/sidebar.svg b/docker-persist/html/_h5ai/public/images/ui/sidebar.svg
new file mode 100755
index 0000000..4e38c05
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/sidebar.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/sort.svg b/docker-persist/html/_h5ai/public/images/ui/sort.svg
new file mode 100755
index 0000000..5b0ed8d
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/sort.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/spinner.svg b/docker-persist/html/_h5ai/public/images/ui/spinner.svg
new file mode 100755
index 0000000..a5f7a7b
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/spinner.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/docker-persist/html/_h5ai/public/images/ui/tree-indicator.svg b/docker-persist/html/_h5ai/public/images/ui/tree-indicator.svg
new file mode 100755
index 0000000..8dfd404
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/tree-indicator.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/tree-toggle.svg b/docker-persist/html/_h5ai/public/images/ui/tree-toggle.svg
new file mode 100755
index 0000000..9914792
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/tree-toggle.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/view-details.svg b/docker-persist/html/_h5ai/public/images/ui/view-details.svg
new file mode 100755
index 0000000..5e756e0
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/view-details.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/view-grid.svg b/docker-persist/html/_h5ai/public/images/ui/view-grid.svg
new file mode 100755
index 0000000..8f4c48c
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/view-grid.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/images/ui/view-icons.svg b/docker-persist/html/_h5ai/public/images/ui/view-icons.svg
new file mode 100755
index 0000000..8601293
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/images/ui/view-icons.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docker-persist/html/_h5ai/public/index.php b/docker-persist/html/_h5ai/public/index.php
new file mode 100755
index 0000000..6fb89c3
--- /dev/null
+++ b/docker-persist/html/_h5ai/public/index.php
@@ -0,0 +1,17 @@
+=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function l(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n ');r(e,function(e,t){i(' ').attr("name",t).attr("value",e).appTo(n)}),n.appTo("body"),n[0].submit(),n.rm()}}}).call(this,a(5))},function(e,t,n){var r={"./":11,"./index":11,"./index.js":11,"./info":52,"./info.js":52};function i(e){var t=o(e);return n(t)}function o(e){if(n.o(r,e))return r[e];var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}i.keys=function(){return Object.keys(r)},i.resolve=o,(e.exports=i).id=10},function(e,t,n){(function(e){n(12),n(25),n(26),n(27),n(28),n(30),n(31),n(32),n(33),n(36),n(38),n(39),n(46),n(47),n(48),n(49),n(50),n(51);var t=e.window.document.location.href;n(21).setLocation(t,!0)}).call(this,n(5))},function(e,t,n){function r(e,t){f("#viewmode-settings .mode").rmCls("active"),f("#viewmode-"+e).addCls("active"),f("#viewmode-size").val(a.indexOf(t)),"next"===b.modeToggle&&(e=o[(o.indexOf(e)+1)%o.length]),f("#viewmode-toggle img").attr("src",p.image("view-"+e))}function i(){var e=v.getMode(),t=(o.indexOf(e)+1)%o.length,n=o[t];v.setMode(n)}var o,a,s,l,c=n(2),u=c.each,f=c.dom,d=n(13),p=n(14),h=n(15),g=n(16),m=n(18),v=n(19),b=Object.assign({modeToggle:!1},h.view),w='');o=v.getModes(),a=v.getSizes(),o.length<2&&a.length<2||(s=f('
View
'),1').attr("max",l).on("input",function(e){return v.setSize(a[e.target.valueAsNumber])}).on("change",function(e){return v.setSize(a[e.target.valueAsNumber])}).appTo(s)),s.appTo(g.$el)),b.modeToggle&&1\n \n ').on("click",i).appTo(m.$toolbar),r(v.getMode(),v.getSize()),d.sub("view.mode.changed",r)},function(s,e,l){(function(e){function t(t){for(var e=arguments.length,n=new Array(1 "+ce(e.message+"",!0)+" ";throw e}}return pe.options=pe.setOptions=function(e){return se(pe.defaults,e),fe(pe.defaults),pe},pe.getDefaults=ue,pe.defaults=de,pe.use=function(s){var t,n=se({},s);s.renderer&&function(){var a=pe.defaults.renderer||new te;for(var e in s.renderer)!function(i){var o=a[i];a[i]=function(){for(var e=arguments.length,t=new Array(e),n=0;nAn error occurred:"+ce(e.message+"",!0)+" ";throw e}},pe.Parser=ae,pe.parser=ae.parse,pe.Renderer=te,pe.TextRenderer=ne,pe.Lexer=J,pe.lexer=J.lex,pe.Tokenizer=B,pe.Slugger=re,pe.parse=pe},"object"===a(t)&&void 0!==e?e.exports=o():void 0===(i="function"==typeof(r=o)?r.call(t,n,t,e):r)||(e.exports=i)},function(e,t,n){function r(e){(m=e.slice(0)).length?o.show():h.alwaysVisible||o.hide()}function i(){var e=h.type,t=h.packageName,n="shell-zip"===e?"zip":"tar",r={action:"download",as:(t=t||(1===m.length?m[0].label:f.getItem().label))+"."+n,type:e,baseHref:f.getAbsHref(),hrefs:""};s(m,function(e,t){r["hrefs[".concat(t,"]")]=e.absHref}),c.formRequest(r)}var o,a=n(2),s=a.each,l=a.dom,c=n(9),u=n(13),f=n(21),d=n(14),p=n(15),h=Object.assign({enabled:!1,type:"php-tar",packageName:"package",alwaysVisible:!1},p.download),g=''),m=[];h.enabled&&(o=l(g).hide().appTo("#toolbar").on("click",i),h.alwaysVisible&&o.show(),u.sub("selection",r))},function(e,t,n){function r(e){var t,n,r=0\n \n \n '),x=!1,k="";w.enabled&&(s=p(y).appTo("#toolbar"),l=s.find("input"),s.find("img").on("click",o),l.on("keyup",f(i,w.debounceTime)),h.sub("location.changed",a))},function(e,t,f){(function(e){var t,n,r,i,o,a=f(2).map,s=f(13),l=f(15),c=e.window,u=Object.assign({enabled:!1,id:"UA-000000-0"},l["google-analytics-ua"]);u.enabled&&(t=window,n=document,r="ga",t.GoogleAnalyticsObject=r,t.ga=t.ga||function(){(t.ga.q=t.ga.q||[]).push(arguments)},t.ga.l=+new Date,i=n.createElement("script"),o=n.getElementsByTagName("script")[0],i.async=1,i.src="//www.google-analytics.com/analytics.js",o.parentNode.insertBefore(i,o),c.ga("create",u.id,"auto"),s.sub("location.changed",function(e){var t=c.location;c.ga("send","pageview",{location:t.protocol+"//"+t.host+e.absHref,title:a(e.getCrumb(),function(e){return e.label}).join(" > ")})}))}).call(this,f(5))},function(e,t,T){(function(o){function t(){_.get(A)?(w("#view-info").addCls("active"),w("#info").show()):(w("#view-info").rmCls("active"),w("#info").hide())}function n(e){var t,n,r=e.thumbRational||e.icon,i=!!e.thumbRational;!e.isCurrentFolder()&&r||(r=k.icon("folder")),a.attr("src",r),i?a.addCls("thumb"):a.rmCls("thumb"),s.text(e.label),b(e.time)?l.text(x.formatDate(e.time)):l.text("."),b(e.size)?(c.text(x.formatSize(e.size)),c.show()):c.hide(),e.isContentFetched?(t=e.getStats(),f.text(t.folders),d.text(t.files),u.show()):u.hide(),C.qrcode&&(n=o.window.location,p.clr().app(m({render:"image",size:200,fill:C.qrFill,back:C.qrBack,text:n.protocol+"//"+n.host+e.absHref,crisp:!0,quiet:1})))}function e(e){n(e)}function r(){n(h)}function i(e){n(h=e)}var a,s,l,c,u,f,d,p,h,g,m=T(34),v=T(2),b=v.isNum,w=v.dom,y=T(13),x=T(20),k=T(14),S=T(15),_=T(17),C=Object.assign({enabled:!1,show:!1,qrcode:!0,qrColor:"#999"},S.info),z=''),A="ext/info";C.enabled&&(g=w('').hide().appTo("#mainrow"),a=g.find(".icon img"),s=g.find(".label"),l=g.find(".time"),c=g.find(".size"),u=g.find(".content"),f=g.find(".folders"),d=g.find(".files"),p=g.find(".qrcode"),C.qrcode||p.rm(),w(z).appTo("#sidebar").find("#view-info").on("click",function(e){_.put(A,!_.get(A)),t(),y.pub("resize"),e.preventDefault()}),"boolean"!=typeof _.get(A)&&_.put(A,C.show),t(),y.sub("location.changed",i),y.sub("item.mouseenter",e),y.sub("item.mouseleave",r))}).call(this,T(5))},function(e,o,t){(function(e){var t,n,r,i;function $(e){return($="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})(e)}i=function(){return r={},i.m=n=[function(e,t,n){function r(e){var t=Object.assign({},i,e),n=o(t.text,t.ecLevel,t.minVersion,t.quiet);return"svg"===t.render?s(n,t):a(n,t,"image"===t.render)}var i=n(1),o=n(2),a=n(4),s=n(8);e.exports=r;try{jQuery.fn.kjua=function(n){return this.each(function(e,t){return t.appendChild(r(n))})}}catch(e){}},function(e,t){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(e,t,n){function s(e){return(s="function"==typeof Symbol&&"symbol"==$(Symbol.iterator)?function(e){return $(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":$(e)})(e)}var l=/code length overflow/i,c=n(3);c.stringToBytes=c.stringToBytesFuncs["UTF-8"],e.exports=function(e,t,n,r){var i,o=3>n&1);u[Math.floor(n/3)][n%3+f-8-3]=r}for(n=0;n<18;n+=1)r=!e&&1==(t>>n&1),u[n%3+f-8-3][Math.floor(n/3)]=r},h=function(e,t){for(var n=l<<3|t,r=w.getBCHTypeInfo(n),i=0;i<15;i+=1){var o=!e&&1==(r>>i&1);i<6?u[i][8]=o:i<8?u[i+1][8]=o:u[f-15+i][8]=o}for(i=0;i<15;i+=1)o=!e&&1==(r>>i&1),i<8?u[8][f-i-1]=o:i<9?u[8][15-i-1+1]=o:u[8][15-i-1]=o;u[f-8][8]=!e},g=function(e,t){for(var n=-1,r=f-1,i=7,o=0,a=w.getMaskFunction(t),s=f-1;0>>i&1)),a(r,s-c)&&(l=!l),u[r][s-c]=l,-1==--i&&(o+=1,i=7));if((r+=n)<0||f<=r){r-=n,n=-n;break}}},m=function(e,t,n){for(var r=x.getRSBlocks(e,t),i=k(),o=0;o8*s)throw"code length overflow. ("+i.getLengthInBits()+">"+8*s+")";for(i.getLengthInBits()+4<=8*s&&i.put(0,4);i.getLengthInBits()%8!=0;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*s||(i.put(236,8),i.getLengthInBits()>=8*s));)i.put(17,8);return function(e,t){for(var n=0,r=0,i=0,o=new Array(t.length),a=new Array(t.length),s=0;s',n+="";for(var r=0;r";for(var i=0;i ';n+=""}return(n+=" ")+""},p.createSvgTag=function(e,t,n,r){var i={};"object"==$(arguments[0])&&(e=(i=arguments[0]).cellSize,t=i.margin,n=i.alt,r=i.title),e=e||2,t=void 0===t?4*e:t,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-description":null,(r="string"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||"qrcode-title":null;var o,a,s,l=p.getModuleCount()*e+2*t,c="",u="l"+e+",0 0,"+e+" -"+e+",0 0,-"+e+"z ";for(c+='",c+=r.text?''+v(r.text)+" ":"",c+=n.text?''+v(n.text)+" ":"",c+=' ',c+=' ')+" "},p.createDataURL=function(i,e){i=i||2,e=void 0===e?4*i:e;var t=p.getModuleCount()*i+2*e,o=e,a=t-e;return T(t,t,function(e,t){if(o<=e&&e "};var v=function(e){for(var t="",n=0;n":t+=">";break;case"&":t+="&";break;case'"':t+=""";break;default:t+=r}}return t};return p.createASCII=function(e,t){if((e=e||1)<2)return function(e){e=void 0===e?2:e;for(var t,n,r,i,o=+p.getModuleCount()+2*e,a=e,s=o-e,l={"██":"█","█ ":"▀"," █":"▄"," ":" "},c={"██":"▀","█ ":"▀"," █":" "," ":" "},u="",f=0;f>>8),t.push(255&r)):t.push(a)}return t}};var t,e,b={L:1,M:0,Q:3,H:2},w=(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]],(e={}).getBCHTypeInfo=function(e){for(var t=e<<10;0<=n(t)-n(1335);)t^=1335<>>=1;return t}var a=function(){for(var t=new Array(256),n=new Array(256),e=0;e<8;e+=1)t[e]=1<>>8)},writeBytes:function(e,t,n){t=t||0,n=n||e.length;for(var r=0;r>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var t=Math.floor(r/8);n.length<=t&&n.push(0),e&&(n[t]|=128>>>r%8),r+=1}};return i},S=function(e){var r=e,t={getMode:function(){return 1},getLength:function(){return r.length},write:function(e){for(var t=r,n=0;n+2>>8&255)+(255&r),e.put(r,13),n+=2}if(n=n.length){if(0==o)return-1;throw"unexpected end of file./"+o}var e=n.charAt(r);if(r+=1,"="==e)return o=0,-1;e.match(/^\s$/)||(i=i<<6|a(e.charCodeAt(0)),o+=6)}var t=i>>>o-8&255;return o-=8,t}},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"c:"+e};return t},T=function(e,t,n){for(var r,i,o,a,h,s,l,g,c=(o=r=e,a=i=t,h=new Array(r*i),s={setPixel:function(e,t,n){h[t*o+e]=n},write:function(e){e.writeString("GIF87a"),e.writeShort(o),e.writeShort(a),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(o),e.writeShort(a),e.writeByte(0);var t=l(2);e.writeByte(2);for(var n=0;255>>t!=0)throw"length over";for(;8<=s+t;)a.writeByte(255&(e<>>=8-s,s=l=0;l|=e<>>m-6),m-=6},w.flush=function(){if(0>6,128|63&r):r<55296||57344<=r?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},void 0===(i="function"==typeof(r=function(){return o})?r.apply(t,[]):r)||(e.exports=i)},function(e,t,n){function f(e,t,n,r,i,o){e.is_dark(i,o)&&t.rect(o*r,i*r,r,r)}var d=n(5),p=n(6),h=n(7);e.exports=function(e,t,n){var r,i,o,a,s,l=t.ratio||d.dpr,c=d.create_canvas(t.size,l),u=c.getContext("2d");return u.scale(l,l),r=e,s=i=u,(a=o=t).back&&(s.fillStyle=a.back,s.fillRect(0,0,a.size,a.size)),function(e,t,n){if(e){var r=0\n Language \n \n \n
\n '),i=t.find("select").on("change",function(e){var t=e.target.value;g.put(w,t),n(r,t,!1)}),s(r,function(e,t){c(" ").attr("value",t).addCls(t).text(t+" - "+(l(e)?e:e.lang)).appTo(i)}),t.appTo("#sidebar")),f.sub("view.changed",function(){n(p,v.lang,v.useBrowserLang)})}).call(this,k(5))},function(e,t,n){var r=n(8).langs;e.exports=Object.assign({},r)},function(e,t,f){(function(e){var t,n,r,i=f(2),o=i.dom,a=i.awaitLoad,s=f(13),l=f(15),c=e.window,u=Object.assign({enabled:!1,baseURL:"not-set",idSite:0},l["piwik-analytics"]);u.enabled&&(t=("https:"===c.location.protocol?"https://":"http://")+u.baseURL+"/",n=[],r=null,o("