| 
<?phpdeclare(strict_types=1);
 
 use Airship\Alerts\FileSystem\FileNotFound;
 use ParagonIE\ConstantTime\Base64UrlSafe;
 
 \error_reporting(E_ALL);
 if (PHP_MAJOR_VERSION < 7) {
 die("Airship requires PHP 7.");
 }
 if (!extension_loaded('sodium')) {
 die("Airship requires Libsodium.");
 }
 if (!\defined('IDE_HACKS')) {
 define('IDE_HACKS', false);
 }
 if (!\session_id()) {
 \session_start();
 }
 
 /**
 * 1. Define come constants
 */
 if (!defined('ROOT')) {
 define('ROOT', \dirname(__DIR__));
 }
 if (!defined('ISCLI')) {
 define('ISCLI', PHP_SAPI === 'cli');
 }
 if (ISCLI) {
 if (isset($argc)) {
 $_SERVER['REQUEST_URI'] = $argc > 1
 ? $argv[1]
 : '/';
 } elseif(empty($_SERVER['REQUEST_URI'])) {
 $_SERVER['REQUEST_URI'] = '';
 }
 }
 
 /**
 * 2. Load the Airship functions
 */
 require_once ROOT.'/Airship.php';
 require_once __DIR__ . '/motifs.php';
 
 /**
 * 3. Let's autoload the composer packages
 */
 require_once \dirname(ROOT).'/vendor/autoload.php';
 
 /**
 * 4. Autoload the Engine files
 */
 \Airship\autoload('Airship\\Alerts', '~/Alerts');
 \Airship\autoload('Airship\\Engine', '~/Engine');
 \Airship\autoload('Airship\\Installer', '~/Installer');
 $state = \Airship\Engine\State::instance();
 
 require_once ROOT.'/gear_init.php';
 
 /**
 * 5. Load the global functions
 */
 require_once ROOT.'/global_functions.php';
 require_once ROOT.'/view_functions.php';
 
 if (ISCLI) {
 if ($argc < 2) {
 echo "\n",
 'Error: No argument passed to command line interface.',
 "\n\n";
 exit(1);
 }
 
 $cli = new \Airship\Installer\Commands($argv);
 exit(0);
 }
 
 $twigLoader = new \Twig_Loader_Filesystem(
 ROOT.'/Installer/skins'
 );
 $twigEnv = new \Twig_Environment($twigLoader);
 
 
 // Expose PHP's built-in functions as a filter
 $twigEnv->addFilter(
 new Twig_SimpleFilter('addslashes', 'addslashes')
 );
 $twigEnv->addFilter(
 new Twig_SimpleFilter('preg_quote', 'preg_quote')
 );
 $twigEnv->addFilter(
 new Twig_SimpleFilter('ceil', 'ceil')
 );
 $twigEnv->addFilter(
 new Twig_SimpleFilter('floor', 'floor')
 );
 
 $twigEnv->addFilter(
 new Twig_SimpleFilter(
 'cachebust',
 function ($relative_path) {
 if ($relative_path[0] !== '/') {
 $relative_path = '/' . $relative_path;
 }
 $absolute = $_SERVER['DOCUMENT_ROOT'] . $relative_path;
 if (\is_readable($absolute)) {
 return $relative_path . '?' . Base64UrlSafe::encode(
 \sodium_crypto_generichash(
 \file_get_contents($absolute) . \filemtime($absolute)
 )
 );
 }
 return $relative_path . '?404NotFound';
 }
 )
 );
 
 $twigEnv->addFunction(
 new Twig_SimpleFunction(
 'form_token',
 function($lockTo = '') {
 static $csrf = null;
 if ($csrf === null) {
 $csrf = new \Airship\Engine\Security\CSRF;
 }
 return $csrf->insertToken($lockTo);
 }
 )
 );
 
 $twigEnv->addFunction(
 new Twig_SimpleFunction(
 'cabin_url',
 function() {
 return '/';
 }
 )
 );
 
 $twigEnv->addFunction(
 new Twig_SimpleFunction(
 '__',
 function(string $str = '') {
 // Not translating here.
 return $str;
 }
 )
 );
 
 $twigEnv->addFunction(
 new Twig_SimpleFunction(
 'get_loaded_extensions',
 function () {
 return \get_loaded_extensions();
 }
 )
 );
 
 $twigEnv->addGlobal('SERVER', $_SERVER);
 
 require_once ROOT.'/keys.php';
 try {
 $step = \Airship\loadJSON(ROOT . '/tmp/installing.json');
 if (empty($step)) {
 \file_put_contents(ROOT . '/tmp/installing.json', '[]');
 $step = [];
 }
 } catch (FileNotFound $e) {
 \file_put_contents(ROOT . '/tmp/installing.json', '[]');
 try {
 $step = \Airship\loadJSON(ROOT . '/tmp/installing.json');
 } catch (FileNotFound $e) {
 die("Cannot create " . ROOT . '/tmp/installing.json');
 }
 }
 
 require_once ROOT . "/Installer/symlinks.php";
 
 $installer = new \Airship\Installer\Install(
 $twigEnv,
 $step
 );
 $installer->currentStep();
 
 |