Wer als Unternehmen online an oberster Position stehen möchte, kommt an den klassischen Branchenverzeichnissen, Kartendiensten und Bewertungsportalen nicht vorbei. Google, Bing & Co. werten diese sogenannten „Citations“ als Vertrauenssignal für dein Unternehmen – vorausgesetzt, deine Firmendaten sind überall konsistent hinterlegt. Das Problem: Sich manuell durch 30+ verschiedene Portale zu klicken, überall dieselben Angaben einzutippen und den Überblick zu behalten, welches Formular schon ausgefüllt wurde, kostet schnell einen ganzen Nachmittag.
Genau dafür haben wir den Branchenverzeichnis-Manager gebaut: ein schlankes PHP-Tool, das die Verwaltung dieses Prozesses übernimmt, statt ihn vorzugaukeln zu automatisieren.
Was das Tool für dich erledigt:
- Eine kuratierte Liste von über 32 Portalen – von Google Unternehmensprofil, Bing Places und Apple Maps über klassische Branchenbücher wie Das Örtliche, Gelbe Seiten und 11880 bis hin zu Bewertungsportalen wie Yelp, Kununu und Trustpilot sowie B2B-Verzeichnissen wie wlw.de und Europages. Jedes Portal ist mit Kategorie, Relevanz-Einstufung und einem Hinweis versehen, ob eine Backlinkpflicht besteht.
- Firmenprofil einmal pflegen, überall nutzen: Domain, Firmenname, Adresse, Kontaktdaten und Kurzbeschreibung werden zentral gespeichert und per Klick in die Zwischenablage kopiert – kein wiederholtes Abtippen mehr.
- Fortschritt lückenlos im Blick: Jedes Portal bekommt einen Status (Offen, In Bearbeitung, Eingetragen, Abgelehnt, Übersprungen) plus Notizfeld. Ein Fortschrittsbalken zeigt sofort, wie weit du bist.
- CSV-Export für Reporting, Übergabe an Kunden oder das eigene Archiv.
- Erweiterbar: Branchenspezifische Verzeichnisse, die in der Standardliste fehlen, lassen sich in Sekunden ergänzen.
Warum keine Ein-Klick-Automatisierung für alle Portale?
Ehrlich gesagt: Weil es unseriös wäre, das zu versprechen. Jedes Verzeichnis hat ein eigenes Formular, oft mit Captcha oder E-Mail-Bestätigung, und viele Portale schließen automatisierte Massen-Einträge in ihren Nutzungsbedingungen ausdrücklich aus. Ein Bot, der das umgeht, sorgt eher für gesperrte Accounts als für verlässliche Backlinks. Der Branchenverzeichnis-Manager nimmt dir stattdessen den organisatorischen Aufwand ab und macht das eigentliche Ausfüllen so schnell wie möglich – sauber und ohne Spam-Risiko für deine Domain.
Technisch schlank, selbst gehostet
Kein Cloud-Abo, keine Registrierung, keine Weitergabe deiner Firmendaten an Dritte. Das Tool läuft als reines PHP-Script mit einer lokalen SQLite-Datenbank auf deinem eigenen Webspace – Standard-Hosting reicht, PHP 8 und PDO-SQLite genügen. Die Installation erledigt eine einzelne Php Datei: Code kopieren, als php Datei speichern, hochladen, einmal aufrufen, fertig – die Datei erstellt alle benötigten Dateien und löscht sich danach selbst.
Für wen ist das Tool gedacht?
Für Solo-Selbstständige, kleine Unternehmen, Agenturen und alle, die Local SEO für sich oder Kunden betreiben und die immer gleiche, mühsame Verzeichnis-Pflege endlich strukturiert statt chaotisch angehen wollen.
<?php
declare(strict_types=1);
$__FILES = [
'schema.sql' => 'Q1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZGlyZWN0b3JpZXMgKAogICAgaWQgICAgICAgICAgICAgICAgIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgIG5hbWUgICAgICAgICAgICAgICBURVhUIE5PVCBOVUxMLAogICAgdXJsICAgICAgICAgICAgICAgIFRFWFQgTk9UIE5VTEwsCiAgICBzdWJtaXRfdXJsICAgICAgICAgVEVYVCBOT1QgTlVMTCwKICAgIGNhdGVnb3J5ICAgICAgICAgICBURVhUIERFRkFVTFQgJ0FsbGdlbWVpbicsCiAgICBpc19mcmVlICAgICAgICAgICAgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDEsCiAgICBjYXV0aW9uICAgICAgICAgICAgVEVYVCwgICAgICAgICAgICAgICAgIC0tIFdhcm5oaW53ZWlzLCB6LkIuICJLb3N0ZW5wZmxpY2h0aWdlIFVwc2VsbHMgcHLDvGZlbiIKICAgIGJhY2tsaW5rX3JlcXVpcmVkICBURVhULCAgICAgICAgICAgICAgICAgLS0gbmVpbiB8IGphIHwgdGVpbHdlaXNlIHwgbWl0IEdlZ2VubGluayB8IG5pY2h0IGVyc2ljaHRsaWNoCiAgICByZWxldmFuY2UgICAgICAgICAgVEVYVCwgICAgICAgICAgICAgICAgIC0tIG5pZWRyaWcgfCBtaXR0ZWwgfCBob2NoIHwgc2VociBob2NoIChSZWxldmFueiBmw7xycyBlaWdlbmUgUHJvamVrdCkKICAgIHBvcnRhbF9zdGF0dXMgICAgICBURVhUIERFRkFVTFQgJ2dydWVuJywgLS0gZ3J1ZW4gfCBnZWxiIHwgcm90IChBa3Rpdml0w6R0cy0vVmVydHJhdWVuc3N0YXR1cyBkZXMgUG9ydGFscykKICAgIGJlbWVya3VuZyAgICAgICAgICBURVhULCAgICAgICAgICAgICAgICAgLS0gRnJlaXRleHQtQmVtZXJrdW5nIHp1bSBQb3J0YWwKICAgIHNvcnRfb3JkZXIgICAgICAgICBJTlRFR0VSIERFRkFVTFQgMCwKICAgIGNyZWF0ZWRfYXQgICAgICAgICBURVhUIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAKKTsKCkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHN1Ym1pc3Npb25zICgKICAgIGlkICAgICAgICAgICAgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgZGlyZWN0b3J5X2lkICBJTlRFR0VSIE5PVCBOVUxMLAogICAgZG9tYWluICAgICAgICBURVhUIE5PVCBOVUxMLAogICAgc3RhdHVzICAgICAgICBURVhUIE5PVCBOVUxMIERFRkFVTFQgJ29mZmVuJywgLS0gb2ZmZW4gfCBpbl9iZWFyYmVpdHVuZyB8IGVpbmdldHJhZ2VuIHwgYWJnZWxlaG50IHwgdWViZXJzcHJ1bmdlbgogICAgbm90ZSAgICAgICAgICBURVhULAogICAgdXBkYXRlZF9hdCAgICBURVhUIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCiAgICBGT1JFSUdOIEtFWSAoZGlyZWN0b3J5X2lkKSBSRUZFUkVOQ0VTIGRpcmVjdG9yaWVzKGlkKSBPTiBERUxFVEUgQ0FTQ0FERSwKICAgIFVOSVFVRShkaXJlY3RvcnlfaWQsIGRvbWFpbikKKTsKCkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHNldHRpbmdzICgKICAgIGtleSAgIFRFWFQgUFJJTUFSWSBLRVksCiAgICB2YWx1ZSBURVhUCik7Cg==',
'db.php' => 'PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKioKICogWmVudHJhbGUgREItS2xhc3NlLiBMZWd0IGRpZSBTUUxpdGUtRGF0ZWkgYmVpIEJlZGFyZiBhbiwgc3BpZWx0IGRhcwogKiBTY2hlbWEgZWluLCBtaWdyaWVydCBhZGRpdGl2ZSBTcGFsdGVuw6RuZGVydW5nZW4gdW5kIHNlZWRldCBkaWUKICoga3VyYXRpZXJ0ZSBWZXJ6ZWljaG5pcy1MaXN0ZSBpZGVtcG90ZW50IChsw6R1ZnQgYmVpIGplZGVtIEF1ZnJ1ZiwKICogZsO8Z3QgYWJlciBudXIgbmV1ZSBQb3J0YWxlIGhpbnp1IOKAkyBiZXN0ZWhlbmRlIFN0YXR1cy9Ob3RpemVuIGJsZWliZW4KICogdW5hbmdldGFzdGV0KS4KICovCmZpbmFsIGNsYXNzIERCCnsKICAgIHByaXZhdGUgc3RhdGljID9QRE8gJHBkbyA9IG51bGw7CgogICAgLyoqIFNwYWx0ZW4sIGRpZSBwZXIgTWlncmF0aW9uIGFkZGl0aXYgZXJnw6RuenQgd2VyZGVuLCBmYWxscyBzaWUgZmVobGVuLiAqLwogICAgcHJpdmF0ZSBjb25zdCBNSUdSQVRJT05fQ09MVU1OUyA9IFsKICAgICAgICAnYmFja2xpbmtfcmVxdWlyZWQnID0+ICJURVhUIiwgICAvLyBuZWluIHwgamEgfCB0ZWlsd2Vpc2UgfCBtaXQgR2VnZW5saW5rIHwgbmljaHQgZXJzaWNodGxpY2gKICAgICAgICAncmVsZXZhbmNlJyAgICAgICAgICA9PiAiVEVYVCIsICAgLy8gbmllZHJpZyB8IG1pdHRlbCB8IGhvY2ggfCBzZWhyIGhvY2gKICAgICAgICAncG9ydGFsX3N0YXR1cycgICAgICA9PiAiVEVYVCBERUZBVUxUICdncnVlbiciLCAvLyBncnVlbiB8IGdlbGIgfCByb3QKICAgICAgICAnYmVtZXJrdW5nJyAgICAgICAgICA9PiAiVEVYVCIsCiAgICBdOwoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCk6IFBETwogICAgewogICAgICAgIGlmIChzZWxmOjokcGRvICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjokcGRvOwogICAgICAgIH0KCiAgICAgICAgJGRhdGFEaXIgPSBfX0RJUl9fIC4gJy9kYXRhJzsKICAgICAgICBpZiAoIWlzX2RpcigkZGF0YURpcikpIHsKICAgICAgICAgICAgbWtkaXIoJGRhdGFEaXIsIDA3NzUsIHRydWUpOwogICAgICAgIH0KICAgICAgICAkZGJGaWxlID0gJGRhdGFEaXIgLiAnL2RpcmVjdG9yaWVzLnNxbGl0ZSc7CgogICAgICAgICRwZG8gPSBuZXcgUERPKCdzcWxpdGU6JyAuICRkYkZpbGUpOwogICAgICAgICRwZG8tPnNldEF0dHJpYnV0ZShQRE86OkFUVFJfRVJSTU9ERSwgUERPOjpFUlJNT0RFX0VYQ0VQVElPTik7CiAgICAgICAgJHBkby0+ZXhlYygnUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OOycpOwoKICAgICAgICAkcGRvLT5leGVjKGZpbGVfZ2V0X2NvbnRlbnRzKF9fRElSX18gLiAnL3NjaGVtYS5zcWwnKSk7CgogICAgICAgIHNlbGY6Om1pZ3JhdGUoJHBkbyk7CiAgICAgICAgc2VsZjo6c2VlZCgkcGRvKTsgLy8gaWRlbXBvdGVudCDigJMgZXJnw6RuenQgbnVyIGZlaGxlbmRlIE5hbWVuCgogICAgICAgIHNlbGY6OiRwZG8gPSAkcGRvOwogICAgICAgIHJldHVybiAkcGRvOwogICAgfQoKICAgIC8qKiBGw7xndCBmZWhsZW5kZSBTcGFsdGVuIGFkZGl0aXYgaGluenUgKFNRTGl0ZSBrZW5udCBrZWluIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUykuICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBtaWdyYXRlKFBETyAkcGRvKTogdm9pZAogICAgewogICAgICAgICRleGlzdGluZyA9IGFycmF5X2NvbHVtbigkcGRvLT5xdWVyeSgnUFJBR01BIHRhYmxlX2luZm8oZGlyZWN0b3JpZXMpJyktPmZldGNoQWxsKFBETzo6RkVUQ0hfQVNTT0MpLCAnbmFtZScpOwogICAgICAgIGZvcmVhY2ggKHNlbGY6Ok1JR1JBVElPTl9DT0xVTU5TIGFzICRjb2wgPT4gJGRlZikgewogICAgICAgICAgICBpZiAoIWluX2FycmF5KCRjb2wsICRleGlzdGluZywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICRwZG8tPmV4ZWMoIkFMVEVSIFRBQkxFIGRpcmVjdG9yaWVzIEFERCBDT0xVTU4geyRjb2x9IHskZGVmfSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogSWRlbXBvdGVudGVzIFNlZWRpbmc6IGxlZ3QgbmV1ZSBrdXJhdGllcnRlIFBvcnRhbGUgYW4sIGzDpHNzdCBhYmVyCiAgICAgKiBiZXJlaXRzIHZvcmhhbmRlbmUgWmVpbGVuIChwZXIgTmFtZSBnZXByw7xmdCkgdW5hbmdldGFzdGV0LCBkYW1pdAogICAgICogU3RhdHVzL05vdGl6ZW4gYXVzIGxhdWZlbmRlbSBCZXRyaWViIG5pY2h0IMO8YmVyc2NocmllYmVuIHdlcmRlbi4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2VlZChQRE8gJHBkbyk6IHZvaWQKICAgIHsKICAgICAgICAvLyBuYW1lLCB1cmwsIHN1Ym1pdF91cmwsIGNhdGVnb3J5LCBpc19mcmVlLCBjYXV0aW9uLCBiYWNrbGlua19yZXF1aXJlZCwgcmVsZXZhbmNlLCBwb3J0YWxfc3RhdHVzLCBiZW1lcmt1bmcKICAgICAgICAkcm93cyA9IFsKICAgICAgICAgICAgLy8gLS0tIFN1Y2htYXNjaGluZW4gJiBLYXJ0ZW5kaWVuc3RlIC0tLQogICAgICAgICAgICBbJ0dvb2dsZSBVbnRlcm5laG1lbnNwcm9maWwnLCAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9idXNpbmVzcy8nLCAnaHR0cHM6Ly9idXNpbmVzcy5nb29nbGUuY29tL2NyZWF0ZScsICdTdWNobWFzY2hpbmUnLCAxLCBudWxsLCBudWxsLCBudWxsLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydCaW5nIFBsYWNlcyBmb3IgQnVzaW5lc3MnLCAnaHR0cHM6Ly93d3cuYmluZ3BsYWNlcy5jb20vJywgJ2h0dHBzOi8vd3d3LmJpbmdwbGFjZXMuY29tLycsICdTdWNobWFzY2hpbmUnLCAxLCBudWxsLCBudWxsLCBudWxsLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydBcHBsZSBNYXBzIEJ1c2luZXNzIENvbm5lY3QnLCAnaHR0cHM6Ly9tYXBzY29ubmVjdC5hcHBsZS5jb20vJywgJ2h0dHBzOi8vbWFwc2Nvbm5lY3QuYXBwbGUuY29tLycsICdTdWNobWFzY2hpbmUnLCAxLCBudWxsLCBudWxsLCBudWxsLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydPcGVuU3RyZWV0TWFwJywgJ2h0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnLycsICdodHRwczovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9lZGl0JywgJ0thcnRlbmRpZW5zdCcsIDEsICdLZWluIEZvcm11bGFyIOKAkyBFaW50cmFnIGVyZm9sZ3Qgw7xiZXIgZGVuIGlELUVkaXRvciBhbHMgS2FydGVucHVua3QgKFBPSSknLCBudWxsLCBudWxsLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydZZWxsb3dNYXAnLCAnaHR0cHM6Ly93d3cueWVsbG93bWFwLmRlLycsICdodHRwczovL3d3dy55ZWxsb3dtYXAuZGUvJywgJ0thcnRlbmRpZW5zdCcsIDEsIG51bGwsICduZWluJywgJ21pdHRlbCcsICdncnVlbicsIG51bGxdLAoKICAgICAgICAgICAgLy8gLS0tIEtsYXNzaXNjaGUgQnJhbmNoZW5iw7xjaGVyIC0tLQogICAgICAgICAgICBbJ0RhcyDDlnJ0bGljaGUnLCAnaHR0cHM6Ly93d3cuZGFzb2VydGxpY2hlLmRlLycsICdodHRwczovL2Zpcm1hLmRhc29lcnRsaWNoZS5kZS8nLCAnQnJhbmNoZW5idWNoJywgMSwgJ0Jhc2lzLUVpbnRyYWcga29zdGVubG9zLCBadXNhdHpmZWF0dXJlcyBrb3N0ZW5wZmxpY2h0aWcnLCAnbmVpbicsICdob2NoJywgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnRGFzIFRlbGVmb25idWNoJywgJ2h0dHBzOi8vd3d3LmRhc3RlbGVmb25idWNoLmRlLycsICdodHRwczovL3d3dy5kYXN0ZWxlZm9uYnVjaC5kZS9maXJtZW5laW50cmFnJywgJ0JyYW5jaGVuYnVjaCcsIDEsICdCYXNpcy1FaW50cmFnIGtvc3RlbmxvcywgWnVzYXR6ZmVhdHVyZXMga29zdGVucGZsaWNodGlnJywgJ25laW4nLCAnaG9jaCcsICdncnVlbicsIG51bGxdLAogICAgICAgICAgICBbJ0dlbGJlIFNlaXRlbicsICdodHRwczovL3d3dy5nZWxiZXNlaXRlbi5kZS8nLCAnaHR0cHM6Ly93d3cuZ2VsYmVzZWl0ZW4uZGUvZWludHJhZ2VuJywgJ0JyYW5jaGVuYnVjaCcsIDEsICdCYXNpcy1FaW50cmFnIGtvc3RlbmxvcywgUHJlbWl1bSBrb3N0ZW5wZmxpY2h0aWcnLCAnbmVpbicsICdob2NoJywgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnMTE4ODAuY29tJywgJ2h0dHBzOi8vd3d3LjExODgwLmNvbS8nLCAnaHR0cHM6Ly93d3cuMTE4ODAuY29tL2JyYW5jaGVuYnVjaGVpbnRyYWcnLCAnQnJhbmNoZW5idWNoJywgMSwgbnVsbCwgJ25laW4nLCAnaG9jaCcsICdncnVlbicsIG51bGxdLAogICAgICAgICAgICBbJ21laW5lc3RhZHQuZGUnLCAnaHR0cHM6Ly93d3cubWVpbmVzdGFkdC5kZS8nLCAnaHR0cHM6Ly93d3cubWVpbmVzdGFkdC5kZS9maXJtZW5laW50cmFnJywgJ0xva2FscG9ydGFsJywgMSwgbnVsbCwgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnQ3lsZXgnLCAnaHR0cHM6Ly93d3cuY3lsZXguZGUvJywgJ2h0dHBzOi8vd3d3LmN5bGV4LmRlL2Zpcm1hLWVpbnRyYWdlbi5odG1sJywgJ0JyYW5jaGVuYnVjaCcsIDEsIG51bGwsICduZWluJywgJ2hvY2gnLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydPcGVuZGknLCAnaHR0cHM6Ly93d3cub3BlbmRpLmRlLycsICdodHRwczovL3d3dy5vcGVuZGkuZGUvZWludHJhZ2VuLmh0bWwnLCAnQnJhbmNoZW5idWNoJywgMSwgbnVsbCwgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnSG90ZnJvZycsICdodHRwczovL3d3dy5ob3Rmcm9nLmRlLycsICdodHRwczovL3d3dy5ob3Rmcm9nLmRlL2FkZF9mcmVlX2xpc3RpbmcnLCAnQnJhbmNoZW5idWNoJywgMSwgbnVsbCwgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnR29ZZWxsb3cnLCAnaHR0cHM6Ly93d3cuZ295ZWxsb3cuZGUvJywgJ2h0dHBzOi8vd3d3LmdveWVsbG93LmRlL2VpbnRyYWdlbi8nLCAnQnJhbmNoZW5idWNoJywgMSwgbnVsbCwgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnS2VubnN0LUR1LUVpbmVuJywgJ2h0dHBzOi8vd3d3Lmtlbm5zdGR1ZWluZW4uZGUvJywgJ2h0dHBzOi8vd3d3Lmtlbm5zdGR1ZWluZW4uZGUvZWludHJhZ2VuJywgJ0JyYW5jaGVuYnVjaCcsIDEsIG51bGwsICduZWluJywgJ21pdHRlbCcsICdncnVlbicsIG51bGxdLAogICAgICAgICAgICBbJ1VudGVybmVobWVuc3ZlcnplaWNobmlzLm9yZycsICdodHRwczovL3d3dy51bnRlcm5laG1lbnN2ZXJ6ZWljaG5pcy5vcmcvJywgJ2h0dHBzOi8vd3d3LnVudGVybmVobWVuc3ZlcnplaWNobmlzLm9yZy9laW50cmFnZW4nLCAnQnJhbmNoZW5idWNoJywgMSwgbnVsbCwgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnQnJhbmNoZW4tSW5mby5uZXQnLCAnaHR0cHM6Ly93d3cuYnJhbmNoZW4taW5mby5uZXQvJywgJ2h0dHBzOi8vd3d3LmJyYW5jaGVuLWluZm8ubmV0L2VpbnRyYWdlbi5odG1sJywgJ0JyYW5jaGVuYnVjaCcsIDEsIG51bGwsIG51bGwsIG51bGwsICdncnVlbicsIG51bGxdLAogICAgICAgICAgICBbJ0tsaWNrdGVsJywgJ2h0dHBzOi8vd3d3LmtsaWNrdGVsLmRlLycsICdodHRwczovL3d3dy5rbGlja3RlbC5kZS9nd2UvJywgJ0JyYW5jaGVuYnVjaCcsIDEsIG51bGwsIG51bGwsIG51bGwsICdncnVlbicsIG51bGxdLAogICAgICAgICAgICBbJ29ubGluZXN0cmVldCcsICdodHRwczovL29ubGluZXN0cmVldC5kZS8nLCAnaHR0cHM6Ly9vbmxpbmVzdHJlZXQuZGUvJywgJ0JyYW5jaGVuYnVjaCcsIDEsIG51bGwsICduZWluJywgJ21pdHRlbCcsICdncnVlbicsIG51bGxdLAoKICAgICAgICAgICAgLy8gLS0tIEJld2VydHVuZ3Nwb3J0YWxlIC0tLQogICAgICAgICAgICBbJ1llbHAnLCAnaHR0cHM6Ly93d3cueWVscC5kZS8nLCAnaHR0cHM6Ly9iaXoueWVscC5jb20vJywgJ0Jld2VydHVuZ3Nwb3J0YWwnLCAxLCBudWxsLCAnbmVpbicsICdtaXR0ZWwnLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydLdW51bnUnLCAnaHR0cHM6Ly93d3cua3VudW51LmNvbS8nLCAnaHR0cHM6Ly93d3cua3VudW51LmNvbS9kZS91bnRlcm5laG1lbi1laW50cmFnZW4nLCAnQmV3ZXJ0dW5nc3BvcnRhbCcsIDEsICdCYXNpc3Byb2ZpbCBrb3N0ZW5sb3MsIGVyd2VpdGVydGUgRnVua3Rpb25lbiBrb3N0ZW5wZmxpY2h0aWcnLCBudWxsLCBudWxsLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydUcnVzdHBpbG90JywgJ2h0dHBzOi8vd3d3LnRydXN0cGlsb3QuY29tLycsICdodHRwczovL2J1c2luZXNzLnRydXN0cGlsb3QuY29tL3NpZ251cCcsICdCZXdlcnR1bmdzcG9ydGFsJywgMSwgJ0Jhc2lzcHJvZmlsIGtvc3RlbmxvcywgZXJ3ZWl0ZXJ0ZSBGdW5rdGlvbmVuIGtvc3RlbnBmbGljaHRpZycsIG51bGwsIG51bGwsICdncnVlbicsIG51bGxdLAoKICAgICAgICAgICAgLy8gLS0tIEIyQiAvIEZpcm1lbmRhdGVuYmFua2VuIC0tLQogICAgICAgICAgICBbJ1dlciBsaWVmZXJ0IHdhcyAod2x3KScsICdodHRwczovL3d3dy53bHcuZGUvJywgJ2h0dHBzOi8vd3d3Lndsdy5kZS9kZS9hbmJpZXRlci13ZXJkZW4nLCAnQjJCLVZlcnplaWNobmlzJywgMSwgJ0Jhc2lzIGtvc3RlbmxvcywgU2ljaHRiYXJrZWl0cy1VcGdyYWRlcyBrb3N0ZW5wZmxpY2h0aWcnLCBudWxsLCBudWxsLCAnZ3J1ZW4nLCBudWxsXSwKICAgICAgICAgICAgWydGaXJtZW53aXNzZW4uZGUnLCAnaHR0cHM6Ly93d3cuZmlybWVud2lzc2VuLmRlLycsICdodHRwczovL3d3dy5maXJtZW53aXNzZW4uZGUvZWludHJhZ2VuJywgJ0Zpcm1lbmRhdGVuYmFuaycsIDEsICdCYXNpc2RhdGVuIGtvc3RlbmxvcywgZXJ3ZWl0ZXJ0ZSBQcm9maWxlIGtvc3RlbnBmbGljaHRpZycsIG51bGwsIG51bGwsICdncnVlbicsIG51bGxdLAogICAgICAgICAgICBbJ05vcnRoZGF0YSAoUmVnaXN0ZXJhdXN6dWcpJywgJ2h0dHBzOi8vd3d3Lm5vcnRoZGF0YS5kZS8nLCAnaHR0cHM6Ly93d3cubm9ydGhkYXRhLmRlLycsICdGaXJtZW5kYXRlbmJhbmsnLCAxLCAnUmVpbmVyIFJlZ2lzdGVyZGF0ZW4tRWludHJhZywga2VpbiBNYXJrZXRpbmctUHJvZmlsJywgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnRXVyb3BhZ2VzJywgJ2h0dHBzOi8vd3d3LmV1cm9wYWdlcy5kZS8nLCAnaHR0cHM6Ly93d3cuZXVyb3BhZ2VzLmRlL3JlZ2lzdGVyJywgJ0IyQi1WZXJ6ZWljaG5pcycsIDEsICdCYXNpcy1FaW50cmFnIGtvc3RlbmxvcywgUHJlbWl1bS1TaWNodGJhcmtlaXQga29zdGVucGZsaWNodGlnJywgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnS29tcGFzcycsICdodHRwczovL2RlLmtvbXBhc3MuY29tLycsICdodHRwczovL2RlLmtvbXBhc3MuY29tL2xpdmUvaW5zY3JpcHRpb24nLCAnRmlybWVuZGF0ZW5iYW5rJywgMSwgJ0Jhc2lzLUVpbnRyYWcga29zdGVubG9zLCBlcndlaXRlcnRlIFByb2ZpbGUga29zdGVucGZsaWNodGlnJywgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnTWFjaGVycG9ydGFsJywgJ2h0dHBzOi8vd3d3Lm1hY2hlcnBvcnRhbC5kZS8nLCAnaHR0cHM6Ly93d3cubWFjaGVycG9ydGFsLmRlLycsICdCMkItVmVyemVpY2huaXMnLCAxLCAnVmVyemVpY2huaXMgZsO8ciBkaWdpdGFsZSBEaWVuc3RsZWlzdGVyL0FnZW50dXJlbiDigJMgcGFzc3QgZ3V0IHp1IFdlYmVudHdpY2tsdW5nL0lUJywgJ25laW4nLCAnaG9jaCcsICdncnVlbicsIG51bGxdLAoKICAgICAgICAgICAgLy8gLS0tIFNvY2lhbCBNZWRpYSAtLS0KICAgICAgICAgICAgWydGYWNlYm9vayBVbnRlcm5laG1lbnNzZWl0ZScsICdodHRwczovL3d3dy5mYWNlYm9vay5jb20vYnVzaW5lc3MvJywgJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9wYWdlcy9jcmVhdGUnLCAnU29jaWFsIE1lZGlhJywgMSwgbnVsbCwgbnVsbCwgbnVsbCwgJ2dydWVuJywgbnVsbF0sCiAgICAgICAgICAgIFsnTGlua2VkSW4gVW50ZXJuZWhtZW5zc2VpdGUnLCAnaHR0cHM6Ly93d3cubGlua2VkaW4uY29tLycsICdodHRwczovL3d3dy5saW5rZWRpbi5jb20vY29tcGFueS9zZXR1cC9uZXcvJywgJ1NvY2lhbCBNZWRpYScsIDEsIG51bGwsIG51bGwsIG51bGwsICdncnVlbicsIG51bGxdLAogICAgICAgICAgICBbJ1hpbmcgVW50ZXJuZWhtZW5zcHJvZmlsJywgJ2h0dHBzOi8vd3d3LnhpbmcuY29tLycsICdodHRwczovL3d3dy54aW5nLmNvbS9wYWdlcy9uZXUnLCAnU29jaWFsIE1lZGlhJywgMSwgJ0Jhc2lzcHJvZmlsIGtvc3RlbmxvcywgZXJ3ZWl0ZXJ0ZSBGdW5rdGlvbmVuIGtvc3RlbnBmbGljaHRpZycsIG51bGwsIG51bGwsICdncnVlbicsIG51bGxdLAoKICAgICAgICAgICAgLy8gLS0tIFdlYmthdGFsb2dlIChTRU8tTGlua3ZlcnplaWNobmlzc2UsIG1laXN0IG9obmUgcmVkYWt0aW9uZWxsZSBQcsO8ZnVuZykgLS0tCiAgICAgICAgICAgIFsnZ28tZmluZHlvdScsICdodHRwczovL3d3dy5nby1maW5keW91LmRlLycsICdodHRwczovL3d3dy5nby1maW5keW91LmRlLycsICdXZWJrYXRhbG9nJywgMSwgJ0dlcHLDvGZ0ZXIgV2Via2F0YWxvZywgRnJlaXNjaGFsdHVuZyBrYW5uIFdvY2hlbiBkYXVlcm4nLCAnbmVpbicsICdtaXR0ZWwnLCAnZ3J1ZW4nLCAnZ2VwcsO8ZnRlciBXZWJrYXRhbG9nJ10sCiAgICAgICAgXTsKCiAgICAgICAgJGV4aXN0cyA9ICRwZG8tPnByZXBhcmUoJ1NFTEVDVCAxIEZST00gZGlyZWN0b3JpZXMgV0hFUkUgbmFtZSA9IDpuYW1lIExJTUlUIDEnKTsKICAgICAgICAkbWF4T3JkZXIgPSAoaW50KSRwZG8tPnF1ZXJ5KCdTRUxFQ1QgQ09BTEVTQ0UoTUFYKHNvcnRfb3JkZXIpLCAtMSkgRlJPTSBkaXJlY3RvcmllcycpLT5mZXRjaENvbHVtbigpOwoKICAgICAgICAkaW5zZXJ0ID0gJHBkby0+cHJlcGFyZSgKICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICAobmFtZSwgdXJsLCBzdWJtaXRfdXJsLCBjYXRlZ29yeSwgaXNfZnJlZSwgY2F1dGlvbiwgYmFja2xpbmtfcmVxdWlyZWQsIHJlbGV2YW5jZSwgcG9ydGFsX3N0YXR1cywgYmVtZXJrdW5nLCBzb3J0X29yZGVyKQogICAgICAgICAgICAgVkFMVUVTCiAgICAgICAgICAgICAgICAoOm5hbWUsIDp1cmwsIDpzdWJtaXRfdXJsLCA6Y2F0ZWdvcnksIDppc19mcmVlLCA6Y2F1dGlvbiwgOmJhY2tsaW5rX3JlcXVpcmVkLCA6cmVsZXZhbmNlLCA6cG9ydGFsX3N0YXR1cywgOmJlbWVya3VuZywgOnNvcnRfb3JkZXIpJwogICAgICAgICk7CgogICAgICAgIGZvcmVhY2ggKCRyb3dzIGFzICRyKSB7CiAgICAgICAgICAgIFskbmFtZSwgJHVybCwgJHN1Ym1pdFVybCwgJGNhdGVnb3J5LCAkaXNGcmVlLCAkY2F1dGlvbiwgJGJhY2tsaW5rLCAkcmVsZXZhbmNlLCAkc3RhdHVzLCAkYmVtZXJrdW5nXSA9ICRyOwoKICAgICAgICAgICAgJGV4aXN0cy0+ZXhlY3V0ZShbJzpuYW1lJyA9PiAkbmFtZV0pOwogICAgICAgICAgICBpZiAoJGV4aXN0cy0+ZmV0Y2hDb2x1bW4oKSkgewogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGJlcmVpdHMgdm9yaGFuZGVuIC0+IFN0YXR1cy9Ob3RpemVuIGRlcyBOdXR6ZXJzIG5pY2h0IGFuZmFzc2VuCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtYXhPcmRlcisrOwogICAgICAgICAgICAkaW5zZXJ0LT5leGVjdXRlKFsKICAgICAgICAgICAgICAgICc6bmFtZScgICAgICAgICAgICAgID0+ICRuYW1lLAogICAgICAgICAgICAgICAgJzp1cmwnICAgICAgICAgICAgICAgPT4gJHVybCwKICAgICAgICAgICAgICAgICc6c3VibWl0X3VybCcgICAgICAgID0+ICRzdWJtaXRVcmwsCiAgICAgICAgICAgICAgICAnOmNhdGVnb3J5JyAgICAgICAgICA9PiAkY2F0ZWdvcnksCiAgICAgICAgICAgICAgICAnOmlzX2ZyZWUnICAgICAgICAgICA9PiAkaXNGcmVlLAogICAgICAgICAgICAgICAgJzpjYXV0aW9uJyAgICAgICAgICAgPT4gJGNhdXRpb24sCiAgICAgICAgICAgICAgICAnOmJhY2tsaW5rX3JlcXVpcmVkJyA9PiAkYmFja2xpbmssCiAgICAgICAgICAgICAgICAnOnJlbGV2YW5jZScgICAgICAgICA9PiAkcmVsZXZhbmNlLAogICAgICAgICAgICAgICAgJzpwb3J0YWxfc3RhdHVzJyAgICAgPT4gJHN0YXR1cywKICAgICAgICAgICAgICAgICc6YmVtZXJrdW5nJyAgICAgICAgID0+ICRiZW1lcmt1bmcsCiAgICAgICAgICAgICAgICAnOnNvcnRfb3JkZXInICAgICAgICA9PiAkbWF4T3JkZXIsCiAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgIH0KfQo=',
'api.php' => 'PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpOwpyZXF1aXJlIF9fRElSX18gLiAnL2RiLnBocCc7CgpmdW5jdGlvbiByZXNwb25kKGFycmF5ICRkYXRhLCBpbnQgJGNvZGUgPSAyMDApOiBuZXZlcgp7CiAgICBodHRwX3Jlc3BvbnNlX2NvZGUoJGNvZGUpOwogICAgZWNobyBqc29uX2VuY29kZSgkZGF0YSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogICAgZXhpdDsKfQoKZnVuY3Rpb24gY3VycmVudERvbWFpbihQRE8gJHBkbyk6IHN0cmluZwp7CiAgICAkc3RtdCA9ICRwZG8tPnByZXBhcmUoJ1NFTEVDVCB2YWx1ZSBGUk9NIHNldHRpbmdzIFdIRVJFIGtleSA9ICJkb21haW4iJyk7CiAgICAkc3RtdC0+ZXhlY3V0ZSgpOwogICAgJHYgPSAkc3RtdC0+ZmV0Y2hDb2x1bW4oKTsKICAgIHJldHVybiAkdiAhPT0gZmFsc2UgPyAoc3RyaW5nKSR2IDogJyc7Cn0KCiRwZG8gICAgPSBEQjo6Z2V0KCk7CiRhY3Rpb24gPSAkX0dFVFsnYWN0aW9uJ10gPz8gJF9QT1NUWydhY3Rpb24nXSA/PyAnJzsKCnRyeSB7CiAgICBzd2l0Y2ggKCRhY3Rpb24pIHsKCiAgICAgICAgLy8gLS0tLSBGaXJtZW5wcm9maWwgKERvbWFpbiArIEtvbnRha3RkYXRlbikgbGFkZW4gLS0tLQogICAgICAgIGNhc2UgJ2dldF9wcm9maWxlJzogewogICAgICAgICAgICAkc3RtdCA9ICRwZG8tPnF1ZXJ5KCdTRUxFQ1Qga2V5LCB2YWx1ZSBGUk9NIHNldHRpbmdzJyk7CiAgICAgICAgICAgICRvdXQgID0gW107CiAgICAgICAgICAgIGZvcmVhY2ggKCRzdG10LT5mZXRjaEFsbChQRE86OkZFVENIX0FTU09DKSBhcyAkcm93KSB7CiAgICAgICAgICAgICAgICAkb3V0WyRyb3dbJ2tleSddXSA9ICRyb3dbJ3ZhbHVlJ107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uZChbJ29rJyA9PiB0cnVlLCAncHJvZmlsZScgPT4gJG91dF0pOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLSBGaXJtZW5wcm9maWwgc3BlaWNoZXJuIC0tLS0KICAgICAgICBjYXNlICdzYXZlX3Byb2ZpbGUnOiB7CiAgICAgICAgICAgICRmaWVsZHMgPSBbJ2RvbWFpbicsICdmaXJtYScsICdzdHJhc3NlJywgJ3Bsel9vcnQnLCAndGVsZWZvbicsICdlbWFpbCcsICdrYXRlZ29yaWUnLCAnYmVzY2hyZWlidW5nJ107CiAgICAgICAgICAgICRzdG10ID0gJHBkby0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyBzZXR0aW5ncyAoa2V5LCB2YWx1ZSkgVkFMVUVTICg6aywgOnYpCiAgICAgICAgICAgICAgICAgT04gQ09ORkxJQ1Qoa2V5KSBETyBVUERBVEUgU0VUIHZhbHVlID0gOnYnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRmaWVsZHMgYXMgJGYpIHsKICAgICAgICAgICAgICAgICR2YWwgPSB0cmltKChzdHJpbmcpKCRfUE9TVFskZl0gPz8gJycpKTsKICAgICAgICAgICAgICAgICRzdG10LT5leGVjdXRlKFsnOmsnID0+ICRmLCAnOnYnID0+ICR2YWxdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25kKFsnb2snID0+IHRydWVdKTsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0gQWxsZSBWZXJ6ZWljaG5pc3NlIGlua2wuIFN0YXR1cyBmw7xyIGRpZSBha3R1ZWxsZSBEb21haW4gLS0tLQogICAgICAgIGNhc2UgJ2xpc3QnOiB7CiAgICAgICAgICAgICRkb21haW4gPSBjdXJyZW50RG9tYWluKCRwZG8pOwogICAgICAgICAgICAkc3FsID0gJ1NFTEVDVCBkLiosIHMuc3RhdHVzIEFTIHN1Yl9zdGF0dXMsIHMubm90ZSBBUyBzdWJfbm90ZSwgcy51cGRhdGVkX2F0IEFTIHN1Yl91cGRhdGVkCiAgICAgICAgICAgICAgICAgICAgRlJPTSBkaXJlY3RvcmllcyBkCiAgICAgICAgICAgICAgICAgICAgTEVGVCBKT0lOIHN1Ym1pc3Npb25zIHMKICAgICAgICAgICAgICAgICAgICAgICAgT04gcy5kaXJlY3RvcnlfaWQgPSBkLmlkIEFORCBzLmRvbWFpbiA9IDpkb21haW4KICAgICAgICAgICAgICAgICAgICBPUkRFUiBCWSBkLnNvcnRfb3JkZXIgQVNDLCBkLmlkIEFTQyc7CiAgICAgICAgICAgICRzdG10ID0gJHBkby0+cHJlcGFyZSgkc3FsKTsKICAgICAgICAgICAgJHN0bXQtPmV4ZWN1dGUoWyc6ZG9tYWluJyA9PiAkZG9tYWluXSk7CiAgICAgICAgICAgICRyb3dzID0gJHN0bXQtPmZldGNoQWxsKFBETzo6RkVUQ0hfQVNTT0MpOwogICAgICAgICAgICBmb3JlYWNoICgkcm93cyBhcyAmJHIpIHsKICAgICAgICAgICAgICAgICRyWydzdWJfc3RhdHVzJ10gPSAkclsnc3ViX3N0YXR1cyddID8/ICdvZmZlbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uZChbJ29rJyA9PiB0cnVlLCAnZGlyZWN0b3JpZXMnID0+ICRyb3dzLCAnZG9tYWluJyA9PiAkZG9tYWluXSk7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tIFN0YXR1cyBlaW5lcyBFaW50cmFncyDDpG5kZXJuIC0tLS0KICAgICAgICBjYXNlICdzZXRfc3RhdHVzJzogewogICAgICAgICAgICAkZG9tYWluICAgICAgPSBjdXJyZW50RG9tYWluKCRwZG8pOwogICAgICAgICAgICAkZGlyZWN0b3J5SWQgPSAoaW50KSgkX1BPU1RbJ2RpcmVjdG9yeV9pZCddID8/IDApOwogICAgICAgICAgICAkc3RhdHVzICAgICAgPSAoc3RyaW5nKSgkX1BPU1RbJ3N0YXR1cyddID8/ICdvZmZlbicpOwogICAgICAgICAgICAkbm90ZSAgICAgICAgPSB0cmltKChzdHJpbmcpKCRfUE9TVFsnbm90ZSddID8/ICcnKSk7CiAgICAgICAgICAgICRhbGxvd2VkICAgICA9IFsnb2ZmZW4nLCAnaW5fYmVhcmJlaXR1bmcnLCAnZWluZ2V0cmFnZW4nLCAnYWJnZWxlaG50JywgJ3VlYmVyc3BydW5nZW4nXTsKCiAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5SWQgPD0gMCB8fCAkZG9tYWluID09PSAnJykgewogICAgICAgICAgICAgICAgcmVzcG9uZChbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnS2VpbiBGaXJtZW5wcm9maWwgLyBrZWluZSBEb21haW4gZ2VzZXR6dC4nXSwgNDAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWluX2FycmF5KCRzdGF0dXMsICRhbGxvd2VkLCB0cnVlKSkgewogICAgICAgICAgICAgICAgcmVzcG9uZChbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnVW5nw7xsdGlnZXIgU3RhdHVzLiddLCA0MDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc3RtdCA9ICRwZG8tPnByZXBhcmUoCiAgICAgICAgICAgICAgICAnSU5TRVJUIElOVE8gc3VibWlzc2lvbnMgKGRpcmVjdG9yeV9pZCwgZG9tYWluLCBzdGF0dXMsIG5vdGUsIHVwZGF0ZWRfYXQpCiAgICAgICAgICAgICAgICAgVkFMVUVTICg6ZGlkLCA6ZG9tYWluLCA6c3RhdHVzLCA6bm90ZSwgQ1VSUkVOVF9USU1FU1RBTVApCiAgICAgICAgICAgICAgICAgT04gQ09ORkxJQ1QoZGlyZWN0b3J5X2lkLCBkb21haW4pIERPIFVQREFURSBTRVQKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gOnN0YXR1cywgbm90ZSA9IDpub3RlLCB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRzdG10LT5leGVjdXRlKFsKICAgICAgICAgICAgICAgICc6ZGlkJyAgICA9PiAkZGlyZWN0b3J5SWQsCiAgICAgICAgICAgICAgICAnOmRvbWFpbicgPT4gJGRvbWFpbiwKICAgICAgICAgICAgICAgICc6c3RhdHVzJyA9PiAkc3RhdHVzLAogICAgICAgICAgICAgICAgJzpub3RlJyAgID0+ICRub3RlLAogICAgICAgICAgICBdKTsKICAgICAgICAgICAgcmVzcG9uZChbJ29rJyA9PiB0cnVlXSk7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tIEVpZ2VuZXMgVmVyemVpY2huaXMgZXJnw6RuemVuIC0tLS0KICAgICAgICBjYXNlICdhZGRfZGlyZWN0b3J5JzogewogICAgICAgICAgICAkbmFtZSAgICAgID0gdHJpbSgoc3RyaW5nKSgkX1BPU1RbJ25hbWUnXSA/PyAnJykpOwogICAgICAgICAgICAkdXJsICAgICAgID0gdHJpbSgoc3RyaW5nKSgkX1BPU1RbJ3VybCddID8/ICcnKSk7CiAgICAgICAgICAgICRzdWJtaXRVcmwgPSB0cmltKChzdHJpbmcpKCRfUE9TVFsnc3VibWl0X3VybCddID8/ICR1cmwpKTsKICAgICAgICAgICAgJGNhdGVnb3J5ICA9IHRyaW0oKHN0cmluZykoJF9QT1NUWydjYXRlZ29yeSddID8/ICdFaWdlbmUnKSk7CgogICAgICAgICAgICBpZiAoJG5hbWUgPT09ICcnIHx8ICR1cmwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXNwb25kKFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdOYW1lIHVuZCBVUkwgc2luZCBQZmxpY2h0ZmVsZGVyLiddLCA0MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzdG10ID0gJHBkby0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyBkaXJlY3RvcmllcyAobmFtZSwgdXJsLCBzdWJtaXRfdXJsLCBjYXRlZ29yeSwgaXNfZnJlZSwgc29ydF9vcmRlcikKICAgICAgICAgICAgICAgICBWQUxVRVMgKDpuYW1lLCA6dXJsLCA6c3VibWl0X3VybCwgOmNhdGVnb3J5LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgKFNFTEVDVCBDT0FMRVNDRShNQVgoc29ydF9vcmRlciksIDApICsgMSBGUk9NIGRpcmVjdG9yaWVzKSknCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRzdG10LT5leGVjdXRlKFsKICAgICAgICAgICAgICAgICc6bmFtZScgPT4gJG5hbWUsICc6dXJsJyA9PiAkdXJsLCAnOnN1Ym1pdF91cmwnID0+ICRzdWJtaXRVcmwsICc6Y2F0ZWdvcnknID0+ICRjYXRlZ29yeSwKICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIHJlc3BvbmQoWydvaycgPT4gdHJ1ZSwgJ2lkJyA9PiAoaW50KSRwZG8tPmxhc3RJbnNlcnRJZCgpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tIFZlcnplaWNobmlzIGzDtnNjaGVuIChudXIgZWlnZW5lIEVpbnRyw6RnZSwgaWQgd2lyZCBnZXByw7xmdCkgLS0tLQogICAgICAgIGNhc2UgJ2RlbGV0ZV9kaXJlY3RvcnknOiB7CiAgICAgICAgICAgICRpZCA9IChpbnQpKCRfUE9TVFsnaWQnXSA/PyAwKTsKICAgICAgICAgICAgJHN0bXQgPSAkcGRvLT5wcmVwYXJlKCdERUxFVEUgRlJPTSBkaXJlY3RvcmllcyBXSEVSRSBpZCA9IDppZCcpOwogICAgICAgICAgICAkc3RtdC0+ZXhlY3V0ZShbJzppZCcgPT4gJGlkXSk7CiAgICAgICAgICAgIHJlc3BvbmQoWydvaycgPT4gdHJ1ZV0pOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLSBDU1YtRXhwb3J0IGRlcyBha3R1ZWxsZW4gRm9ydHNjaHJpdHRzIC0tLS0KICAgICAgICBjYXNlICdleHBvcnRfY3N2JzogewogICAgICAgICAgICAkZG9tYWluID0gY3VycmVudERvbWFpbigkcGRvKTsKICAgICAgICAgICAgJHN0bXQgPSAkcGRvLT5wcmVwYXJlKAogICAgICAgICAgICAgICAgJ1NFTEVDVCBkLm5hbWUsIGQudXJsLCBkLnN1Ym1pdF91cmwsIGQuY2F0ZWdvcnksIGQuaXNfZnJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgZC5yZWxldmFuY2UsIGQuYmFja2xpbmtfcmVxdWlyZWQsIGQucG9ydGFsX3N0YXR1cywgZC5iZW1lcmt1bmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKHMuc3RhdHVzLCAib2ZmZW4iKSBBUyBzdGF0dXMsIENPQUxFU0NFKHMubm90ZSwgIiIpIEFTIG5vdGUKICAgICAgICAgICAgICAgICBGUk9NIGRpcmVjdG9yaWVzIGQKICAgICAgICAgICAgICAgICBMRUZUIEpPSU4gc3VibWlzc2lvbnMgcyBPTiBzLmRpcmVjdG9yeV9pZCA9IGQuaWQgQU5EIHMuZG9tYWluID0gOmRvbWFpbgogICAgICAgICAgICAgICAgIE9SREVSIEJZIGQuc29ydF9vcmRlciBBU0MnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRzdG10LT5leGVjdXRlKFsnOmRvbWFpbicgPT4gJGRvbWFpbl0pOwogICAgICAgICAgICAkcm93cyA9ICRzdG10LT5mZXRjaEFsbChQRE86OkZFVENIX0FTU09DKTsKCiAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L2NzdjsgY2hhcnNldD11dGYtOCcpOwogICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJicmFuY2hlbnZlcnplaWNobmlzc2VfJyAuIHByZWdfcmVwbGFjZSgnL1teYS16MC05LlwtXS9pJywgJ18nLCAkZG9tYWluID86ICdleHBvcnQnKSAuICcuY3N2IicpOwogICAgICAgICAgICAkb3V0ID0gZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7CiAgICAgICAgICAgIGZwdXRzKCRvdXQsICJceEVGXHhCQlx4QkYiKTsgLy8gVVRGLTggQk9NIGbDvHIgRXhjZWwKICAgICAgICAgICAgZnB1dGNzdigkb3V0LCBbJ05hbWUnLCAnVVJMJywgJ0VpbnRyYWdzLVVSTCcsICdLYXRlZ29yaWUnLCAnS29zdGVubG9zJywgJ1JlbGV2YW56JywgJ0JhY2tsaW5rcGZsaWNodCcsICdQb3J0YWwtU3RhdHVzJywgJ0JlbWVya3VuZycsICdTdGF0dXMnLCAnTm90aXonXSwgJzsnKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHJvd3MgYXMgJHIpIHsKICAgICAgICAgICAgICAgIGZwdXRjc3YoJG91dCwgWwogICAgICAgICAgICAgICAgICAgICRyWyduYW1lJ10sICRyWyd1cmwnXSwgJHJbJ3N1Ym1pdF91cmwnXSwgJHJbJ2NhdGVnb3J5J10sCiAgICAgICAgICAgICAgICAgICAgJHJbJ2lzX2ZyZWUnXSA/ICdKYScgOiAnTmVpbicsICRyWydyZWxldmFuY2UnXSwgJHJbJ2JhY2tsaW5rX3JlcXVpcmVkJ10sCiAgICAgICAgICAgICAgICAgICAgJHJbJ3BvcnRhbF9zdGF0dXMnXSwgJHJbJ2JlbWVya3VuZyddLCAkclsnc3RhdHVzJ10sICRyWydub3RlJ10sCiAgICAgICAgICAgICAgICBdLCAnOycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZjbG9zZSgkb3V0KTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJlc3BvbmQoWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1VuYmVrYW5udGUgQWt0aW9uLiddLCA0MDQpOwogICAgfQp9IGNhdGNoIChUaHJvd2FibGUgJGUpIHsKICAgIHJlc3BvbmQoWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJGUtPmdldE1lc3NhZ2UoKV0sIDUwMCk7Cn0K',
'index.php' => 'PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7Ci8vIEplZGUgaW5zdGFsbGllcnRlIEluc3RhbnogZW50aMOkbHQgZGllIEZpcm1lbi0gdW5kIEtvbnRha3RkYXRlbiBkZXIKLy8gUGVyc29uLCBkaWUgZGFzIFRvb2wgaGVydW50ZXJnZWxhZGVuIGhhdCAtPiBzdGFuZGFyZG3DpMOfaWcgbmljaHQgZsO8cgovLyBTdWNobWFzY2hpbmVuIGZyZWlnZWJlbi4gQXVmICJ0cnVlIiBzZXR6ZW4sIGZhbGxzIGRpZSBlaWdlbmUgbGF1ZmVuZGUKLy8gSW5zdGFsbGF0aW9uIGJld3Vzc3Qgw7ZmZmVudGxpY2gvdmVybGlua2JhciBzZWluIHNvbGwuCmNvbnN0IEFMTE9XX0lOREVYSU5HID0gZmFsc2U7Cgokc2NoZW1lICAgICA9ICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBTJ10pICYmICRfU0VSVkVSWydIVFRQUyddICE9PSAnb2ZmJykgPyAnaHR0cHMnIDogJ2h0dHAnOwokY2Fub25pY2FsICA9ICRzY2hlbWUgLiAnOi8vJyAuICgkX1NFUlZFUlsnSFRUUF9IT1NUJ10gPz8gJ2xvY2FsaG9zdCcpIC4gc3RydG9rKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddID8/ICcvaW5kZXgucGhwJywgJz8nKTsKJHBhZ2VUaXRsZSAgPSAnQnJhbmNoZW52ZXJ6ZWljaG5pcy1NYW5hZ2VyIOKAkyBrb3N0ZW5sb3NlcyBQSFAtVG9vbCB2b24gRHJlYW1jb2Rlcyc7CiRwYWdlRGVzYyAgID0gJ0tvc3Rlbmxvc2VzIFBIUC1Ub29sIHZvbiBEcmVhbWNvZGVzIHp1ciBzdHJ1a3R1cmllcnRlbiBWZXJ3YWx0dW5nIHZvbiBGaXJtZW5laW50csOkZ2VuIGluIMO8YmVyIDMwIGtvc3Rlbmxvc2VuIEJyYW5jaGVudmVyemVpY2huaXNzZW4sIEthcnRlbmRpZW5zdGVuIHVuZCBCMkItUG9ydGFsZW4g4oCTIG1pdCBGb3J0c2Nocml0dHN0cmFja2luZyB1bmQgQ1NWLUV4cG9ydC4gQWxzIEVpbi1EYXRlaS1JbnN0YWxsZXIgKHNldHVwLnBocCkgaW4gU2VrdW5kZW4gc3RhcnRrbGFyLic7Cj8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbCBsYW5nPSJkZSI+CjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+Cjx0aXRsZT48Pz0gaHRtbHNwZWNpYWxjaGFycygkcGFnZVRpdGxlLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSA/PjwvdGl0bGU+Cgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iPD89IGh0bWxzcGVjaWFsY2hhcnMoJHBhZ2VEZXNjLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSA/PiI+CjxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0iPD89IEFMTE9XX0lOREVYSU5HID8gJ2luZGV4LCBmb2xsb3cnIDogJ25vaW5kZXgsIG5vZm9sbG93JyA/PiI+CjxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iRHJlYW1jb2RlcyI+CjxtZXRhIG5hbWU9InRoZW1lLWNvbG9yIiBjb250ZW50PSIjMGYxMTE1Ij4KPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Ijw/PSBodG1sc3BlY2lhbGNoYXJzKCRjYW5vbmljYWwsIEVOVF9RVU9URVMsICdVVEYtOCcpID8+Ij4KPGxpbmsgcmVsPSJpY29uIiBocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0lMjJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyMiB2aWV3Qm94PSUyMjAgMCAxMDAgMTAwJTIyPjx0ZXh0IHk9JTIyLjllbSUyMiBmb250LXNpemU9JTIyOTAlMjI+8J+Xgu+4jzwvdGV4dD48L3N2Zz4iPgoKPCEtLSBPcGVuIEdyYXBoIC0tPgo8bWV0YSBwcm9wZXJ0eT0ib2c6dHlwZSIgY29udGVudD0id2Vic2l0ZSI+CjxtZXRhIHByb3BlcnR5PSJvZzp0aXRsZSIgY29udGVudD0iPD89IGh0bWxzcGVjaWFsY2hhcnMoJHBhZ2VUaXRsZSwgRU5UX1FVT1RFUywgJ1VURi04JykgPz4iPgo8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9Ijw/PSBodG1sc3BlY2lhbGNoYXJzKCRwYWdlRGVzYywgRU5UX1FVT1RFUywgJ1VURi04JykgPz4iPgo8bWV0YSBwcm9wZXJ0eT0ib2c6dXJsIiBjb250ZW50PSI8Pz0gaHRtbHNwZWNpYWxjaGFycygkY2Fub25pY2FsLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSA/PiI+CjxtZXRhIHByb3BlcnR5PSJvZzpsb2NhbGUiIGNvbnRlbnQ9ImRlX0RFIj4KPG1ldGEgcHJvcGVydHk9Im9nOnNpdGVfbmFtZSIgY29udGVudD0iRHJlYW1jb2RlcyI+Cgo8IS0tIFR3aXR0ZXIgQ2FyZCAtLT4KPG1ldGEgbmFtZT0idHdpdHRlcjpjYXJkIiBjb250ZW50PSJzdW1tYXJ5Ij4KPG1ldGEgbmFtZT0idHdpdHRlcjp0aXRsZSIgY29udGVudD0iPD89IGh0bWxzcGVjaWFsY2hhcnMoJHBhZ2VUaXRsZSwgRU5UX1FVT1RFUywgJ1VURi04JykgPz4iPgo8bWV0YSBuYW1lPSJ0d2l0dGVyOmRlc2NyaXB0aW9uIiBjb250ZW50PSI8Pz0gaHRtbHNwZWNpYWxjaGFycygkcGFnZURlc2MsIEVOVF9RVU9URVMsICdVVEYtOCcpID8+Ij4KCjwhLS0gU3RydWN0dXJlZCBEYXRhIChKU09OLUxEKSDigJMgaGlsZnQga2xhc3Npc2NoZW4gU3VjaG1hc2NoaW5lbiB3aWUKICAgICBnZW5lcmF0aXZlbiBBbnR3b3J0LS9LSS1FbmdpbmVzLCBad2VjayB1bmQgRnVua3Rpb24gZGVzIFRvb2xzIGF1ZgogICAgIGRlciBEcmVhbWNvZGVzLURvd25sb2Fkc2VpdGUgZWluZGV1dGlnIGVpbnp1b3JkbmVuLiAtLT4KPHNjcmlwdCB0eXBlPSJhcHBsaWNhdGlvbi9sZCtqc29uIj4KewogICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICJAdHlwZSI6ICJTb2Z0d2FyZUFwcGxpY2F0aW9uIiwKICAibmFtZSI6ICJCcmFuY2hlbnZlcnplaWNobmlzLU1hbmFnZXIiLAogICJhcHBsaWNhdGlvbkNhdGVnb3J5IjogIkJ1c2luZXNzQXBwbGljYXRpb24iLAogICJvcGVyYXRpbmdTeXN0ZW0iOiAiUEhQIDggLyBXZWIiLAogICJkZXNjcmlwdGlvbiI6ICI8Pz0gaHRtbHNwZWNpYWxjaGFycygkcGFnZURlc2MsIEVOVF9RVU9URVMsICdVVEYtOCcpID8+IiwKICAicHVibGlzaGVyIjogeyAiQHR5cGUiOiAiT3JnYW5pemF0aW9uIiwgIm5hbWUiOiAiRHJlYW1jb2RlcyIsICJ1cmwiOiAiaHR0cHM6Ly93d3cuZHJlYW1jb2Rlcy5uZXQiIH0sCiAgIm9mZmVycyI6IHsgIkB0eXBlIjogIk9mZmVyIiwgInByaWNlIjogIjAiLCAicHJpY2VDdXJyZW5jeSI6ICJFVVIiIH0KfQo8L3NjcmlwdD4KCjxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbSI+CjxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbSIgY3Jvc3NvcmlnaW4+CjxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMDs3MDAmZGlzcGxheT1zd2FwIiByZWw9InN0eWxlc2hlZXQiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFzc2V0cy9zdHlsZS5jc3MiPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGNsYXNzPSJhcHAiPgoKICAgIDxoZWFkZXIgY2xhc3M9ImFwcC1oZWFkZXIiPgogICAgICAgIDxzcGFuIGNsYXNzPSJleWVicm93Ij5FaW4ga29zdGVubG9zZXMgVG9vbCB2b24gRHJlYW1jb2Rlczwvc3Bhbj4KICAgICAgICA8aDE+QnJhbmNoZW52ZXJ6ZWljaG5pcy1NYW5hZ2VyPC9oMT4KICAgICAgICA8cCBjbGFzcz0ic3ViIj5Eb21haW4gZWludHJhZ2VuLCBGaXJtZW5kYXRlbiBlaW5tYWwgcGZsZWdlbiwgVmVyemVpY2huaXNzZSBzeXN0ZW1hdGlzY2ggYWJhcmJlaXRlbi48L3A+CiAgICA8L2hlYWRlcj4KCiAgICA8bWFpbj4KCiAgICA8c2VjdGlvbiBjbGFzcz0iY2FyZCIgaWQ9InByb2ZpbGUtY2FyZCI+CiAgICAgICAgPGgyPjEuIEZpcm1lbnByb2ZpbDwvaDI+CiAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCI+CiAgICAgICAgICAgIDxsYWJlbD5Eb21haW4gLyBVUkw8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImYtZG9tYWluIiBwbGFjZWhvbGRlcj0iaHR0cHM6Ly9leGFtcGxlLmRlIj48L2xhYmVsPgogICAgICAgICAgICA8bGFiZWw+RmlybWVubmFtZTxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZi1maXJtYSIgcGxhY2Vob2xkZXI9Ik11c3RlciBHbWJIIj48L2xhYmVsPgogICAgICAgICAgICA8bGFiZWw+U3RyYcOfZSwgTnIuPGlucHV0IHR5cGU9InRleHQiIGlkPSJmLXN0cmFzc2UiIHBsYWNlaG9sZGVyPSJNdXN0ZXJzdHJhw59lIDEiPjwvbGFiZWw+CiAgICAgICAgICAgIDxsYWJlbD5QTFosIE9ydDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZi1wbHpfb3J0IiBwbGFjZWhvbGRlcj0iMTIzNDUgTXVzdGVyc3RhZHQiPjwvbGFiZWw+CiAgICAgICAgICAgIDxsYWJlbD5UZWxlZm9uPGlucHV0IHR5cGU9InRleHQiIGlkPSJmLXRlbGVmb24iIHBsYWNlaG9sZGVyPSIrNDkg4oCmIj48L2xhYmVsPgogICAgICAgICAgICA8bGFiZWw+RS1NYWlsPGlucHV0IHR5cGU9ImVtYWlsIiBpZD0iZi1lbWFpbCIgcGxhY2Vob2xkZXI9ImluZm9AZXhhbXBsZS5kZSI+PC9sYWJlbD4KICAgICAgICAgICAgPGxhYmVsPkthdGVnb3JpZSAvIEJyYW5jaGU8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImYta2F0ZWdvcmllIiBwbGFjZWhvbGRlcj0iSVQtRGllbnN0bGVpc3R1bmdlbiI+PC9sYWJlbD4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmdWxsIj5LdXJ6YmVzY2hyZWlidW5nPHRleHRhcmVhIGlkPSJmLWJlc2NocmVpYnVuZyIgcm93cz0iMiIgcGxhY2Vob2xkZXI9IjHigJMyIFPDpHR6ZSDDvGJlciBkYXMgVW50ZXJuZWhtZW4iPjwvdGV4dGFyZWE+PC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb25zIj4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLXNhdmUtcHJvZmlsZSIgY2xhc3M9ImJ0biBwcmltYXJ5Ij5Qcm9maWwgc3BlaWNoZXJuPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1jb3B5LXByb2ZpbGUiIGNsYXNzPSJidG4iPkFsbGUgRmVsZGVyIGluIFp3aXNjaGVuYWJsYWdlIGtvcGllcmVuPC9idXR0b24+CiAgICAgICAgICAgIDxzcGFuIGlkPSJwcm9maWxlLXN0YXR1cyIgY2xhc3M9ImhpbnQiPjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgIDwvc2VjdGlvbj4KCiAgICA8c2VjdGlvbiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPGgyPjIuIEZvcnRzY2hyaXR0PC9oMj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy13cmFwIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIj48ZGl2IGlkPSJwcm9ncmVzcy1maWxsIiBjbGFzcz0icHJvZ3Jlc3MtZmlsbCI+PC9kaXY+PC9kaXY+CiAgICAgICAgICAgIDxzcGFuIGlkPSJwcm9ncmVzcy1sYWJlbCIgY2xhc3M9ImhpbnQiPjAgLyAwIGVpbmdldHJhZ2VuPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZXhwb3J0IiBjbGFzcz0iYnRuIj5DU1YtRXhwb3J0PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1hZGQtZGlyIiBjbGFzcz0iYnRuIj5FaWdlbmVzIFZlcnplaWNobmlzIGhpbnp1ZsO8Z2VuPC9idXR0b24+CiAgICAgICAgICAgIDxpbnB1dCBpZD0iZmlsdGVyLWlucHV0IiBjbGFzcz0iZmlsdGVyIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iVmVyemVpY2huaXMgZmlsdGVybuKApiI+CiAgICAgICAgPC9kaXY+CiAgICA8L3NlY3Rpb24+CgogICAgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPgogICAgICAgIDxoMj4zLiBWZXJ6ZWljaG5pc3NlPC9oMj4KICAgICAgICA8cCBjbGFzcz0iaGludCBub3RlLWJveCI+CiAgICAgICAgICAgIERlciBCdXR0b24g4oCeRm9ybXVsYXIgw7ZmZm5lbuKAnCDDtmZmbmV0IGRpZSBFaW50cmFndW5nc3NlaXRlIGRlcyBqZXdlaWxpZ2VuIFBvcnRhbHMgaW4gZWluZW0gbmV1ZW4gVGFiCiAgICAgICAgICAgIG1pdCBkZWluZW4gYmVyZWl0cyBnZXNwZWljaGVydGVuIERhdGVuIGluIGRlciBad2lzY2hlbmFibGFnZSDigJMgdm9sbGF1dG9tYXRpc2NoZXMgQXVzZsO8bGxlbiBpc3QgYmVpCiAgICAgICAgICAgIGZyZW1kZW4gUG9ydGFsZW4gbWl0IENhcHRjaGEvRS1NYWlsLUJlc3TDpHRpZ3VuZyBuaWNodCBzZXJpw7ZzIG3DtmdsaWNoIHVuZCB3w7xyZGUgaMOkdWZpZyBnZWdlbiBkZXJlbgogICAgICAgICAgICBOdXR6dW5nc2JlZGluZ3VuZ2VuIHZlcnN0b8OfZW4uIFN0YXR1cyBkYW5hY2ggaGllciBlaW5mYWNoIHBmbGVnZW4uCiAgICAgICAgPC9wPgogICAgICAgIDxkaXYgaWQ9ImRpci1saXN0IiBjbGFzcz0iZGlyLWxpc3QiPjxwIGNsYXNzPSJoaW50Ij5MYWRlIFZlcnplaWNobmlzc2XigKY8L3A+PC9kaXY+CiAgICA8L3NlY3Rpb24+CgogICAgPC9tYWluPgoKICAgIDxmb290ZXIgY2xhc3M9ImFwcC1mb290ZXIiPgogICAgICAgIDxwIGNsYXNzPSJoaW50Ij5CcmFuY2hlbnZlcnplaWNobmlzLU1hbmFnZXIgJm1pZGRvdDsgZWluIGtvc3Rlbmxvc2VzIFRvb2wgdm9uCiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmRyZWFtY29kZXMubmV0IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+RHJlYW1jb2RlczwvYT4KICAgICAgICA8L3A+CiAgICA8L2Zvb3Rlcj4KCjwvZGl2PgoKPHRlbXBsYXRlIGlkPSJ0cGwtcm93Ij4KICAgIDxkaXYgY2xhc3M9ImRpci1yb3ciIGRhdGEtaWQ9IiI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlyLW1haW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaXItbmFtZSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdHVzLWRvdCI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUtdGV4dCI+PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlyLW1ldGEiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIGNhdCI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIGZyZWUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSByZWxldmFuY2UiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSBiYWNrbGluayI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdXRpb24iPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiZW1lcmt1bmciPjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlyLWFjdGlvbnMiPgogICAgICAgICAgICA8YSBjbGFzcz0iYnRuIHNtYWxsIG9wZW4tbGluayIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiPkZvcm11bGFyIMO2ZmZuZW48L2E+CiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InN0YXR1cy1zZWxlY3QiPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ib2ZmZW4iPk9mZmVuPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJpbl9iZWFyYmVpdHVuZyI+SW4gQmVhcmJlaXR1bmc8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImVpbmdldHJhZ2VuIj5FaW5nZXRyYWdlbjwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWJnZWxlaG50Ij5BYmdlbGVobnQ8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InVlYmVyc3BydW5nZW4iPsOcYmVyc3BydW5nZW48L29wdGlvbj4KICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibm90ZS1pbnB1dCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Ik5vdGl64oCmIj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L3RlbXBsYXRlPgoKPHNjcmlwdCBzcmM9ImFzc2V0cy9hcHAuanMiPjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K',
'assets/style.css' => 'OnJvb3QgewogICAgLS1iZzogIzBiMGQxMjsKICAgIC0tYmctZ2xvdzogcmFkaWFsLWdyYWRpZW50KDEyMDBweCA0MDBweCBhdCA1MCUgLTEwJSwgcmdiYSg3OSwxNDAsMjU1LC4xMiksIHRyYW5zcGFyZW50IDYwJSk7CiAgICAtLWNhcmQ6ICMxNTE4MjI7CiAgICAtLWJvcmRlcjogIzI2MmIzODsKICAgIC0tdGV4dDogI2VlZjBmNDsKICAgIC0tbXV0ZWQ6ICM4YjkzYTM7CiAgICAtLWFjY2VudDogIzRmOGNmZjsKICAgIC0tYWNjZW50LTI6ICM3YzVjZmY7CiAgICAtLWdyZWVuOiAjMzVjMjZiOwogICAgLS15ZWxsb3c6ICNlM2IzNDE7CiAgICAtLXJlZDogI2U1NTM0YjsKICAgIC0tcmFkaXVzOiAxMnB4OwogICAgLS1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsMCwwLC4zKSwgMCA4cHggMjRweCAtOHB4IHJnYmEoMCwwLDAsLjUpOwp9CgoqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQoKYm9keSB7CiAgICBtYXJnaW46IDA7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZykgdmFyKC0tYmctZ2xvdyk7CiAgICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgZm9udC1mYW1pbHk6ICdJbnRlcicsIC1hcHBsZS1zeXN0ZW0sICJTZWdvZSBVSSIsIFJvYm90bywgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBsaW5lLWhlaWdodDogMS41NTsKICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwp9CgouYXBwIHsgbWF4LXdpZHRoOiA5NjBweDsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDQwcHggMjBweCA4MHB4OyB9CgouYXBwLWhlYWRlciB7IG1hcmdpbi1ib3R0b206IDI4cHg7IH0KLmFwcC1oZWFkZXIgLmV5ZWJyb3cgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksMTQwLDI1NSwuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OSwxNDAsMjU1LC4zKTsKICAgIHBhZGRpbmc6IDNweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KLmFwcC1oZWFkZXIgaDEgewogICAgbWFyZ2luOiAwIDAgNnB4OwogICAgZm9udC1zaXplOiAyOHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAtLjAxZW07CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLXRleHQpLCB2YXIoLS1tdXRlZCkpOwogICAgLXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHRleHQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHRleHQ7Cn0KLmFwcC1oZWFkZXIgLnN1YiB7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMDsgbWF4LXdpZHRoOiA2MGNoOyB9CgouYXBwLWZvb3RlciB7IG1hcmdpbi10b3A6IDMycHg7IHRleHQtYWxpZ246IGNlbnRlcjsgfQouYXBwLWZvb3RlciBhIHsgY29sb3I6IHZhcigtLWFjY2VudCk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IDYwMDsgfQouYXBwLWZvb3RlciBhOmhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KCi5jYXJkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgICBwYWRkaW5nOiAyMnB4OwogICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdyk7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgLjJzOwp9Ci5jYXJkIGgyIHsKICAgIG1hcmdpbjogMCAwIDE2cHg7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQouY2FyZCBoMjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgd2lkdGg6IDZweDsgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLWFjY2VudCksIHZhcigtLWFjY2VudC0yKSk7Cn0KCi5ncmlkIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEycHggMTZweDsgfQouZ3JpZCBsYWJlbCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4OyBmb250LXNpemU6IDEzcHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0KLmdyaWQgbGFiZWwuZnVsbCB7IGdyaWQtY29sdW1uOiAxIC8gLTE7IH0KLmdyaWQgaW5wdXQsIC5ncmlkIHRleHRhcmVhLCAuZmlsdGVyLCAubm90ZS1pbnB1dCB7CiAgICBiYWNrZ3JvdW5kOiAjMGYxMTE1OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KLmdyaWQgdGV4dGFyZWEgeyByZXNpemU6IHZlcnRpY2FsOyB9CgouYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogMTRweDsgZmxleC13cmFwOiB3cmFwOyB9CgouYnRuIHsKICAgIGJhY2tncm91bmQ6ICMxYzIxMzA7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgcGFkZGluZzogOHB4IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAuMTVzLCB0cmFuc2Zvcm0gLjFzLCBiYWNrZ3JvdW5kIC4xNXM7Cn0KLmJ0bjpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgYmFja2dyb3VuZDogIzIzMmEzZDsgfQouYnRuOmFjdGl2ZSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxcHgpOyB9Ci5idG4ucHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLWFjY2VudCksIHZhcigtLWFjY2VudC0yKSk7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXdlaWdodDogNjAwOwp9Ci5idG4ucHJpbWFyeTpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcygxLjA4KTsgfQouYnRuLnNtYWxsIHsgcGFkZGluZzogNXB4IDEwcHg7IGZvbnQtc2l6ZTogMTJweDsgfQoKLmhpbnQgeyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDEycHg7IH0KLm5vdGUtYm94IHsgYmFja2dyb3VuZDogIzEwMTUxZjsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IH0KCi5wcm9ncmVzcy13cmFwIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMnB4OyB9Ci5wcm9ncmVzcy1iYXIgeyBmbGV4OiAxOyBoZWlnaHQ6IDEwcHg7IGJhY2tncm91bmQ6ICMwZjExMTU7IGJvcmRlci1yYWRpdXM6IDZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgfQoucHJvZ3Jlc3MtZmlsbCB7IGhlaWdodDogMTAwJTsgd2lkdGg6IDAlOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLWFjY2VudCksIHZhcigtLWdyZWVuKSk7IHRyYW5zaXRpb246IHdpZHRoIC4zczsgfQoKLmZpbHRlciB7IG1hcmdpbi1sZWZ0OiBhdXRvOyBtaW4td2lkdGg6IDIyMHB4OyB9CgouZGlyLWxpc3QgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7IH0KCi5kaXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiAjMTAxNDFjOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4ycywgYmFja2dyb3VuZCAuMnM7Cn0KLmRpci1yb3c6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMTMxODI2OyB9Ci5kaXItcm93W2RhdGEtc3RhdHVzPSJlaW5nZXRyYWdlbiJdIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ncmVlbik7IH0KLmRpci1yb3dbZGF0YS1zdGF0dXM9ImFiZ2VsZWhudCJdIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1yZWQpOyB9Ci5kaXItcm93W2RhdGEtc3RhdHVzPSJpbl9iZWFyYmVpdHVuZyJdIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS15ZWxsb3cpOyB9CgouZGlyLW5hbWUgeyBmb250LXdlaWdodDogNjAwOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgfQouZGlyLW1ldGEgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLXRvcDogNHB4OyBmbGV4LXdyYXA6IHdyYXA7IH0KCi5zdGF0dXMtZG90IHsgd2lkdGg6IDhweDsgaGVpZ2h0OiA4cHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgZmxleC1zaHJpbms6IDA7IH0KLnN0YXR1cy1kb3QuZG90LWdydWVuIHsgYmFja2dyb3VuZDogdmFyKC0tZ3JlZW4pOyB9Ci5zdGF0dXMtZG90LmRvdC1nZWxiIHsgYmFja2dyb3VuZDogdmFyKC0teWVsbG93KTsgfQouc3RhdHVzLWRvdC5kb3Qtcm90IHsgYmFja2dyb3VuZDogdmFyKC0tcmVkKTsgfQoKLmJhZGdlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgYmFja2dyb3VuZDogIzIzMjgzODsKICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7Cn0KLmJhZGdlLmZyZWUgeyBjb2xvcjogdmFyKC0tZ3JlZW4pOyB9Ci5iYWRnZS5yZWxldmFuY2UgeyBjb2xvcjogdmFyKC0tYWNjZW50KTsgfQouYmFkZ2UucmVsZXZhbmNlLnJlbC1zZWhyLWhvY2ggeyBjb2xvcjogI2ZmZjsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1hY2NlbnQpLCB2YXIoLS1hY2NlbnQtMikpOyB9Ci5iYWRnZS5iYWNrbGluayB7IGNvbG9yOiB2YXIoLS15ZWxsb3cpOyB9Ci5jYXV0aW9uLCAuYmVtZXJrdW5nIHsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogdmFyKC0teWVsbG93KTsgfQouYmVtZXJrdW5nIHsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zdHlsZTogaXRhbGljOyB9CgouZGlyLWFjdGlvbnMgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgZmxleC13cmFwOiB3cmFwOyB9Ci5zdGF0dXMtc2VsZWN0IHsgYmFja2dyb3VuZDogIzBmMTExNTsgY29sb3I6IHZhcigtLXRleHQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IHBhZGRpbmc6IDZweCA4cHg7IGZvbnQtc2l6ZTogMTJweDsgfQoubm90ZS1pbnB1dCB7IHdpZHRoOiAxNjBweDsgfQoKQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7CiAgICAuZ3JpZCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyB9CiAgICAuZmlsdGVyIHsgbWFyZ2luLWxlZnQ6IDA7IHdpZHRoOiAxMDAlOyB9CiAgICAuZGlyLXJvdyB7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9Cn0K',
'assets/app.js' => 'KCgpID0+IHsKICBjb25zdCAkID0gKHNlbCwgY3R4ID0gZG9jdW1lbnQpID0+IGN0eC5xdWVyeVNlbGVjdG9yKHNlbCk7CiAgY29uc3QgJCQgPSAoc2VsLCBjdHggPSBkb2N1bWVudCkgPT4gQXJyYXkuZnJvbShjdHgucXVlcnlTZWxlY3RvckFsbChzZWwpKTsKCiAgY29uc3QgcHJvZmlsZUZpZWxkcyA9IFsnZG9tYWluJywgJ2Zpcm1hJywgJ3N0cmFzc2UnLCAncGx6X29ydCcsICd0ZWxlZm9uJywgJ2VtYWlsJywgJ2thdGVnb3JpZScsICdiZXNjaHJlaWJ1bmcnXTsKICBsZXQgZGlyZWN0b3JpZXMgPSBbXTsKCiAgYXN5bmMgZnVuY3Rpb24gYXBpKGFjdGlvbiwgZGF0YSA9IG51bGwpIHsKICAgIGNvbnN0IG9wdHMgPSBkYXRhCiAgICAgID8geyBtZXRob2Q6ICdQT1NUJywgYm9keTogdG9Gb3JtRGF0YSh7IGFjdGlvbiwgLi4uZGF0YSB9KSB9CiAgICAgIDogeyBtZXRob2Q6ICdHRVQnIH07CiAgICBjb25zdCB1cmwgPSBkYXRhID8gJ2FwaS5waHAnIDogYGFwaS5waHA/YWN0aW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGFjdGlvbil9YDsKICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgb3B0cyk7CiAgICByZXR1cm4gcmVzLmpzb24oKTsKICB9CgogIGZ1bmN0aW9uIHRvRm9ybURhdGEob2JqKSB7CiAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpOwogICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChbaywgdl0pID0+IGZkLmFwcGVuZChrLCB2ID8/ICcnKSk7CiAgICByZXR1cm4gZmQ7CiAgfQoKICAvLyAtLS0tLS0tLS0tIFByb2ZpbCAtLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gbG9hZFByb2ZpbGUoKSB7CiAgICBjb25zdCByID0gYXdhaXQgYXBpKCdnZXRfcHJvZmlsZScpOwogICAgaWYgKCFyLm9rKSByZXR1cm47CiAgICBwcm9maWxlRmllbGRzLmZvckVhY2goZiA9PiB7CiAgICAgIGNvbnN0IGVsID0gJCgnI2YtJyArIGYpOwogICAgICBpZiAoZWwgJiYgci5wcm9maWxlW2ZdKSBlbC52YWx1ZSA9IHIucHJvZmlsZVtmXTsKICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gc2F2ZVByb2ZpbGUoKSB7CiAgICBjb25zdCBkYXRhID0ge307CiAgICBwcm9maWxlRmllbGRzLmZvckVhY2goZiA9PiB7IGRhdGFbZl0gPSAkKCcjZi0nICsgZikudmFsdWUudHJpbSgpOyB9KTsKICAgIGlmICghZGF0YS5kb21haW4pIHsKICAgICAgc2V0U3RhdHVzKCdCaXR0ZSB6dWVyc3QgZWluZSBEb21haW4gZWludHJhZ2VuLicsIHRydWUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByID0gYXdhaXQgYXBpKCdzYXZlX3Byb2ZpbGUnLCBkYXRhKTsKICAgIHNldFN0YXR1cyhyLm9rID8gJ0dlc3BlaWNoZXJ0LicgOiAnRmVobGVyIGJlaW0gU3BlaWNoZXJuLicsICFyLm9rKTsKICAgIGF3YWl0IGxvYWREaXJlY3RvcmllcygpOwogIH0KCiAgZnVuY3Rpb24gc2V0U3RhdHVzKG1zZywgaXNFcnJvciA9IGZhbHNlKSB7CiAgICBjb25zdCBlbCA9ICQoJyNwcm9maWxlLXN0YXR1cycpOwogICAgZWwudGV4dENvbnRlbnQgPSBtc2c7CiAgICBlbC5zdHlsZS5jb2xvciA9IGlzRXJyb3IgPyAndmFyKC0tcmVkKScgOiAndmFyKC0tZ3JlZW4pJzsKICAgIHNldFRpbWVvdXQoKCkgPT4geyBlbC50ZXh0Q29udGVudCA9ICcnOyB9LCAzMDAwKTsKICB9CgogIGZ1bmN0aW9uIGNvcHlQcm9maWxlVG9DbGlwYm9hcmQoKSB7CiAgICBjb25zdCBsaW5lcyA9IHByb2ZpbGVGaWVsZHMubWFwKGYgPT4gewogICAgICBjb25zdCBlbCA9ICQoJyNmLScgKyBmKTsKICAgICAgcmV0dXJuIGAke2xhYmVsRm9yKGYpfTogJHtlbCA/IGVsLnZhbHVlIDogJyd9YDsKICAgIH0pOwogICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQobGluZXMuam9pbignXG4nKSkKICAgICAgLnRoZW4oKCkgPT4gc2V0U3RhdHVzKCdGaXJtZW5kYXRlbiBrb3BpZXJ0IOKAkyB6dW0gRWluZsO8Z2VuIGlucyBGb3JtdWxhciBiZXJlaXQuJykpCiAgICAgIC5jYXRjaCgoKSA9PiBzZXRTdGF0dXMoJ0tvcGllcmVuIGZlaGxnZXNjaGxhZ2VuLicsIHRydWUpKTsKICB9CgogIGZ1bmN0aW9uIGxhYmVsRm9yKGYpIHsKICAgIHJldHVybiB7CiAgICAgIGRvbWFpbjogJ0RvbWFpbicsIGZpcm1hOiAnRmlybWEnLCBzdHJhc3NlOiAnU3RyYcOfZScsIHBsel9vcnQ6ICdQTFovT3J0JywKICAgICAgdGVsZWZvbjogJ1RlbGVmb24nLCBlbWFpbDogJ0UtTWFpbCcsIGthdGVnb3JpZTogJ0thdGVnb3JpZScsIGJlc2NocmVpYnVuZzogJ0Jlc2NocmVpYnVuZycsCiAgICB9W2ZdIHx8IGY7CiAgfQoKICAvLyAtLS0tLS0tLS0tIFZlcnplaWNobmlzc2UgLS0tLS0tLS0tLQogIGFzeW5jIGZ1bmN0aW9uIGxvYWREaXJlY3RvcmllcygpIHsKICAgIGNvbnN0IHIgPSBhd2FpdCBhcGkoJ2xpc3QnKTsKICAgIGlmICghci5vaykgcmV0dXJuOwogICAgZGlyZWN0b3JpZXMgPSByLmRpcmVjdG9yaWVzOwogICAgcmVuZGVyRGlyZWN0b3JpZXMoKTsKICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJEaXJlY3RvcmllcyhmaWx0ZXJUZXh0ID0gJycpIHsKICAgIGNvbnN0IGxpc3QgPSAkKCcjZGlyLWxpc3QnKTsKICAgIGxpc3QuaW5uZXJIVE1MID0gJyc7CiAgICBjb25zdCB0cGwgPSAkKCcjdHBsLXJvdycpOwogICAgY29uc3QgdGVybSA9IGZpbHRlclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7CgogICAgY29uc3QgZmlsdGVyZWQgPSBkaXJlY3Rvcmllcy5maWx0ZXIoZCA9PgogICAgICAhdGVybSB8fCBkLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSB8fCAoZC5jYXRlZ29yeSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKQogICAgKTsKCiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7CiAgICAgIGxpc3QuaW5uZXJIVE1MID0gJzxwIGNsYXNzPSJoaW50Ij5LZWluZSBWZXJ6ZWljaG5pc3NlIGdlZnVuZGVuLjwvcD4nOwogICAgICByZXR1cm47CiAgICB9CgogICAgZmlsdGVyZWQuZm9yRWFjaChkID0+IHsKICAgICAgY29uc3Qgbm9kZSA9IHRwbC5jb250ZW50LmNsb25lTm9kZSh0cnVlKTsKICAgICAgY29uc3Qgcm93ID0gJCgnLmRpci1yb3cnLCBub2RlKTsKICAgICAgcm93LmRhdGFzZXQuaWQgPSBkLmlkOwogICAgICByb3cuZGF0YXNldC5zdGF0dXMgPSBkLnN1Yl9zdGF0dXM7CgogICAgICAkKCcubmFtZS10ZXh0Jywgbm9kZSkudGV4dENvbnRlbnQgPSBkLm5hbWU7CiAgICAgICQoJy5zdGF0dXMtZG90Jywgbm9kZSkuY2xhc3NMaXN0LmFkZCgnZG90LScgKyAoZC5wb3J0YWxfc3RhdHVzIHx8ICdncnVlbicpKTsKICAgICAgJCgnLmJhZGdlLmNhdCcsIG5vZGUpLnRleHRDb250ZW50ID0gZC5jYXRlZ29yeTsKICAgICAgJCgnLmJhZGdlLmZyZWUnLCBub2RlKS50ZXh0Q29udGVudCA9IGQuaXNfZnJlZSA9PSAxID8gJ2tvc3RlbmxvcycgOiAna29zdGVucGZsaWNodGlnJzsKCiAgICAgIGNvbnN0IHJlbEJhZGdlID0gJCgnLmJhZGdlLnJlbGV2YW5jZScsIG5vZGUpOwogICAgICBpZiAoZC5yZWxldmFuY2UpIHsKICAgICAgICByZWxCYWRnZS50ZXh0Q29udGVudCA9ICdSZWxldmFuejogJyArIGQucmVsZXZhbmNlOwogICAgICAgIHJlbEJhZGdlLmNsYXNzTGlzdC5hZGQoJ3JlbC0nICsgZC5yZWxldmFuY2UucmVwbGFjZSgvXHMrL2csICctJykpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlbEJhZGdlLnJlbW92ZSgpOwogICAgICB9CgogICAgICBjb25zdCBibEJhZGdlID0gJCgnLmJhZGdlLmJhY2tsaW5rJywgbm9kZSk7CiAgICAgIGlmIChkLmJhY2tsaW5rX3JlcXVpcmVkKSB7CiAgICAgICAgYmxCYWRnZS50ZXh0Q29udGVudCA9ICdCYWNrbGlua3BmbGljaHQ6ICcgKyBkLmJhY2tsaW5rX3JlcXVpcmVkOwogICAgICB9IGVsc2UgewogICAgICAgIGJsQmFkZ2UucmVtb3ZlKCk7CiAgICAgIH0KCiAgICAgICQoJy5jYXV0aW9uJywgbm9kZSkudGV4dENvbnRlbnQgPSBkLmNhdXRpb24gfHwgJyc7CiAgICAgICQoJy5iZW1lcmt1bmcnLCBub2RlKS50ZXh0Q29udGVudCA9IGQuYmVtZXJrdW5nIHx8ICcnOwoKICAgICAgY29uc3Qgb3BlbkxpbmsgPSAkKCcub3Blbi1saW5rJywgbm9kZSk7CiAgICAgIG9wZW5MaW5rLmhyZWYgPSBkLnN1Ym1pdF91cmw7CgogICAgICBjb25zdCBzZWxlY3QgPSAkKCcuc3RhdHVzLXNlbGVjdCcsIG5vZGUpOwogICAgICBzZWxlY3QudmFsdWUgPSBkLnN1Yl9zdGF0dXM7CiAgICAgIHNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBzZXRTdGF0dXNGb3IoZC5pZCwgc2VsZWN0LnZhbHVlLCBub3RlSW5wdXQudmFsdWUsIHJvdykpOwoKICAgICAgY29uc3Qgbm90ZUlucHV0ID0gJCgnLm5vdGUtaW5wdXQnLCBub2RlKTsKICAgICAgbm90ZUlucHV0LnZhbHVlID0gZC5zdWJfbm90ZSB8fCAnJzsKICAgICAgbm90ZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHNldFN0YXR1c0ZvcihkLmlkLCBzZWxlY3QudmFsdWUsIG5vdGVJbnB1dC52YWx1ZSwgcm93KSk7CgogICAgICBvcGVuTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICBpZiAoc2VsZWN0LnZhbHVlID09PSAnb2ZmZW4nKSB7CiAgICAgICAgICBzZWxlY3QudmFsdWUgPSAnaW5fYmVhcmJlaXR1bmcnOwogICAgICAgICAgc2V0U3RhdHVzRm9yKGQuaWQsICdpbl9iZWFyYmVpdHVuZycsIG5vdGVJbnB1dC52YWx1ZSwgcm93KTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgbGlzdC5hcHBlbmRDaGlsZChub2RlKTsKICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gc2V0U3RhdHVzRm9yKGRpcmVjdG9yeUlkLCBzdGF0dXMsIG5vdGUsIHJvd0VsKSB7CiAgICBjb25zdCByID0gYXdhaXQgYXBpKCdzZXRfc3RhdHVzJywgeyBkaXJlY3RvcnlfaWQ6IGRpcmVjdG9yeUlkLCBzdGF0dXMsIG5vdGUgfSk7CiAgICBpZiAoci5vaykgewogICAgICByb3dFbC5kYXRhc2V0LnN0YXR1cyA9IHN0YXR1czsKICAgICAgY29uc3QgZCA9IGRpcmVjdG9yaWVzLmZpbmQoeCA9PiB4LmlkID09IGRpcmVjdG9yeUlkKTsKICAgICAgaWYgKGQpIHsgZC5zdWJfc3RhdHVzID0gc3RhdHVzOyBkLnN1Yl9ub3RlID0gbm90ZTsgfQogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MoKSB7CiAgICBjb25zdCB0b3RhbCA9IGRpcmVjdG9yaWVzLmxlbmd0aDsKICAgIGNvbnN0IGRvbmUgPSBkaXJlY3Rvcmllcy5maWx0ZXIoZCA9PiBkLnN1Yl9zdGF0dXMgPT09ICdlaW5nZXRyYWdlbicpLmxlbmd0aDsKICAgICQoJyNwcm9ncmVzcy1maWxsJykuc3R5bGUud2lkdGggPSB0b3RhbCA/IGAkeyhkb25lIC8gdG90YWwpICogMTAwfSVgIDogJzAlJzsKICAgICQoJyNwcm9ncmVzcy1sYWJlbCcpLnRleHRDb250ZW50ID0gYCR7ZG9uZX0gLyAke3RvdGFsfSBlaW5nZXRyYWdlbmA7CiAgfQoKICAvLyAtLS0tLS0tLS0tIEVpZ2VuZXMgVmVyemVpY2huaXMgLS0tLS0tLS0tLQogIGFzeW5jIGZ1bmN0aW9uIGFkZE93bkRpcmVjdG9yeSgpIHsKICAgIGNvbnN0IG5hbWUgPSBwcm9tcHQoJ05hbWUgZGVzIFZlcnplaWNobmlzc2VzOicpOwogICAgaWYgKCFuYW1lKSByZXR1cm47CiAgICBjb25zdCB1cmwgPSBwcm9tcHQoJ1N0YXJ0LVVSTCAoei5CLiBTdGFydHNlaXRlKTonKTsKICAgIGlmICghdXJsKSByZXR1cm47CiAgICBjb25zdCBzdWJtaXRVcmwgPSBwcm9tcHQoJ0VpbnRyYWdzLS9Gb3JtdWxhci1VUkwgKGxlZXIgPSBnbGVpY2ggd2llIG9iZW4pOicsIHVybCkgfHwgdXJsOwogICAgY29uc3QgY2F0ZWdvcnkgPSBwcm9tcHQoJ0thdGVnb3JpZTonLCAnRWlnZW5lJykgfHwgJ0VpZ2VuZSc7CgogICAgY29uc3QgciA9IGF3YWl0IGFwaSgnYWRkX2RpcmVjdG9yeScsIHsgbmFtZSwgdXJsLCBzdWJtaXRfdXJsOiBzdWJtaXRVcmwsIGNhdGVnb3J5IH0pOwogICAgaWYgKHIub2spIGF3YWl0IGxvYWREaXJlY3RvcmllcygpOwogICAgZWxzZSBhbGVydChyLmVycm9yIHx8ICdGZWhsZXIgYmVpbSBIaW56dWbDvGdlbi4nKTsKICB9CgogIC8vIC0tLS0tLS0tLS0gSW5pdCAtLS0tLS0tLS0tCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGFzeW5jICgpID0+IHsKICAgIGF3YWl0IGxvYWRQcm9maWxlKCk7CiAgICBhd2FpdCBsb2FkRGlyZWN0b3JpZXMoKTsKCiAgICAkKCcjYnRuLXNhdmUtcHJvZmlsZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2F2ZVByb2ZpbGUpOwogICAgJCgnI2J0bi1jb3B5LXByb2ZpbGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvcHlQcm9maWxlVG9DbGlwYm9hcmQpOwogICAgJCgnI2J0bi1hZGQtZGlyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRPd25EaXJlY3RvcnkpOwogICAgJCgnI2J0bi1leHBvcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnYXBpLnBocD9hY3Rpb249ZXhwb3J0X2Nzdic7IH0pOwogICAgJCgnI2ZpbHRlci1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHJlbmRlckRpcmVjdG9yaWVzKGUudGFyZ2V0LnZhbHVlKSk7CiAgfSk7Cn0pKCk7Cg==',
'README.md' => 'IyBCcmFuY2hlbnZlcnplaWNobmlzLU1hbmFnZXIKCioqRWluIGtvc3Rlbmxvc2VzIFBIUC1Ub29sIHZvbiBbRHJlYW1jb2Rlc10oaHR0cHM6Ly93d3cuZHJlYW1jb2Rlcy5uZXQpKioKClRyYWdlIGRlaW5lIERvbWFpbiBzeXN0ZW1hdGlzY2ggaW4gw7xiZXIgMzAga29zdGVubG9zZSBkZXV0c2NoZQpCcmFuY2hlbnZlcnplaWNobmlzc2UsIEthcnRlbmRpZW5zdGUgdW5kIEIyQi1Qb3J0YWxlIGVpbiDigJMgbWl0CkZvcnRzY2hyaXR0c2FuemVpZ2UsIE5vdGl6ZW4gdW5kIENTVi1FeHBvcnQuIEtlaW4gQ2xvdWQtRGllbnN0LCBrZWluZQpSZWdpc3RyaWVydW5nOiBEYXMgVG9vbCBsw6R1ZnQga29tcGxldHQgYXVmIGRlaW5lbSBlaWdlbmVuIFdlYnNwYWNlLCBkZWluZQpGaXJtZW5kYXRlbiBibGVpYmVuIGJlaSBkaXIuCgojIyBEb3dubG9hZCAmIEluc3RhbGxhdGlvbiAodW50ZXIgMzAgU2VrdW5kZW4pCgoxLiAqKmBzZXR1cC5waHBgIGhlcnVudGVybGFkZW4qKiB1bmQgaW4gZWluZW4gbGVlcmVuIE9yZG5lciBhdWYgZGVpbmVtCiAgIFBIUC04LWbDpGhpZ2VuIFdlYnNwYWNlIGhvY2hsYWRlbiAoei5CLiBgZGVpbmUtZG9tYWluLmRlL3Rvb2xzL2JyYW5jaGVuL2ApLgoyLiBFaW5tYWwgaW0gQnJvd3NlciBhdWZydWZlbjogYGh0dHBzOi8vZGVpbmUtZG9tYWluLmRlL3Rvb2xzL2JyYW5jaGVuL3NldHVwLnBocGAKMy4gRmVydGlnLiBEZXIgSW5zdGFsbGVyIGxlZ3QgYWxsZSBEYXRlaWVuIHVuZCBkaWUgU1FMaXRlLURhdGVuYmFuawogICBhdXRvbWF0aXNjaCBhbiwgYmVmw7xsbHQgc2llIG1pdCBkZXIga3VyYXRpZXJ0ZW4gUG9ydGFsbGlzdGUsIGzDtnNjaHQgc2ljaAogICBkYW5hY2ggc2VsYnN0IHVuZCBsZWl0ZXQgZGlyZWt0IHp1bSBUb29sIHdlaXRlci4KCktlaW5lIERhdGVuYmFuay1Lb25maWd1cmF0aW9uLCBrZWluIENvbXBvc2VyLCBrZWluZSBleHRlcm5lbgpBYmjDpG5naWdrZWl0ZW4g4oCTIG51ciBQSFAgbWl0IFBETy1TUUxpdGUsIGRhcyBhdWYgc28gZ3V0IHdpZSBqZWRlbQpTdGFuZGFyZC1XZWJob3N0aW5nIGJlcmVpdHMgdm9yaGFuZGVuIGlzdC4KCiMjIFNvIGZ1bmt0aW9uaWVydCdzCgoxLiAqKkZpcm1lbnByb2ZpbCoqIGVpbm1hbCBhdXNmw7xsbGVuIChEb21haW4sIE5hbWUsIEFkcmVzc2UsIEJlc2NocmVpYnVuZykKICAgdW5kIHNwZWljaGVybi4KMi4gRsO8ciBqZWRlcyBQb3J0YWwgYXVmICoq4oCeRm9ybXVsYXIgw7ZmZm5lbuKAnCoqIGtsaWNrZW4g4oCTIMO2ZmZuZXQgZGllCiAgIEVpbnRyYWd1bmdzc2VpdGUgaW4gZWluZW0gbmV1ZW4gVGFiIHVuZCBzZXR6dCBkZW4gU3RhdHVzIGF1dG9tYXRpc2NoIGF1ZgogICDigJ5JbiBCZWFyYmVpdHVuZ+KAnC4KMy4gTWl0ICoq4oCeQWxsZSBGZWxkZXIgaW4gWndpc2NoZW5hYmxhZ2Uga29waWVyZW7igJwqKiBkaWUgRmlybWVuZGF0ZW4gaW4KICAgU2VrdW5kZW4gaW5zIGpld2VpbGlnZSBGb3JtdWxhciBlaW5mw7xnZW4uCjQuIE5hY2ggZGVtIEVpbnRyYWdlbiBkZW4gU3RhdHVzIGF1ZiAqKuKAnkVpbmdldHJhZ2Vu4oCcKiogc2V0emVuIChvZGVyCiAgIOKAnkFiZ2VsZWhudOKAnC/igJ7DnGJlcnNwcnVuZ2Vu4oCcLCBmYWxscyBlaW4gUG9ydGFsIG5pY2h0IHBhc3N0KSB1bmQgb3B0aW9uYWwKICAgZWluZSBOb3RpeiBoaW50ZXJsZWdlbi4KNS4gRGVyIEZvcnRzY2hyaXR0c2JhbGtlbiB6ZWlndCBkZW4gR2VzYW10c3RhdHVzOyAqKkNTVi1FeHBvcnQqKiBsaWVmZXJ0CiAgIGVpbmUgTGlzdGUgZsO8ciBSZXBvcnRpbmcgb2RlciBBcmNoaXYuCjYuIEZlaGx0IGVpbiBicmFuY2hlbnNwZXppZmlzY2hlcyBWZXJ6ZWljaG5pcz8gw5xiZXIg4oCeRWlnZW5lcyBWZXJ6ZWljaG5pcwogICBoaW56dWbDvGdlbuKAnCBpbiBTZWt1bmRlbiBlcmfDpG56ZW4uCgojIyBXYXJ1bSBrZWluZSB2b2xsYXV0b21hdGlzY2hlIE1hc3Nlbi1FaW5yZWljaHVuZz8KCkplZGVzIFBvcnRhbCBoYXQgZWluIGFuZGVyZXMgRm9ybXVsYXIsIG9mdCBtaXQgQ2FwdGNoYSBvZGVyCkUtTWFpbC1CZXN0w6R0aWd1bmcsIHVuZCB2aWVsZSBzY2hsaWXDn2VuIGF1dG9tYXRpc2llcnRlIE1hc3Nlbi1FaW50csOkZ2UgaW4KaWhyZW4gTnV0enVuZ3NiZWRpbmd1bmdlbiBhdXNkcsO8Y2tsaWNoIGF1cy4gRWluIEJvdCwgZGVyIGRhcyB1bWdlaHQsIHfDvHJkZQplaGVyIEFjY291bnRzIHNwZXJyZW4sIGFscyB2ZXJsw6Rzc2xpY2ggQmFja2xpbmtzIGxpZWZlcm4uIERlcgpCcmFuY2hlbnZlcnplaWNobmlzLU1hbmFnZXIgYXV0b21hdGlzaWVydCBkZXNoYWxiIGRlbiBWZXJ3YWx0dW5nc2F1ZndhbmQKKERhdGVuaGFsdHVuZywgU3RhdHVzLCBXaWVkZXJ2b3JsYWdlLCBFeHBvcnQpIHVuZCBtYWNodCBkYXMgZWlnZW50bGljaGUKQXVzZsO8bGxlbiBzbyBzY2huZWxsIHdpZSBtw7ZnbGljaCDigJMgc2VyacO2cyB1bmQgb2huZSBTcGFtLVJpc2lrby4KCiMjIEVudGhhbHRlbmUgUG9ydGFsZSAoU3RhbmQgMjAyNikKCsOcYmVyIDMwIGt1cmF0aWVydGUgUG9ydGFsZSBpbiBzZWNocyBLYXRlZ29yaWVuLCBqZXdlaWxzIG1pdCBSZWxldmFuei0gdW5kCkJhY2tsaW5rcGZsaWNodC1LZW5uemVpY2hudW5nOgoKLSAqKlN1Y2htYXNjaGluZW4gJiBLYXJ0ZW46KiogR29vZ2xlIFVudGVybmVobWVuc3Byb2ZpbCwgQmluZyBQbGFjZXMsCiAgQXBwbGUgTWFwcyBCdXNpbmVzcyBDb25uZWN0LCBPcGVuU3RyZWV0TWFwLCBZZWxsb3dNYXAKLSAqKkJyYW5jaGVuYsO8Y2hlcjoqKiBEYXMgw5ZydGxpY2hlLCBEYXMgVGVsZWZvbmJ1Y2gsIEdlbGJlIFNlaXRlbiwKICAxMTg4MC5jb20sIG1laW5lc3RhZHQuZGUsIEN5bGV4LCBPcGVuZGksIEhvdGZyb2csIEdvWWVsbG93LAogIEtlbm5zdC1EdS1FaW5lbiwgVW50ZXJuZWhtZW5zdmVyemVpY2huaXMub3JnLCBCcmFuY2hlbi1JbmZvLm5ldCwKICBLbGlja3RlbCwgb25saW5lc3RyZWV0Ci0gKipCZXdlcnR1bmdzcG9ydGFsZToqKiBZZWxwLCBLdW51bnUsIFRydXN0cGlsb3QKLSAqKkIyQiAmIEZpcm1lbmRhdGVuYmFua2VuOioqIHdsdy5kZSwgRmlybWVud2lzc2VuLmRlLCBOb3J0aGRhdGEsCiAgRXVyb3BhZ2VzLCBLb21wYXNzLCBNYWNoZXJwb3J0YWwKLSAqKlNvY2lhbCBNZWRpYToqKiBGYWNlYm9vay0sIExpbmtlZEluLSB1bmQgWGluZy1VbnRlcm5laG1lbnNzZWl0ZQotICoqV2Via2F0YWxvZ2U6KiogZ28tZmluZHlvdQoKIyMgVXBkYXRlIGF1ZiBlaW5lIG5ldWVyZSBWZXJzaW9uCgpgc2V0dXAucGhwYCBlcm5ldXQgaG9jaGxhZGVuIHVuZCBtaXQgYD9mb3JjZT0xYCAoYnp3LiBgcGhwIHNldHVwLnBocAotLWZvcmNlYCkgYXVzZsO8aHJlbi4gQmVzdGVoZW5kZSBTdGF0dXMsIE5vdGl6ZW4gdW5kIGRlaW4gRmlybWVucHJvZmlsCmJsZWliZW4gZGFiZWkgdm9sbHN0w6RuZGlnIGVyaGFsdGVuIOKAkyBlcyB3ZXJkZW4gbnVyIG5ldWUgUG9ydGFsZSBlcmfDpG56dC4KCiMjIEVpbiBIaW53ZWlzIGluIGVpZ2VuZXIgU2FjaGUKCkVzIGt1cnNpZXJlbiB1bnNlcmnDtnNlIEJyYW5jaGVuYnVjaC3igJ5BbmdlYm90ZSIgcGVyIFBvc3Qgb2RlciBFLU1haWwgKHouQi4KdW50ZXIgTmFtZW4gd2llIOKAnkJyYW5jaGVuYnVjaCBkZXIgUmVnaW9uIiBvZGVyIOKAnmJyYW5jaGVuLWxva2FsLmNvbSIpLCBkaWUKd2llIGVpbiBrb3N0ZW5sb3NlciBFaW50cmFnIGF1c3NlaGVuLCB0YXRzw6RjaGxpY2ggYWJlciBlaW4ga29zdGVucGZsaWNodGlnZXMKQWJvIGVudGhhbHRlbi4gU29sY2hlIEFuZnJhZ2VuIG5pY2h0IHVuZ2VwcsO8ZnQgdW50ZXJzY2hyZWliZW4uCgotLS0KCkVudHdpY2tlbHQgdm9uICoqW0RyZWFtY29kZXNdKGh0dHBzOi8vd3d3LmRyZWFtY29kZXMubmV0KSoqIOKAkyBJVC0gdW5kCldlYmVudHdpY2tsdW5nIHNlaXQgMTk5OS4K',
];
function out(string $msg): void
{
if (PHP_SAPI === 'cli') {
fwrite(STDOUT, $msg . PHP_EOL);
} else {
echo $msg;
}
}
function renderPage(string $title, string $bodyHtml, string $accent = '#4f8cff'): void
{
if (PHP_SAPI === 'cli') {
return;
}
header('Content-Type: text/html; charset=utf-8');
echo <<<HTML
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<title>{$title} · Branchenverzeichnis-Manager Setup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root{--bg:#0b0d12;--card:#151822;--border:#262b38;--text:#eef0f4;--muted:#8b93a3;--accent:{$accent};--green:#35c26b;--red:#e5534b;}
*{box-sizing:border-box}
body{margin:0;background:var(--bg) radial-gradient(1200px 400px at 50% -10%, rgba(79,140,255,.12), transparent 60%);
background-attachment:fixed;color:var(--text);font-family:'Inter',-apple-system,'Segoe UI',Roboto,Arial,sans-serif;
display:flex;min-height:100vh;align-items:center;justify-content:center;padding:20px;}
.box{max-width:560px;width:100%;background:var(--card);border:1px solid var(--border);border-radius:14px;
padding:32px;box-shadow:0 1px 2px rgba(0,0,0,.3),0 8px 24px -8px rgba(0,0,0,.5);}
.eyebrow{display:inline-block;font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
color:var(--accent);background:rgba(79,140,255,.12);border:1px solid rgba(79,140,255,.3);
padding:3px 10px;border-radius:20px;margin-bottom:14px;}
h1{margin:0 0 12px;font-size:22px;}
p{color:var(--muted);line-height:1.6;}
code{background:#10141c;border:1px solid var(--border);border-radius:4px;padding:1px 6px;font-size:13px;color:var(--text);}
ul{color:var(--muted);line-height:1.8;padding-left:20px;}
.btn{display:inline-flex;margin-top:16px;background:linear-gradient(90deg,var(--accent),#7c5cff);
color:#fff;text-decoration:none;padding:10px 18px;border-radius:8px;font-weight:600;font-size:14px;}
.err{color:var(--red);}
.ok{color:var(--green);}
footer{margin-top:20px;font-size:12px;color:var(--muted);text-align:center;}
footer a{color:var(--accent);text-decoration:none;font-weight:600;}
footer a:hover{text-decoration:underline;}
</style>
</head>
<body>
<div class="box">
<span class="eyebrow">Ein kostenloses Tool von Dreamcodes</span>
{$bodyHtml}
<footer>
<a href="https://www.dreamcodes.net" target="_blank" rel="noopener">www.dreamcodes.net</a>
</footer>
</div>
</body>
</html>
HTML;
exit;
}
$baseDir = __DIR__;
$alreadyThere = file_exists($baseDir . '/index.php') || file_exists($baseDir . '/db.php');
$force = isset($_GET['force']) || in_array('--force', $argv ?? [], true);
if ($alreadyThere && !$force) {
if (PHP_SAPI === 'cli') {
out('Es existieren bereits Projektdateien in diesem Ordner. Mit "php setup.php --force" erneut installieren/aktualisieren (bestehende Status/Notizen in der Datenbank bleiben erhalten, nur neue Portale werden ergänzt).');
exit(1);
}
renderPage(
'Installation vorhanden',
'<h1>Es existiert bereits eine Installation</h1>
<p>In diesem Ordner liegen bereits <code>index.php</code> bzw. <code>db.php</code>.
Ein erneuter Lauf überschreibt diese Dateien mit der aktuellen Version
(die Datenbank in <code>data/</code> bleibt erhalten – bestehende
Status/Notizen werden nicht verändert, es werden nur neue Portale
ergänzt).</p>
<a class="btn" href="?force=1">Trotzdem installieren / aktualisieren</a>',
'#e3b341'
);
}
$written = [];
$errors = [];
foreach ($__FILES as $relPath => $b64) {
$target = $baseDir . '/' . $relPath;
$dir = dirname($target);
if (!is_dir($dir) && !mkdir($dir, 0775, true) && !is_dir($dir)) {
$errors[] = "Ordner konnte nicht angelegt werden: {$dir}";
continue;
}
$content = base64_decode($b64, true);
if ($content === false) {
$errors[] = "Base64-Dekodierung fehlgeschlagen für: {$relPath}";
continue;
}
if (file_put_contents($target, $content) === false) {
$errors[] = "Datei konnte nicht geschrieben werden: {$relPath} (Schreibrechte prüfen)";
continue;
}
$written[] = $relPath;
}
// data/-Ordner für die SQLite-Datenbank vorbereiten (max. Automatisierung:
// Rechte werden hier gesetzt, damit db.php beim ersten Laden sofort
// schreiben kann, ohne dass manuell chmod nötig ist).
$dataDir = $baseDir . '/data';
if (!is_dir($dataDir)) {
@mkdir($dataDir, 0775, true);
}
@chmod($dataDir, 0775);
if (!empty($errors)) {
$list = '<ul>' . implode('', array_map(fn($e) => '<li class="err">' . htmlspecialchars($e) . '</li>', $errors)) . '</ul>';
if (PHP_SAPI === 'cli') {
out('Fehler bei der Installation:');
foreach ($errors as $e) { out(' - ' . $e); }
exit(1);
}
renderPage('Fehler bei der Installation', '<h1>Installation unvollständig</h1><p>Folgende Probleme sind aufgetreten:</p>' . $list, '#e5534b');
}
$seedOk = true;
$seedError = '';
try {
require $baseDir . '/db.php';
DB::get(); // legt Schema an, migriert neue Spalten, ergänzt neue Portale
} catch (Throwable $e) {
$seedOk = false;
$seedError = $e->getMessage();
}
$selfDeleted = @unlink(__FILE__);
if (PHP_SAPI === 'cli') {
out('Installation abgeschlossen. ' . count($written) . ' Dateien geschrieben.');
out($seedOk ? 'Datenbank angelegt/migriert und Verzeichnisliste geseedet (32 kuratierte Portale).' : ('Warnung beim Seeding: ' . $seedError));
out($selfDeleted ? 'setup.php wurde entfernt.' : 'Hinweis: setup.php konnte nicht automatisch gelöscht werden – bitte manuell entfernen.');
out('Öffne jetzt index.php im Browser.');
exit(0);
}
$fileList = '<ul>' . implode('', array_map(fn($f) => '<li>' . htmlspecialchars($f) . '</li>', $written)) . '</ul>';
$seedNote = $seedOk
? '<p class="ok">Datenbank angelegt/migriert, 32 kuratierte Portale eingespielt.</p>'
: '<p class="err">Warnung: Seeding fehlgeschlagen (' . htmlspecialchars($seedError) . '). index.php erledigt dies beim ersten Aufruf automatisch nach.</p>';
$deleteNote = $selfDeleted
? '<p class="ok">setup.php wurde automatisch entfernt.</p>'
: '<p class="err">setup.php konnte nicht automatisch gelöscht werden – bitte manuell vom Server entfernen.</p>';
renderPage(
'Installation abgeschlossen',
'<h1>Installation abgeschlossen</h1>
<p>' . count($written) . ' Dateien wurden angelegt:</p>' . $fileList .
$seedNote . $deleteNote .
'<a class="btn" href="index.php">Zum Branchenverzeichnis-Manager →</a>'
);