From 78f67c1e0ef699d47966b2560f6e43eb5e63ddc0 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 1 Jan 2021 23:10:38 +0000 Subject: [PATCH 01/25] Check for reaching the memory limit --- src/Core/Worker.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index e90747e41..009912ee7 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -1189,6 +1189,11 @@ class Worker */ private static function forkProcess(bool $do_cron) { + if (DI::process()->isMinMemoryReached()) { + Logger::warning('Memory limit reached - quitting'); + return; + } + // Children inherit their parent's database connection. // To avoid problems we disconnect and connect both parent and child DBA::disconnect(); @@ -1230,7 +1235,7 @@ class Worker { // Worker and daemon are started from the command line. // This means that this is executed by a PHP interpreter without runtime limitations - if (in_array(DI::mode()->getExecutor(), [Mode::DAEMON, Mode::WORKER])) { + if (function_exists('pcntl_fork') && in_array(DI::mode()->getExecutor(), [Mode::DAEMON, Mode::WORKER])) { self::forkProcess($do_cron); } else { $process = new Core\Process(DI::logger(), DI::mode(), DI::config(), From 7a03b72060c915271f0037e9f2a72e2beccc9607 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 2 Jan 2021 08:43:55 +0000 Subject: [PATCH 02/25] Improved daemon test --- src/Core/Worker.php | 64 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 009912ee7..eb769ad1c 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -50,6 +50,7 @@ class Worker private static $lock_duration = 0; private static $last_update; private static $state; + private static $daemon_mode = null; /** * Processes the tasks that are in the workerqueue table @@ -146,13 +147,17 @@ class Worker if (time() > ($starttime + (DI::config()->get('system', 'cron_interval') * 60))) { Logger::info('Process lifetime reached, respawning.'); self::unclaimProcess(); - self::spawnWorker(); + if (self::isDaemonMode()) { + self::IPCSetJobState(true); + } else { + self::spawnWorker(); + } return; } } // Cleaning up. Possibly not needed, but it doesn't harm anything. - if (DI::config()->get('system', 'worker_daemon_mode', false)) { + if (self::isDaemonMode()) { self::IPCSetJobState(false); } Logger::info("Couldn't select a workerqueue entry, quitting process", ['pid' => getmypid()]); @@ -190,7 +195,7 @@ class Worker Logger::warning('Maximum processes reached, quitting.'); return false; } - + return true; } @@ -771,7 +776,7 @@ class Worker // Are there fewer workers running as possible? Then fork a new one. if (!DI::config()->get("system", "worker_dont_fork", false) && ($queues > ($active + 1)) && self::entriesExists()) { Logger::info("There are fewer workers as possible, fork a new worker.", ['active' => $active, 'queues' => $queues]); - if (DI::config()->get('system', 'worker_daemon_mode', false)) { + if (self::isDaemonMode()) { self::IPCSetJobState(true); } else { self::spawnWorker(); @@ -780,7 +785,7 @@ class Worker } // if there are too much worker, we don't spawn a new one. - if (DI::config()->get('system', 'worker_daemon_mode', false) && ($active > $queues)) { + if (self::isDaemonMode() && ($active > $queues)) { self::IPCSetJobState(false); } @@ -1208,7 +1213,7 @@ class Worker Logger::info('Spawned new worker', ['cron' => $do_cron, 'pid' => $pid]); return; } - + // We now are in the new worker DBA::connect(); Logger::info('Worker spawned', ['cron' => $do_cron, 'pid' => getmypid()]); @@ -1233,6 +1238,7 @@ class Worker */ public static function spawnWorker($do_cron = false) { + Logger::notice("Spawn", ['do_cron' => $do_cron, 'callstack' => System::callstack(20)]); // Worker and daemon are started from the command line. // This means that this is executed by a PHP interpreter without runtime limitations if (function_exists('pcntl_fork') && in_array(DI::mode()->getExecutor(), [Mode::DAEMON, Mode::WORKER])) { @@ -1244,7 +1250,7 @@ class Worker } // after spawning we have to remove the flag. - if (DI::config()->get('system', 'worker_daemon_mode', false)) { + if (self::isDaemonMode()) { self::IPCSetJobState(false); } } @@ -1336,7 +1342,7 @@ class Worker } // Set the IPC flag to ensure an immediate process execution via daemon - if (DI::config()->get('system', 'worker_daemon_mode', false)) { + if (self::isDaemonMode()) { self::IPCSetJobState(true); } @@ -1361,7 +1367,7 @@ class Worker } // Quit on daemon mode - if (DI::config()->get('system', 'worker_daemon_mode', false)) { + if (self::isDaemonMode()) { return $added; } @@ -1485,6 +1491,46 @@ class Worker return (bool)$row['jobs']; } + /** + * Checks if the worker is running in the daemon mode. + * + * @return boolean + */ + public static function isDaemonMode() + { + if (!is_null(self::$daemon_mode)) { + return self::$daemon_mode; + } + + if (DI::mode()->getExecutor() == Mode::DAEMON) { + return true; + } + + $daemon_mode = DI::config()->get('system', 'worker_daemon_mode', false, true); + if ($daemon_mode) { + return $daemon_mode; + } + + $pidfile = DI::config()->get('system', 'pidfile'); + if (empty($pidfile)) { + // No pid file, no daemon + self::$daemon_mode = false; + return false; + } + + if (!is_readable($pidfile)) { + // No pid file. We assume that the daemon had been intentionally stopped. + self::$daemon_mode = false; + return false; + } + + $pid = intval(file_get_contents($pidfile)); + $running = posix_kill($pid, 0); + + self::$daemon_mode = $running; + return $running; + } + /** * Test if the daemon is running. If not, it will be started * From c0ac120578f04bd8758c162c09e045c633524e34 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 2 Jan 2021 09:11:38 +0000 Subject: [PATCH 03/25] Issue 9736: Fix for undroppable registrations --- src/Model/User.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Model/User.php b/src/Model/User.php index 6960c5c2c..dbace74e5 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -1159,6 +1159,9 @@ class User return false; } + // Delete the avatar + Photo::delete(['uid' => $register['uid']]); + return DBA::delete('user', ['uid' => $register['uid']]) && Register::deleteByHash($register['hash']); } From bbdb42358e3fe4c0b16b86cb40c70afad39bf740 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 2 Jan 2021 11:10:06 +0100 Subject: [PATCH 04/25] update the CREDITS.txt for the 2021.01 release --- CREDITS.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CREDITS.txt b/CREDITS.txt index 07d6ecb2f..2f6897054 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -35,6 +35,7 @@ Athalbert aweiher axelt balderino +Balázs Úr Beanow beardyunixer Beatriz Vital @@ -133,6 +134,7 @@ julia.domagalska Julio Cova Karel Karolina +Kastal András Keenan Pepper Keith Fernie Klaus Weidenbach @@ -144,11 +146,11 @@ Leberwurscht Leonard Lausen Lionel Triay loma-one +loma1 Lorem Ipsum Ludovic Grossard Lynn Stephenson maase2 -Magdalena Gazda Mai Anh Nguyen Manuel Pérez Monís Marcin Klessa @@ -157,7 +159,6 @@ Marcus Müller Marie Olive Mariusz Pisz marmor -Marquis_de_Carabas Martin Schmitt Mateusz Mikos Mats Sjöberg @@ -177,6 +178,7 @@ mpanhans mytbk nathilia-peirce Nicola Spanti +nobody Olaf Conradi Oliver Olivier @@ -225,7 +227,6 @@ Samuli Valavuo Sandro Santilli Sebastian Egbers sella -Sennewood Seth Silke Meyer Simon L'nu @@ -242,7 +243,6 @@ Sveinn í Felli Sven Anders Sylke Vicious Sylvain Lagacé -szymon.filip Sérgio Lima Taekus Tazman DeVille From 6f693452c54f4a9b3cdb9ee91be6594c316589cb Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 2 Jan 2021 19:00:21 +0100 Subject: [PATCH 05/25] 2021.01 CHANGELOG --- CHANGELOG | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index d50c3ff65..9a30bcb9c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,106 @@ +Version 2021.01 (2021-01-xx) + Friendica Core + Added HU translation + Updates to the translations: DE, IT, RU [translation teams] + Updates to the themes (duepuntozero, frio, vier) [annando, MrPetovan, tobiasd, vinzv] + General Code cleanup [annando, MrPetovan, nupplaphil] + Enhanced the handling of permission sets [annando] + Enhanced the usage of system resources when displaying photos and updating contacts [annando] + Enhanced the database structure [annando, Quix0r] + Enhanced the detection of PeerTube servers [annando] + Enhanced the photo cache [annando] + Enhanced the import of old postings which would otherwise not be imported due their age [annando] + Enhanced the delivery process of ActivityPub content [annando] + Enhanced the performance profiler [annando] + Enhanced the background worker [annando] + Enhanced the handling of blocked authors [MrPetovan] + Enhanced the user management in the admin panel [MrPetovan] + Enhanced the process of expiring postings [annando] + Enhanced the un/follow process of contacts [annando] + Enhanced the handling of HTTP requests [nupplaphil] + Enhanced filter possibilities of contacts [annando] + Enhanced language detection of postings [annando] + Enhanced the admin panel [MrPetovan, tobiasd] + Enhanced the contact suggestions [annando] + Enhanced the community page (filter, tags) [annando] + Enhanced the display of the reason why a posting is displayed in a stream [annando] + Enhanced the forum delivery of postings [redmatrix] + Enhanced PHP8 compatibility [annando] + Added new options to the remote_self feature [annando] + Added API endpoints for accounts and trends [annando] + Added API endpoints for re-sharing of postings [annando] + Added provider fields to the API [annando] + Added the possibility to map $_SERVER variables during installation [nupplaphil] + Added the possibility to filter account types on the network page [annando] + Added missing Mastodon API endpoints as "unsupported" [annando] + Added a watchdog mode to check if the daemon is running [annando] + Added number of group members to the contact widget [annando] + Added endless scrolling in several places [annando] + Added an option to stay local when clicking on a contact profile [annando] + Added support of ActivityPub relays [annando] + Model\User::getAuthenticationInfo is now available for addons [MrPetovan] + Contact details can only edited for mail and feed contacts [annando] + Fixed some problems during the export of user data [annando] + Fixed various problems with the notification system [MrPetovan] + Fixed a problem with emoticon alt-text interpretation [MrPetovan] + Fixed a problem that caused comments on Tweets being distributed via ActivityPub [annando] + Fixed a problem with the auto-completion when composing comments [MrPetovan] + Fixed an ACL problem while poking contacts [MrPetovan] + Fixed a problem with Mastodon emoticons [MrPetovan] + Fixed a parser problem that caused additional
tags [annando] + Fixed escaping of several HTML snippets [MrPetovan] + Fixed a problem with fetching objects by URL [annando] + + Friendica Addons + Updated to the translations IT, HU [translation teams] + advancedcontentfilter: + Added examples [hoergen] + blackout: + Improved the wording in the admin interface [urbalazsqsu] + catavatar: + Improved the generation of avatars [annando] + ifttt: + Added support for delayed postings [annando] + mailstream: + Improved code structure [nupplaphil] + Fix case-sensitive check by [nupplaphil] + markdown: + Improved parsing [MrPetovan] + newmemberwidget: + Improved addon description [SpencerDub] + langfilter: + Changed the input to use a slider [MrPetovan] + ldapauth: + Reworked the authentication code [MrPetovan] + libravatar: + Fixed a problem with DNS requests [annando] + Improved the list of available avatars [annando] + phpmailer: + Fixed UTF8 encoding problems [MrPetovan] + rendertime: + Added more information about the "other" things that cost time [annando] + showmore: + Improved handling of the HTML structure of postings [MrPetovan] + showmore_dyn: + Improved user settings, language [MrPetovan] + twitter: + Improved logging [annando] + Improved the twitter_post_hook [MrPetovan] + Improved the posts send to twitter [annando] + Improved the remote_self functionality [annando] + Added support for delayed postings [annando] + Fixed a bug with direct re-shares [MrPetovan] + + Closed Issues + 2803, 4230, 4486, 4494, 5616, 7393, 7697, 8485, 8533, 8605, 8689, + 8796, 8896, 8943, 8950, 9042, 9089, 9127, 9142, 9165, 9235, 9236, + 9238, 9249, 9264, 9268, 9276, 9281, 9291, 9296, 9305, 9306, 9315, + 9326, 9328, 9329, 9337, 9344, 9348, 9363, 9383, 9385, 9407, 9427, + 9430, 9432, 9457, 9461, 9464, 9465, 9480, 9486, 9496, 9508, 9518, + 9525, 9538, 9549, 9564, 9568, 9573, 9598, 9611, 9622, 9629, 9630, + 9633, 9636, 9639, 9641, 9642, 9662, 9672, 9673, 9678, 9682, 9692, + 9712 + Version 2020.09-1 (2020-09-24) Friendica Core: Updates to the translations: RU [translation teams] From 10b035b51ad8f0d1e418dd372b86004e638894ba Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 2 Jan 2021 19:33:50 +0000 Subject: [PATCH 06/25] Additional worker cooldown --- src/Core/Worker.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 2f39a82fe..1759fae19 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -411,6 +411,12 @@ class Worker { $a = DI::app(); + $cooldown = DI::config()->get("system", "worker_cooldown", 0); + if ($cooldown > 0) { + Logger::info('Pre execution cooldown.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'cooldown' => $cooldown]); + sleep($cooldown); + } + Logger::enableWorker($funcname); Logger::info("Process start.", ['priority' => $queue["priority"], 'id' => $queue["id"]]); @@ -483,10 +489,8 @@ class Worker DI::profiler()->saveLog(DI::logger(), "ID " . $queue["id"] . ": " . $funcname); - $cooldown = DI::config()->get("system", "worker_cooldown", 0); - if ($cooldown > 0) { - Logger::info('Cooldown.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'cooldown' => $cooldown]); + Logger::info('Post execution cooldown.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'cooldown' => $cooldown]); sleep($cooldown); } } From a8725a4d975a28115d8680c64dea4ca8022e11d1 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 3 Jan 2021 09:04:09 +0100 Subject: [PATCH 07/25] enhancements to the worker_cooldown --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 9a30bcb9c..54cb7a157 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -26,6 +26,7 @@ Version 2021.01 (2021-01-xx) Enhanced the display of the reason why a posting is displayed in a stream [annando] Enhanced the forum delivery of postings [redmatrix] Enhanced PHP8 compatibility [annando] + Enhanced the worker_cooldown mechanism [annando] Added new options to the remote_self feature [annando] Added API endpoints for accounts and trends [annando] Added API endpoints for re-sharing of postings [annando] From 7184827b3604dd55e8114f3f61a959017ede5331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20=C3=9Ar?= Date: Sun, 3 Jan 2021 20:08:47 +0100 Subject: [PATCH 08/25] Fix contributor nickname in changelog --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 54cb7a157..ca5e85fde 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -57,7 +57,7 @@ Version 2021.01 (2021-01-xx) advancedcontentfilter: Added examples [hoergen] blackout: - Improved the wording in the admin interface [urbalazsqsu] + Improved the wording in the admin interface [urbalazs] catavatar: Improved the generation of avatars [annando] ifttt: From 74d7d7e164364c09b7fdfbf64e15168ccd56508a Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 3 Jan 2021 22:57:25 +0000 Subject: [PATCH 09/25] Check for childf status --- bin/daemon.php | 3 +++ src/Core/Worker.php | 27 ++++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/bin/daemon.php b/bin/daemon.php index ec507305c..cc86a9f20 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -223,6 +223,9 @@ while (true) { $sleep = min(1000000, round(log10($arg) * 1000000, 0)); usleep($sleep); + $pid = pcntl_waitpid(-1, $status, WNOHANG); + Logger::info('Checked children status via pcntl_waitpid', ['pid' => $pid, 'status' => $status]); + $timeout = ($seconds >= $wait_interval); } while (!$timeout && !Worker::IPCJobsExists()); diff --git a/src/Core/Worker.php b/src/Core/Worker.php index ec317a676..559ae6837 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -1230,6 +1230,17 @@ class Worker DI::process()->end(); Logger::info('Worker ended', ['cron' => $do_cron, 'pid' => getmypid()]); + + DBA::disconnect(); +/* + $php = '/usr/bin/php'; + $param = ['bin/worker.php']; + if ($do_cron) { + $param[] = 'no_cron'; + } + pcntl_exec($php, $param); + Logger::warning('Error calling worker', ['cron' => $do_cron, 'pid' => getmypid()]); +*/ exit(); } @@ -1242,21 +1253,14 @@ class Worker */ public static function spawnWorker($do_cron = false) { - Logger::notice("Spawn", ['do_cron' => $do_cron, 'callstack' => System::callstack(20)]); - // Worker and daemon are started from the command line. - // This means that this is executed by a PHP interpreter without runtime limitations - if (function_exists('pcntl_fork') && in_array(DI::mode()->getExecutor(), [Mode::DAEMON, Mode::WORKER])) { + if (self::isDaemonMode()) { self::forkProcess($do_cron); + self::IPCSetJobState(false); } else { $process = new Core\Process(DI::logger(), DI::mode(), DI::config(), DI::modelProcess(), DI::app()->getBasePath(), getmypid()); $process->run('bin/worker.php', ['no_cron' => !$do_cron]); } - - // after spawning we have to remove the flag. - if (self::isDaemonMode()) { - self::IPCSetJobState(false); - } } /** @@ -1515,6 +1519,11 @@ class Worker return $daemon_mode; } + if (!function_exists('pcntl_fork')) { + self::$daemon_mode = false; + return false; + } + $pidfile = DI::config()->get('system', 'pidfile'); if (empty($pidfile)) { // No pid file, no daemon From a7fd9d3bb5b1a3c54c9d4f152bb38ff0ac9787f0 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 4 Jan 2021 07:46:43 +0100 Subject: [PATCH 10/25] set the release date --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index ca5e85fde..94b3b6c9b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -Version 2021.01 (2021-01-xx) +Version 2021.01 (2021-01-04) Friendica Core Added HU translation Updates to the translations: DE, IT, RU [translation teams] From 4dcdcd4d6fd4d4b3639a5e0f6a07cc7c47ba255f Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 4 Jan 2021 07:48:47 +0100 Subject: [PATCH 11/25] version 2021.01 --- VERSION | 2 +- boot.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 04d17e893..f73d2c17c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2020.12-rc +2021.01 diff --git a/boot.php b/boot.php index 504f997d9..32eb84a24 100644 --- a/boot.php +++ b/boot.php @@ -38,7 +38,7 @@ use Friendica\Util\DateTimeFormat; define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_CODENAME', 'Red Hot Poker'); -define('FRIENDICA_VERSION', '2020.12-rc'); +define('FRIENDICA_VERSION', '2021.01'); define('DFRN_PROTOCOL_VERSION', '2.23'); define('NEW_UPDATE_ROUTINE_VERSION', 1170); From bf8fb215a9cc554b5ec5b774168a52fb56fa43e6 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 4 Jan 2021 08:34:01 +0100 Subject: [PATCH 12/25] version 2021.03-dev --- boot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 32eb84a24..1c5b4c168 100644 --- a/boot.php +++ b/boot.php @@ -38,7 +38,7 @@ use Friendica\Util\DateTimeFormat; define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_CODENAME', 'Red Hot Poker'); -define('FRIENDICA_VERSION', '2021.01'); +define('FRIENDICA_VERSION', '2021.03-dev'); define('DFRN_PROTOCOL_VERSION', '2.23'); define('NEW_UPDATE_ROUTINE_VERSION', 1170); From 99b0126d84505bf580b093e6c2225f18ece9fe7e Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 4 Jan 2021 08:34:30 +0100 Subject: [PATCH 13/25] version 2021.03-dev --- CHANGELOG | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 94b3b6c9b..9a9abff4b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +Version 2021.03 (unreleased) + Version 2021.01 (2021-01-04) Friendica Core Added HU translation diff --git a/VERSION b/VERSION index f73d2c17c..50ccf18a2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2021.01 +2021.03-dev From 69c7e9af2043404052cd488fd5edf18917dcdaa5 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 4 Jan 2021 09:20:44 +0000 Subject: [PATCH 14/25] Let the worker run for an hour in daemon mode --- bin/daemon.php | 6 +- src/Core/Worker.php | 142 +++++++++++++++++++++++++++----------------- 2 files changed, 92 insertions(+), 56 deletions(-) diff --git a/bin/daemon.php b/bin/daemon.php index cc86a9f20..fcdd73566 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -224,8 +224,10 @@ while (true) { usleep($sleep); $pid = pcntl_waitpid(-1, $status, WNOHANG); - Logger::info('Checked children status via pcntl_waitpid', ['pid' => $pid, 'status' => $status]); - + if ($pid > 0) { + Logger::info('Children quit via pcntl_waitpid', ['pid' => $pid, 'status' => $status]); + } + $timeout = ($seconds >= $wait_interval); } while (!$timeout && !Worker::IPCJobsExists()); diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 559ae6837..bb17e430c 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -94,67 +94,101 @@ class Worker $last_check = $starttime = time(); self::$state = self::STATE_STARTUP; + $wait_interval = self::isDaemonMode() ? 360 : 10; + $start = time(); - // We fetch the next queue entry that is about to be executed - while ($r = self::workerProcess()) { - // Don't refetch when a worker fetches tasks for multiple workers - $refetched = DI::config()->get('system', 'worker_multiple_fetch'); - foreach ($r as $entry) { - // Assure that the priority is an integer value - $entry['priority'] = (int)$entry['priority']; + do { + // We fetch the next queue entry that is about to be executed + while ($r = self::workerProcess()) { + // Don't refetch when a worker fetches tasks for multiple workers + $refetched = DI::config()->get('system', 'worker_multiple_fetch'); + foreach ($r as $entry) { + // Assure that the priority is an integer value + $entry['priority'] = (int)$entry['priority']; - // The work will be done - if (!self::execute($entry)) { - Logger::notice('Process execution failed, quitting.'); + // The work will be done + if (!self::execute($entry)) { + Logger::notice('Process execution failed, quitting.'); + return; + } + + // Trying to fetch new processes - but only once when successful + if (!$refetched && DI::lock()->acquire(self::LOCK_PROCESS, 0)) { + self::findWorkerProcesses(); + DI::lock()->release(self::LOCK_PROCESS); + self::$state = self::STATE_REFETCH; + $refetched = true; + } else { + self::$state = self::STATE_SHORT_LOOP; + } + } + + // To avoid the quitting of multiple workers only one worker at a time will execute the check + if ((time() > $last_check + 5) && !self::getWaitingJobForPID()) { + self::$state = self::STATE_LONG_LOOP; + + if (DI::lock()->acquire(self::LOCK_WORKER, 0)) { + // Count active workers and compare them with a maximum value that depends on the load + if (self::tooMuchWorkers()) { + Logger::notice('Active worker limit reached, quitting.'); + DI::lock()->release(self::LOCK_WORKER); + return; + } + + // Check free memory + if (DI::process()->isMinMemoryReached()) { + Logger::warning('Memory limit reached, quitting.'); + DI::lock()->release(self::LOCK_WORKER); + return; + } + DI::lock()->release(self::LOCK_WORKER); + } + $last_check = time(); + } + + // Quit the worker once every cron interval + if (time() > ($starttime + (DI::config()->get('system', 'cron_interval') * 60))) { + Logger::info('Process lifetime reached, respawning.'); + self::unclaimProcess(); + if (self::isDaemonMode()) { + self::IPCSetJobState(true); + } else { + self::spawnWorker(); + } + return; + } + $start = time(); + } + + $seconds = (time() - $start); + + // logarithmic wait time calculation. + $arg = (($seconds + 1) / ($wait_interval / 9)) + 1; + $sleep = min(1000000, round(log10($arg) * 1000000, 0)); + usleep($sleep); + + $timeout = ($seconds >= $wait_interval); + Logger::info('Timeout', ['timeout' => $timeout, 'seconds' => $seconds, 'sleep' => $sleep]); + + if (!$timeout) { + if (DI::process()->isMaxLoadReached()) { + Logger::notice('maximum load reached, quitting.'); return; } - // Trying to fetch new processes - but only once when successful - if (!$refetched && DI::lock()->acquire(self::LOCK_PROCESS, 0)) { - self::findWorkerProcesses(); - DI::lock()->release(self::LOCK_PROCESS); - self::$state = self::STATE_REFETCH; - $refetched = true; - } else { - self::$state = self::STATE_SHORT_LOOP; + // Kill stale processes every 5 minutes + $last_cleanup = DI::config()->get('system', 'worker_last_cleaned', 0); + if (time() > ($last_cleanup + 300)) { + DI::config()->set('system', 'worker_last_cleaned', time()); + self::killStaleWorkers(); } + + // Check if the system is ready + if (!self::isReady()) { + return; + } } - - // To avoid the quitting of multiple workers only one worker at a time will execute the check - if ((time() > $last_check + 5) && !self::getWaitingJobForPID()) { - self::$state = self::STATE_LONG_LOOP; - - if (DI::lock()->acquire(self::LOCK_WORKER, 0)) { - // Count active workers and compare them with a maximum value that depends on the load - if (self::tooMuchWorkers()) { - Logger::notice('Active worker limit reached, quitting.'); - DI::lock()->release(self::LOCK_WORKER); - return; - } - - // Check free memory - if (DI::process()->isMinMemoryReached()) { - Logger::warning('Memory limit reached, quitting.'); - DI::lock()->release(self::LOCK_WORKER); - return; - } - DI::lock()->release(self::LOCK_WORKER); - } - $last_check = time(); - } - - // Quit the worker once every cron interval - if (time() > ($starttime + (DI::config()->get('system', 'cron_interval') * 60))) { - Logger::info('Process lifetime reached, respawning.'); - self::unclaimProcess(); - if (self::isDaemonMode()) { - self::IPCSetJobState(true); - } else { - self::spawnWorker(); - } - return; - } - } + } while (!$timeout); // Cleaning up. Possibly not needed, but it doesn't harm anything. if (self::isDaemonMode()) { From 7e89bf5af89c18c1934b5af0d162897eda3ad7e7 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 5 Jan 2021 10:18:25 +0000 Subject: [PATCH 15/25] Wait for child being ready --- src/Core/Worker.php | 182 ++++++++++++++++--------------------- static/defaults.config.php | 4 + 2 files changed, 82 insertions(+), 104 deletions(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index bb17e430c..f84dd2947 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -94,101 +94,70 @@ class Worker $last_check = $starttime = time(); self::$state = self::STATE_STARTUP; - $wait_interval = self::isDaemonMode() ? 360 : 10; - $start = time(); - do { - // We fetch the next queue entry that is about to be executed - while ($r = self::workerProcess()) { - // Don't refetch when a worker fetches tasks for multiple workers - $refetched = DI::config()->get('system', 'worker_multiple_fetch'); - foreach ($r as $entry) { - // Assure that the priority is an integer value - $entry['priority'] = (int)$entry['priority']; + // We fetch the next queue entry that is about to be executed + while ($r = self::workerProcess()) { + if (self::IPCJobsExists(getmypid())) { + self::IPCSetJobState(false, getmypid()); + } + // Don't refetch when a worker fetches tasks for multiple workers + $refetched = DI::config()->get('system', 'worker_multiple_fetch'); + foreach ($r as $entry) { + // Assure that the priority is an integer value + $entry['priority'] = (int)$entry['priority']; - // The work will be done - if (!self::execute($entry)) { - Logger::notice('Process execution failed, quitting.'); + // The work will be done + if (!self::execute($entry)) { + Logger::notice('Process execution failed, quitting.'); + return; + } + + // Trying to fetch new processes - but only once when successful + if (!$refetched && DI::lock()->acquire(self::LOCK_PROCESS, 0)) { + self::findWorkerProcesses(); + DI::lock()->release(self::LOCK_PROCESS); + self::$state = self::STATE_REFETCH; + $refetched = true; + } else { + self::$state = self::STATE_SHORT_LOOP; + } + } + + // To avoid the quitting of multiple workers only one worker at a time will execute the check + if ((time() > $last_check + 5) && !self::getWaitingJobForPID()) { + self::$state = self::STATE_LONG_LOOP; + + if (DI::lock()->acquire(self::LOCK_WORKER, 0)) { + // Count active workers and compare them with a maximum value that depends on the load + if (self::tooMuchWorkers()) { + Logger::notice('Active worker limit reached, quitting.'); + DI::lock()->release(self::LOCK_WORKER); return; } - // Trying to fetch new processes - but only once when successful - if (!$refetched && DI::lock()->acquire(self::LOCK_PROCESS, 0)) { - self::findWorkerProcesses(); - DI::lock()->release(self::LOCK_PROCESS); - self::$state = self::STATE_REFETCH; - $refetched = true; - } else { - self::$state = self::STATE_SHORT_LOOP; - } - } - - // To avoid the quitting of multiple workers only one worker at a time will execute the check - if ((time() > $last_check + 5) && !self::getWaitingJobForPID()) { - self::$state = self::STATE_LONG_LOOP; - - if (DI::lock()->acquire(self::LOCK_WORKER, 0)) { - // Count active workers and compare them with a maximum value that depends on the load - if (self::tooMuchWorkers()) { - Logger::notice('Active worker limit reached, quitting.'); - DI::lock()->release(self::LOCK_WORKER); - return; - } - - // Check free memory - if (DI::process()->isMinMemoryReached()) { - Logger::warning('Memory limit reached, quitting.'); - DI::lock()->release(self::LOCK_WORKER); - return; - } + // Check free memory + if (DI::process()->isMinMemoryReached()) { + Logger::warning('Memory limit reached, quitting.'); DI::lock()->release(self::LOCK_WORKER); + return; } - $last_check = time(); + DI::lock()->release(self::LOCK_WORKER); } - - // Quit the worker once every cron interval - if (time() > ($starttime + (DI::config()->get('system', 'cron_interval') * 60))) { - Logger::info('Process lifetime reached, respawning.'); - self::unclaimProcess(); - if (self::isDaemonMode()) { - self::IPCSetJobState(true); - } else { - self::spawnWorker(); - } - return; - } - $start = time(); + $last_check = time(); } - $seconds = (time() - $start); - - // logarithmic wait time calculation. - $arg = (($seconds + 1) / ($wait_interval / 9)) + 1; - $sleep = min(1000000, round(log10($arg) * 1000000, 0)); - usleep($sleep); - - $timeout = ($seconds >= $wait_interval); - Logger::info('Timeout', ['timeout' => $timeout, 'seconds' => $seconds, 'sleep' => $sleep]); - - if (!$timeout) { - if (DI::process()->isMaxLoadReached()) { - Logger::notice('maximum load reached, quitting.'); - return; + // Quit the worker once every cron interval + if (time() > ($starttime + (DI::config()->get('system', 'cron_interval') * 60))) { + Logger::info('Process lifetime reached, respawning.'); + self::unclaimProcess(); + if (self::isDaemonMode()) { + self::IPCSetJobState(true); + } else { + self::spawnWorker(); } - - // Kill stale processes every 5 minutes - $last_cleanup = DI::config()->get('system', 'worker_last_cleaned', 0); - if (time() > ($last_cleanup + 300)) { - DI::config()->set('system', 'worker_last_cleaned', time()); - self::killStaleWorkers(); - } - - // Check if the system is ready - if (!self::isReady()) { - return; - } + return; } - } while (!$timeout); + } // Cleaning up. Possibly not needed, but it doesn't harm anything. if (self::isDaemonMode()) { @@ -1248,33 +1217,36 @@ class Worker } elseif ($pid) { // The parent process continues here DBA::connect(); - Logger::info('Spawned new worker', ['cron' => $do_cron, 'pid' => $pid]); + Logger::info('Spawned new worker', ['pid' => $pid]); + self::IPCSetJobState(true, $pid); + + $cycles = 0; + while (self::IPCJobsExists($pid) && (++$cycles < 100)) { + usleep(10000); + } + + Logger::info('Spawned worker is ready', ['pid' => $pid, 'wait_cycles' => $cycles]); return; } // We now are in the new worker DBA::connect(); - Logger::info('Worker spawned', ['cron' => $do_cron, 'pid' => getmypid()]); + Logger::info('Worker spawned', ['pid' => getmypid()]); - DI::process()->start(); + $cycles = 0; + while (!self::IPCJobsExists($pid) && (++$cycles < 100)) { + usleep(10000); + } + + Logger::info('Parent is ready', ['pid' => getmypid(), 'wait_cycles' => $cycles]); self::processQueue($do_cron); self::unclaimProcess(); + self::IPCSetJobState(false, getmypid()); DI::process()->end(); - Logger::info('Worker ended', ['cron' => $do_cron, 'pid' => getmypid()]); - - DBA::disconnect(); -/* - $php = '/usr/bin/php'; - $param = ['bin/worker.php']; - if ($do_cron) { - $param[] = 'no_cron'; - } - pcntl_exec($php, $param); - Logger::warning('Error calling worker', ['cron' => $do_cron, 'pid' => getmypid()]); -*/ + Logger::info('Worker ended', ['pid' => getmypid()]); exit(); } @@ -1287,14 +1259,16 @@ class Worker */ public static function spawnWorker($do_cron = false) { - if (self::isDaemonMode()) { + if (self::isDaemonMode() && DI::config()->get('system', 'worker_fork')) { self::forkProcess($do_cron); - self::IPCSetJobState(false); } else { $process = new Core\Process(DI::logger(), DI::mode(), DI::config(), DI::modelProcess(), DI::app()->getBasePath(), getmypid()); $process->run('bin/worker.php', ['no_cron' => !$do_cron]); } + if (self::isDaemonMode()) { + self::IPCSetJobState(false); + } } /** @@ -1505,10 +1479,10 @@ class Worker * @param boolean $jobs Is there a waiting job? * @throws \Exception */ - public static function IPCSetJobState($jobs) + public static function IPCSetJobState(bool $jobs, int $key = 0) { $stamp = (float)microtime(true); - DBA::update('worker-ipc', ['jobs' => $jobs], ['key' => 1], true); + DBA::replace('worker-ipc', ['jobs' => $jobs, 'key' => $key]); self::$db_duration += (microtime(true) - $stamp); self::$db_duration_write += (microtime(true) - $stamp); } @@ -1519,10 +1493,10 @@ class Worker * @return bool * @throws \Exception */ - public static function IPCJobsExists() + public static function IPCJobsExists(int $key = 0) { $stamp = (float)microtime(true); - $row = DBA::selectFirst('worker-ipc', ['jobs'], ['key' => 1]); + $row = DBA::selectFirst('worker-ipc', ['jobs'], ['key' => $key]); self::$db_duration += (microtime(true) - $stamp); // When we don't have a row, no job is running diff --git a/static/defaults.config.php b/static/defaults.config.php index 310d1ea08..ed0f8f871 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -538,6 +538,10 @@ return [ // Number of worker tasks that are fetched in a single query. 'worker_fetch_limit' => 1, + // worker_fork (Boolean) + // Experimental setting. use pcntl_fork to spawn a new worker process + 'worker_fork' => false, + // worker_jpm (Boolean) // If enabled, it prints out the jobs per minute. 'worker_jpm' => false, From 8a7b70e5acaf79cd08c2137f3a9e6e7ed2158ff4 Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Tue, 5 Jan 2021 11:37:28 +0000 Subject: [PATCH 16/25] [ImgBot] Optimize images *Total -- 3,606.88kb -> 3,454.97kb (4.21%) /images/pause.gif -- 0.85kb -> 0.12kb (85.8%) /images/rarrw.gif -- 0.98kb -> 0.20kb (79.28%) /images/larrw.gif -- 0.98kb -> 0.21kb (78.98%) /images/youtube_icon.gif -- 0.90kb -> 0.22kb (76.08%) /images/lock_icon.gif -- 0.91kb -> 0.22kb (75.43%) /images/unlock_icon.gif -- 0.92kb -> 0.23kb (74.95%) /images/beer_mug.gif -- 1.00kb -> 0.30kb (69.83%) /images/play.gif -- 0.89kb -> 0.31kb (65.46%) /view/theme/smoothly/images/larrow.gif -- 0.97kb -> 0.38kb (60.9%) /view/theme/smoothly/images/rarrow.gif -- 0.97kb -> 0.38kb (60.9%) /images/camera-icon.gif -- 0.99kb -> 0.40kb (59.9%) /doc/img/vier_icons.png -- 2.37kb -> 1.12kb (52.82%) /images/friendica.svg -- 7.21kb -> 3.63kb (49.61%) /images/spencil.gif -- 0.49kb -> 0.29kb (40.24%) /images/globe.gif -- 1.00kb -> 0.61kb (39.02%) /images/smiley-heart.gif -- 0.56kb -> 0.36kb (35.36%) /images/smiley-brokenheart.gif -- 0.58kb -> 0.38kb (34.45%) /view/theme/vier/icons.svg -- 82.44kb -> 54.11kb (34.36%) /view/theme/smoothly/images/icons.svg -- 82.44kb -> 54.11kb (34.36%) /images/friendica-404_svg_flexy-o-hare.png -- 14.21kb -> 10.90kb (23.31%) /images/friendica-404_svg_hare-bottom-light-inside.png -- 5.89kb -> 4.54kb (22.98%) /doc/img/editor_frio.png -- 9.44kb -> 7.55kb (19.98%) /images/b_drop.gif -- 0.13kb -> 0.11kb (19.57%) /images/b_dropshow.gif -- 0.13kb -> 0.11kb (19.57%) /doc/img/editor_vier.png -- 7.91kb -> 6.48kb (18.06%) /images/link-icon.gif -- 0.14kb -> 0.12kb (16.55%) /images/discourse.png -- 11.89kb -> 10.20kb (14.24%) /images/smiley-Oo.gif -- 0.98kb -> 0.89kb (8.67%) /view/theme/frio/img/friendica-logo.svg -- 3.66kb -> 3.45kb (5.71%) /images/humane-tech-badge.svg -- 49.17kb -> 46.72kb (5%) /view/theme/duepuntozero/login-bg.gif -- 0.23kb -> 0.22kb (3.38%) /view/theme/smoothly/images/login-bg.gif -- 0.23kb -> 0.22kb (3.38%) /spec/dfrn2_contact_confirmation.svg -- 24.14kb -> 23.44kb (2.9%) /spec/dfrn2_contact_request.svg -- 32.92kb -> 32.11kb (2.49%) /view/theme/frio/font/open_sans/fonts/Light/OpenSans-Light.svg -- 258.16kb -> 252.11kb (2.35%) /view/theme/frio/font/open_sans/fonts/Bold/OpenSans-Bold.svg -- 264.11kb -> 258.04kb (2.3%) /view/theme/frio/font/open_sans/fonts/Semibold/OpenSans-Semibold.svg -- 264.13kb -> 258.07kb (2.29%) /view/theme/frio/font/open_sans/fonts/ExtraBold/OpenSans-ExtraBold.svg -- 265.14kb -> 259.07kb (2.29%) /view/theme/frio/font/open_sans/fonts/Regular/OpenSans-Regular.svg -- 266.09kb -> 260.03kb (2.28%) /view/theme/frio/frameworks/bootstrap/fonts/glyphicons-halflings-regular.svg -- 106.19kb -> 103.92kb (2.14%) /view/theme/frio/font/open_sans/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.svg -- 283.40kb -> 277.34kb (2.14%) /view/theme/frio/font/open_sans/fonts/BoldItalic/OpenSans-BoldItalic.svg -- 284.26kb -> 278.21kb (2.13%) /view/theme/frio/font/open_sans/fonts/SemiboldItalic/OpenSans-SemiboldItalic.svg -- 289.45kb -> 283.39kb (2.09%) /view/theme/frio/font/open_sans/fonts/Italic/OpenSans-Italic.svg -- 290.77kb -> 284.70kb (2.09%) /view/theme/frio/font/open_sans/fonts/LightItalic/OpenSans-LightItalic.svg -- 291.13kb -> 285.07kb (2.08%) /images/person-300.jpg -- 11.05kb -> 10.83kb (2.05%) /images/smiley-bangheaddesk.gif -- 0.86kb -> 0.85kb (1.92%) /images/smiley-shaka.gif -- 2.37kb -> 2.33kb (1.9%) /view/theme/vier/font/fontawesome-webfont.svg -- 357.05kb -> 352.24kb (1.35%) /images/article.gif -- 1.04kb -> 1.03kb (0.75%) /images/rotator.gif -- 0.81kb -> 0.80kb (0.48%) /view/theme/frio/scheme/plusminus.jpg -- 22.34kb -> 22.32kb (0.09%) Signed-off-by: ImgBotApp --- doc/img/editor_frio.png | Bin 9668 -> 7736 bytes doc/img/editor_vier.png | Bin 8099 -> 6636 bytes doc/img/vier_icons.png | Bin 2427 -> 1145 bytes images/article.gif | Bin 1060 -> 1052 bytes images/b_drop.gif | Bin 138 -> 111 bytes images/b_dropshow.gif | Bin 138 -> 111 bytes images/beer_mug.gif | Bin 1021 -> 308 bytes images/camera-icon.gif | Bin 1015 -> 407 bytes images/discourse.png | Bin 12174 -> 10441 bytes images/friendica-404_svg_flexy-o-hare.png | Bin 14553 -> 11160 bytes ...ndica-404_svg_hare-bottom-light-inside.png | Bin 6031 -> 4645 bytes images/friendica.svg | 241 +-- images/globe.gif | Bin 1025 -> 625 bytes images/humane-tech-badge.svg | 58 +- images/larrw.gif | Bin 1004 -> 211 bytes images/link-icon.gif | Bin 145 -> 121 bytes images/lock_icon.gif | Bin 932 -> 229 bytes images/pause.gif | Bin 866 -> 123 bytes images/person-300.jpg | Bin 11319 -> 11087 bytes images/play.gif | Bin 912 -> 315 bytes images/rarrw.gif | Bin 999 -> 207 bytes images/rotator.gif | Bin 826 -> 822 bytes images/smiley-Oo.gif | Bin 1003 -> 916 bytes images/smiley-bangheaddesk.gif | Bin 885 -> 868 bytes images/smiley-brokenheart.gif | Bin 598 -> 392 bytes images/smiley-heart.gif | Bin 577 -> 373 bytes images/smiley-shaka.gif | Bin 2427 -> 2381 bytes images/spencil.gif | Bin 497 -> 297 bytes images/unlock_icon.gif | Bin 938 -> 235 bytes images/youtube_icon.gif | Bin 924 -> 221 bytes spec/dfrn2_contact_confirmation.svg | 163 +- spec/dfrn2_contact_request.svg | 219 +-- view/theme/duepuntozero/login-bg.gif | Bin 237 -> 229 bytes .../open_sans/fonts/Bold/OpenSans-Bold.svg | 959 +---------- .../fonts/BoldItalic/OpenSans-BoldItalic.svg | 959 +---------- .../fonts/ExtraBold/OpenSans-ExtraBold.svg | 959 +---------- .../OpenSans-ExtraBoldItalic.svg | 959 +---------- .../fonts/Italic/OpenSans-Italic.svg | 959 +---------- .../open_sans/fonts/Light/OpenSans-Light.svg | 959 +---------- .../LightItalic/OpenSans-LightItalic.svg | 959 +---------- .../fonts/Regular/OpenSans-Regular.svg | 959 +---------- .../fonts/Semibold/OpenSans-Semibold.svg | 959 +---------- .../OpenSans-SemiboldItalic.svg | 959 +---------- .../fonts/glyphicons-halflings-regular.svg | 289 +--- view/theme/frio/img/friendica-logo.svg | 18 +- view/theme/frio/scheme/plusminus.jpg | Bin 22877 -> 22856 bytes view/theme/smoothly/images/icons.svg | 1464 +---------------- view/theme/smoothly/images/larrow.gif | Bin 995 -> 389 bytes view/theme/smoothly/images/login-bg.gif | Bin 237 -> 229 bytes view/theme/smoothly/images/rarrow.gif | Bin 995 -> 389 bytes view/theme/vier/font/fontawesome-webfont.svg | 656 +------- view/theme/vier/icons.svg | 1464 +---------------- 52 files changed, 19 insertions(+), 14143 deletions(-) diff --git a/doc/img/editor_frio.png b/doc/img/editor_frio.png index d37081b8337206ada1b7b8cb9d49df66f8de1055..d969f261bb3542b436537086ef77e81482b92010 100644 GIT binary patch literal 7736 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 V7J!1y`hWmrW@2Sr{N2^){{cm^vef_p literal 8099 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 diff --git a/images/article.gif b/images/article.gif index 91aeef000b1c0004ef8b5d59ac0ab235eb0689aa..af9de93453fc15c87955d05a4d967f799cc4f80a 100644 GIT binary patch delta 19 acmZ3&F^7ZI-P6s&d?PCd^JYWd%|I diff --git a/images/b_drop.gif b/images/b_drop.gif index b08c68b62d7b7cd7c3329f62863f91b87a0a8387..5834b5d29942b6f32c2b13dcb289bdcfd6a23f86 100644 GIT binary patch delta 94 zcmeBT%;$0UbhEHb6krfw_{2VuN7762CkrbV13QBb0}z0O8JJBfcHQA(+2NX@actrl wkAt$y8;_d>&Zu1U=#}J?pIU{+`df`SLW513y}6G|JPC8YpLH@tg@M5u0LeNYE&u=k delta 121 zcmd1rV&rl6bhEHb6krfwc+4@8M>6$44xspxg^`Paok52I2tdjiSj<11@LbKpa>KJi zqs_HNB(OnMbJ6h~g$sTkdX*#frrNu5tH13@hYKr3w3_{SJtSGuy&vazEp=gFum%9? Ccs8j3 diff --git a/images/b_dropshow.gif b/images/b_dropshow.gif index b08c68b62d7b7cd7c3329f62863f91b87a0a8387..5834b5d29942b6f32c2b13dcb289bdcfd6a23f86 100644 GIT binary patch delta 94 zcmeBT%;$0UbhEHb6krfw_{2VuN7762CkrbV13QBb0}z0O8JJBfcHQA(+2NX@actrl wkAt$y8;_d>&Zu1U=#}J?pIU{+`df`SLW513y}6G|JPC8YpLH@tg@M5u0LeNYE&u=k delta 121 zcmd1rV&rl6bhEHb6krfwc+4@8M>6$44xspxg^`Paok52I2tdjiSj<11@LbKpa>KJi zqs_HNB(OnMbJ6h~g$sTkdX*#frrNu5tH13@hYKr3w3_{SJtSGuy&vazEp=gFum%9? Ccs8j3 diff --git a/images/beer_mug.gif b/images/beer_mug.gif index 9a3e0519224125a5ac596ca0ebe2706ddd09d8af..10b53e47b60d4ffb373f8f375af178ab3fb4ae47 100644 GIT binary patch literal 308 zcmZ?wbhEHb6lM@+_#(s5(9m$;&VkVQ(0U-M2clK0;zL)}1JSBg^Fvq7U$tugsw?pf zSK>pj)H7VE54|!!^a@bqJ`nx?KR@*U{?PyTSN*^L|IC^H|9^j2uwcpm|Nj|~fZ|UU zRxSn^1|5(X$W8{8!#z-!A_iN$z%oQ1|0l2nsSpWb4 literal 1021 zcmW+#U5M936g}!%Y8HYUgh4;;pT#oRD@(e_4R^sAS$mk=TPSmJI*`j9UX zMg`maqpI?tHiAJWK8OrqA2j`JV} zMWJD0{!Gl5iFTW~juXG0ICA<*hzwDoN9Zl|484LQxCLi$g@lkSB!;Ar5weBMkQFLI zwNM$Vf)Hdu43Yr`GteOGV4Yb<>tqoY%_1$zdRTAP(|Vc1+{|e%OR!{?Xi1h~*(}qt ztiq~UrB#_=G80X5z?&L$$UAsv-qAaGgh%s8kMbVgoA>ly?r=AEy2}$hnJ0RZXLvTx z^enINYF_D8F0`Rsbcq0A1PQSNJ7Y(7Vg#cxl2Poz-q@3U)3mXS&L(C8lQEG=%wRTV zGK&?g#!6OEpo}7=0u)#Q3sgFk&PvD9sYH}$C9*`79;LU^v-B#C;#Qo+RT4_Fl30>T zM#)w(OIE2U)kWT zhO#MBS*lPqRjNvAE8>|m(iyFno|8VfPMfD~Z3bsE7YRs)L?j^t*^r4WRG=CvQPpzP zEDu0{1vH}2A#@fxhE5?OMAO`r!Qj&tX|^9*x>ct)o*S&*cHovL zhIh=?dxn-wt=aqPmb2TPLtE#*fA^EYqAfSy|Imux-w)$wpSn=?ZF%OgL$5z_@9xLL z*d6iF$p(UZr_JRf2{6EQz`Hlbp diff --git a/images/camera-icon.gif b/images/camera-icon.gif index a4adf9adfa18e3072f6ced0499ce5364e0950e9c..2943aa09535ebb072c144cc4e9360f612631e1d7 100644 GIT binary patch delta 326 zcmey)KAlc#IH>R>fW`(>wlcKDwoX`e|nib0>`2@ricCS~cU9TuE z!>Y`}DKEQpnKZ9VzbGpsKRb_Np;JKdd_Hk@er9epp$H!(Aui6ocM+-~Prs@=GFSru DTQ^Ip literal 1015 zcmW+#TS$~q5T3%w5=tQp(ry-7DjPV|x@@MPm_}$+VoFgK9V<(Nl|-{AHA_&C@Zp3? z5aCmXAPSaI`XY4_vWsTBtC^ctD5X*KG=1kkZ^O)dxB34=x!I|nl1PfAIU=#oh-eWd z!XjiVW5j4NN(_r3+tfz17Oh0HXtJ})h|;2zC>BL_m5s0#R>CYyKoT-ST1W}85DH)e z8dzAyG+7?|v@yyUHij%MDy@xHMzhgmRiLS~QOYPbimWKivNo&?vtfcptQyjWlp!_* zR;UITL_;NHp$B4M0~%OZCTqyncuH&5nyf$2qEbpL){3lMs6dmIX4Xt_4^f!aq%^T6 z*h3zWiEYFI{}2I(Pz^AMhDwY=2Z(_UXkd{|&bCqGu~KA%gg?-tVpdGZ6?UNlO+~B- zIU;EU09_bI&~S?=kq2aA8*xAr48tK*0}P_E30cqqVqgQB?1}6&+Nkje7ekQn2U=82 z_T#X*I`_6s=Y%$9=PGvA3EHOaWM@~MIP4J|hZe~ZZExb}u)q#9J_lS0;lUHA0)ar* z?qpX{SzJl=o}*`6ImgoSPQ<0>)_s;jUu{nDSjOYV`FdT z=jUf;W~Qd5@agaP7q$XMDH$5@M??~Zzav?*;bcX_V9lSeuVY3cJKRajGi{lTqp{vw zva*LuyZxSu(97n#n=Vd2^@S#Tya{>jIaNy&MNzk1pS)Gy4mQ<}FP_f1AtP<)$ICkg zDi>x0^>fV~1NTG0N8YYc|3KBxiB&0oUBUFE?ZXXMJc|LZFE~B;YCf;s-QsEO%Zymx z8C|{TABt+BgfYmKk>g|F~KvbSQP^WNLKuv1;-OXt?s jr!N2K&zqjT_Qbtz=Wz9xzDvIEn;)b#JuH)maPs~K*o*RN diff --git a/images/discourse.png b/images/discourse.png index 6c9ce4667638a97372f7b7e06d0cb68540c5cfdb..c51e26d0c971c7b7f72eef765a1c9349efa93f42 100644 GIT binary patch delta 10381 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 literal 12174 zcmZ`0xNL3)4wB~FTYCkU3}%Hl9Eb#Z9V zCW!Cf6hJu*Wf&N*FEB9v!7wn7@4x)_VPL>)FffP4Ffan?FfjOz+3o5=?+Hkzin3BL zZ~vY7U8PAdFf7ILQsSB(%O^RW9tI1ZZ=!pv-j*_)%e4CS5W`D2quzAmTV_hifZ%vU zA_;n08fytF9KA;-<-0G+bB)TG_8;uz#*i@n=n{oXE`5m7CHc4nQ6a^ZwyC zYCHkupa!+M@A~A)#&H#TTb}aYy{z5|uXu|o{_g?0pmD`()o*HQf@Lsosy)&8X%>-K zfk3MeqCu;m;d5UrA(qc3zC+qwr%pRa1EYXW9bA}9ki-X1;hm!PGM?}fT8nH(@vF^Y zqg&l@g-E-~v(b8?WYxpUCrQIJs!+2FbG|=I6qI_v@fcj7^+8Xp5heRG?_??^5F6_{=AXYRK z?K7jCev9pFvC{fo*x`PrVg>qD+pa=vV{?eDU_eWg_H$mBV)D2eYoTTnUt`RhF0t;( zHA`opy`Z9|rsm6m0YmUTMOg#baJoVs;qHU1&qyA=kK@^Tmy;na5tLR32n2Q~DH#QA zdBIxlKPql)qYet^zm}F)ogf;L6G5eQB*8asMbCT+hVWE6i=zeU>-M-UVWv16D=z!L zTB|>y9|blwLB4X4p}dlnslw775b1JA2XCn)znm$Pl1{Y?a6uR{RpDvd zWm1)6#e|I&AKa^|s%8!kf7MP`JdQsy6Wr#Z3@-Q=gUo2NnuWsEzT4P?o|>vZq90}1 zK&sb^ik_Kp&qlf$!s}C(>5@6@LDmkQ5{uHG2imJkc4?69;hoTpt-d*OH+CRA_t>6^ zPYVEeHMO*8LM{*y7Ohnen|PSr=@9eK!UjyxK}eMa1ylrVzPxCCd;UUpPq_<4m_AdY zWRK75-CaN;=tm|X5WI$*toAlKpU7D?i4r5Ie(5rGQndlCwNUA}cEjAW*`5Zx^h^2L zeAm|pmEdzx3u-qzY}oGrUiGoI>@jbab2;^5Ft)a(5ktmC&wtJN&*m;rSJYIC>Y(fq z_l_;cHmIobYpniSUT#+%I5gGL*518WzKWuMg%SRdJ(Vfur0?Q=zriszVG*p(tI2Kq zdG@tBQz4@} zD^C&OIN>`6@F-RB|MR~$)zUxuE(#})e#B8(U2!VJu%MF4s$8177-TvG?B@{K-x;(w zLJN}i1)q>Bl>aCeUr?BEMA%EJ&2uQLUauBD!UoM%D7XFIywB-+n9*|fd!OzEaT^0&vUnvEHOT&vA(E7aW zZ1kcC)Q!{(Gyysrza0HkRpSZ=HgPn4m8YH%wgko0R??u@h{GMh=3PDI<<^5II)}>` zC6CL?GfKr(^Z7Q+gD%ga5VBWv>U!$8b&?rSWhdl8S1UOEoo zt!6gB{NnselGs`Sx*P~`o`vMew53D}j02GYDxaL7+W+DyY;smf#UR<<+MVA0f`0Th zpGR}?$EUu9WxYm&d=~T3D1AM>TM!`5ns;$=ew6`p(T4c9b3(iFe4G8aSluisU%}7z zTT$*ZJr+%A?2C!aOrk|4kfHnxBN52vO|p-!$&keF8!8^|2YRhQ%y=|}`3DQLaNh(i?2DWl%P4yxiCg-b*3#*kQ z;GrQ%35UavYMegr-U!_%BcrS zt=0z>^}s1q9>%)kE8&q0xH~Xx4cbr?oD5fYdA_rsi~bQ_tuyRI{lGFn>yC_eA#N;@ znaKt#d%G8dcB!b>@z1YjUxIZ@L?KFCOxAPs+16I z$2x3-A_VSn{iCN2bs?(Fv{1>)T^A(dd1YlgySI$rwLIEd+!QgEc(|5Z${%6y1p+6M z%@jlVN_~6bHR==v_N&G=;uTOCSV1;+zVy^4IeL5|w_M><8E!|B0e5_fcl_~rKMB?7 z0t_WCB+ISlOgMULsfS{Brd2yhptM9bpfedKtuJd;jEIW@i7i!PbiWnGOezeY?8>di zy{s0Pep+2m?i^DZIRl7o4qxHsH!Q}PE5sags9Ohh*Qcpudy7=_FO??YlEl2s6e8Bt^F!v#dX6b3E@Q}L$`iY8L6B%F zKZdC>Y$#Ovia2XZedQQWF)_MyQLC_h>S;+{+e=Lhzw5R^c_z~Wuvs@gdbTQi1yPTF zAD2;+OKccc6*v0GIU|$K!Zt_{9k<7}TFLflXf(q-m>tPSM_`p1FXDKcyM)BkUQu@9 z$|yvOXMX+_yLD;8{ik>zxnN>as@1)@&WM=2i~{epi(ad+(} zaNUfgMx))gwo!!VdF}7P@^|rbBJBaOby@k7i%=)a0*uHZ%IhRMplfudA;Eu8Z;#Hw zF!7m)xJR+miZKps&HrzgcCYg`?-x8&=bC{35!$do2zAiXU+ z4h`BmLl4`qP}kR{zsN1Qg?bCa9+hZiInxDgdn3$y*44A>1ZLSq_$7$2GKxVT=vnT> z(mPNhRT1_&7p*DJo@P5(E>O#Yj#sD_WB|Mtn;9m zFqB;ipWQ6K$_V*dQcW(@3mV1*e=A%|M-)qnK%#J^m)vv%kKpXXkF9%H*3*!L5RjXzmOwmM zRykZ&(^pn0lbS*m71aw^wJgqz-nvHL3Kpy#AYG~=U0M@1E+t!%843K@Niq;F=wl=x zl=9FuB;36D&yi2)p8(+K-L*;gT6Sq>;nVl!F-ttTuCmhe5A~*XG*U+wP>>%bC$U2p zOy+f{C$y`Kx48n=)4(V0C@O{+t*QZV~az z6knRVPK9?;b`kL>3pG}Hglw#9fc+Gc5FG-4*ty%>T)GNZX;oI`i#z0LRNhxf+IJ>+ z8H_5DNzJfA#pZ(VMahF*#SujX!-T|8LYktQ) zR;bA?FVwOdstLDTQ`6E)NFIh2idQ`NN_*eQ{JHbi6*6x+HFhC=AcFHlv^#2M*!@5{ zT+Qvw%-Y=*tLM!GyW_62?c9xObDI@eLa5W5VlI*xT(q>byu93eoZD1edq06P?d*-7 zQ?wb?9N-X;|K;#G+0G#NwmkWsMI>yqw0cAcjMHzKaFU4l04U81tosQoxEer2I-;;_ zK%m41RU2kv24-j)d=qmrv)V76IMgL(Bqm}%)^U1}dcoejEh;h#$ghwgM_iy=7vZj8 zL@~I7jc&JTv~X#_xcDwAe_YxlCJm&A-C(KS{O&iKp@K@B1JV06op)j^rAtM8s;i zTHvXkl1^u9Flu2ElD&@AdqCUU+pA{PS+_19dfsLdI$dCedz$@w8AO~_YDX4Vy*L6u z8>N(n`H8IE{pT&G!$?Rmz3 zKlt0oJ)e2w^OJXDV@>{^XP!r_(pBD^JUL!_V%#G?EOkSG_ z&CG14Id;El?B_=5wpI*8BdF%&c|b{FCehT@lbEKf9xAJxZDdXy-e&K9&D+=v?IQK5 z@nQbH_9qu>9dBi+H9lwI+bsk!WGD~cu|yx#3)5|;$oRQ_-YzJvlN$|rVYNA9)6!n5 zn&o#ev&BY`$=1fwDEhXrPkR$F@QUd6_^LB3MNU>GH0;em-gvFm%`Sp@C&#qnY&hkS zRMxRvLG)Q!^NGH~kfKZjyYx(^fLxZ!YWEQr>q|7!Wxu|9e33bGAJW zibAc#KD=Ag(-S?9Kn(8rStSyU=t?+IuN7?n#8vMcQ(}pD&8ojHQO(ay;G|;|IIAy| zBS{v}>h#;Vsg{@AXU|=wSMpNH}hpCD=9Xy zb53&E)Ea0}t5{pf7&%Y&^X^geJ;j4%EW7JpFd1_~`(FtSMIGVF1Go8k1Gv^%i7PCF z1dD2Bt+N4?qLy0Sdmn_iO_}J-rcCTKFCBlLE7}75oU#3bG|xJ|oty>mnGhua&tMxm zYq%pu5wq{Jij7;^5h;V>EaHYP1FR|;*jeW;Cs9Cko4pgv1J++KuU}P3_*(VVLZMJ3 zge_tFuK=|^?>XDb)NGrQE`ncg)h(v>E08hAa{KBPxu0OO^m<{D!OW!`lJ-|}dC2AR zv+d34`1p7>VxNt`)>>_mH!>^WOe#KW_@Zz}#K-fZv3ua%qrNh&S4TM3T{4rCmsjN7 zuB&Z&CgW{yqJQtZ@V1@}9=#zP7Q{!Wq|UB1(4{GHqg2)6QCp8EE30pf&yMpYD4LgQ zH6X7v6g{~K&M7i_X1%yXdaQnBQcaPj5J~5Oth6|^AZ%gte%|MzEt3ZtaH}7UoR>NU znkTx<-Gq0>f9Zo?PW(QoJ2cmV^&!d^LFSIF`Ghn&`v#U3Z%by}WIOHmRgWBB+-VK>qS?H=gpF8xPoeJs_+HF4L*DFxfb*YWE)?-P8r zS?U!whV_Kc5L5$x05|}I6mmYm~}PPIJH!)6pU&U~f1uJ5L71mKOoj`m4xg&y(F~B!}Gt*#aIYHmqsww4e7u z07f!xbu-1W_4eH7`N0IQWP9BFqlla*VK#hnaf0GlSw*kk!O-%SFr=lXn!+l5#DhUP zg*_!riSV;8`MrxO&4>7AFIk0J#^Px(5VpA(3ob700rPc!j|xfTxm$XJ*#MOB#Q8BP zN+*TRz1UWg77o8h?AD&3^u3%}Ico}H|- z@i;9g>CR{#KmNkc6?z%#-6P5_W4v|1`(2jhfnJ4eW5JxAWG~yZ-`KNRaHX=miHxURP3)I5n&i5<&iVyDE8 zaJyJ^8_Z?Hc++YVT1m;};?I{IZ8~g}b!s>RzF>>R<{V&*r)$H3&P!}2KF@znKhom< z19Nmt8diMUFlRIZwWrW?j}%0sN*`({FyNoyPr1<2_h)5$Gcd+F2j(${|SY5R9( zpI?wIcCCZwLPm<{eG7S8r(<-o#=qbd{+v(znNeyF*ToFn9U#gUmek4HM=WWn8gA*v zql-TpF1QzDBra+CV`gq{&aSpUT*<8XbIK;UlxK0yYl2}pu>lsk`bYRkjVdxByW6{+ z!&fQ$cv?l47H6*HO(E~RjROHALC=1(Gw~q~tB+(-nYfYGGC=zYp1|d6$V7~&`>OZ0 z{#u)q1}ac*kf~U$$-eW~GcMi3?&ID}gIR7fq0%>f=g)E!qb(LQLYN$SabY(_F6!O> zN8<&t*0~C@j5-!5OiGjpDsZ#uekn1hfN_=`!UoZF=C|GpwR<=v$j0A(FIj~`@A+up+NX!&&{zB3hCu`aTxSVDUPo?oe>u?xVm3AW|h4(EzrcK;?0dfU# z>8((c>o{t?J5j@mz+OB__{JgpQKl7Jn<*sBfWrMX=p#A^DnB{Lb4jOX=_9JwvH%vB z00Il&8@-gmy)UHmIoq@!RfUDQfpcLIn-#Avb!cBRlCEpw-2 zR5HX$$6`xT)naOsTzUCnBJ|2z2&Wi>rGp5qwpK^QR|%58-x8POck4m6-8{?`MYj;W zkt1Wr`4u}lvyhqdOB{$5sD^_Zr{>@-GY zj{b4QUt(IRS)5w8Nu79pqu7-0-cV1k;2eI9lt=?oBuiR|B>Yti+`=mS_4pncU`IWu zzd97WAvE`3XBkUZ^nK>TG!Hr*cB9JVMxPno%T@0oV4FL6;g-uo8YqU#P4x;u5cH2R9k-ZsbkVjYWo$($6kbHfu=ENJG12duI|Z)=cl? z3jcD|Z>M6D1+Q;2GLITjOjVg}CSdh1O5bRZh2W1AT|A&;zi9+8pm2`3&lN3n#lRE; z;k`F=*M8xh%ZEo{_@f^`)6)?FmRvuDD?h_@ggqX_%;ZT5$m+4Fb|YfBphF@`N=npc zdTroYr?FA-qvQhWO@hVSX3noC(`K%#w8a`PbJY`Qyj#|P*;dSo>+UC$$md7P-ZT8|NY&?n z^z==@ZB;id&=Raj@O4=j86?#UY6$KxOvu>K8F=rjs2{U)G8+8leTN%7qEzhe9@-&R zHzW|4oB01_Ox((7B_6{lst^OuI2UnveVlF7nCQ0qIVNF!~A3?aB=Fl*8#fOlmCky(}ZR5LZ8_=|)Z%rZh4RSYF z2DR3$wZyhLc`7&LhT-Ra9_4O~`{e4dqd-R!w`FZE!T!!o-QVQc8%4B{)niJ4mL(qv z+2vOVkK@_L^(K$i;S7_u?6p6I%mP6-JMc9{KDN0PlqpiVrvX~ew@dCqX|HE=8d$=^ z9jL~R9PUUn6(&=fT|5GlzF`{3put>G1R4H&uS|n}#`Q2T!u`<4b#T75hBx%#Ow;yR_a5sfw_)I~U%qrvVv*?)ce`Ki^dat^Gf?}@Zu_bT~Z+rhlEjTmUM z;jM91F*VasnlE8a1_Ac+#$8koo#61vh=uhNev$1XKk;R$a?y?=!YsG@oBniJv#Ozq z*K$(IiJ|R}9Blfgo}>Kv*BbaE#M@{Ndg|ocU?(~wi!>`x`n`*lTlRAtw$F=v3+~O$ z^z?LJbnpUFH%*SUB>(GTXsKO7{OTek%uxuk?vXsxbt|E_hf8d}1cfHYqIW&gQ-wS$ zPvF2^P5gOH!6HuQL2ErKb6l#)?>H+XRDPcnW#Bh1cx&c)9q?WcnOf&?+V+U<03}&Z zoRxJ`G(K5yL0~pg=Nc%8yu;Lo6O4NAlV+?d@A6*-JM+kkf0rYueboW#J6xEekW9qL zkWYC4e3h!~d?m$;`S^Uy2u2P>g4cc*S8XU_&E3JMU?LW7pUy5Nz-g)S7`j@9jEH2n)`V z05bPo6$NE%^m?2i+zM5wpvU6`k?cq`8Ok3Te@#fP{NPbp6O{esjw{ZV@^l6jz)P~N zBg-g(;{Ay5;b_Z+3z6)XVNR8g(;Jg@UfOmx>=liapdO;?vFqG%v+!TX`QZE+EVZBUILiqv{BRI0Ju?xdGAg2J);w3Zx~hC}^N_zDL<#bA~5jN7sw z9RpT&=38ArLGQIId3Q@LvV;|p0VH>cM(26=Z{zN3_s_9^O=5>n6`zG}B#XRn8~Z*V zhUvl{)#WI54gHY194$b^LN(24Q=Z#2RbJ+KmogE+uMN`2B9?!gR#^+9HN_RW^}V~- z^ziJ)%=27>1noAmZh#O_}*QPLPs`Fzg*$a=8M=H0e=%7ll5UEXa%=m+oc zzCUQZM(wW1*+8bZ-9)d?1pHgQ!LVr1{clDl3Vx8+4(BJAx1ZNnH>e2Pw=qSDh+E1o z;mR8KM-Cn3s3hhD8)HO(Me-e8Z^_RbKg_V&JrBQ_Sx1!ghbZtxR_1yqBV#bz)+?wP zh69TiI~jcL^$CDM_7$OFdU|@x4RFx>z$RHR$s=*8CI5BTje&9qnmN-Dm{n+c#%meh z^+!3xY}MUPZ!bN8ti@9+7<)tMJ+N#TNh^78C8r5GdPuqo8*Hn@&?fopKghP7ZT2@; z(6dQgN9kucY-9qpF0X1Ru-SRFhG0at*C7En`J6f`?iz5P#-o>pv?-f?)5hO>%LahSqPC>{j)lcJ3$4A^HR@4Q;MmHRKo;?kySe- z84(h0U6#84=4q>aQ7wiU>4x0_DY4E+%j$w>_SUpXW2xu;O7Vuh$)JTYfQgDKUL4e? z>BRwV`&r4ZHJ|e~Swi_i{Aa>c7uq_m;cpvi7jG~4+TX)gD*o-2M^~wM13dr0IQv%& zy;_IyP9^(#nmfmLdj5bV@^_aVXm>lPPOjjpSijvb-L2}d#@?s7 z&RjHF8kWWi*?nPj5m&a$x3yb=gny{{J4kM^r!1Yx70WWUK*-7l4zhG`!furt(4#qt=f6bb>_Rf7zJ~P7|n_~ z-??{6eb)B03Xo=&rll1%7>!uJg@pNis>V<|R4U#*KU&~sD)DabU+vt}#mF(v#Fa#O z9-AQi)afU__q1|Xe~9e2H!h$NIP(q-5KPdjMe-jX$Zaa4L{OrV5LfDIxA@cKXB(Vl z^ori`sNxefMKaK@VlX3RY@$pEboIYVp+aAQwLSQ^lCxe(TgMr}I)emziO6+UO>4Uq`^n?}X) zdBu`Tw5zQaeeU4hC}88~=Qb$RS^OG>w8j2fwFB;+eLnnvK0;DORhS&!iav>WyTue% zfA%9*Y{g+s&u&WV@40)H>L$F8DkRrjYP^ zuG(JtuL|mqg{)Z1S4@l09Eq2m2oEjQf%d0R}|SHHr|G4fUd&0K41P{)y!=t$DL`fPAtV3QvIm628J!b#g@ zd4F^E=y(zNX)*c>&NHMmC&$o)?C|8vDaoJT)q(TcSl^q?L)rXSQ=tnCs!sIhC`-LI)-%%uL%)N}D#CB)74FTAEv%3EHG9T}H3$Rd z;!p^)LH%DM*}iS~u%$l>J2rHH`+co8; zBp?D`mzv!4mzC+HipS?!jmmhlW3Eu2vjUxD7LUu{kg1#?=49VJ9-p%aWJ1 zrzdWR(vATmqq1pE9p3;qD+YRfLuJalf%fA7UC8uJc9N0+Q&x?s;b4J6D3T1;!Eu;W ze@~2CGwcV6q@IG&JE0&MK^(W$8*m&Xlb6vF8Y#rHmJrY`2>ZJPu2RO-a;*s!VK1}~33dJTS zz{r*79r}iE!mMIFESbhJT`UIo-ITX-o|7+t4H-xBeIU2uq7r}{jHuazsXTkte?F<%6fU1eIBZaSK+g?qf*l2o4z-^{8fWat$j#r2%rUGwCXAiL zgd#F1rE(BfnZ|!hpIlQx8%|!F)Lptk6^vkCjw9rkvptbXW@Te)b$ZKib@Et<=Z_Y> z)sOUuA@Sn{7Q}TAE+s;%C~1adU_-kiBg|-lyVg=WGVN?>!$D*(YlZN*Z(BX1Z&Rv< z>8uP*9%3jL3AfG7;h{IRJdE;Vu?lADCJH0&O0h1g?&%$Z19NWloFQgay8eVrKpH*O z!JeQWm7zayMwMT@%v?!a_9=Fac`g1?Xcr;7>|PkkSaq7jRgv>h#&6usnfM}%A?UHz9%41-S` z+bulZP|iRL>&C8^r(%B~vp(Fs9yK9c{eIt_VHF%!d8?q@K@!Ny8!{00_2G_de%`A% zE2c+Jzn6RCel)wQH_S9?b&k}+(lWgi$=eARH(f-#Qez7TM4*&A2zb?{=bxDdj`xuq zDUar1j32?#?yLv$iElgIdbo6c6~j z>ErlZcu2F;@jI#@&J^8^{5D!Rec(Oh-x{Nn4iX$n^NrCmDMBu3sLt;BwzH=5Hs&nC zrGymLUG6mA4c9OO>A{>~)ews+Y8ysbM^_H`@v$zey9 zl=|7jFW5JMJ(OBH8Uxo@>X99}WI1N{TzqnrvgONUW>*+h`po+V4}1M~*B}$rdm}kT z@_nBAPuQEat%Ll0^(DQ)oUBwY47T%xhwv!vpBhO_i}d~?`;6<7u>2%x(zB4m{seO_o-3os~$Xc zkvG-)W~_-$&vxD)x?gG9ScQWZHWL2wN(+l-$Qk@vTkASrTO`tE9sDCFt{}~H&@G5e?zYf+d+^RT&$+k zuFLfpLc*2?$$d^q`ua5w2q#maHeCC-d_jr|ylMU`I3KvM7+O=xu)UneU^AbvwfeqY zCCv1B$O^zYj~0enho+rG&oVN`AVxZkxN|Q_fu4*>KM=;wADK-et`cjk6iY!Tn}9=| zKJZc-2r@M+X^r1nQ?9D|RArSUIZ#o|?G6*PnYruev8V7oeEv>C5v0wKd|yN?woq$h zJtbYSIg`1f@8CXhV+Ckxw6Gy(eEs>3Q9|Z5ObXRfJOZd8ez&ptw6WWKH2cm^O8Ut7 z+Ri}o`i<8ptK1YHeFM0;8oO@>opjPwyHUIhb6Yuw;P%WkvJRAjs#d)&V zfE8BFfr^x=NI8ae@BF44c2)z(d%FI@j@(7{E?)LgR<)}`tv1hLIn5z+6&ak?JF_qL zD%mKy;rzQkwwn|eO=`7M|kdXAgS8i0A&p4<>-@&<=?|HxQmXSlK(gxbXy32v?@+{G+%}s6AQ96cEU4 zXu^K4H%rV`;LP;VEj+4jG`6bAglyt3K;XlFO!D7OY4A!-OCq(%wcaF+O8{4fPf0_Ai-t~A zs1|4k7cmp-81Fo>aDIZr`o#Ls=5SuC&}2c6j3M9eP!`>PA9#NOyNLbPs|B`6Kj-3rpu|HJRw z`{BLdy7rtkd+l@fKKEYhUia)M4K;ZJTpC;u2t=T$AfpAeb083kDmEtYDdp;h8EDY$ zBvmCrpf3q{cNQ4HHNBOBmMRG3!wLcgg@HgffGKDX1oGemfey?;AmL092#m;S(-Z-| zz_e7BmjOLK{eA8%O96p6qZMT&b-Wh-8#UK9>DLpWtp)Mv9ykSbWmZC^4 zdXuT55R2iONyTUXj&H!6k*XWzIq`4yte%rS(G3D5JvO|fXYHG5FRJ07Aqi<}KZg>7 z*O^s4ndslJA4T-_+SWs1KE5k2jwqcbcrFqams^Z?b#k+nBFtNF1KfXJ=eZr{^7Y8* zQMYba$1b_*$~j+CA6LaL;kter8H#^4gi%Y)@Pi?5!e*2qG46& zs)PmsVe+X(K9Q_6oMq8ddsLm{FO4vuBZUe41WvqDOP4QGDB;ub2EGM2QfW5H!_i_p zc)jU6R~{r0qaUlVRk5qfdj^yJw4Swx1s=24Fgw`d$kcNOM~;w2B1d6n{c%Qz?70SZ zj8vr&2dG=k=!^l%^rS$esZ5W`Ap*yd2}zgu7H7VXl@_<=);*obt?^2keuE4}OE|$8 zH7RkO@snf^ZUqS~_T|aVOA#q=91yTxKo3EsI2-1=Uif7)wpffogw(cOA-?^ZyR-Die-$8ZfVVv`!=@QH_m~~5-QF;)9 ze4PE2ys>W@t(lGZ>}Q!Q#4ZOovuGZA_uI!7gX8SeW)EUaV-*?Hc@c{y|=OZ^Nfpn={TQTm>`zQz5xVtmEw+ zN;l3+r?nk*xHRRgGP;Jt0AK8cl4k;3?<0!D3--p>A0JCG4ccbdMu~ZyA9t}v6djyo z!R8=yG^xuUxxRnz)|~oEgJ~|V3o)@q>=5ORX!syMiE(TYxrvtt{A|6;;{4 z8$^#A_UF^vE9G&ill5ZIL>=s223!S5KOA(v>3xW@m8^STZ^nF_>;J%nVAE9=UH$6yLNMw6Mnp` zox%*E&a{e@l1-05fBBVb+a=yH#)qqTc&_6ZUCIxLGB=GUQ*WGWv zyS`6m!9`~RqU%Wq{(g%uGtULovc}hxl|n;l&VLmauN`QU)zC^8O`q3lb+f<)wo>j_ zdyCk*Fy(jc5^p~~@{P1K<~Jnqt4)0VPg$mmN6q6N17sS<2u}0VFUkI9;I+;=x_>{Q z!dDU!OEaVPF1K7Vrdt-Zu8zk1el`E$MOv?Hr6N8=gBs?!x1GGm&p8*#Pl~WXk%)!D zK3aN~W5fh=4gHsI+re*riEYDKmkf%T$e~+MP;-RQ-e(>7h8U8BhU0=;zT7Hvj)^QN z$kx%LH1~Er9$@XFNB?)X`amO9J}N-nBg5MSmv?X4Yd#2WoL~#FG?h0*g@swCxd}}_Fg!W{Ty&l?(S z^BrZn(EnKaEPrABcefJNwL4*Vpjggitz2I4PtRA9-h+xXVqL2JSGlr|BcPtbrR7}t zg4?BqM!u5Mm=`*s?PujDEgpL*G?wRDhC-7Vm4J~eB$}umcm$&{d|QXVNB&fuv00vu zc@Md?1{^rq6Usz=e{V|)AAS#&xqZG?|1+&_q2TwZ*3`xPl7hP|t5CPi2Yx=;hp->R zFL%q3i28vt8%5-EaYy>5(N0cj?I&Tij`2Ti#}2}2y@=&3?2O-HdLKsKCTjorxK!^m z3_-W;MaboB=ap@p&bCUU*6zWDj zuEX9MLL*m_ri$Tv7}>kkA-_H3-O;N25AlaJTspt)1QlqPgg6x923_peQQpbvi4weM zs-L3`?r?Ck;hh9-SofP|9KZT$av?(f(cK$2!ue1HcTt|sq;`6(&?R_Rn zM3+LC8Im!5c}dt)t}EJwUQI@e*jwY*G$#9S>}NP>SDR9OE#etJ2O+0p%<##JQQyvm3&(uYPBJ2^2cZ5HsF<$SCaibOT)zT zx%Ra=L?Zo2s(D&^n(_0PX91(DOKEzxc1)BldJNPkz-<%%9I{e2$?=Nj?3t8A*DFm* z&F+qJQ^uMu@6Kuo?Z`w~+OOp44^MTOT3kUTe;!?Fi3N$+%^09OPOxakxVvv*8OA`z z3|X$Xv1g2`x4w37Q(k1PioT^k6ex=^{hLpuO!0aH>i0=tF&3mNJ7g(u)u~aQ3lGGoi5~hY*g#%Q7{bEV(ZlK7zuhq1AMnoM5gW zcr(V;iAm*AwrPDwxxCU(fT{U#kCxvAz~)!ynawbxN`1?F3N?bbH^1OvMeBRjEqR6$ z@GEG~76Ddx;JyjkrrqJIj?6uWT#=QLb}BG(DOz&G@T)orto>R47{SrXwJT#if!Sjf zyrSTnsChGfD3>)SG8*i?TJM`p|K8W^I|h%cQyD_?bV zd2&QnxXS63oI=>%G9WvsF*9153*J;7ICBJ7Jw0IKy6hYGzf`r+p*oSm~#m%vOYcB@m&M2q);;~knLjOB;k`S($56J+=aRNS6q_A-I zQWT-r@XeaMl*{{_$6Du`J*oB;Pxe0m>c#H{I8BNznY|gBG)9|~F(9vX^k-OM`xz(} z$e?6XeX2u9#l>s`R{#@cjkRRx`{3qdUmpGr-%~H%cME?RNwzicVN(7zo^S0)(|(m8 z$8D9U7d2qOOoR>~^192fG!ZVvUjLa?KMxc<#Xq*BTxhN>#fy`S^ArA<9V*TdG4k9a zqp$PE;|t=8s%hCO^+j_a1>)_`+u8g0O+wb^~fteAw@QDd`X! zC24lS=K)<4=KorNZPw^ar*JafpGKJ*g)t=z9*6|k1$;l%Y5b#5AdgH*`-lvFdD z?0aXl`}UI;*mEo2u97f4QHs4`w$Qd<-`ys41d1qG91(a#Pg zTh2%)ch+_!;~FmBZs(Z%bKX_yzpp*GW(m=zDpp_lp@A$c4d&WTPa#iv)|xQG9-^+8zBB%uACv>{g}Y|thB42@#kaw0K}_iJJy2! zP^?97T6Ac?<95lY>3upd6Y5sV*VVhdX)T>ZxR(Lgv~ecMC{~@Ti#Qm*;?U8!l&bjW zK}T+m7-a|7TNe#zTm=Al;AZafam;au;TRYM0)uH5nIC_AdMbD5hn~TvT4mHxg$l-1 z9*(1*MdNp6AMAa7u^Kx&(e!AAK!C|;)n8>wN2Hf!2H3`Si1lovN2Tv(m;1EGy>2{q z=DP!QrnQT%xB*|@R{tw_u=J!lXwIRz@_fHEji-L>HOHqpp)x4K1UoI#N3C%$JA$tR zR(+iVhtwOjsNLqg3IEN{5o|}3L>V51eGa*Mh?0|PbeJ*?R%;MHug>e$)-P;Klj{7Y z8jCb#^zbY&gpgS5Q0C*R@B~StntPZ~jn}!o>v|49Zyr_(Y~_pTbQ_b*VA8jn0oBgJ zbswL>_DUHwu{oNpyB{XzW|O}X5FA+SBf=BwJ3(ZsXy|x)i6}oap68+m#PjTrd9#5< z76dMm$}C(@L^5G-uvq8m)@d~@KXtdJ@g!=`6)f1SpBZ7v^vM=}wFZgY*f4$Cf$2i;j;Adp5=h#<^~qXgBEo#jpVYf9iE2+xs_}|6JX;oek7+V3J|V*)R7k;T;-ELS5(k z=o0X%u&kqb-!bV4Ei=@bhRm5#|a!kc63A&GEbX9AX;Eyr85X1 zOkM=1n0S$FQ<;Dk;1?=%AHT2onx1FTv{L-Add4Wbf*lnQI2v`kM0+GS!V#jp6g5bj zQE+`eH}1d98oSh)acWdiwYnTU`#?qBL^MeRE<>T+3?6pO-6IyvA6OO{ZW}ilUNRZf zJLDenuO1lZuu^LhXZXG)RJHZu#o%;d)biXrrCiGcn{3aqd%Lg2C$$!RMLX zN|$=VKCNE#`*uEjxbgKm*Fj%DC@tr-KPzxoXMJ}*^Zf|YqY#Z%HOs^8z$z_DN465# zqd!*eZfeuTdh~ru7ArEE-rs3?A2Av;^c@^=9$%Ddk3!u z^Q>=_e>BzNFn8riDl?fG+!-_ACznpM^AV$-_QJ(nfMgWhi2KI~k% zy!&_F6Kt63pYXhYaw>u)|Mm>vib(~I6@%lM11)6J6pmGtjyI>bAxwQUA1pHc^$eLQ z{Sv+ToYS6-Sp1Yz)+Cu&H@(L`R1}gA_^=Mcu3jS8HM<7?+vxttaev44h`N~J zj3FOz^GVOO@_zD&uHh%mTevZt$#1S3`SnG9eRfMH@3rATnfUgXDY0!dkVV}3LD79y z-Kl>f83ha4Z^T^JD3(D_bgl!+h^Z&@pAFBgv5@ZX%MQV$A@A0UVj@>GvVZ_gMbG^_ zji>&AQ;%9TNKXr;8A$x)mBAEz0g!;^55Ximnke06{4mpno>SN9fzQc0DT}wsxCTE@ z{X;yx)6#x^3|zh_<*q}T>TAkxO`c-aC|FL3Ub0dODXrI_)InAVQ}A|~#imlTAncjD z&Y#SQ(Lg_B;p_L{U}Ed6L+64eHve@=*1V$5JZpS#L*vjJdAU zl{H4Rmxr@tI5u^ED~vK^Y#`z z-jn#9-h7lP(gz}kOicgEiJ3Bl~|7oHaH_rbc=X8Yc}+ zwYVsH1`VpGv?CGcCTKX>MI^2Io8u}9>K^zNk?(mv;PeX3Y>|(@# z2I7^hEB?<+nclJio$+h2(rN7>sL%5F3J*ghI1mGX8AG)woOy8hlaD9-fTm@>rXbRnF?p+WG8^3p7qyA0u z4z_;Y7K&@n%zomm%_--OeZ7i^1DPd)cW(AK|;%M5CT`7@@wybY^^P?S$_5B;{ z+5gzwyG&RNEz>ib#>#?rp1!c9dmfafLx%$2nhf&Px* zk7eQ1J#VDhdmj*Io(hvp+bgx~uQ*f9gjC}&6_Xvi2Yo}|p(6)Z1!@%WrTUVl4a^oUJU0R`}p}{DTw%IpJdoO>q%e#azZB6v<20jCp zX{lJwHPe1-P?5|@Ar2L(gC2XR$y#}xGWps}>xS}mw$k9Nbjs`JVHFp(<)|-S&x|gv z43?f*H0>-UPs@OlnUvydOu5ccac0c-6ggOp^<5n6bn?1dxlUFiy{#cI6rIRoFK7;;lNdiR5Ed5JC?-Ofh(Cct|^G#5U%K;y`Fp#L#+RHd{ILGXc z>EvFARW(belL#Y?BXSfHvAN2fJOpU{h)LfPzwATmGj(h1C8l$}s@{EDiOm`H5(nI6MvVTGwdng8ULrP)8Tis8C>ry%bL}XmZ3#}%=Q~ob@ z!6B2l0|Lkd6oZQba5!|fjJt*g{j&|G2I-Y&|QLI zutZK$;tlPKqIOjyg8&@5vAG$q&j)2^KsS^X!lNP_seRxsr+NDsE~qCw#UUD7fDBHb z1*nng{@&Dlt#hd9hm!?%r8E2K(l7{%ygN|Ulb$#4OqqSUQ~*KIKK)m)oR6Q8x{oiU z4KDt3Gou0dJRZ!af?7ygpfEq0;Ia>Gsin z^C=K)ch3lUg&HAK&pYd{@;(9*8dobWZa+aIP|BS2q#Yq>Xtu6&UbS!5b0d))^`m&( znoAPO1R0vzQbz+yLY`2vg%6<{mx@5^7f`HxNtxUi!d zhQ4kVenFL->QB!*$)CqZf8rDnaSbo&wh8l5wuReoih%)fiJ#-3g6@jDh?=;jutbdW z%4zt^>_aB^b%*u(%c>_`?6*Lc(Ic*NrHnSAekD}FIq>l2%9H-oY?b5ma8>z5i}3A? z(|iUGIq&HagO2aDO9=yvW1SQJBDDi4|9I*7_qi9*X|ucH=|+ZH$ZoeUPVK)<>Y>F+ zj6AgCp1suvh=Z2tk&f(Bof6+qu*&(4bJK<}3+{I%h}Xj+KbnX}iAQ2~UIjR|620VV1D0Me*yzBUj( zMEG&z@L^g!w6L#7k)MC(RhA~BWsKjOlIEugw7y_(XpP;#>@87=P{+#9kx1=kVTKQR znMz6p0boZAXRJGfD4R#V=HB$S0cbowYS8)?X0Ht)621B1qm7sVcy%ZfzguHT0=Y%- z`}=>bKM4r>qSPOx$RWWv*L5Mgl+5UvWcm!fvdp7Gkq%I%0I*L8hiTP;yd!!-0(?2_<%7?Ier3Kz)*vi4bCW(*E0}~cysbRgS;&B{q@rX#(=QobR}zbrt)b|0 zPi6-e8k@Y!U29T^hGR|3L%0*bt>Y<5kprmDjZl@vp4;KM4p|KV4lsJG>hU+9{ug5s zC(3LrPABS93bWSyVBS-R2e zKZNQEVm$HnCj}?wOiwT9b+z4nf!RjroHFSCMR=9YpO{RtyN!oGB{!rI!oPDUC9sB=45~B3+S& zyZ?Sj5{6+9FA2Z5l=~c;M~4d=2#RLNu5?&GbX^0sK2*ob8&DiXJaAOc8pnCJNjt2& zw{jfHn@U>2)Ce<*Y)(B`t7{4j$sLTH`r<33 zCYFA{6YqU>)h5$T+$Dr`fS#**BBkIxB^cJr`p%_r(io4NX$fr%$co(Q^o@RGProjO z@vT*~V|`Nlm4alr{C@=%xEcD2Ooob3K!@n*cPuJ|H#~_sKYO0lRqiS`iKXD_qtQ4Z zVNzhbDjcwxj+-Ze=o)j8HqF&KT!M)pBTj~C9zFhtHB=Y08O~*Q<(q{LRvRj+K-E`? zGtEF*j;cb5gTgE@UQc`){&FP6M5wRv#}qtkVxNVZVYWkXZs1u^P*NYVpw~jz38`)$ zS9vdW+lH(6dsGHl2XxP&!F^7w=bFF7f*0xJ_-{n zTDjQH@sQ>7LjbA85vYUJBzqpMTK6!3om(yq24(z)6bMHK6YSzo?7b>T`3zKf>?Y-g zaDQ9Y=n9mK7y9Tl{A6vl$_};4KgOyp;Z*&=;gHcV!YakDL9oKAfPXP8#5fh`29!0p zP*)Fq-DRHM&YC(*M5}JdNE{bxT(RY^_fRBN_XcNoxF>57NgQkt`>O4ZriVfY1tKy= z9LEk@#K+AblP?%AZ+@yo{1DsCc?DmczW|3mo`*{n3Az4YSyK4mfSp0~)Te2({#2{? z6KgI_Z;8?vo<0T*KhwOz>`g<}^qK2sr36z74aE6hk`9w07IKMwxM%_|!}mf^suN-& z7iq1sSj3!AYG_2oimq?KhP(s5r^bY2l^q{oWDu};Lxrb$E8DcgXoe*_1F$CBQ)3?A zP+@??H~m4xlz-{Z?3O@ly)$92em?z_#fY9^CXb9fKGQ-ZnWYB*jH}|>oat?H0=$#g zP(jbm;&{nv?@*60LEud_%o^^=zK$@6P6C<)c9GEz5Hh3?t+JqP>#sA4t2%UM%eNGo z$ZYjM)ti;CR3I-DdOUsFURmpN98f)|y9`x>XlYmWCYmXYn-IjFY5fxRvJ?sv(YVg) zFOEw3x~RM#m&wRTT^fU(0Yzr|uw&8~FNRwbBAQI7W;d)p^6APTWqSIjb=rObyfLy@ zH{f5i-V4!zXaRd_P{uUg&>{qXk&4<#A3*Q~U>cq+w+RT-H@m=V8vR0$ZAPCG)okxBy3YXE+#no9#`A3n=^ zq0iZCvoM`Fp4vg$unwP@$n+Ki+xf~Z@I0@LXdBBWc^XDZD7Z&-s+PvK9?`EHk=G&*EK?lV#^ z;2$nOlHEZFnM7!F>XT3T-r?T>fh9uob7_UCrzYdl+P4T)WUtXz4lTsQF9lYUC!4u+ z)~pWSe5rU#9yTmD^mTdI;YO1txgat3-@}vAo$6l-=rw@0oTgb-?w?p*E*Z+eGr9fY z4|w%s#u|9+Jv}N|)%9*@*;mF6&!LJZiAw3Px@)-;@1xIH&+}u-9-k55H{zvPfrzlf z15eM$7sN`&PEp@9G6@6do~hxbEqzk6FK>OSCn&hXMhwhb8+{m7m)i&us_*_|uPg4= zofcD&ZIf{&rCWdbKH%{J0G1f3Uu2U#-IkGL(0W=ip7g7+#^geX9*!3Ex!r`H5dzKc|)xTv+lo74e1b2uQH_RX$(CfKo&U zt-p+>*@P;c!0@TAT6j^kZcZcC*JDDb%cnNA;d{8D`|D9pyyL^h=o|5IH_F}#Ui*2| zf?p8RXW;;P#y?n4EtyCYc>x>A9w;}SUU@2SA~$n%2$cATdxT{~UMSMO^wkTkaPtBS zrN|2UYzzDZJv0LO?D3c1-?6u77vmOY4czd-Epo#nH1Vb+p?y?p)Yf})QkB4k}uKQkB{bcaWjPS<7h zqotG0VPvDmpdE1!JW$fO;GwO!#3Bkv67+ucNg>CvrMIz`{zf7S7<7F4Z2Fo)SYN9y--3od+ZnB;(6O zQ9&i>5^-H*Eg#IIGf&bntk4>m52o1HX5(Wq@qNv6j3Rfhkrwa1vv8A^60gk?LVq&4 zT4iH{7zYzFhXy=iRqP##3^YDs(1v^wRq%P{d?7Ik8Y-Q(LOG2p) z^BJkL$Q2I7KjFCmF~3cFpWYqIt*ttRH2&}1TVU;xy>inHp*?$@vZQww@3sGVIuKBW zgr~dgms18^pEwlRa9YDTGWfe`yX>*4-pIas?}Cm)pcnmkX}O~MR?;(WfQW=XDs z4P*uq3UHKwZ7OD7Vzjf*S-k1wf&sx73jmZRweYb^&o13wZ2dZ zKA=|=qKG^c8BCBjnS>EwISt<6+4bViE*p8@QO2lA$U|gZsIH zZp+YBL|FzGOHM3cV5OTN!&prL^JDWuxX|?z6N^<+z?!g$AzWrawKPp!KRtkzqKlZh z@(PA(F^OdUN;2@?LZ-7GEEqO3v|MPZ#Aq3&>Jcs;P*u^FVAZn5gG#J&%pRiU(h5}>vsPtz8#QSWS}(L*TEJS&Vykoz z#6pd9+sJ+f7Z--HR0)V3OELCB%M}kQAA_pK;n&^3U}{Lv*q5+Ml2sfb17KHRvqQ_J z2G#}#yMYkzz%Y?IJsrE8ue*sJyBwRHc8z*)lTW_)M}9P`G40@D@f9>Mp98<2I)Eyb zigjkeHlS-L6rc(Q(QMYv%91=NC0CvT*Wg&V91IpfwTxForuQMt>AaTEb6SBwZ7N}I z@`4n-0(pe^YP(rBR~mxF6)MHO*g*L7<3XHPoxv6gfLbIdynyd~8HKFQ)^M>{W1oY- zYGhVHNM91YAFZ731{4#RY)loL_g9tyVAV3uXQ_qWj}+F>b6L(nH&tF0u&UV8 z#_rb2%sDIO3HZ_*(-bOr5b^9Al9Y8;CteMZh_2qvvRv;fS(aQ-*q%P9Ea*olju`pbEU|A=$pp zesZ`cL_TWoBmX?nOODW=O%TK=)fUXKR3l)YJ;TFB zt{9m^9-ldk+)|t`;v69pSZNVhH3SEK#sf=!7}q%T669ouPbgf}YC!|4N_A(qjLjn} zFDQ!ZP8x6nE3K+#P!uVPkk8>@EoNXj{lOy?Fxhfd@!DZ&ftUPZYGJB?fypklcm~_W z0wE}KC{&QNs3++&+(;;3GF%II?oaw|Jo74y}jqTRp^JRijA4wzfilN12E zqohFZpF!W%5*ys?ETIo}4l~ zvlWRCz1AYY?x~+dmZ1gcn)Ife9iC=SRnL&zY=( z{UOrX(L;K=`$#X{`ujqpi~b+f9_X^-^8DoVTpV5 zL~1sxY?RCatFbUqEXn%YL{{CW6o1KZfnUAK1j}X1wX0Yq#;SPk-HBrzr1fY=y1&d5CP={F(HMVA&rm=>ZU*RB2YJ z-t1x2crKUA<)?sEvZr~fgUTBJaj1KVofjYIJlVbUa7zH8vO$c+spGazV1i>6(YcUe z+$sTP#o$D13U=6m3^Y^p0?;-cn@rYxelh)dtktJq znriJ{g72I6B(8?6mkYsio&cnq$89Dz(aop;vWIqEE4^AEZo@h(at$@bUam9;OJwHA z5~%K<@`CirO90mowk{yeU1yke8DOo-Mb5fpQW%ibdb!gWteSKI3*5iDul#}3U;2n< zu-ZEaX*m?u1nldT52j=V4OlHR3JMwp??36#Bv+b(C3K9M+13icN)%54NKd~UB%8N| z$mXVy^#530T;?WMU*;xrE_IW!XR3egFC8o+i>MV7nD~GsMx}}EfY-`2@sw~-rI)0q z47&ra_G84gcPnunX_kIgDqJ{%ghv&V@Wh$Y&!Pp^=Y8bc%JlX1z3;N1u0nlhW8I(tzDT-rcD~$1ls!Y$v57zR%*m#&-XYS~4+Pux#DuRNg{tbxB<`=8R^k)AHozyg==>f3u$ z0!z7{wJKH*T+rued+@(E54LKi5fs#JYcaEgtNH7hn)$ zB?9ZlMZILlr(sfDd^TDBn_rTTKixuFj_#7SS2i?|d;k3&Qdp#Y&d4Rd?3dg{HNfh= z@_Q+n!a;SS`m~bBjADnHjBpFbfA`mGPmR6s22Eg5ivwVQ=HFaRF23Z;WGrp4Qhc)M zU9$G6deYo{K=ZM~Bgc{c8~=ll9OLulLqmSO^5;^OMIx{OpnLDXC+>cBe6)+)Salm| zZ_`%o4=&=XPh_hmIv`bFO21K{4yjmdPYsr4A!*s&m(_- zc@4Rd!UaDUk2_o10JJ;4vp}){jc>fA%}wlTBX0jkBy@rCWY`ZTzamvzsOi@G`^eUh z!=(1-KP2D#!JUa4)Tj~U=#gV&>-!&QI&M!dk)WMFcW`q6(A#MY_I|73Wt_okt+uLN z6kKup9Ad&$d7W=Ou_kTZ!muanuKuB;le=--UX{QCYxT;8`T=XDraQiK8@YP!mD=Ml z8nc0`Y1C@nIq?nE-#z|JP;%YiT;QBE#Z+zj#;C#m*T%^@-Z$k1Rcoq2(4V!;;-+DS zYgnZ=6?R&{HT|oXj|zKpZs{MA7%qsdJdICDRthYD7J((x6@zVV(3KdGb=Sn#Rr|8Q z9h8$7%N~3{)4sqheEFrM0agnDg9kz)D=X_23YDICOR45V;kecd z&QE7@1FV)E=A|@i1jp>Ogo|3OZ-qVCB$Qo{&}D=4Ib_)&rqTkI(MAf#flaIAp(1Kp z`%1Vm9OISd`nib3+me^g} z@s9L5R)d@O_#gjF{^d(oQ1@!5;q#J@r$zDllOV~^%<2Qd)dS!M!AC7CKm{8Bma5>G zu&D_uIP`>(HfbVe!BxgaK@Z6B*k3Y6r0xOj#{{UPc zzfFP_w`fYupI_7*H_4z(P+VPEMXtW)O38}t*uG2ZGEkl?WH%vE)BO1X>K?vk_}pK4 zJ4B{U8k{-QS&a{6N0u)K1ycynMsL>Pz+_tF4h8pnXae19c2NNAX;*=Yq=*yEK3#3f2*#AfdxNf9qm0WsMlzxkyUmx0T* zYQ6?@G3n06rMu(>qpXnm;@^gtw_CO3NmylH&Tf8lE4KM$Ea!SnE0ii zkNoPl(gv}i60nxf57-4P`AP1xNlM=IxXaOSh28FHnm#vjoO-)w88~R5S6_35WThZp zfrJ30wT)Cc7*V`&Q)*+a20s9H3OT1~lhj>8s58_laK{=mG466UT%PQanm(A5FS%y% zhL%7B71c=Nfvprw4g=OJHYI=crEaNWz1`%+R=^!CRPnN55T$_ul$i$CK-}f*PGpz6 zL~|pbIMe*|gFY^eLr`EYK{d^})ck=90JWM7PQ#Xovl~m+%h7PTLj9w(el|4i64TEw zqyy-e4$e@0|K5e>!*$1v9$gOr4KYZjX}06x3T5SMo@@`?Gg0$h@BkWIL$$^W0~qhP z!92k3UFcOEGzsSy?*V{Pb%oP+-a<76ufE;9c#wju7v{(IUJF$lty0fMAP=;A8z2cmJ75s)ESpavKu7an=QD;zAC4NBc*Elb5}Wg=YCd@gAN zm%F!9oAvsad73hKsi^eyRG^E-<8tdgAxri_5v4?Yx08bGaguQ4uWUkO=pdFXW~_Z zRe_nBc+Q$D&;AtRkn#uj@F&}ERFA)CO!UNqS*kGT5m>^tE3;H*-jywufQdmfD(*^~ z>8!mc50hkbXbghk)@6~Ipx9V1qt+@k^J|j3$y1OygldSDGgl9qTLb!`{<$VcngReu zDmNd}Ud0YmS>HIJe$|)8k#R9M`m6X8LuV6#UzowuV&iF zVRFvcX#l|5fE9xchKRrb#~q&xUW5TYH|-pN$)%~v9l_%Gz)zbC={RiMrK2%Y|BX{3 zi!i|a7tOm>OQp zVfX1v@SJKT|F?J|S@Okxa&7BT&HEV|3`(De4XoIACrp)qvomC{)GEv)2v!VcWtv8T zi#O3tv=z*k+&_8YaT8oXKf>ii%jNd&h`N}QhsntyqbXn$$nvwsQww&2TBwucOP%cl z7Au*+t%T2>%*(g^^#d4?^iWn$$Sxx!K*q5o2qY=svtXSpuu%IEE(glp*L5_Ml^S_XqsAD^p5DYDxW$eVrd? zGF+|{;i_jA%Fis243McAqRHR**CRCU8b}LvkGVkFtP*r$Lrj&(dQ?p*=bANyKDs*( zAJE+85KoVsHJ1z=OF6ak<_bW+RR4sgsbfo0NR&6I))msH>yuv(%1E~~*(#QN!( z&@f5=pxXdk@Z~}wui6k4rK>1?mb!)mI`X+RJ8ro6ToM8|F@Mvx9h!uOlSDEC*D($5y$^Ne7mTmv3KPe+4IP7U3{1Te`U&0w!3ieLNLw!%Ghs4siMIW_R6 z-0#(U#zfLJUjIav(#j+{X3IqplGpOS1Xv^n?%TZc#lP8QH3&m9{+>U&fD{+yNUyTq z`MixZ2YN_zTaPp0V(EQ=XdZj@DL`r@k<@-uY(Loash1b@77m>sc6$ei$O<$Q*Vr#5 zUUgCi>geZ@b&Pwuq?jvgvoT$E7F5M#AK!cWjWGG0jZROKsAFk)Rq86juzj;<<>e*!wpWR(=aiI`fj&KHZLpXXHMIp! z(N!(d&)`zC{y?>=mm#05mqsK+{vdQT=h&Xo?Qg!(X@~nV>cLInL_p1*Je=Hg!N@2J zrBwjdq8Ij(m-d{n4_qv6QUWDgC+Htr&0x~qS2pdcdF6eDXAhcfM(R`!yQGyKr6K(A zN*kUu@|ebB5>zG)+vg&HN2kjgn5#q|tCGH_Z zAqD^A-Sv+>XqQ_>;o3lAO6|2`|LDcsj5dmK$XzEfUs zfpz-XRV8HBIR4pFfD0fq6)xuTEr< znhI#LMPqSfEXdFmk!t6-GFb$0oi@{w{d}LVm~>9iv0M~& zf4tBCM%R3XsR}Gl@Zxz%6Dw{8QKEPe&KoLFT+O?pu0bwTHd=`SDR-zJlvD50d;Q&) z?q2ugJ35nAGHiA1q3ag_SIOZYUcAq&@9)CjZIx5?4K7ZN9G+6E6lqUkR!Rk`I<@1R zJMY`;!rt8LV*j>l{4COYhPIAfPvcXP)v`jN@~=sdC2aTwBwtX1AO@TalU#r*yMzdWYtvm163G#E$=DcYRWmf>r$hscjnS7 zty-npSU#t~_3&FQW;5dm|hrk zvo*$F9_kWmok#vm-w5)JSyz%v&MPOQeTipSIvhAoUfK2zd2Z8dq@z1=<$AE<7Ricf zvb6tPM`OcRrRtIpwR#~v9pTjaxs~x6bf(8-R-qVr$e#7ezY5UzzVh)a&+Z{M7G-Nt zI$khb4M%=7tJ>BR)UfnDSgOU$DlX9r@VQmD|03+kd0mF~Do&WsL# zM&ZgHK9ppQ7$Id~NjTK!?(MvG*9-skDzUjJT+n`&n+VrJ3Rj)W#$eU38v=l>U@o8` zS5w*dr57-0q;g!N=KlSA^|z(hRP@kut0YUN8hcUeV`P;|NXx@{OYWY$5{m)I;JUN6 zzfL^cH;^D3W#Bz?4DtGW5AS`u;eO%(QMkbKF(s+-%{4pyPu)DVRQe8V2$j+W1lMn2 zs!5UQU%kAbXXKQ(iAtTBCJUx)s7zOvUqZfn%}tW!;-T+6x@>SPMnQm>E0w-EmvRLc z1CT-DB7gs8DKjYbWgTcH{f7<)*h8<0B_Zk@02s8X8WXaG%ih1|OSQIxi-J|l+(6I@ z`lT)5weQK--wlmnLp;E`N@gWZa!3h)t?Nn6__5@+%ImmZJGh4b_T)oR?jXclygGrw z0)x9K_0?%uQw(4NsFYbja0Q9WeOKqk*Bh9tzKB5vF8gZsods+PmycO5pQvLzzw>zD z&iXwtPh-F~aK)tZ{mfc5@;;6PSUB{mJkMclk^_dPKwnrg4WW1K((Ev~EGtaP=r)AY zT?Fg(N&ZM0Ctbp2h00`*MHXNmocMr@pfr1vq8|&A7oJmrZ|{8ZZ}lqfyWF=arPE0y zTkN+XU_$59c>KLXOYXdA%!+{rl+CPF0|QIg(+^z4-eILLhP^poRShvlO_Ao`&{N5A zW?vU68mXz>><=myja&Vu#OaTLT_6yrSGN0#n@t!HGV=Q8#vG!gU=9`=S~V% zK;!pnd&mUDUvO_qT`pI^a<~{+8x%qDLbD4xLFZlb&FWCjkl%*g-m}zx-#>J;WW~}I zGMK4Ja{s7{*t2&JfnsL>E9cy)#4}=Kz}ai3&l0}Lb$5xP0z-rjTod;Nz z6s$q*H!fUIlSLvu=E@QkxG@k5LD6M{9Jr+bRvoigmIc93$r1KuuMB17Umx!?09nt- zDVpLjyUX3%Nn@&=5?C=Ym6U4l+5NFJgv8}>uMY=9^Hce5SU=@rh1+i{$S7bH46qX3 zV8w-tf>j%HL*fZ;)H(`TgN~cMja|$_JEd@^&Y52s%=7(@TCwxueFogcKHpdgGACIx z01C2xFce?8%#w=y;r7-acWv8x4*UKC?0ZV7@`iPK6NiGU0o&WOQjYGhTTKCQdXd4aDqYwDroF9uBub{t^kabI`L!nxm@812~S|@ zgsdjUQ;P@HN(xnD((fV0V)=?bcv^b2X)SJz0~&lut0`!XTKJ5)!myQPweFvn)&50= zG|5ej`;V$z1PFY<=-6-t4T13C5!SSGVl{=b@|xUzr`82#-r8s+vm3|StYV3YCT4N`h>=0K1OgV-5J)7& z-$qU^j7P}nh4f_iP0Nz5wh?6M05Y(2vO5Q_yx~*EdGNF3W_q&WK34O9N(Hi7aypxs zmM$H4xTemz;XC~WqyC`wK~6CkD#pc>lOL;EF=P7-03xZHN6=VxohE z1!`}ynS9D);-3hO)Qy1&N??9)h$&ExkdFu&YQg%w${APy+BOCpTCQXtnE1bcT;=IH zAx}a>)RG-w$&~#zDBDV!+d;&RStd~)jEad4qN6JQ-0Hi&7k0Uq#!gj+kU2_z3RkJ9 zoySykNH9BL3II{kyoTuUUGHx>Yh>Z-us6p|T(0wp+mjQuqf@QY2v(_FC>$c;tUSyt z+R!~LxZ-wK=NnH5u_!0Ij(5{-U19!+5@x}w=+FDj_ zaBp<&pVb8G=ECxx zYd$<0wF10_G9@*SmMcva_T*e7YTresu~k0HfHIY~bcpMe$TVS`oRVX4ne z``fLyUZscxKe;msF1P2x*qDol0FW(rmy@4eRiX*3L2e_paP{AsCjC7?YLQCVWUwfN z%aAH~?hHVxzm*>p0O@nzni|)YG(n5l1VAW+OS>l2EE@z?DhUlpQoMfq1(Ma_9j{pk zm^@?zg>dP((B7`H!EhOCz>ur}H%^ob2m7@Uuo~7KfLhGr&?F@BYgyS+=NxTCXa^1L4vn8ec`lT#4pp zPvokZt@|z;Yn6Mr9FrReS5m?1C8^GE3oe>fX>!O$S|B*+VnhVtN+{pfzm%w0GR=QK zck*y)vr3SWgjml4En>?mp%5;0^`0@YVlZ6VT`h|&N0cD;vcPg;Y98TAELg5Il}2r( z>VmiAaw!W`MXgr_qJnU#Dwta|+vwlkdC{4+xehoNi{d`CUI>@EU|iQA;54M-A3Mas%NaY9I}AYqX@|Eo#U~fwxFYF*T2H4YphcmR5znB?}8^6UJT^ z0fxy9gezJ`>*Or75J`3O1)~iAt-MN2(FadU(~s*^4JJ1buG5d(t$$HiF_c~4cLn=iQoaYP(ijjXHxMrE3wcMmUE>RFe_dc%4J2HaQA<^; ze8WK8C3)NE9wJeceAK;ZPq3>xIdUc=3KFUUV=&aT?x;np-HV3KZsLlWAuSi`vhQFIvgP6GxLL7kpLvJx9y6PVLRC zz~{f}J!8@xVYl}z_TofK41>zRMO za**}Ay>6ql&)DB3dLV$cO*G$pygA^vzxhVzxm6SHqCdU>|A)8>Qu95drWj3bR3lOu z6m!w|N^|<}{89Q`GO#p8z>1ropf2GPHM6CC!oE4hU5$x;xx3-{pSaifNN1lCJhT@q>z3-&e|J^fXPR3^ctGdZ9u z-s&je{c_>a^8S&F$aVzPLd(VT0(v?gBuvM8}xq)z@OB-vw0?a)mDFOy@*J6YVC8S`t`9z15 zQjgtU-qAvye(y7`$KpA1ngZ6SbPrPiY-uJBOTmPOKmkDUAcD9nUb2HDTpNwz$v;tN_GAw(D2@Qb_)65DD(QzXMY~keV z?}i_1)BpqZo{=;`vxsESpvp`b&viWP%{{}4W6Kp9PPbf2z$V>tU%=hlwO9=>7|Gl< z{^CTt@ImE<&XO#23sE*mXqZrV{OMBI!YCfQn<47{ z?OylfJD%?L^4RIIlK|F8UBU*8xza>oPd22ogvDGi*ToHgcuksMCRUqtj#Pg6qh@Iy z4cMnqXk+Hn5Ssdi8KmgTHB+vunNRO?ZP@KSPYD=E5rcun%BW!|>7OlhxjRMf9)^y* zy5t(N_Px(kVbTNGob!vxjTcVPJ-u2~+?8wofX`je*F8;No<8rIZ&ru03vMJX*E|YZ zz5=j1Fv`?w1rV;Za{u~Hg*{n9j{z{;d)0Jlvzbiow567;p1#0FC}?K~^L*z}u>6@i zGO8SEWnURP~EQ>k!)GX5px+2kY^vw)UX~?@hB9+Wl*84 z{ExJJPHp}PCn`4P!exFCE(>C@=7IvwXuMycTZnK8 za|;dmc{R`Mc2vi5g02LF3*i#x79LT1A7(2`=4O54uOCaVwzpaz9+lkLIP&3Yj|i8T zi|p-aOC^p0z!EfETf|yFc`a#-h;SiX{1wU`vQ72kd$hTH;2K`>#D}(Z5dka>*0lng zJHo|3=IZa(ozRG9!Cu;P!glT;Y#M|aLxhXJvRnOe=gQMF#TozxNe;WD>A{lz;04XO z8cb>+T>Qn>no^aK$w47aZ?&5U#|BHPLnWBhK)A#x9QuTJ;|9PUeyhdwY$CXU2D6xG zy$~)DftUM$+S_VFPxJ^1eE~9!aZgH;vVznl1y|4@&B~3xIvB{gKOj@67Kd+c88Dx+eziIkNa?=GPQ(7DWtkcVTS|#hqsh_O^o4kq6 zQl?z!OQA(55kqtriiH0e0!Dq+WkVfS+<4<~ca9WJe2nQRR$h~=QB5ejexrTr^2 zWqmBPTo${9o~~A*2L+1*uAJ=70bFV;KsE<@%&G!`xC`MzxWvQ7V<{oMuAapckV4$G z0-HW2G`MNcvyaA2Xt;YjGwD0WxC`Mj&wA-8gGvMWaEfb$%RIPxIy3EiN9%=faaR*s zu7S7Z3I8^&B{xezV^3g!<-%Y|_l!X-l9_AgXxlU)71nfTqK^+LG#Y4^G(-%*bDc!2kayisf%Crl1 zh5FwMd$KQ5vtG&t$c>5u)}#h7jdA4046%;d-0c8jfc<^!-vVq^0^+U;tTRNo_`wzI z{e;3LBJOHR0$rm5BE4EC04~{jAzbJd@`9`X9kusUjk_p30fDF8AZWky5CMdXpQ-LR zv_nA5ayDr1!g%B=og2`%J{oThoTQ0u|r@l_mek%|Igo~SK%(c~N=S-~^ zxP~HJPjn3tE}n5$@1Th&QkZ4z4u_uiY61H!!BQxMi=X8Rhg4&v z6ymNXlU&0lLB~Stg>Z3-x#G-Wm_o)dVB+bEuwGaSg>dmvcB@}?5{ncDO_~Xph`6f? zQ9!u3X#1OQY*)P*28W)gl`IK#4Tbc1(YOl%L%2A_U7`Lij&7mZ64B>{DS3p8SKt*o z7W%^)4vbOI2vSf=z#2zyo4$Hs+WE&}L4Tx3-!xi@A>{GoV z9f!G$NRE5laJYm-MkANSu?`y(SPMD618V{Qheo_SfrZg6SYZWLWicT6nikV*l&30K zoyk@$bK!D(cuiK=qyZ>sbPGtNv$ljs+{3Iz;LiFzd|{p1waNM=ygLStesTZzc?g_SE|fjwS=C5~VLJ^_M(plZSEL-#ee1-Z#D~-Li=YSDFZ_Dme5{Sz)=9 zTAof84B?8sAr4-`l_y*RQ}S9YSPjCJj&M16Aw1r$p+(k9wqRulSBA@?r@JYxp-Cxu zHAzVhge$|<-V;n)*U-e2yqd~br3=D^N>A4is^l%yQZ|afkxGlIcveOOK6(XvOF0jp z>JX0qSGVTNkG=3_+QB8ehP+%lPF3=$2;9R;gv)%OYDi=#N21`jLha4VE}BW=!37=3 zY76A4sX5R?$T)l58>rUc1=pti?N(n-1=MUhaa@?&fl!q|(I@>8Qd!H1fKFUJB~Z<6 zJ+`|?JS`1epAD{Y0mfYBK(&uqEL0ppts&20C^oQOHBOAZ+ztV&mPCef*bXW?rQ$_d zFAGYc)KrCV@rA04Rh*kTK1z?;dirg7?|4?p+rV-;(lvD37_1s*t%UT{56$uLiAe%I z_JnI3Ke!;~var8PR+-ZVSGsKq7Q|LUd+5Dx7q^CIM?p#+rU2lj9Y?zCa9I@ymvN|I z{)u`sVynEoT&_>{bhlnMaSh85F5{{wqbGA_<+R{2^PvhaIx8GO>qYgA3s5E zTe^a@cb*cGG_V6)YqlRnurQ%9u#8TK$0tI-0{!gD5?i=R?cL%>MDt1jAzWew zV40Ry&CAUdvfp1{JBj;L(ncj3aNZRk2GxXcCAL~Z#$YAVlt~k~?hiU=U%&kV+kgdv za}nA2!9v?W0fZ|)ST)3gIn~DwA4+b&?s9GC7$;K*Pi|4d!k!2+miuuY&iX|>Z%*o9!B93n@#gdn#7uxb!26lc{r4J_`K zizP2MU|T?ORw;$c@3fP4a|8>rf%Vu9P@L7^M6h_fg;06n!?u9ptR+r8aV~H%cM#(& z6mKnas@38ab5Xb;&Z@w+fZ`~Cs@#c*3~rW-SuF$$#aq=*28)+lxB%M$inA6{u$r8H z5h=NaEJN6eZ2`qm(5JO99WEqQ%TTT@{hS15iZB6QMN1$3Is!tQccBg z#9Qb%t;Ad40Jo62hOGoUlpPamIc?V3OtxI0I=qdJ(Gt7`&Vmcw3}7Y{;$b7$vghv;kZ=?hR$CC98psXO0cHp6%18a=cX*g0&dGag4dF zgsnmm-1|uK5zY|U`&n?`m@JlIz-=JrkDN}+dC*Y~f-8|5Nh0$*fc&Xs$SeR1!9r!6 zJG#vTSFjfEHY!sg6P3B#r;_J7@0aJpbMD-ob9a6-J9E#R-I;xEY@`chyT}Fr0D$^>TBbA} zMtd91G1EqWyUt`9V|39l)BpfJC$gV7FwwrRIO&-h0suib0f2}Y0N{u=6|qD^%K`u^ z_5c9nEdU_klTl{^r3siF@9Sy-&i*}F4f!bmzy$$)Ee&(*7$x%zW40jNehk`S;rjUJ z9UobVzNceRS*3MOQsisv+xDLBpjXeFmjNCUu|O$DiEQKMhnJQGa?b%hA|KA&@N~=S z>$Q(aQh1>^-WJt%ezvQ*@5`$)mg@bm&6_v74TCni8#)^T@#GBBtk1bS&@%F2NH`vJ z>()J%R@p<2R#%}|Iav-TXTcvAu0Fdy^^Ej(r0J8(S;?9dgqPKdB>MvAAQ((#5oj^eVio#$~B3&0xok4rZjf{_~lHty)*|G@g?_vLfZnceGN zO>B{VhfF%L4pi~c@6Et9=c^2DS_0})=ul<`@?*egE(0me>?0TF!OSja^D?@XMo(1Y zdpIxUKdPt9k^+y2f|ob1oKD*!k_ zfF?8JRKb7w>YuaUf#To_7i(J|cFvI&X!scy+tczyMN*=i5`MeY9u}L*0(V$wF?%$L z;vPSHVze^7wpQLUKsF4ZTe_`Zl~6sNDSWpRQ;6Dd;1zL_C51{Guo>C3th`D|c8$Ct z5K*TZzNeNYICFK02~_%BJ@HL4UZeAuIyZasr@9(K71>sfGkv0G?Bs(0wtxxI}P7nAsj)5jL~xESdr;6%ZF z5q^#^{PD%=%j+o$ELUV%b1zqcd4nV^f^*HoPYT61H-hOa!pesDD~(BZLYp|}IcAm+ zS5LWovDTaXCw8zij6ow|V40sy4V>8<*uIR1c|SJ$L|-2I z%^j|~9hTD1dYIBpbqohva-(H7arg@vO(?Ex)WTl46U;1pG5t%ZUE0s;d^JXi!<-C^@+ek2CWvpg zt1?s^i`?SEN6`dQubFaa@h07XhmDyNe*<|;4fIL&f=hesib^dTwdmU?@B06mT!zgj zNq0T7dG_3(mExHhGEg6;OvDZ<`^_O~sWSU~(r+oDE^0*FH`NQLbzkuP}+Bc1FT#S;Mnzgm3$b zp&&BTe;Av(_7MlS!!h^sTXy1La0p^z%yID()zCCz|5gc6Qd>^|J{b2m2~TlZTiMss6iJE}zx;+hZWK0u{IeN- zxq>EjnNo|=w~(==&g9L#wf1O_FJaNfc|FhaOO3d9vjr8T*Q;TuFNp~`TFND2uZS&- z)QLcAmX*9`Y~($+_upUXTOQW~!)!0O65WKjCjCsXexStbV_~qFXdeHrBAt(lRR~l<^sLWHX#ug4x$EeUcKJTk=h% zaeiL~f^>Xn$v>yLAzGiHNz&upiS_%iq>6$RMhod%P)1gNn3pY*hsKaNk>uK{J;CuX z-+3dOCE+yhwlyleM?U#CBleC5HpO5psd1ooCJuUt4LCh&IBP@i-KhVmEz;5PipAC+ z_-4*CNHROlIcQrgdz;zG(I21`K4)uQk@qE>m(xz2+WMBZg&szL&!?ta);Z-D{*_|x znm-(@314~opw|21IstMi#UEJFJdLGZ>dAq3;AwvMZVf(rT4Iy87#iZf%iM<Nv(c$x_un^TC6`d*?+#aG9E7CrVBru2wLpb}$GjARTlgB8vZ~>gd z*%pqeS6ZBPBSbl%p~sgqSY}cy+l7&qafWsw33K?!+*_gCV~1Jd?M8*t535AqDQjp& z*)^j1rpijW&TM6Z?E;S^VSgtQukZ0l5Lob5M5xBA%;fRn_!Tac=Ck~jjbY-I;Ad%^ zZk}@Ns|{qcSPS3CCt(P<&G{6vrBl}%P*?=a|E}*2r6TCi8gp51+-B2fb00qerc<0E&ARTDTV&m z{{pW`8na^j=$>lx9#L6xTP7yIi{b+wiEsX?!_jCOSNkbAIqJRH#ES{?&!poJD;pqn zWNiIQHxn0W>NW2HE#nJ_r}t8yudabptxOu9s@Y2N5c)HrO^_cZze4MtZC47h+qy|i z54=7ND=JinoTws>!+RQWO(T+ zH`A2O7oNzpm$Cws?{gl)TP>AY?K(~Dpy<2_MPMx{O@bLpcx3BC)me^{bcc=LL@gg_ zM{^OMKB(Egr+g;p50}J>;jjv#Yu~BLA zEn}^;tTI~5PV=8dMVIHj%&3r=hgrrSD}b-;*P0qFsXZQy%=4`8q$|5|U^pHym&&ID zH4amf`CjNj8L2oxxbCWKZBh?Lq5DxK|9o9cu8x7JD`gC%_wSwYvrS#$J1}3^RxC!u z?RVK}EvzgYlz$dmCl7hKeh2^Ox$tT$?XJ^OtCJG)%j{Ou7tk*zts}bh`(xbcuN1nS zqqqW(eN%lDy+)$&dCLc`ljvqep79}4%MYM6_xfKuK4N5sVnADj8cmy$95m%Ho&K|1 z+^$+}y@!M#tAEVC>p2sMo`5(riN1kUYUq?sEi}bR(N78>F&{~7eS~l@=Q{|YodaW`h34T1 zLov{f-eJuwnJ3L|dRgOD=>_Hc0XKlEm`nyRe`@|@;X+>+@`1#Gu?4({6OZ|c*XIn% z6};Thr|{>s8ZlFrO^@*u!#-tTeJ<^R)m@cTxZC~D$JUtN4w&6y!6jNeT8fW}byNoP zi|(Iix((m%9W-{a-BV+}*V&Jg0xZfGm3@6g7Fd#z*p?~SW-xWNLJe{jQ!_5mnqk%2+`(o%Yw z(;uE{i(OoK5MOAq2{lLs7mb>}Qk+WJI$3p>>?3Za)r_bxz-8il-jPO8H#tI1#LvEq zS_cd&%=8W472^P=N`;ha@`PHJa1WlnLe#%LwsGVAjysN%4O;b@@Ox^PIJNkzEiNq7 zUqA5M_atsyobCpErSO9CJvCaThNXjk`g8&_N{r}nc|mGP+y~xVy|`Ii%FVaBYC(sO zb8@*5YJw_SQ=85>>*~%c;4e^C>A5knjA{Y7e*Y!0`t3uR=eMpwg?MK0Q31M07%IWv zT#U2GXnz|M1xM$}nY{dxqkanG_aAdV2#RT4s6eKu@%Jfg1B6!ZOYC1wHzj?2k(!$L~H7Ti`{$ zv)R*cvT{xkZBb+t*DJBY1YqhlJPeF?^LfrJ%GYBtvbA<%fpz?Rf#!i4b{~o8xK-3n zOm^3f!$L_vR#O^l9!bd0H$7wf#Pwb}G^*vScvjS;zG3f!=&z3V(w+t4;g$+pP*VLm z^+sT@jvIB>#brx}rAcS~T4KH=?L@)7YC$cl&W(xcLQshi2ap6A=*XkXIS^Plx=&PcY_@TXO zqsA50zlN5k4L|~`{2er>Od89OSN*k(L)s}o>ru8taRw(0G42>@ZU=wR5phY?7h1Ca zm)1mlTcDm}!cXwb85qvyncc!RF!(?w%LB%df%m>vwY{JDJ5iy`1{(jpxwl*uBuQV1Hf@6Gi%x{Zg${}7h87zuXi6d zCD3dH&HVq*rW$kq81wC*P%uMkft*pAc&qL}{Wq=jRMzNj%D^|y#A=CHhdWm9?v5nO zSe&BF>m@0*%}+STI(ZNer8}-6dneCM4f}-}euBzRZ)&#QG2~y4wm9S0%=j851yLfc zSjqF&{KvhRPxnC4dx~SK)=!rrsY>AHQvwLmsUtDe1FL-LL~dR#+n-a`xem7@bZ}4T zqKi`uC||W^wyib~FXyR~ju=|*6rmV)dlu*j?NP(q1uU*sFK3bp@3=c^n5Ac4I{?_9 ze|NpZrS1IH?6wOMc_@N}{h3JBfI9=6g$b^kr-VTpZ=#*Wv8wENh*eCaB0V6JmD;QV zP+EGBwA^=TnKq8NEk8|Sno<{5k#7m6!_uahR1?QA6>}J1CauspraSnD>R$bSsP9pv zyh;tcnM+Qk#*;OpOh{Cg3&Xko321G-DxrrtusU-+;9IkGfhS1OD<2Pam^m#r)13>T z7lue@0;%Ru|D|&YqlNLHkpyrS%?={pke^Xw*tFhA1`V!Sbq?IrV9WfKDUvH;<(suy z7z6?vDVi+JkNT-e6O$OAV8=8TH{V!}DldD7XdK)^MZsIvUvpaJ!p|IG(_-Qb(n8y+~rF*bcuoT z5#TP-QeY8)6#8xly?6HTvt$;;Jz@c&i-`00<* x6ome*VCMYZj6 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/images/globe.gif b/images/globe.gif index 3f17c5d322d90d6093ebb9a62ddcb008f903e9ea..84722efa52055d838c1d275f93c07aa69f0bd04f 100644 GIT binary patch delta 484 zcmZqV_{fsz?&)S>nJB;@!0;`BfkAUCgW+BV!($AF=NK%3=o*9NJqF9?3{LMk4EJ(4 zUE^@NCt$f%z;dsE(=iFlV-ik#C7g~adTmtyyw`xIp?p9|#y|3>1H|ure?tFzA5n0r}s7{aiyrQ*(@?PknrIvkN0LTOWs{q_>}^ z6(2)%f;FRnS!lSsjR-3<6QfU4oHP?N>pE8H0An8Mm=-mIkSI6TFjZdl=IAx7YzkU> z@}d&LOZa2rrPdy0W9QZmijCBk?r4fpU&h3%%&QUC+3aKLV5p<(yyB&rkeydlpsSOt zAmhQN)m#-n1e3g+S~=M~SOpl<0=3=Qb@nW{*ut`sC3>5ISHxQec1@2enUe<@AY5DR;-mGPnjJviRxP?arG8R%sYk)fb46@}^i0K^ z(t!>_06>udg90M}1_K5Mh5#l5CI@CL5||3uN;9ZtQqAU?Ep(IUCe`gAX9hW&=3=SK ze3j(mJHd;NEIP`lGsBU_tTJXpbAs71P7JqaS=9}yE~_?p-4*pVpK!U;z>XKVZR~oY z@fX>ExB+<^A`fB@1|Fgia~~2PV;@VOK%X$=QxpedL?j|At{_S=QJ5;sFcuy`Z9)(s zn2?B2L})|;MS_shkOqjx!XOnMl^#_vU?>niBOYUvv5>Kdal&}Wc*G>++~eHm!WSG0 z5lQAtj->RZf>K3FU?qJOOBjX94?`5j68+D=@qzrWjsyS^7>uV7FG2^FCP0+kzkT)n zV>8uhXG@^9*-_wRNucvN-L|0#Vd}h1Z`r0wM)F}kPhtdxou@>Z>Nc-NDWhslM^4s9e;`*D5h+?{Os^Va6= z^k`=8Q)%q-@kI9Mr3ba1Wd2$AN_YQ>T5qtPE~GZ*C(X%b>!4AXuRZ$tVt2pw^y64g H2Pgjk?;Xx& diff --git a/images/humane-tech-badge.svg b/images/humane-tech-badge.svg index 51a28d87d..699942271 100644 --- a/images/humane-tech-badge.svg +++ b/images/humane-tech-badge.svg @@ -1,57 +1 @@ - - - - - - - - image/svg+xml - - - - Humane Technology Badge - This badge when displayed on a code repository indicates the software is considered to be 'humane', as defined by The Center for Humane Technology (https://humanetech.com). - Arnold Schrijver - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/images/larrw.gif b/images/larrw.gif index 08902d772a4d22c5a9ca1a001604c0b181e9ba5c..6076876a69bca506ede3ab53be250af59dc18be0 100644 GIT binary patch literal 211 zcmZ?wbhEHblxL7<_{7TK;NXy&n%dRXwSN8jD_5>Cz<}aU7FGrZRt6oA07xwZ^NfgH zcm5eL39O!Dwpnt;xtQ;fa}@dlGOIFz`LbU#H5weayX1Yf*KPCQ1P>h{!_BvP8H6q7 z2fWDqC?zms`-QS9`%PK8Y{kmjS!?E)=&X<1w7F^9 IdQJvw0Jq*()&Kwi literal 1004 zcmVWr~W5udlDv)YJd~fWW}OfPeu10RMmh zfB^sh0Dyo20RaL60s{jB1qB5L1_lQQ2M7oV2?+@b3JMDg3k(bl4Gj$r4h|0w4-gO# z5fKp*5)u;=6BQK|78Vv47Z(^97#SHE8X6iK8yg%P9334U9v&VaA0HqfAR!?kA|fIq zBO@gxB_<{&CnqN;C@3i@DJm)|D=RB3EG#W8EiNuDFE1}JFfcJOF)}hTGcz+aH8nOi zHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7LPJACMMXtMMn*?RM@UFW zNl8gcN=i#hOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&m+}R#sM5S65hASXo(FT3T9L zTU%UQTwPsVUS3{bUteHgU}0flVq#)rV`F7yWoBk(XJ=<Cc=sHmx_sj8}~tE;Q5tgNlAt*)-FudlDLu&}YQv9hwVv$M0cwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW00930EC2ui03QG!000Qd0RIUbNU)&6g9sA_2#~O$!i5ea5?m;N zp~Q$3D_(R+ae&5+2s?VT2(n;D0wYVB3?N_t0hARN%A7efBukesJqp;#vnNl8D_g!S zfO3G*qezi{9C(sI0irLXN}ZaL>CK@}vufS?6eh{0T*GelDiEyLvqY<2b&B>Z*?(r+ za(xSTt=zd)%i6u0m9Ac)Y^MsAn%64ev`G^mT{>|sOrMZ<0yWrlB+bi{51uTn@~=_G aojrpNT~{(`$}CBqwyJuyUe~7s0suR3`s0TH diff --git a/images/link-icon.gif b/images/link-icon.gif index c012d716e20b97f4129819daf7d478962b2eccb3..f238c63bffbba5b113ef6ed4ca65683c74de00de 100644 GIT binary patch delta 27 icmbQpSjpq=>1JV>D8L}V@ag|V9!VC(pDe5s9RmPqp9jzY delta 51 lcmb=N$jIaF>1JV>D8L}V@R)rfkEG0h96<3W3*$u1005r`9<2ZX diff --git a/images/lock_icon.gif b/images/lock_icon.gif index b6b1b7fed591fec3cf7b709a8e9145217403452b..44a7d05001611d11d901780a65136c807a757cb7 100644 GIT binary patch delta 140 zcmZ3&{*;m1-P6s&GEsm*fZ@wT?xYIEpDe5l4Dt**3_t)9WnfKupx&3_S*DRSZ(gdW z>-M_2>`UgV%)V<|wlOr{oqL**tcUvKOa|-ei;pk#P|*_RQ7Q;YFl%XaEO2nyb^pVT rGZuQ6l8oGoeGXjz{43T^Jyt-bv8l0EnV(UFN2p6aRd@^!MkZ zzu#{kY2v%FMe*mzkdDtWRKwS(C^R3uU@@+W3ANBH!JRJlQ~?^ z`~CT(pSQ}^u3h{8|9^&2Fd71bI|LMevM@3*$TR4GoC(Sk3>=LN_8c-E8x#)maR^G; zyg1mz%E@Y_^XI}r=7tto6%Uge4<8-i6BIAI<6)R`kVjUb6{=F>g(;7QXGr_Q1a1xAclmIkkmo9Z?70V|8lp)TIr Xr4O1JL?kjIPH%g2WV<{Q6N5DX4QzQJ diff --git a/images/pause.gif b/images/pause.gif index dc57c4c98124f8a8dd7d1ab70118ce7b3ebe22df..7006e9856b41ecd3a4b54bcb58e7da960e3caa48 100644 GIT binary patch literal 123 zcmZ?wbh9u|6krfw_{;zTQc_ZSdU^o?0YO1QiHV6xNl9sGX$1uZrKP1!O-&sg9g`r043r7Re?zv=2|>Z1~8+U^p#(*Q^y?6E|3I{&@S8 Y_}6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui01yBW000O_0RIUbNU)&6g9sBMgac*Lzc5e`C3FEm%s&kPq)e=M sG2=#y7&RiK2-4$7jv+sG6nT*3N|h-Q3NjPwUmY`-6zbf`(_laVJAdq*{r~^~ diff --git a/images/person-300.jpg b/images/person-300.jpg index 817308211344100b5b548adb1e3541a38ef3f746..41803623de3061e14dd490636a77b157bcbee28d 100644 GIT binary patch literal 11087 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 literal 11319 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 diff --git a/images/play.gif b/images/play.gif index 4010f056d298bb618700ec9557c331d6b0546d5e..c5ae628b5c0ad0c35010ce98f586b4204016a060 100644 GIT binary patch literal 315 zcmZ?wbh9u|6krfw_{snRjEs!Dyu1Pe0zyJU!otF0Vq)Ur;syo==H}*>mX>aAZXO;U z-rnB6zP|qc{y{-Op`oD(2?;edHEnHe3l=O`vSi81l`Ge+Tep4t_C0&{oH%jf)TvWf zuU@@&?b^+oH}BrP`{>c5moHzwe*OCW`}ZF{eE9O^%lGf!fByXW=g*&i|Ni~|{~zoM zG6@}!K9FA+*b)v*E%4Cc3w2*Iu|rF9y32(nN6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui01yBW000Pe0RIUbNU-2Qe+Lm7B$yAL!i5C8@d1@i;6sDiU;t=B z>Yl}g*>V5?0AWe0g9Ss59613AFO&jRt{mB*O0|?CXVNr8kD$zv0VIGC_c3Np02iJh mvv@Jv4FDFT++u3bnvo~2_!TwyPT4w$1TS7RsBmn-fB-vAVzP|@ diff --git a/images/rarrw.gif b/images/rarrw.gif index 849238c2dcb324e89dfcb3f0ff505899dc4077ae..bf26b8a8bbe89e4c361f1577c3b6ff7125527047 100644 GIT binary patch literal 207 zcmZ?wbhEHblxL7<_{7TK;NXy&n%dRXwSN8jD_5>Cz<}aU7FGrZRt6oA07xwZ^OT5P zcm5fOF)V4_a&N7}f;-P@qa-SsGUqi;XjTK4LQeITYM{SZ>W%&_s=R}Q&djaxoaPCqd)f@zWrixt?haD@5!}w4LPwq z#*v-%P24{I{d$2ty^gNa+$XnN%?=AO?6sLUzjD#y_@&E~y_RLHUL(A2{l@iboD9|g DWr~W5udlDv)YJd~fWW}OfPeu10RMmh zfB^sh0Dyo20RaL60s{jB1qB5L1_lQQ2M7oV2?+@b3JMDg3k(bl4Gj$r4h|0w4-gO# z5fKp*5)u;=6BQK|78Vv47Z(^97#SHE8X6iK8yg%P9334U9v&VaA0HqfAR!?kA|fIq zBO@gxB_<{&CnqN;C@3i@DJm)|D=RB3EG#W8EiNuDFE1}JFfcJOF)}hTGcz+aH8nOi zHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7LPJACMMXtMMn*?RM@UFW zNl8gcN=i#hOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&m+}R#sM5S65hASXo(FT3T9L zTU%UQTwPsVUS3{bUteHgU}0flVq#)rV`F7yWoBk(XJ=<Cc=sHmx_sj8}~tE;Q5tgNlAt*)-FudlDLu&}YQv9hwVv$M0cwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW000L7EC2ui03QG!000QY01pTpNU)&6g9sBI2oOM_Lxc<)KAb2p zfB=RRCtAEHF=IlD12}s8C}2QHj3W(#Byh6h!H6(pGAv1erO1~X1?b$#Q|Ex1Hc=J? zX|kx%qXY`nY^jna(5Fyq7El`0Q(5)ORjwkpAuQ3K!AJCNwn!zPmwE}XNcg{DuZKJ76e06T#T<+lI; diff --git a/images/rotator.gif b/images/rotator.gif index 3797ec3e4b74d98f392eec92cedc6fab037114aa..6e8181ee98f9834122d821d1f2fb6ac7fa617728 100644 GIT binary patch literal 822 zcmZ?wbhEHb6krfw_{`04?b@}*#zqqp6GleH>C>lg-n>~_TKeI`hewVa*|lp|NJt0+ zDp35-?dKX2?CcoeYNTht%m|cK{K>+~%D~N_15ybxmVw2u;N(t@g%NC)Z8|ek8tzVN zSeT%bT9|NXtHkZ?GOVjOm?k{sl+bed!^nJM)4B00ERQ?;)~N0|^@FSMw3J&ItA~=rw1WrC zB2KnVfrS$ngANA+BLfG}uM8|20iLDLbWUmoY;g$+^z~RS+OXWqad%YfhEr=41rHf$ zu&sR|G@E5bCoCS>L7ruYdRFDb3C(WbDYu%6zeWl$Bsg}>FpxQ>$Z=C(!z2fvV_w%U z>u#L~vlW;C7=eC;gs(=yNl)<=i6N1vCLUG@IWb*?VWDo<#vaEFp6|3-PpVyc>~v!4 zp(WvPTY+9?06Lf#h#6RvCiKi)wRO_HT;}_2A0yiWM8g^jnk0D`ssz&>skX*k-B#)X z4PiEroh;B0R@lJftS#$&L+aVT1c|Kq3JkLy0vsPkIVS9p@d{?0ssamMa7twa`Vka7 vY6T}npUH$t?KuCI)K&7Zv!r literal 826 zcmZ?wbhEHb6krfwc+9}?|NsBZn>YXd{rlRrYY!hj{PgM5u3ftt8yihbOc)s%rKP2h z962(5`t-kl|AvHw02M3#=k{|A33hf2a5d61U}j`sU{L(Y!ph3P&!7Wj0}T~mU|{k4 zaPp_b;t08!lXzw>X}Fu*pt#5;)gj@;SB=}>1sGo`oS5*GO+w4%4YEkCv*i>#@z9 z_ns&$GE%uIX!jz7?YLvi^^Ff~@>mYcE6}*}Pzj+MQ(-5vV589W-k-x2~vk5 z4m#L!r0dQPS=6Pfy)h?q+tfEZx2Ovu^Z{)H>H@h~xuD1Wb#jkf_x+op}r*#R3c^h;LPZ;oNLG@ z%Io@N-L3PGtYrjx781l7A5MDSU!fi<$u!ZkDdcoI3-e;zzE3^JH+sI)mOa*XuZsyH zMGYeZ3p9uo43@ZS`*Pl_diF0tB1^uBNBU5J`-7;YD(~q+&k9XC=&OMzRH<$BXULo-1s?4Ht&dLni_ZMXjE)ZE+$N6xp z(2eE17uJcEhHtuoDHJn8u96bemMF~bNCBD!0icD%tX-wv37zm*FpWDwhB-q(8z|~04 zfSD2K2F0H&tS5l6qXTjeD4H19*E9$;HMg|3x&>Rw>N!V*v*!nL=r+rB~AOF&-s@ZlrY0-|<` ztJm)0QS}iJ3y@%CX1cdpQo}^XNWfRbjF*j_olVn2TuwoyNnc$=f}4YbPg2}Qxxqq` zWpP_uAeUamM}wqe6P-M}a%LDTbm14!?Ql5s(b;2)w2VhcqsyiM1+WLW7#JCJm>8HD zxEa_P7+5tD6#6^`dygutIds9{;N%T!HX5)jU_QjB!6NEg;Gn^@dEr6BEFslJ0$|N4 sKtCWfGl@*$@8o)@aI4tF_oqSK#H-9|69OQ?#7K!PjC8SuD8E<(0Dfl+cK`qY literal 1003 zcmZ?wbhEHb6krfwIL64}Y$EU<2%ahZd!l%Mli=%P;)4H-=9TER@QToSixnK9> z|2$Oq`&jY&O}W316hEGqe!fri?s|bK+3aUe?SJ>->H-*qr$B%eVU*1+QE_ zRg>*_c^=od8?wbw+}D=yk+jZI3N5y~LmH&E8_WKRl z51+qoTs7s{UeTX-;I1Yee6?dtVT%yKm=; zL;Kcc`f+yU@vd6fxu=uk#F6bcm-Fu1vHbE1fiG8O7L{{WX4t;JD06Uu$jUm-hg*ei zEa$zjPP8$?b%+DNo^^O$=shVNPoE^^YgAe zD9ph?@jthpYe=xOV}PrXo&hr>0|SHNPZrh_4D}2;KsGRv1Q;0D*EG~OHMg|3hUa>U zS%g#;x7EulYjbhQak8oyw#s{O^D{FuEM_%MZ%$NR%)rFJxSl~Uh^@(P-G=o$8H94` zD~z_U+rEJ%zFtP`@Zlp~^=!U!tJm(*P)e$2&*0={X1cdpK+j3ozCM}NRg;I8mq$N} zLrPY$$x4NlQ=N}bOMt^$VbK)HE6pA)focMGE;2BAOmm7^6-UYxDO`W#UoS;9>wO zWtuZbjjL-K6EB}y{gm#hJX*~gm)A5kf{jW+HA)#|6hmuE8v|n(Lw#p=*M!!tdd9x) hY16uUJ0>>IYwf9r=wn3HM~M^Aj2ZwZFp?7r)&TU(i4On( diff --git a/images/smiley-bangheaddesk.gif b/images/smiley-bangheaddesk.gif index 91ccb8bb4de286aef08a50464f969cc69da8fead..c28440296cfdecbfbfb228a3565141f5415eee69 100644 GIT binary patch delta 644 zcmey$_JmE|-P6s&GEs>^j^Pt40|Ub`0R{#|4vwV~4FA6?0{Ii=<>gr!bbu@dkQxT& z)e*Zc?lm~IQflY-i@MDJB-O+}!2njs1XL&kRJc51*O`y&PkJiuG!Njc zJfN^J_nd*2zr?&0!5J$S2sP~lL3q4m!dj8VVh<1Hk(AR8OZ@!jSE)2d6xCbr@vt4>y=SQ*;P1-1nc7- ze)E$MU}whwS0gq4eT$x3lTJivkBfjj>U zPI*S|*dFFn#V_?NCeE|rc7xWE$aTRBHZ^&3d|fGNG-I~~zs|B>H(RXdX%&d@Y1*a< zx2%j>AGknau}sDO2Om;1n-e#lE_{7B_lrV)YJzsx5qD!tkOy=sD>Q6@9?)sbt4xpJ zF7IkioD`?s-!QQ!tFLo53J7Eh37CEd-m3^-nHp~aiMad(jp&-`&ox}1pG7ANY+#^GB7YwNUBs&3eL^U r$xPLC|5j3xnWv;sQj}Ph%F9(=Uapssn3I#QTU?M>T&$Op%3uuu#0Y#5 diff --git a/images/smiley-brokenheart.gif b/images/smiley-brokenheart.gif index 971b57fd984d3be7d66b05f9107ffa089e5e0a38..f511db3e4caf64dc12289d998b5610e483c394dd 100644 GIT binary patch delta 303 zcmcb{(!tE*?&)S>nJB~{#PC&rB2P-awU?KxkB?(Wh;MLkTy%6nNl9x_NoG}5SyNN{ z#EE^=r%jkOYwEmtGZ!snARQ?FWMSoE&}YyAX$9HIz_#?j^a-kq5`qqio$L^?;;!fG zbrn=}T*^A}v+BzRJB5JOgFlu~f)Q zGHPv`tX!eca)5zJrZ-<;(gA%%u2~BG=cN2N#nNS2G_Lxw#4Wq)r^(JQ_$XR+>j6gw FYXG%!RYCv& literal 598 zcmZ?wbhEHb6k-r!IOf2>#>6DTz@WguAjZXO#lq^r#Kb8g9L>Ox!@wXZAyv-6*v!B% zlYuFZPhc?v!$tT2m?($YHG*24gBNFd7E#@frv)yKy%B*Zs3I4(N6proX=s3fzhs;sH0ed5GPQ>XMzpEhCE ztf}+n&0Mr_+KS~1HmqN_W%JHWn>Ov+yKV2@o%{CgK79DteUqNDh=f*?zG_=XQy(jzlo*$w>V!$G z%6;}ivI_DF3ZgtR^A%)g+l$M}t(99Szm{8irPRiC>lo$w)SEQKx33dmSL%~xZ8Bhz zT_Y#X%*NKVS%ITZnPs^gOW!WJGrY5fc@(%+nvSe}x@9(lWYYzOhzf?Qh~E1q2lWa3_KCEyWwQIOI9nUz&g;R8pOiL-sK KFiUVSSOWmJrbp`l diff --git a/images/smiley-heart.gif b/images/smiley-heart.gif index 6a11e70652d32206d792fe00b8f0ec9fbfd6b759..8891901cff0199f036b2220774eb333209d21bfe 100644 GIT binary patch delta 235 zcmX@e@|B6l-P6s&GEs;@h~ca8M4l=23pT9ZxoHyvaX|4W3o93cF@p|BImiqKwn+zO z7I^4L#VT{Tsn$%L;*+%I!G#Esi9%PSBm`AuFR-($GO$PrI9@1pN>8@`j`P1W)^nQ- zmTWx#zgU68NkcrWuAy9(*U5mXqN9;p+F6+;Yl4CRgR3x)LWjI0qqZA^#>6DTz@WguAjZXO#lq^r#Kb8g9L>Ox!@wXZAyv-6*v!B% zlYuFZPhc?v!$tT2m?($YHG*24gBNFd7E#@frv)yKy%B*Zs3I4(N6proX=s3fzhs;sH0ed5GPQ>XMzpEhCE ztf}+n&0Mr_+KS~1HmqN_W%JHWn>Ov+yKV2@o%{CgK79DtXd1$$}K{&3i1jHqC7H-6lD3-n@q%I4yU%i5$UwQckM%?cb%8shs7Y?tM2 zGGN+q;vlzlvog!73km`Zt-?GCC*&m=wc8jZ@9$S&S8B7@Ws=#r=_cFTCMB-x3gXP) nnmNTnN);v?y05^rP;7#Mg~!oGc0matqm8~wielfG7#XYqo~%HP diff --git a/images/smiley-shaka.gif b/images/smiley-shaka.gif index 336fe3bcdc490fa11284145b67c0d179a2e983e9..030aeccad0c9640b77a4fe849ae356affb768ffa 100644 GIT binary patch literal 2381 zcmeIyYgEz+8V2w`3dl|5E+`tLW|~cETAETANK}rY)<)&HrjBV@nK`3V=_2CY1n<`r z6phLYCOYP&#Y=={W1tnK8D6k7Yn;xWooUa`y4yKB=j`tH-B0^|e9!yodCu=WaFFBU zdzublfuH#R%L^01#h>QDq7K61gW(Bbh*%yW?W9HAF~eXL@TaX+)0CFr5?+M6ETmS6{KaODLTM~YzDGQ@Z_ zYN(N@m0>1s6Q`xf=gp{>x6yh9=1B)>y4%{=gga1-#Rs>Aq!HNH3Diwj`NMIt&Jl4o4L5Q0+Om2d$*h_ z&2*IKxXG_?RpirKiyRdtI|gJ<`I*7B;*hGclQos$C7Guy^1harMBl7E*L)-WPDA=Y z6MH}&p^&Au-@K+NMGVzrH4PX|z1~_iS6~k>;w4Emhy>8;}p>gwba5L<{x@1#VJlt-C{%fLg$(xQU_ z=5*gZ3g6wHHfH-9WKuT7-Or!F@b~xg@pLv1>@4QMUHp2ry?(nrD98iD;=Nd3f8aU5 zFaX}J=zW<-f}qe)XwVTcfi!d2@WH?%3WI_|JcC1bEd?Dvz5T z;}O&g)N?PQPoVJl)}^x3BTy?_9}=f?AxvTg+nH!c8bb;YIE!@ukX3nnn7vO+_@x+d z28^;hENQLk4nm!e!_~w4HV3W{%)?sbSJ@(U9@%>$A}nM$QxK`MziuN5fFP~ij#km= zL&R2XNxplc00hpn!lT{S!8QaOjfep=c_41nvm!IlKXc~&OU|$jKn4>DW4JjG7%7=7 zjFFDyVC-C7^u{45!HW~ldm_y($)(wCfqT-}XuGYKXC<-#fkaFXz_|d?7Girw>bfC= zrO5*YMsd7KXb;eJ+)E#Nu?{SAzWI4Z2;>Zjy9t}L4ycJtaXWBU@rzm9WXsVwH<$5J zNKgyk%7qW~%g?=PKcO!?yI)&G;RTc7Hli&>EbxvZ;jb^BW+V4y8?^4t4<3m^zG4&m zSo6oWXMhs6F6XN}3V4#fI;n19GSeH%`<2ohICblHJdEl|4Z%fBjbeDLsN%k~4UHL{ zej#y&kiyPtL^AcfMmNW((71cZ%(e$zH_TR$H{eI4p5bWvp`&9KB8pGKUzXuaNS^sV zsaEE7aMB_4LYe-6V@de%nCo3~h5+U{D;Ys!ZiCebC$3VBMR$JGkgoY8LESDJ7BENc#E8%V`(}E^SrSam*t>bj2$F6S z*hhe-dGp2`)_2dumyP=Bf^zq=`tzJ}{a8Qg!1CV9Ol@?ko|p$mD!+Iucn7O=h$ z$5%$2?*)nlW7Kc;C23R7Om&^!d^NTi1$NTZIsmKigE0FO>9#*e5bH1(6nOAk;KY9Z215ord;^@2-zm@h{K=41hL d*aA;g3l4BKA~1$X!vJPPK*uY`K)`_C-vM(G)=vNc literal 2427 zcmeH{X*3&%7RM87ED2eOJ(g0{T1rPd%tWbSOzm1l4WX7wnYIk2yhNyoU2L&LqOorY zVMs7BG!xs{)!taEXlFWOUTe<0>C}7g!<_ft=YD$koO|v$_v8KF-|sVLN9&8h7yuOT z25?gLmdb%n@L)#}&KVTxDi`FUg7=aSb4Mim$;SG_@A<1e_!1W3qmTDB{2NXo35QGx zRgVubi^W;Sgw{!P_L>zDx*|Bi&LWMS#hXig|cNVi-I<5=M?fXMY9B zzKfv6%F~k|#R;&Y1g+8(4O$|!GDS5Vf0lelFFnRQBi1T2-kKV(L;c#IG)bTO(6lC5 zp&?PWIT@4|>yj0Z%}a62OLj_6@X1K@&3fpWmF!oU3a=!f$_X0P8HQEqM%9^@SOjn* zNwFqPtDX#N%tW+Mlv}eWJ%dt8=M zTb0sWoznN%p^p{Vz)Wtde>jv25>n+wMe?IG#X&k$SgkCiYtB?F4AvlrYf#^_5W}^q zBBt_K9c;V~`a=V3ya_qUR{4ReImb|VTC2F+1es}2o^D3Yw!x;_QFHC^84hBe4WI8o z&UL9Qv0*D+@O2(?g@<14S08RYGunok=A9RJLN~i%TRm_w53$jY+U6mIZ0~V?!t?J? zTSB$%A@q(=ZAYZOCqV8$Q8^TGQamF>;-=i94?+fy%g*I&F?-`d*R-PzdL z*%9v?Y&?ItzqfICu)Dv%cX+V(?%lih&yRVh;CjW|%ihlYip4oIN#M!qSV~U%{WN*s zfD=prpg#aWkdz>|TtgmgBw`Aq8ABP$n!E5)qJ7cTUj5S#^6df!$U2&vS&mo_cCZoY znD=Waft!c1^ZOW^>?wtz!hd|ikaO!1>|$?2DNgdmAj+dZvUZ#nbY*S_(!{YkkeTq)C^dFn`)UmwuR1&3*_H6f!+ zuZKA2mzfO~Q~RI1(oHzpla~SZ%Y1p|b^TB@jk{SAPcO! zhpim`7Ku-uPOl3~ zmU*EhS=aHYp;F-8vgCORzlC5en1vH=48Z@Xw6pIWI&z+BR-Ogh^0+e!(N8eR+( zUHGwbmZ0~|TbQD`aub4JTr!6pyac&>KU> zsQypN|0G5F!-)#|E3MNoU)zQ_?jUsr#fSog1WF!$Ub{gXicX9+5lx5Wp2xS7tyf;_ zwS3wh-=8SPu%C6HokNQn3sXlxZZyJNq}f4)FFP=)*LWL17zm4EMBKKlDJgK1w+7y& zx?)YgzggfISS%v+MSXM)Yf-2`YytChz8aZ@U`f~fsk&!T_!dp6D-2%`Y>hos+CaAf zOZuWpaN;mz^ohgHa;t`U$YvkbY3jYW(aWb?`-$V1#1dimttSDE#;2`0 diff --git a/images/spencil.gif b/images/spencil.gif index 0a2551ac0847df408675dd0bd729d94d03056098..515e6b02dc16a4c9ad038d17c286281a4c6ede48 100644 GIT binary patch literal 297 zcmZ?wbhEHbjvez&sy?&SykYY&As9tmqY8qsnzvh`TTgwxrR z&J<5SS2g!y?fgq^%dSpXdvo6QyNh<+U%L0f>VuEAoqW3e)U&e$uSXKubd zd+XhWJMXVO{P_CAkDtH(FpvTif3mQ0F&HxFfHZ;p#K7iuU`Bz5j+CL`;|oU_czTq% zk8TkVahyFRi|M6+zC6En5QCtq`o%0q2|@W4Tv~#Pg3fcMtt>Q1i<4sG@?tblX_>X@VDRjut)r{mYC zcC7(T%`YKm#>EYr9-7RigP(pOt&tg+4AVwbnoE^oVi{tk!2-3~>2 zolEw)lPs^(s-oqwru(UrDkS0}8!IdA*jg*)#p+I4^F-Uq7>KH7Hj>Go64cAa^? z_uPwv7hfH_`ufbxw`Xs?yKv|I)dwH0J^c9k!;hc8{`?<0K=CIFBNszGgAM}_fZ~LK z-LIj(skx=KO;x6?*+rC@qs?4N-b#eM)mYokUQSxSMa9s-QHI;NMb_HXL4?b^Maove iR!GL8#YD%+N`kLV%~hR8xQo@zlD|t*wyU|3!5RR<{We$t diff --git a/images/unlock_icon.gif b/images/unlock_icon.gif index 254ac8bfd228426798e5bfba96e9b6ddb0131511..9487b44e3eba6b3a90ba6502f382e030ba6405a8 100644 GIT binary patch delta 146 zcmZ3*{+f~7-P6s&GEsm*fZ@wT?xZ@!pDe5l4Dt**3_t)9Wnj&Cpx&2~IVpD5yyWMR z(?UwtaIcu_GW+h`bIb3&yF4@1h*xD3^UD+$*X73-dZ=g#^C$(J(lC%dbU?vELFsOO yMU0!lF76F8Y93_l;p6aRd@^!MkZ zzu#{kY2v%FMe*mzkdDtWRKwS(C^R3uU@@+W3ANBH!JRJlQ~?^ z`~CT(pSQ}^u3h{8|9^&2Fd71bI|LMevM@3*$TR4GoC(Sk3>@tY_8c-E8x}Y=$qK32 zSZru!=N3~Dd2!%^B15aJN`T3Yhe?M!*{$>bTu4l6G9%&991BC|+O&qrMY_d@zjLq}78@N=f8k*bYaV{}hTQxPIZH@QJDBTK1 c#`et_=gVY&C@`?HNj*9hdwRpW_67!P04XVWr2qf` diff --git a/images/youtube_icon.gif b/images/youtube_icon.gif index 987b82bfdd51c2c191c97fe6c19948c9aa0ff230..11a0a982ce3757e4bd3687df7f69e815d1578328 100644 GIT binary patch delta 163 zcmbQkewUHk-P6s&JW+r_fZ@wTZkKunyg&ye3sTF#nv_t=6B-bbv1(BR(;9;+hUJVL zSAVbKZunx^l6Up@O92+ei{Tp|rZvt8F-?qEACY6)x;ABZm=Sa1<6<`!7MDq1A`U7Y>ts|q z6=KoYcy_i$;WeL*%}(d$S=RpB61lMP{2~rTg9Zo3L%vIR7K9ZvT+j?$9JtX>^w$ - - - - - - - - -Friendica - Contact confirmation - - - - -bob@example.com - - - - -karen@karenhompage.com - - -notifications.php - - -notifications_content() ------------------------------------------ -- This is the page where Karen see Bobs friendship request -- the submit form redirects to Karens local dfrn_confirm page -($dfrn_id, $contact_id, $intro_id are submitted) - - -dfrn_confirm.php - - -dfrn_confirm_post() -SCENARIO 1 ( no $_POST['source_url'] available) --------------------------------------------------------------------------------- -- contact data come either form $handsfree (if autoconfirm) or -from $_POST -- get all data about Karen form the user table -[Note: Bob have been issued an ID (contact issue-id) when he first -requested the friendship. Locate Bobs contact record. At this -time, his record will have both pending and blocked set to 1. -There won't be any dfrn_id if this is a network follower, so use -the contact_id instead] -- search for Bob in the contact table by contact_id, dfrn_id and -issued-id not empty (for the uid -> Karens user id) -- if network = dfrn - -> create a new keypair (prvkey & pubkey) and update the -contact -[Note: Generate a key pair for all further communications with -this person. We have a keypair for every contact, and a site key -for unknown people. This provides a means to carry on -relationships with other people any single key is compromised. It -is a robust key. We're much more worried about key leakage -than anybody cracking it.] - -> update Bobs contact record (in the contact table) with the -generated prvkey - -> encrypting the dfrn_id with Karens prvkey (Bob can decrypt it -on the other and with Karens site-pubkey) and add it to the -transmit params. - -> encrypting Karens profile url with Bobs site-pubkey (Bob -can decrypt it with his own private key) and add it to the -transmit params. - -> add the above generated public key to params which -getting transmitted (if $aes_allow -> encrypt the the public key) - -> add duplex state and page-flags to the params - -> send params to Bobs dfrn_confirm page ($res = -Network::post($dfrn_confirm,$params); - - -dfrn_confirm_post() -SCENARIO 2 ( $_POST['source_url'] is available) ------------------------------------------------------------------------- -- get all data about Bob from the user table (prvkey and uid form -Bob ) -- decrypt the transmitted source_url (profile url) with Bobs -prvkey -- get data of Karen from contact table by her source_url (and by -her user id) -- decrypt the dfrn_id sent by Karen with Karens site-pubkey -(taken from contact table) -- if possible decrpyt the pubkey sent by Karen with the prvkey of -Bob (taken from user table) -> if this is not possible use the raw -pubkey -- search if the dfrn_id is already present in the contact table (if it -is prensent it is a duplicate) -- update dfrn-id and pubkey for Karens contact entry in the -contact table - - - -> set the relation for the contact and set pending = 0 and -blocked = 0 - - -- update the relationship of the contact Karen --> if duplex delete the issued-id --> set blocked = 0 and pending = 0 - - -send a notification - - -delete the intro of Bob - - -Note: this chart respects only dfrn -contacts and focuses on key exchange -(for other areas it might be very -incomplete) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Friendica - Contact confirmationbob@example.comkaren@karenhompage.comnotifications.phpnotifications_content()------------------------------------------ This is the page where Karen see Bobs friendship request- the submit form redirects to Karens local dfrn_confirm page($dfrn_id, $contact_id, $intro_id are submitted)dfrn_confirm.phpdfrn_confirm_post()SCENARIO 1 ( no $_POST['source_url'] available)--------------------------------------------------------------------------------- contact data come either form $handsfree (if autoconfirm) orfrom $_POST- get all data about Karen form the user table[Note: Bob have been issued an ID (contact issue-id) when he firstrequested the friendship. Locate Bobs contact record. At thistime, his record will have both pending and blocked set to 1.There won't be any dfrn_id if this is a network follower, so usethe contact_id instead]- search for Bob in the contact table by contact_id, dfrn_id andissued-id not empty (for the uid -> Karens user id)- if network = dfrn-> create a new keypair (prvkey & pubkey) and update thecontact[Note: Generate a key pair for all further communications withthis person. We have a keypair for every contact, and a site keyfor unknown people. This provides a means to carry onrelationships with other people any single key is compromised. Itis a robust key. We're much more worried about key leakagethan anybody cracking it.]-> update Bobs contact record (in the contact table) with thegenerated prvkey-> encrypting the dfrn_id with Karens prvkey (Bob can decrypt iton the other and with Karens site-pubkey) and add it to thetransmit params.-> encrypting Karens profile url with Bobs site-pubkey (Bobcan decrypt it with his own private key) and add it to thetransmit params.-> add the above generated public key to params whichgetting transmitted (if $aes_allow -> encrypt the the public key)-> add duplex state and page-flags to the params-> send params to Bobs dfrn_confirm page ($res =Network::post($dfrn_confirm,$params);dfrn_confirm_post()SCENARIO 2 ( $_POST['source_url'] is available)------------------------------------------------------------------------- get all data about Bob from the user table (prvkey and uid formBob )- decrypt the transmitted source_url (profile url) with Bobsprvkey- get data of Karen from contact table by her source_url (and byher user id)- decrypt the dfrn_id sent by Karen with Karens site-pubkey(taken from contact table)- if possible decrpyt the pubkey sent by Karen with the prvkey ofBob (taken from user table) -> if this is not possible use the rawpubkey- search if the dfrn_id is already present in the contact table (if itis prensent it is a duplicate)- update dfrn-id and pubkey for Karens contact entry in thecontact table-> set the relation for the contact and set pending = 0 andblocked = 0- update the relationship of the contact Karen-> if duplex delete the issued-id-> set blocked = 0 and pending = 0send a notificationdelete the intro of BobNote: this chart respects only dfrncontacts and focuses on key exchange(for other areas it might be veryincomplete) \ No newline at end of file diff --git a/spec/dfrn2_contact_request.svg b/spec/dfrn2_contact_request.svg index d32718271..9b75acd5d 100644 --- a/spec/dfrn2_contact_request.svg +++ b/spec/dfrn2_contact_request.svg @@ -1,218 +1 @@ - - - - - - - - - -Friendica - Contact request - - - - -karenn@karenhompage.com - - - - -bob@example.com - - - dfrn_request.php -- -https://karenhompage/dfrn_request/karin - - -dfrn_request_post - SCENARIO 1 ----------------------------------------------- -- Cleanup old introductions that remain blocked + Cleanup -any old email intros - which will have a greater lifetime -- Probe::uri Bobs posted dfrn_url and get the network with -webfinger_dfrn -- try to select all contact data of Bob (contact table) by the -url ($_POST['dfrn_url] and profile uid ($a->profile['uid']) -where self = 0 to look if this contact is already there (if -issued-id or rel is already available return here because it -seems that we are already connected) -- create a issued-id with $issued_id = Strings::getRandomHex(); -- if we already found a contact record above update the -issued-id with the one we have created -- otherwise if Bob is not already in the contact table scrape -Bobs profile and create a new contact with this data (e.g. -the scraped issued-id / profiles pubkey becomes contacts -site-pubkey) in the contact table (blocked = 1, pending = 1) -- select this created contact from contact table and create -an intro in the intro table (blocked = 1) - - -$_POST['dfrn_url'] is transmited and is Bobs profile url - - -redirect to Bobs request page -goaway($parms['dfrn-request'] . "?dfrn_url=$dfrn_url" - . '&dfrn_version=' . -DFRN_PROTOCOL_VERSION - . '&confirm_key=' . $hash - . (($aes_allow) ? "&aes_allow=1" : "") - ); -http://example.com/dfrn_request/bob?dfrn_url=6874747 -03a2f2f6b6172656e686f6d65706167652e636f6d2f70726f66 -696c652f6b6172656e&aes_allow=1&confirm_key=”ABC123” - - -dfrn_request.php - - -http://example.com/dfrn_request/bob? -dfrn_url= -687474703a2f2f6b6172656e686f6d65706167652e -636f6d2f70726f66696c652f6b6172656e&aes_allow=1& -confirm_key=”ABC123” -dfrn_request_content() ------------------------------------------- -- copy the posted parameters (dfrn_url, key and so on) -to $_POST - dfrn_request_post() - SCENARIO 2 -($_POST['localconfirm'] == 1) ------------------------------------------------------------------------ -- if(local_user() && ($a->user['nickname'] == $a- ->argv[1]) && !empty($_POST['dfrn_url'])) --> -- $confirm_key comes from $_POST -- get data for contact Karen (contact table) by -$dfrn_url (contacts url and nurl) -> if contact Karen -does already have a dfrn-id Bob seems already -connected with Karen (abort here) -- if this contact (Karen) isn't available in the contact -tabel, scrape Karens profile page to pick up the dfrn -links, key, fn, and photo -- create a contact for Karen in the contact table with -the scraped data with blocked = 1 and pending = 1 -(Karens pubkey becomes the contact site-pubkey) -- Network::fetchUrl($dfrn_request . '?confirm_key=' . -$confirm_key); -- Network::fetchUrl(http://karenhomepage.com/dfrn_request? -confirm_key=”ABC123”) - - -dfrn_request.php - - -http://karenhomepage.com/dfrn_request?confirm_key=”ABC123” -dfrn_request_content() - -elseif (!empty($_GET['confirm_key'])) ----------------------------------------------------------------------------------------------- -- select the intro by confirm_key (intro table) -> get contact id -- use the intro contact id to get the contact in the contact table -- build a notification package ( notification(array.....) ) -- update intro in intro table (blocked = 0) - - -Bob stays on his Friendica server -- goaway($forwardurl); - - -Note: this chart respects only dfrn -contacts and focuses on key exchange -(for other areas it might be very -incomplete) - - -dfrn_request_content() ------------------------------------- -- the page for the on Katrins server where Bob do a connection -request -- the form transmit on submit Bobs profile url as dfrn_url - - - - - - - - - - -bob wants to make a request and is directed from karens profile page to karens dfrn-request page - - - - - - - - - - - - - - - - - - - - - - - - - - -redirict to bobs dfrn_request page - - - - - - - - - - - - - - - - - - - - -http://karenhomepage.com/dfrn_request?confirm_key=”ABC123” - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Bob fills request form and presses submit - +Friendica - Contact requestkarenn@karenhompage.combob@example.comdfrn_request.php-https://karenhompage/dfrn_request/karindfrn_request_post - SCENARIO 1----------------------------------------------- Cleanup old introductions that remain blocked + Cleanupany old email intros - which will have a greater lifetime- Probe::uri Bobs posted dfrn_url and get the network withwebfinger_dfrn- try to select all contact data of Bob (contact table) by theurl ($_POST['dfrn_url] and profile uid ($a->profile['uid'])where self = 0 to look if this contact is already there (ifissued-id or rel is already available return here because itseems that we are already connected)- create a issued-id with $issued_id = Strings::getRandomHex();- if we already found a contact record above update theissued-id with the one we have created- otherwise if Bob is not already in the contact table scrapeBobs profile and create a new contact with this data (e.g.the scraped issued-id / profiles pubkey becomes contactssite-pubkey) in the contact table (blocked = 1, pending = 1)- select this created contact from contact table and createan intro in the intro table (blocked = 1)$_POST['dfrn_url'] is transmited and is Bobs profile urlredirect to Bobs request pagegoaway($parms['dfrn-request'] . "?dfrn_url=$dfrn_url". '&dfrn_version=' .DFRN_PROTOCOL_VERSION. '&confirm_key=' . $hash. (($aes_allow) ? "&aes_allow=1" : ""));http://example.com/dfrn_request/bob?dfrn_url=687474703a2f2f6b6172656e686f6d65706167652e636f6d2f70726f66696c652f6b6172656e&aes_allow=1&confirm_key=”ABC123”dfrn_request.phphttp://example.com/dfrn_request/bob?dfrn_url=687474703a2f2f6b6172656e686f6d65706167652e636f6d2f70726f66696c652f6b6172656e&aes_allow=1&confirm_key=”ABC123”dfrn_request_content()------------------------------------------- copy the posted parameters (dfrn_url, key and so on)to $_POSTdfrn_request_post() - SCENARIO 2($_POST['localconfirm'] == 1)------------------------------------------------------------------------ if(local_user() && ($a->user['nickname'] == $a->argv[1]) && !empty($_POST['dfrn_url']))->- $confirm_key comes from $_POST- get data for contact Karen (contact table) by$dfrn_url (contacts url and nurl) -> if contact Karendoes already have a dfrn-id Bob seems alreadyconnected with Karen (abort here)- if this contact (Karen) isn't available in the contacttabel, scrape Karens profile page to pick up the dfrnlinks, key, fn, and photo- create a contact for Karen in the contact table withthe scraped data with blocked = 1 and pending = 1(Karens pubkey becomes the contact site-pubkey)- Network::fetchUrl($dfrn_request . '?confirm_key=' .$confirm_key);- Network::fetchUrl(http://karenhomepage.com/dfrn_request?confirm_key=”ABC123”)dfrn_request.phphttp://karenhomepage.com/dfrn_request?confirm_key=”ABC123”dfrn_request_content() -elseif (!empty($_GET['confirm_key']))----------------------------------------------------------------------------------------------- select the intro by confirm_key (intro table) -> get contact id- use the intro contact id to get the contact in the contact table- build a notification package ( notification(array.....) )- update intro in intro table (blocked = 0)Bob stays on his Friendica server- goaway($forwardurl);Note: this chart respects only dfrncontacts and focuses on key exchange(for other areas it might be veryincomplete)dfrn_request_content()------------------------------------- the page for the on Katrins server where Bob do a connectionrequest- the form transmit on submit Bobs profile url as dfrn_urlbob wants to make a request and is directed from karens profile page to karens dfrn-request pageredirict to bobs dfrn_request pagehttp://karenhomepage.com/dfrn_request?confirm_key=”ABC123”Bob fills request form and presses submit \ No newline at end of file diff --git a/view/theme/duepuntozero/login-bg.gif b/view/theme/duepuntozero/login-bg.gif index cde836c893f64bcfec04b9c817e3371ff122fe19..be47484c50905e64f3194e089e6d51bcd71c3847 100644 GIT binary patch delta 22 dcmaFM_>_^`-P6s&JW+r_fZ@wT?xcyO6#!2(2NnPT delta 31 kcmaFL_?D5|-P6s&GEsm*fZ@nQ?j#PypDYX@Ffq3R0E$5f1^@s6 diff --git a/view/theme/frio/font/open_sans/fonts/Bold/OpenSans-Bold.svg b/view/theme/frio/font/open_sans/fonts/Bold/OpenSans-Bold.svg index 81c8a275a..9aa908bbb 100755 --- a/view/theme/frio/font/open_sans/fonts/Bold/OpenSans-Bold.svg +++ b/view/theme/frio/font/open_sans/fonts/Bold/OpenSans-Bold.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/BoldItalic/OpenSans-BoldItalic.svg b/view/theme/frio/font/open_sans/fonts/BoldItalic/OpenSans-BoldItalic.svg index d06de541a..36fc373c5 100755 --- a/view/theme/frio/font/open_sans/fonts/BoldItalic/OpenSans-BoldItalic.svg +++ b/view/theme/frio/font/open_sans/fonts/BoldItalic/OpenSans-BoldItalic.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/ExtraBold/OpenSans-ExtraBold.svg b/view/theme/frio/font/open_sans/fonts/ExtraBold/OpenSans-ExtraBold.svg index aeb208de4..76ae14e60 100755 --- a/view/theme/frio/font/open_sans/fonts/ExtraBold/OpenSans-ExtraBold.svg +++ b/view/theme/frio/font/open_sans/fonts/ExtraBold/OpenSans-ExtraBold.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 2011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 2011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.svg b/view/theme/frio/font/open_sans/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.svg index 2152de9ec..9a64576ff 100755 --- a/view/theme/frio/font/open_sans/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.svg +++ b/view/theme/frio/font/open_sans/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/Italic/OpenSans-Italic.svg b/view/theme/frio/font/open_sans/fonts/Italic/OpenSans-Italic.svg index 7561e874c..47c769b8c 100755 --- a/view/theme/frio/font/open_sans/fonts/Italic/OpenSans-Italic.svg +++ b/view/theme/frio/font/open_sans/fonts/Italic/OpenSans-Italic.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/Light/OpenSans-Light.svg b/view/theme/frio/font/open_sans/fonts/Light/OpenSans-Light.svg index c3bd1594c..4d8470fe3 100755 --- a/view/theme/frio/font/open_sans/fonts/Light/OpenSans-Light.svg +++ b/view/theme/frio/font/open_sans/fonts/Light/OpenSans-Light.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/LightItalic/OpenSans-LightItalic.svg b/view/theme/frio/font/open_sans/fonts/LightItalic/OpenSans-LightItalic.svg index e5694a123..9a5a9547f 100755 --- a/view/theme/frio/font/open_sans/fonts/LightItalic/OpenSans-LightItalic.svg +++ b/view/theme/frio/font/open_sans/fonts/LightItalic/OpenSans-LightItalic.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/Regular/OpenSans-Regular.svg b/view/theme/frio/font/open_sans/fonts/Regular/OpenSans-Regular.svg index b34ed428a..a6d682228 100755 --- a/view/theme/frio/font/open_sans/fonts/Regular/OpenSans-Regular.svg +++ b/view/theme/frio/font/open_sans/fonts/Regular/OpenSans-Regular.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/Semibold/OpenSans-Semibold.svg b/view/theme/frio/font/open_sans/fonts/Semibold/OpenSans-Semibold.svg index 4949365fb..38e38b1eb 100755 --- a/view/theme/frio/font/open_sans/fonts/Semibold/OpenSans-Semibold.svg +++ b/view/theme/frio/font/open_sans/fonts/Semibold/OpenSans-Semibold.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 2011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 2011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/font/open_sans/fonts/SemiboldItalic/OpenSans-SemiboldItalic.svg b/view/theme/frio/font/open_sans/fonts/SemiboldItalic/OpenSans-SemiboldItalic.svg index df4513785..e178a0f4b 100755 --- a/view/theme/frio/font/open_sans/fonts/SemiboldItalic/OpenSans-SemiboldItalic.svg +++ b/view/theme/frio/font/open_sans/fonts/SemiboldItalic/OpenSans-SemiboldItalic.svg @@ -1,958 +1 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +This is a custom SVG webfont generated by Font Squirrel. Copyright : Digitized data copyright 20102011 Google Corporation Foundry : Ascender Corporation Foundry URL : httpwwwascendercorpcom \ No newline at end of file diff --git a/view/theme/frio/frameworks/bootstrap/fonts/glyphicons-halflings-regular.svg b/view/theme/frio/frameworks/bootstrap/fonts/glyphicons-halflings-regular.svg index 94fb5490a..b17ff2663 100644 --- a/view/theme/frio/frameworks/bootstrap/fonts/glyphicons-halflings-regular.svg +++ b/view/theme/frio/frameworks/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -1,288 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/view/theme/frio/img/friendica-logo.svg b/view/theme/frio/img/friendica-logo.svg index 42f7f1b09..d402a22d6 100644 --- a/view/theme/frio/img/friendica-logo.svg +++ b/view/theme/frio/img/friendica-logo.svg @@ -1,17 +1 @@ - - - - - > - - - - - - - +> \ No newline at end of file diff --git a/view/theme/frio/scheme/plusminus.jpg b/view/theme/frio/scheme/plusminus.jpg index 7d333a2e1d49d449c2df58016fb31e207dfbeb22..a0e39e96e2c7db10d84185c815b8b5292adf6798 100644 GIT binary patch delta 12 Tcmcb+iSfiH#tEVuwTvSHCV>SQ delta 33 pcmX@HiSh0x#tEV#{}_awi&7IyQd1PlGfOfQ+&z5*Hj0=;0s!6p3<&@L diff --git a/view/theme/smoothly/images/icons.svg b/view/theme/smoothly/images/icons.svg index 91bb2ff38..befc4d9e1 100644 --- a/view/theme/smoothly/images/icons.svg +++ b/view/theme/smoothly/images/icons.svg @@ -1,1463 +1 @@ - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - YouTube - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Lorem Ip - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ? - ? - - - +YouTubeLorem Ip?? \ No newline at end of file diff --git a/view/theme/smoothly/images/larrow.gif b/view/theme/smoothly/images/larrow.gif index 15bb1ea110029f1264d0de370eb049c8ad817b8d..2fa8067ce0daabc0a5f2edbfd4b5a2665556299d 100644 GIT binary patch literal 389 zcmZ?wbhEHblw*)$_-euMYbnG3<54eXG5p`>c%_Ho|2ED4t2zH4^8K@n;p2RU|65hJ zOpW}1D*68|lM^irdukZ|UunMB#qfV6)Bm$M@8>eiOl3IN!SH_-`;j?*|M%MbKj5~l zg5m!<;jarB{_oKHe?WvK*L#nEN1w>R^b0C);F^m&aN-{zk&f5Q2fcl%D`a3paW6> z@)HBwB8NEz9y(I}Czce=^f8$cu*i9nl*{6#+h>YX)AD6J!aaB1Rasall(0|oihE=< zx4GA|=~fes_aFS?q*`kpuHtUotl+~_>Bg?#EauIn&+jH#-mK#xtZA6$%qYcb(wxTP zF0VKtSA6NRTn0WD0bQ>38#WjTa=V&IYvk-KHZbKA^_CDTD&{caR2J0IQA*b0%x!Sh VlQn0$<*IJ8`d5@_PEpC>Qv4S8mz;_!0_HmpnQkBEBFpK!310Q~Ast4?hQi@BhO&~Z6=rW*L;#xK0a5`$s@R?Fy z3)r^@B|ET#GRL9e{ZIUDAo&KIzk+Rf1`SLvVPob7VK1$xAsfdS0k6|I)-fwRH~%yE z*7Rm&1rDS>`U!BU1N)Ov{l)FFBt;pZ{_=DUphJiA%_t_J=G@<0c%rCc=Yvtj#ur|% zYk7!&X0jTvJsj`Ft!i6e_=pK6t+N7W0vk5$-bV1DpToerF^VfR`+^eX`%v|%x_&?YH8gu2@Lp_veuS|60ItZN zHUhdA?S{UY?p&KuvA$+p;J(szHFHjohIgV-@ism>B`n>(+_o2cUi))ej()-?+5N0# zJ1z>$I!VLX9XNOp=WeJgBE~D>`spA;9e7st9_Nb1phj7ub12)?96fj`%I7kTTm+Q9 zYHo_;o{!rg98*mxICJHf0$7?ECZ2Hcaf$G2Sb8i%<#ENuP!t6Pgn;6Z4FO=+W^50& zHN$frVD}d6jI=IHxSl?kV^SBpKeG3H;4n`}zNKpJlo(~j*3SLz#eubHwnJ03s$sfx zjgAK;zS+hNi*j9-=HyeFig){^3F@vN$9t+Y^15N>dxZEUkBYJGwmar!0dbhFj!Fo^ zTvONl#L7Tf*z+~B{6_j@Efqz8{~x=&Awd8LiSV!gP5^lXkP>_3E^qWQdE4HvSVb8T zm76K;ykhcURdr--{@D4Oxpc;7IVGPLC|SunPty~qIa*d|LwItpo~(<%#(wwAR!)kJ zMdOl8?$lDr#OTKvgKtLP)WuhRnDKpL$VqEOdcuJ!`r)kCr)bRJO{sidq3Cx?c<+UB zgEli;niMRGCo{HI%Zf~SHCtMEd*1jV%fc-zWJbhB-g4I+dMmgsDlhNl8h3sxKPss_ ZruBXGEJ+i(o_^`-P6s&JW+r_fZ@wT?xcyO6#!2(2NnPT delta 31 kcmaFL_?D5|-P6s&GEsm*fZ@nQ?j#PypDYX@Ffq3R0E$5f1^@s6 diff --git a/view/theme/smoothly/images/rarrow.gif b/view/theme/smoothly/images/rarrow.gif index 3c38041f3de3ab4bf07fbb884e3856c356fa2abf..5090248976038e9f3274fc43a42c03788d3b064d 100644 GIT binary patch literal 389 zcmZ?wbhEHblw*)$_-euMYbnG3<54eXG5p`>c%_Ho|2ED4t2zH4^8K@n;p2RU|65hJ zOpW}1D*68|lM^irdukZ|UunMB#qfV6)Bm$M@8>eiOl3IN!SH_-`;j?*|M%MbKj5~l zg5m!<;jarB{_oKHe?WvK*L#nEN1w>R^b0C);F^m&aN-{zk&f5Q2fcl%D`a3paW6> z@)HBwB8NEz9y(I}Czcdd=BUiLaM0^fgP!f?*#}m&6y!za8L2P^AMs%R!R8>pIeX^r zipcva#Y$)D9zSWXF;}g(P-rxER|ykq)Ms}W=kd{LESGfS*XQzKnQCsrD#h4fZm22j z#m6u&+oUvGUs2wZThM6D8WS#E0S{3=)9M}B3>wmA-by-Jg36pm95qH_5-r)BS}jgY V=CXRXoQ>2UxTrmO-r~q$4FDo)mq!2q literal 995 zcmdVZ4NuYu901@SYNV)_CE4lBn=RZjt+1}FT&>HitgL2ht5z*zZC0*jGv_te$tf&FfGU zjMYA)B{Y1K=z0O78(?_`#;IY{upNYvolL@)G;!f6>}I$f7HxO+NK@+AV{pz7>E(A& zy5-$%KwUMq(ouP$A}d;!1vr#5@DHF_jbp_q^gvbW*HZW(%i~-Gt%8H!9S-YM8}D-8 zUBIfP*cfIQeE!`@^s;F+X<#ph=_i10SL;oX-j6~1^x$ibqT~p+#bL)j>`drp1vO_v zQ+Akp(TH_{1P@wE7}yXbyGJvP%Tclc6-mm1tvK5@@({2wwBRB|z}$v2lFvnewh5D_ zdAKgwsFf|uYsX7h*WTYh%8$c(D#~`?yR(9fRZ}k_QM~5UfCOEHQ?&L=`6`^?>(!#d zE5Z0G7Dpc`?@)Sj;o&)wCLipEA-iQ}TBF34C`;R^$ztlOY=5V9vf~zD({FmNZ|U{0 zMZ(qVAAM{HIypEBeb%RiCbHNt>(LYMYSG4{*$?JcEjDRTr7N(w!qk zi_`LjmN*N~hnu$6)fAzu{kun;r;_Bivv(81m39SV!Dcd#wYY_3b-o|LCtLd;xQH2P z7Wvz}Uh-&9AIlFb0slY39bO~=gedswzZ2ly0q7HYprNcY$2&0cOy(vfIX56Yw4CRm zdlSWBMK@FibWs^0+aqj$cs}?4*E>3UOAt(TvewgEqh=Wu^pMRyryDP&9_(YrJ?L~e z>JRlFUfOfgxLmvC0jO**bBER>}r z{JMr5(VY4_^NE*d_%ADqGjwNz%a&1(`@W8kq3-P^9}dpEU=ZD&?e@>TOF46%MWLxY R=_XR*v1N1Wcux=5`2$yVe2D-6 diff --git a/view/theme/vier/font/fontawesome-webfont.svg b/view/theme/vier/font/fontawesome-webfont.svg index d05688e9e..87bd1bc3e 100644 --- a/view/theme/vier/font/fontawesome-webfont.svg +++ b/view/theme/vier/font/fontawesome-webfont.svg @@ -1,655 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/view/theme/vier/icons.svg b/view/theme/vier/icons.svg index 91bb2ff38..befc4d9e1 100644 --- a/view/theme/vier/icons.svg +++ b/view/theme/vier/icons.svg @@ -1,1463 +1 @@ - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - YouTube - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Lorem Ip - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ? - ? - - - +YouTubeLorem Ip?? \ No newline at end of file From 17fbe5c299d5a85abe1bb862233fcc515b597d26 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 5 Jan 2021 16:01:05 +0000 Subject: [PATCH 17/25] Delete IPC entries --- src/Core/Worker.php | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index f84dd2947..619cb5bfa 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -98,8 +98,9 @@ class Worker // We fetch the next queue entry that is about to be executed while ($r = self::workerProcess()) { if (self::IPCJobsExists(getmypid())) { - self::IPCSetJobState(false, getmypid()); + self::IPCDeleteJobState(getmypid()); } + // Don't refetch when a worker fetches tasks for multiple workers $refetched = DI::config()->get('system', 'worker_multiple_fetch'); foreach ($r as $entry) { @@ -1217,8 +1218,9 @@ class Worker } elseif ($pid) { // The parent process continues here DBA::connect(); - Logger::info('Spawned new worker', ['pid' => $pid]); + self::IPCSetJobState(true, $pid); + Logger::info('Spawned new worker', ['pid' => $pid]); $cycles = 0; while (self::IPCJobsExists($pid) && (++$cycles < 100)) { @@ -1231,15 +1233,11 @@ class Worker // We now are in the new worker DBA::connect(); + /// @todo Reinitialize the logger to set a new process_id and uid + + self::IPCSetJobState(true, getmypid()); Logger::info('Worker spawned', ['pid' => getmypid()]); - $cycles = 0; - while (!self::IPCJobsExists($pid) && (++$cycles < 100)) { - usleep(10000); - } - - Logger::info('Parent is ready', ['pid' => getmypid(), 'wait_cycles' => $cycles]); - self::processQueue($do_cron); self::unclaimProcess(); @@ -1477,6 +1475,7 @@ class Worker * Set the flag if some job is waiting * * @param boolean $jobs Is there a waiting job? + * @param int $key Key number * @throws \Exception */ public static function IPCSetJobState(bool $jobs, int $key = 0) @@ -1487,9 +1486,24 @@ class Worker self::$db_duration_write += (microtime(true) - $stamp); } + /** + * Delete a key entry + * + * @param int $key Key number + * @throws \Exception + */ + public static function IPCDeleteJobState(int $key) + { + $stamp = (float)microtime(true); + DBA::delete('worker-ipc', ['key' => $key]); + self::$db_duration += (microtime(true) - $stamp); + self::$db_duration_write += (microtime(true) - $stamp); + } + /** * Checks if some worker job waits to be executed * + * @param int $key Key number * @return bool * @throws \Exception */ From 2f8e873cc7b7ff56bd77480893e03bb9ff3b5315 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 5 Jan 2021 16:47:55 +0000 Subject: [PATCH 18/25] Wait for parent --- src/Core/Worker.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 619cb5bfa..d2468a2a8 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -1234,9 +1234,13 @@ class Worker // We now are in the new worker DBA::connect(); /// @todo Reinitialize the logger to set a new process_id and uid - - self::IPCSetJobState(true, getmypid()); - Logger::info('Worker spawned', ['pid' => getmypid()]); + + $cycles = 0; + while (!self::IPCJobsExists($pid) && (++$cycles < 100)) { + usleep(10000); + } + + Logger::info('Worker spawned', ['pid' => getmypid(), 'wait_cycles' => $cycles]); self::processQueue($do_cron); From 6ef0f9646f4853d3ac957cb6a74d054a2e305806 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 5 Jan 2021 21:39:53 +0000 Subject: [PATCH 19/25] Set the new pid --- src/Core/Process.php | 11 +++++++++++ src/Core/Worker.php | 1 + 2 files changed, 12 insertions(+) diff --git a/src/Core/Process.php b/src/Core/Process.php index 919d37dea..447d312d4 100644 --- a/src/Core/Process.php +++ b/src/Core/Process.php @@ -77,6 +77,17 @@ class Process $this->pid = $pid; } + /** + * Set the process id + * + * @param integer $pid + * @return void + */ + public function setPid(int $pid) + { + $this->pid = $pid; + } + /** * Log active processes into the "process" table */ diff --git a/src/Core/Worker.php b/src/Core/Worker.php index d2468a2a8..54bfdedf3 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -1234,6 +1234,7 @@ class Worker // We now are in the new worker DBA::connect(); /// @todo Reinitialize the logger to set a new process_id and uid + DI::process()->setPid($pid); $cycles = 0; while (!self::IPCJobsExists($pid) && (++$cycles < 100)) { From 594b1a75b567337e4fac13947c846723298fa87d Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 5 Jan 2021 21:48:29 +0000 Subject: [PATCH 20/25] Use the correct pid --- src/Core/Worker.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 54bfdedf3..504a7b9f5 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -1232,6 +1232,8 @@ class Worker } // We now are in the new worker + $pid = getmypid(); + DBA::connect(); /// @todo Reinitialize the logger to set a new process_id and uid DI::process()->setPid($pid); @@ -1241,15 +1243,15 @@ class Worker usleep(10000); } - Logger::info('Worker spawned', ['pid' => getmypid(), 'wait_cycles' => $cycles]); + Logger::info('Worker spawned', ['pid' => $pid, 'wait_cycles' => $cycles]); self::processQueue($do_cron); self::unclaimProcess(); - self::IPCSetJobState(false, getmypid()); + self::IPCSetJobState(false, $pid); DI::process()->end(); - Logger::info('Worker ended', ['pid' => getmypid()]); + Logger::info('Worker ended', ['pid' => $pid]); exit(); } From e944e5d7a2106de57fccb1a9061a17946026eb36 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 5 Jan 2021 22:23:46 +0000 Subject: [PATCH 21/25] Added description --- static/defaults.config.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/static/defaults.config.php b/static/defaults.config.php index ed0f8f871..2bc2bea5b 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -539,7 +539,8 @@ return [ 'worker_fetch_limit' => 1, // worker_fork (Boolean) - // Experimental setting. use pcntl_fork to spawn a new worker process + // Experimental setting. Use pcntl_fork to spawn a new worker process. + // Does not work when "worker_multiple_fetch" is enabled (Needs more testing) 'worker_fork' => false, // worker_jpm (Boolean) @@ -559,6 +560,7 @@ return [ // worker_multiple_fetch (Boolean) // When activated, the worker fetches jobs for multiple workers (not only for itself). // This is an experimental setting without knowing the performance impact. + // Does not work when "worker_fork" is enabled (Needs more testing) 'worker_multiple_fetch' => false, // worker_defer_limit (Integer) From e42939a2e30ff0de44ffd6dfd4bd0a6747a9bfd8 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 6 Jan 2021 23:04:25 +0000 Subject: [PATCH 22/25] Delete sleeping database processes --- static/defaults.config.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/defaults.config.php b/static/defaults.config.php index 2bc2bea5b..893f77cbd 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -194,6 +194,10 @@ return [ // If it is not running and hadn't been terminated normally, it will be started automatically. 'daemon_watchdog' => false, + // delete_sleeping_processes (Boolean) + // Periodically delete waiting database processes. + 'delete_sleeping_processes' => false, + // diaspora_test (Boolean) // For development only. Disables the message transfer. 'diaspora_test' => false, From ced417da6c2f3bcc37d747bbc5058d3e32767a67 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 6 Jan 2021 23:05:55 +0000 Subject: [PATCH 23/25] Added functionality to kill processes --- src/Worker/Cron.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Worker/Cron.php b/src/Worker/Cron.php index 1901766d3..1f1e91630 100644 --- a/src/Worker/Cron.php +++ b/src/Worker/Cron.php @@ -24,6 +24,7 @@ namespace Friendica\Worker; use Friendica\Core\Hook; use Friendica\Core\Logger; use Friendica\Core\Worker; +use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Tag; @@ -54,6 +55,10 @@ class Cron copy($basepath . '/.htaccess-dist', $basepath . '/.htaccess'); } + if (DI::config()->get('system', 'delete_sleeping_processes')) { + self::deleteSleepingProcesses(); + } + // Fork the cron jobs in separate parts to avoid problems when one of them is crashing Hook::fork(PRIORITY_MEDIUM, 'cron'); @@ -137,4 +142,26 @@ class Cron DI::config()->set('system', 'last_cron', time()); } + + /** + * Kill sleeping database processes + * + * @return void + */ + private static function deleteSleepingProcesses() + { + Logger::info('Looking for sleeping processes'); + + $processes = DBA::p("SHOW FULL PROCESSLIST"); + while ($process = DBA::fetch($processes)) { + // To-Do: Auf Datenbank abgrenzen + if (($process['Command'] != 'Sleep') || ($process['Time'] < 60) || ($process['db'] != DBA::databaseName())) { + continue; + } + + DBA::e("KILL ?", $process['Id']); + Logger::notice('Killed sleeping process', ['id' => $process['Id']]); + } + DBA::close($processes); + } } From d5280c3dc33a78aa39ca53c830121d936f8fbf75 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 6 Jan 2021 23:08:09 +0000 Subject: [PATCH 24/25] Removed to-do comment --- src/Worker/Cron.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Worker/Cron.php b/src/Worker/Cron.php index 1f1e91630..7257101d9 100644 --- a/src/Worker/Cron.php +++ b/src/Worker/Cron.php @@ -154,7 +154,6 @@ class Cron $processes = DBA::p("SHOW FULL PROCESSLIST"); while ($process = DBA::fetch($processes)) { - // To-Do: Auf Datenbank abgrenzen if (($process['Command'] != 'Sleep') || ($process['Time'] < 60) || ($process['db'] != DBA::databaseName())) { continue; } From 0fd01015e136ca9bef98ecce480158400e81ffd7 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 6 Jan 2021 23:24:00 +0000 Subject: [PATCH 25/25] Increase wait time to 5 minutes --- src/Worker/Cron.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Worker/Cron.php b/src/Worker/Cron.php index 7257101d9..acb5132af 100644 --- a/src/Worker/Cron.php +++ b/src/Worker/Cron.php @@ -154,7 +154,7 @@ class Cron $processes = DBA::p("SHOW FULL PROCESSLIST"); while ($process = DBA::fetch($processes)) { - if (($process['Command'] != 'Sleep') || ($process['Time'] < 60) || ($process['db'] != DBA::databaseName())) { + if (($process['Command'] != 'Sleep') || ($process['Time'] < 300) || ($process['db'] != DBA::databaseName())) { continue; }