/** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ /** * @file * Pathologic text filter for Drupal. * * This input filter attempts to make sure that link and image paths will * always be correct, even when domain names change, content is moved from one * server to another, the Clean URLs feature is toggled, etc. */ /** * Implements hook_filter_info(). */ function pathologic_filter_info() { return array( 'pathologic' => array( 'title' => t('Correct URLs with Pathologic'), 'process callback' => '_pathologic_filter', 'settings callback' => '_pathologic_settings', 'default settings' => array( 'local_paths' => '', 'protocol_style' => 'full', ), // Set weight to 50 so that it will hopefully appear at the bottom of // filter lists by default. 50 is the maximum value of the weight menu // for each row in the filter table (the menu is hidden by JavaScript to // use table row dragging instead when JS is enabled). 'weight' => 50, ) ); } /** * Settings callback for Pathologic. */ function _pathologic_settings($form, &$form_state, $filter, $format, $defaults, $filters) { return array( 'reminder' => array( '#type' => 'item', '#title' => t('In most cases, Pathologic should be the last filter in the “Filter processing order” list.'), '#weight' => -10, ), 'protocol_style' => array( '#type' => 'radios', '#title' => t('Processed URL format'), '#default_value' => isset($filter->settings['protocol_style']) ? $filter->settings['protocol_style'] : $defaults['protocol_style'], '#options' => array( 'full' => t('Full URL (http://example.com/foo/bar)'), 'proto-rel' => t('Protocol relative URL (//example.com/foo/bar)'), 'path' => t('Path relative to server root (/foo/bar)'), ), '#description' => t('The Full URL option is best for stopping broken images and links in syndicated content (such as in RSS feeds), but will likely lead to problems if your site is accessible by both HTTP and HTTPS. Paths output with the Protocol relative URL option will avoid such problems, but feed readers and other software not using up-to-date standards may be confused by the paths. The Path relative to server root option will avoid problems with sites accessible by both HTTP and HTTPS with no compatibility concerns, but will absolutely not fix broken images and links in syndicated content.'), '#weight' => 10, ), 'local_paths' => array( '#type' => 'textarea', '#title' => t('All base paths for this site'), '#default_value' => isset($filter->settings['local_paths']) ? $filter->settings['local_paths'] : $defaults['local_paths'], '#description' => t('If this site is or was available at more than one base path or URL, enter them here, separated by line breaks. For example, if this site is live at http://example.com/ but has a staging version at http://dev.example.org/staging/, you would enter both those URLs here. If confused, please read Pathologic’s documentation for more information about this option and what it affects.', array('!docs' => 'http://drupal.org/node/257026')), '#weight' => 20, ), ); } /** * Pathologic filter callback. * * Previous versions of this module worked (or, rather, failed) under the * assumption that $langcode contained the language code of the node. Sadly, * this isn't the case. * @see http://drupal.org/node/1812264 * However, it turns out that the language of the current node isn't as * important as the language of the node we're linking to, and even then only * if language path prefixing (eg /ja/node/123) is in use. REMEMBER THIS IN THE * FUTURE, ALBRIGHT. * * @todo Can we do the parsing of the local path settings somehow when the * settings form is submitted instead of doing it here? */ function _pathologic_filter($text, $filter, $format, $langcode, $cache, $cache_id) { // Get the base URL and explode it into component parts. We add these parts // to the exploded local paths settings later. global $base_url; $base_url_parts = parse_url($base_url . '/'); // Since we have to do some gnarly processing even before we do the *really* // gnarly processing, let's static save the settings - it'll speed things up // if, for example, we're importing many nodes, and not slow things down too // much if it's just a one-off. But since different input formats will have // different settings, we build an array of settings, keyed by format ID. $settings = &drupal_static(__FUNCTION__, array()); if (!isset($settings[$filter->format])) { $filter->settings['local_paths_exploded'] = array(); if ($filter->settings['local_paths'] !== '') { // Build an array of the exploded local paths for this format's settings. // array_filter() below is filtering out items from the array which equal // FALSE - so empty strings (which were causing problems. // @see http://drupal.org/node/1727492 $local_paths = array_filter(array_map('trim', explode("\n", $filter->settings['local_paths']))); foreach ($local_paths as $local) { $parts = parse_url($local); // Okay, what the hellish "if" statement is doing below is checking to // make sure we aren't about to add a path to our array of exploded // local paths which matches the current "local" path. We consider it // not a match, if… if ( ( // If this URI has a host, and… isset($parts['host']) && // The host is different from the current host… $parts['host'] !== $base_url_parts['host'] ) || // Or… ( // The URI doesn't have a host… !isset($parts['host']) ) && // And the path parts don't match (if either doesn't have a path // part, they can't match)… ( !isset($parts['path']) || !isset($base_url_parts['path']) || $parts['path'] !== $base_url_parts['path'] ) ) { // Add it to the list. $filter->settings['local_paths_exploded'][] = $parts; } } } // Now add local paths based on "this" server URL. $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path']); $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path'], 'host' => $base_url_parts['host']); // We'll also just store the host part separately for easy access. $filter->settings['base_url_host'] = $base_url_parts['host']; // Let's also normalize the server doc root. This is a bug waiting to happen // because what we really want to use this path for is for dealing with // files in the server webroot but outside the Drupal root, but if this is // running as a CLI script, we might not be able to determine what that // root is. In that case, we'll use the Drupal root. // @see http://drupal.org/node/1780398 $filter->settings['docroot'] = (drupal_is_cli() || !isset($_SERVER) || !isset($_SERVER['DOCUMENT_ROOT'])) ? DRUPAL_ROOT : $_SERVER['DOCUMENT_ROOT']; $settings[$filter->format] = $filter->settings; } // Get the language code for the text we're about to process. $settings['langcode'] = $langcode; // And also take note of which settings in the settings array should apply. $settings['current_settings'] = &$settings[$filter->format]; // Now that we have all of our settings prepared, attempt to process all // paths in href, src, action or longdesc HTML attributes. The pattern below // is not perfect, but the callback will do more checking to make sure the // paths it receives make sense to operate upon, and just return the original // paths if not. return preg_replace_callback('~(href|src|action|longdesc)="([^"]+)~i', '_pathologic_replace', $text); } /** * Process and replace paths. preg_replace_callback() callback. */ function _pathologic_replace($matches) { // Get the settings for the filter. Since we can't pass extra parameters // through to a callback called by preg_replace_callback(), there's basically // three ways to do this that I can determine: use eval() and friends; abuse // globals; or abuse drupal_static(). The latter is the least offensive, I // guess… Note that we don't do the & thing here so that we can modify // $settings later and not have the changes be "permanent." $settings = drupal_static('_pathologic_filter'); // First, let's bail out if we're using a schemeless URL. // @see http://drupal.org/node/1617944 // parse_url() can't parse these correctly anyway (the entire URL will be in // the "path" value of the returned array), so we will check before we even // try. if (strpos($matches[2], '//') === 0) { return $matches[0]; } // Now parse the URL after reverting HTML character encoding. // @see http://drupal.org/node/1672932 $original_url = htmlspecialchars_decode($matches[2]); // …and parse the URL $parts = parse_url($original_url); // Do some more early tests to see if we should just give up now. if ( // If parse_url() failed, give up. $parts === FALSE // If there's a scheme part and it doesn't look useful, bail out. // "files" and "internal" are for Path Filter compatibility. || (isset($parts['scheme']) && !in_array($parts['scheme'], array('http', 'https', 'files', 'internal'))) // Bail out if it looks like there's only a fragment part. || (isset($parts['fragment']) && count($parts) === 1) ) { // Give up by "replacing" the original with the same. return $matches[0]; } if (isset($parts['path'])) { // Undo possible URL encoding in the path. // @see http://drupal.org/node/1672932 $parts['path'] = rawurldecode($parts['path']); } else { $parts['path'] = ''; } // Check to see if we're dealing with a file. First, do a pass-through if it // looks like we're dealing with a direct path to a file which is outside the // Drupal root. Use realpath() and the server's (?) docroot to iron out // wrinkles to the file's actual path. // @see http://drupal.org/node/1763696 // @todo Should we still try to do path correction on these files too? $filepath = realpath($settings['current_settings']['docroot'] . '/' . $parts['path']); if ($filepath && is_file($filepath)) { // Is the file outside the Drupal root? if (strpos($filepath, DRUPAL_ROOT) !== 0) { return $matches[0]; } else { // Linking to a file inside the Drupal root. Okay. $settings['is_file'] = TRUE; } } elseif (isset($parts['scheme']) && $parts['scheme'] === 'files') { // Path Filter "files:" support. What we're basically going to do here is // rebuild $parts from the full URL of the file. $new_parts = parse_url(file_create_url(file_default_scheme() . '://' . $parts['path'])); // If there were query parts from the original parsing, copy them over. if (!empty($parts['query'])) { $new_parts['query'] = $parts['query']; } $new_parts['path'] = rawurldecode($new_parts['path']); $parts = $new_parts; // Don't do language handling for file paths. $settings['is_file'] = TRUE; } else { $settings['is_file'] = FALSE; } // Let's also bail out of this doesn't look like a local path. $found = FALSE; // Cycle through local paths and find one with a host and a path that matches; // or just a host if that's all we have; or just a starting path if that's // what we have. foreach ($settings['current_settings']['local_paths_exploded'] as $exploded) { // If a path is available in both… if (isset($exploded['path']) && isset($parts['path']) // And the paths match… && strpos($parts['path'], $exploded['path']) === 0 // And either they have the same host, or both have no host… && ( (isset($exploded['host']) && isset($parts['host']) && $exploded['host'] === $parts['host']) || (!isset($exploded['host']) && !isset($parts['host'])) ) ) { // Remove the shared path from the path. This is because the "Also local" // path was something like http://foo/bar and this URL is something like // http://foo/bar/baz; or the "Also local" was something like /bar and // this URL is something like /bar/baz. And we only care about the /baz // part. $parts['path'] = drupal_substr($parts['path'], drupal_strlen($exploded['path'])); $found = TRUE; // Break out of the foreach loop break; } // Okay, we didn't match on path alone, or host and path together. Can we // match on just host? Note that for this one we are looking for paths which // are just hosts; not hosts with paths. elseif ((isset($parts['host']) && !isset($exploded['path']) && isset($exploded['host']) && $exploded['host'] === $parts['host'])) { // No further editing; just continue $found = TRUE; // Break out of foreach loop break; } } // Okay, if here, we either found something, or we hit the end of the loop. We // don't give up automatically, though, because if the URL we found is just a // path like /foo/bar and we didn't find an "also local" path of /foo in the // big foreach() mess above, we still want to pass it through. if (!$found && !(isset($parts['path']) && !isset($parts['host']))) { return $matches[0]; } // Examine the query part of the URL. Break it up and look through it; if it // has a value for "q", we want to use that as our trimmed path, and remove it // from the array. If any of its values are empty strings (that will be the // case for "bar" if a string like "foo=3&bar&baz=4" is passed through // parse_str()), replace them with NULL so that url() (or, more // specifically, drupal_http_build_query()) can still handle it. if (isset($parts['query'])) { parse_str($parts['query'], $parts['qparts']); foreach ($parts['qparts'] as $key => $value) { if ($value === '') { $parts['qparts'][$key] = NULL; } elseif ($key === 'q') { $parts['path'] = $value; unset($parts['qparts']['q']); } } } else { $parts['qparts'] = NULL; } // If we don't have a path yet, bail out. if (!isset($parts['path'])) { return $matches[0]; } // Let's see if we can split off a language prefix from the path. if (!$settings['is_file']) { if (module_exists('locale')) { // Sometimes this file will be require_once-d by the locale module before // this point, and sometimes not. We require_once it ourselves to be sure. require_once DRUPAL_ROOT . '/includes/language.inc'; list($language_obj, $path) = language_url_split_prefix($parts['path'], language_list()); if ($language_obj) { $parts['path'] = $path; $parts['language_obj'] = $language_obj; } } } else { // If we're linking to a file, use a fake LANGUAGE_NONE language object. // Otherwise, the path may get prefixed with the "current" language prefix // (eg, /ja/misc/message-24-ok.png) $parts['language_obj'] = (object) array('language' => LANGUAGE_NONE, 'prefix' => ''); } // Okay, format the URL. // If there's still a slash lingering at the start of the path, chop it off. // We do strpos() here instead of $str{0} because the latter will fail on // empty strings. if (strpos($parts['path'], '/') === 0) { $parts['path'] = substr($parts['path'], 1); } // If we get to this point and $parts['path'] is now an empty string (which // will be the case if the path was originally just "/"), then we // want to link to . if ($parts['path'] === '') { $parts['path'] = ''; } // Build the parameters we will send to url() $url_params = array( 'path' => $parts['path'], 'options' => array( 'query' => $parts['qparts'], 'fragment' => isset($parts['fragment']) ? $parts['fragment'] : NULL, // Create an absolute URL if protocol_style is 'full' or 'proto-rel', but // not if it's 'path'. 'absolute' => $settings['current_settings']['protocol_style'] !== 'path', // If we seem to have found a language for the path, pass it along to // url(). Otherwise, ignore the 'language' parameter. 'language' => isset($parts['language_obj']) ? $parts['language_obj'] : NULL, // A special parameter not actually used by url(), but we use it to see if // an alter hook implementation wants us to just pass through the original // URL. 'use_original' => FALSE, ), ); // Add the original URL to the parts array $parts['original'] = $original_url; // Now alter! // @see http://drupal.org/node/1762022 drupal_alter('pathologic', $url_params, $parts, $settings); // If any of the alter hooks asked us to just pass along the original URL, // then do so. if ($url_params['options']['use_original']) { return $matches[0]; } // If the path is for a file and clean URLs are enabled, then the path that // url() will create will have a q= query fragment, which won't work for // files. To avoid that, we use this trick to temporarily turn clean URLs on. // This is horrible, but it seems to be the sanest way to do this. // @see http://drupal.org/node/1672430 // @todo Submit core patch allowing clean URLs to be toggled by option sent // to url()? if (!empty($settings['is_file'])) { $settings['orig_clean_url'] = !empty($GLOBALS['conf']['clean_url']); if (!$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = TRUE; } } // Now for the url() call. Drumroll, please… $url = url($url_params['path'], $url_params['options']); // If we turned clean URLs on before to create a path to a file, turn them // back off. if ($settings['is_file'] && !$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = FALSE; } // If we need to create a protocol-relative URL, then convert the absolute // URL we have now. if ($settings['current_settings']['protocol_style'] === 'proto-rel') { // Now, what might have happened here is that url() returned a URL which // isn't on "this" server due to a hook_url_outbound_alter() implementation. // We don't want to convert the URL in that case. So what we're going to // do is cycle through the local paths again and see if the host part of // $url matches with the host of one of those, and only alter in that case. $url_parts = parse_url($url); if (!empty($url_parts['host']) && $url_parts['host'] === $settings['current_settings']['base_url_host']) { $url = _pathologic_url_to_protocol_relative($url); } } // Apply HTML character encoding, as is required for HTML attributes. // @see http://drupal.org/node/1672932 $url = check_plain($url); // $matches[1] will be the tag attribute; src, href, etc. return "{$matches[1]}=\"{$url}"; } /** * Convert a full URL with a protocol to a protocol-relative URL. * * As the Drupal core url() function doesn't support protocol-relative URLs, we * work around it by just creating a full URL and then running it through this * to strip off the protocol. * * Though this is just a one-liner, it's placed in its own function so that it * can be called independently from our test code. */ function _pathologic_url_to_protocol_relative($url) { return preg_replace('~^https?://~', '//', $url); } Duktig flicka! | IHM

Duktig flicka!

Förra veckan var jag i Stockholm och jobbade för IHM, och redan i höstas hade jag kommit i kontakt med en tjej med en mycket spännande historia. Det känns konstigt att skriva historia för Theodora Nordqvist är bara 27 år men har redan en historiebok mer välfylld än de flesta av oss. Jag tar tunnelbanan mot Söder och vårt avtalade möte.

På vägen dit sitter jag och funderar på vad jag vet och vem jag ska träffa. Vi har bara haft kontakt via mail, och så har jag läst en artikel om henne. Hon växte upp i en familj med missbruk och våld, jag har också förstått att hon drabbats av mobbning och att hon själv betraktat sig som delvis stökig och revolterande under en period. Det är klart att bakgrunden måste ha påverkat henne, och det vore inte osannolikt om jag var på väg till ett möte med en mänsklig spillra. Men så är det inte. Jag är på väg till ett möte med en kraft, en urkraft!

Theodora möter mig på sitt kontor, beläget i samma lokaler som ett svenskt välkänt skivbolag, vi går ner en trappa och sätter oss lite ostört. Med risk för att betraktas som gubbig måste jag säga att mitt första intryck av henne är; glad, söt och ljuv. Jag säger det för att ni ska känna samma kontrast som jag när vi börjar prata om missbruk. Thea berättar om sina första levnadsår med en mamma som var alkoholist, inte en sliten alkis som du såg ute på gatorna, men hemma eller på fest så kunde hon aldrig sluta dricka. Men mitt i dimman kunde hon ändå sköta sitt liv så att omgivningen inte reagerade, eller inte reagerade tillräckligt. Hon berättar också om sin pappa från Västindien som har en helt annan missbruksproblematik, kontakten var dålig och idag obefintlig, Trots att hon berättar detta som en självklarhet och med inneboende styrka, så måste jag fråga hur hon klarade sig.

Jag blev vuxen vid 7-årsåldern, säger hon. Jag fick min styrka genom deras svagheter, och jag insåg tidigt att jag måste forma mitt liv själv. Det är därifrån jag har fått mitt kontrollbehov säger hon och ler. Jag var ensam, och jag visste att om något skulle hända fick jag göra det själv. Jag var en duktig flicka som alltid ville vara bäst, och jag blev det också. Jag fick aldrig vara ledsen, och rent materiellt blev jag bortskämd. Jag levde i ett luftslott.

Mitt i allt detta känner jag hennes stora kärlek till sin mamma, samtidigt som hon inte godtar bortförklaringar konstaterar hon att mamman gjorde sitt allra bästa och att mamman trots allt varit en stor förebild, både som mor och människa. Vid 12-årsåldern dör mormodern som har funnits i bakgrunden som ett stort stöd. Detta medför också att mamman tar tag i sitt liv och blir nykter.

Då vänder det nu säger jag lite frågande?

På ett sätt, ja, säger Thea. (Hon har nu brutit helt med sin pappa och med en mamma som börjar komma på fötter revolterar hon själv.) Hela jag skrek; SE MIG! Jag fortsatte att vara duktig flicka i skolan, men utanför och hemma så blev jag under en period väldigt stökig. Jag gjorde min prao i köket på Kafé 44, ett underbart ställe med en massa punkare och anarkister. När jag var klar med min prao sökte jag jobb där, men Tompa sa att jag var alldeles för ung för att jobba. Jag svarade att jag i så fall kommer att hänga där, och det gjorde jag.

Något år senare fick jag känna av baksidan av att vara duktig flicka i skolan. Några tjejer retade sig på mig och jag blev rejält mobbad. Jag orkade inte stå emot och bytte skola, vilket blev ganska bra. Jag fick nya influenser, och när det var dags för gymnasiet så sökte jag mig till Viktor Rydbergs gymnasium. Mitt intresse för teater hade jag inte bejakat sedan jag var programledare för ”Juniorchansen” tillsammans med Joakim Geigert och Claes Malmberg i 7-årsåldern. Men nu på teaterskolan med en massa esteter från hela Stockholm stormtrivdes jag! Vi var som en stor familj. Jag har gått i en massa terapi genom åren, och det här var en terapi för min teatersjäl, jag gillade inte att vara på scenen utan mer åt regi-hållet. Som examensarbete ringde jag upp Lars Norén och frågade om jag fick sätta upp "Trio till tidens ände”, en komplicerad pjäs som jag kortade ner till tre timmar. Hon ler varmt vid minnet av sin regidebut.

Under gymnasiet har hon börjat jobba extra på Kafé 44, bestämmer sig för att flytta hemifrån och 17 år gammal köper hon sin första lägenhet med hjälp av sparade pengar och ett lån som hennes mamma skriver på. Kom ihåg att det var ett lån, säger Thea lite skarpt till mig. Här kan jag skymta både Theas kontrollbehov och självständighet. Jag lovar att inte glömma det, säger jag. Hon betalade tillbaka hela summan plus ränta bara sex år senare.

Att ha egen lägenhet redan vid 17-årsåldern när man går i gymnasiet innebär väl ganska mycket festande?

Klart det var fest någon gång, men jag var fortfarande väldigt målmedveten med skolan och jag behövde jobba mycket extra för att få allt att gå runt, säger Thea. Efter råddande med banden och jobb i köket på Kafé 44 hade jag nu börjat jobba på Gulan, en skateboard-shop på Söder, och jag sökte olika extrajobb hela tiden. Även om jag tyckte att allt med musik var roligt så såg jag det fortfarande som en hobby. Strax innan studenten ringde jag upp MIKAs modellagentur i Stockholm och skrev även i ett långt mejl att agenturyrket var något jag var väldigt intresserad av. Jag fick chansen men vi klickade inte så bra och efter ett tag fick jag sparken. Men jag tyckte om den världen, 20 år gammal startade jag en egen agentur med några vänner,  ”Kid Of Tomorrow”, med annorlunda modeller, illustratörer, fotografer och stylister. Det gick jättebra och vi jobbade med flera reklambyråer som älskade vårt urval av modeller och kreatörer. Det snurrade på allt fortare, och ca två år efter starten brakade jag rätt in i väggen. Jag gick omedvetet in i någon form av automatläge, stängde av allt, bara låg i sängen, fast jag inte riktigt förstod det. Efter en vecka kom mamma hem och frågade vad som stod på. Jag svarade att jag jobbade för fullt. Men du har inte varit på jobbet på en vecka och telefonen är avstängd, sa mamma. Då fattade jag, jag hade varit duktig flicka alldeles för länge, jag blev sjukskriven i sex månader och min mamma fick vara mamma igen.

Under dessa sex månader började jag ompröva delar av mig själv, och med hjälp av terapi började jag sakta bygga upp mig själv. Jag behövde inte vara duktig flicka inför min omgivning längre, jag behövde göra mitt yrkesval utifrån mig själv. Klart jag ville vara duktig på det jag skulle göra, men på mina premisser och utifrån vad jag tyckte var kul. Jag funderade på vad min bakgrund gett mig för styrkor och tänkte att PR-branschen kanske vore något att pröva på. Jag tog en kurs inom PR och Kommunikation och insåg att det var precis rätt. Jag fick jobb på en PR-byrå och ett av mina bästa jobb blev ett PR-event för klädföretaget Fred Perry. Vi hade Gary Mounfield, basisten från Stone Roses och Primal Scream med på eventet - det blev grymt bra! Även en efterfest med The Specials blev enormt lyckad; de brukade alltid gå efter en halvtimma men nu var de kvar till halv tre på morgonen. Dom på Fred Perry älskade det jag gjorde, och jag började så sakta förstå att jag gillade musikbranschen, säger Thea och skrattar. Efter 2,5 år inom PR med mycket modejobb, och mot slutet mer och mer för musikbranschen, så kände jag att det var dags! Det var dags för musikbranschen.

Jag tog med mig mina tidigare erfarenheter och hela min historia och åkte upp till Oslo där ”Made” har sitt huvudkontor – det i mina ögon bästa managementbolaget inom musik. Jag föreslog att jag skulle starta upp deras kontor i Stockholm, och så blev det. Jag satte igång som ett renodlat management för några band, det var jätteroligt och efter ett tag utökade vi med en PR-del, den delen har Ami Mörén ansvar för. Visst jag är VD, men det är inte så viktigt, jag jobbar både strategiskt och operativt och vi är lika stora delar Made båda två. Jag vill vara nära mina band och jag märkte snabbt att mina tidigare erfarenheter i livet hjälpte mig nu. Colleagues, Caviare Days, Syket och Solen är några av banden och idag känner jag verkligen att jag bara vill jobba med musik, kreativ musik, och med människor som har samma vision, bli störst och bäst. Jag ska bli världens bästa manager, och jag ska göra det på mitt sätt!

Ett möte på en timma blev över två timmar, och jag avslutar med att ta några foton på Theodora, som förresten är ett namn hon själv valde när hon var 15 år. Hon berättar att hon gift sig för några veckor sedan och har fått bonusbarn. Hon har precis köpt hund och är så lycklig. Jag bara ler och beger mig mot tunnelbanan.

Jag funderar på vad jag precis hört och varför jag ska skriva om detta. Jag är uppfylld av den här människan, jag säger det igen, glad, söt och ljuv, med krafter som ett kärnkraftverk, en kvinna i karriären som ger hopp om framtiden. Jag vill inte att det ska behöva vara ett blogginlägg med genusperspektiv. Jag vill inte heller att det ska vara en snyfthistoria om barn till missbrukare. Jag vill att det blir ett blogginlägg som inspirerar, berör och skapar en tro på framtiden, allas framtid. Jag vill att ni ska känna samma kraft som jag kände när jag lämnade Thea. Och jag vill att hon blir världens lyckligaste och bästa manager!

Er man vid pianot

Aludd

PS: Hoppas att Zlatan läser detta blogginlägg också, så kanske han byter manager, om nu Thea vill jobba lite utanför musikbranschen!

19 mars 2015
Läs intervjun med Åsa Sånemyr, VD på klädföretaget Hope.
Använd Killinggängets teknik för kreativa möten.