<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[WiggleWaggleWorth]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://wigglewaggleworth.com/</link><image><url>https://wigglewaggleworth.com/favicon.png</url><title>WiggleWaggleWorth</title><link>https://wigglewaggleworth.com/</link></image><generator>Ghost 5.88</generator><lastBuildDate>Sun, 12 Apr 2026 08:33:39 GMT</lastBuildDate><atom:link href="https://wigglewaggleworth.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Test Post - Wiggle Meter Trial]]></title><description><![CDATA[<!--kg-card-begin: html-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Wiggle-Meter</title>
<link href="https://fonts.googleapis.com/css2?family=Patrick+Hand&amp;family=Playpen+Sans&amp;display=swap" rel="stylesheet">
<style>
  body {
    background: #f5e7c6;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    margin: 0;
  }
  .card {
    background: #fff;
    border: 3px solid #CC3322;
    border-radius: 20px;
    padding: 22px 20px 20px 20px;
    width: 300px;
    text-align: center;
    box-shadow: 4px 4px 0px #CC3322;
    position: relative;
    box-sizing: border-box;
  }
  .title { font-family: 'Patrick Hand', cursive; font-size: 22px; color: #CC3322;</style></html>]]></description><link>https://wigglewaggleworth.com/test-post-wiggle-meter-trial/</link><guid isPermaLink="false">69ae6a979f55f46308208f94</guid><dc:creator><![CDATA[The Butler]]></dc:creator><pubDate>Mon, 09 Mar 2026 06:38:36 GMT</pubDate><content:encoded><![CDATA[
<!--kg-card-begin: html-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Wiggle-Meter</title>
<link href="https://fonts.googleapis.com/css2?family=Patrick+Hand&amp;family=Playpen+Sans&amp;display=swap" rel="stylesheet">
<style>
  body {
    background: #f5e7c6;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    margin: 0;
  }
  .card {
    background: #fff;
    border: 3px solid #CC3322;
    border-radius: 20px;
    padding: 22px 20px 20px 20px;
    width: 300px;
    text-align: center;
    box-shadow: 4px 4px 0px #CC3322;
    position: relative;
    box-sizing: border-box;
  }
  .title { font-family: 'Patrick Hand', cursive; font-size: 22px; color: #CC3322; margin: 0 0 2px 0; }
  .animal { font-family: 'Playpen Sans', cursive; font-size: 12px; color: #888; font-style: italic; margin: 0 0 16px 0; }
  .score-display { font-family: 'Patrick Hand', cursive; font-size: 15px; color: #888; margin: 12px 0 4px 0; }
  .score-display span { font-size: 30px; color: #E65C00; font-weight: bold; }
  .level-name { font-family: 'Playpen Sans', cursive; font-size: 13px; color: #CC3322; font-style: italic; min-height: 20px; margin: 0 0 12px 0; }
  hr { border: none; border-top: 1.5px dashed #eee; margin: 0 0 12px 0; }
  .vote-label { font-family: 'Patrick Hand', cursive; font-size: 12px; color: #aaa; margin: 0 0 8px 0; }
  .vote-buttons { display: flex; gap: 7px; justify-content: center; margin-bottom: 10px; }
  .vote-btn {
    width: 36px; height: 36px; border-radius: 50%;
    border: 2.5px solid #CC3322; background: #fff;
    font-family: 'Patrick Hand', cursive; font-size: 15px; font-weight: bold;
    color: #CC3322; cursor: pointer; transition: all 0.15s;
  }
  .vote-btn:hover { background: #CC3322; color: #fff; transform: scale(1.12); }
  .vote-btn.selected { background: #CC3322; color: #fff; }
  .vote-btn:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
  .vote-count { font-family: 'Playpen Sans', cursive; font-size: 11px; color: #ccc; margin: 0 0 4px 0; }
  .paid-note { font-family: 'Playpen Sans', cursive; font-size: 10px; color: #CC3322; font-style: italic; margin: 6px 0 0 0; opacity: 0.75; }
  .status-msg { font-family: 'Playpen Sans', cursive; font-size: 11px; color: #2E7D32; margin: 4px 0 0 0; min-height: 16px; }
  .loading-msg { font-family: 'Playpen Sans', cursive; font-size: 11px; color: #aaa; margin: 4px 0; }
  .paw-deco { font-size: 10px; opacity: 0.15; position: absolute; }
  .paw-deco.tl { top: 9px; left: 11px; }
  .paw-deco.br { bottom: 9px; right: 11px; }
  @keyframes cardwiggle {
    0%,100% { transform: rotate(0deg); }
    20% { transform: rotate(-3deg); }
    50% { transform: rotate(3deg); }
    80% { transform: rotate(-2deg); }
  }
  .wiggling { animation: cardwiggle 0.45s ease-in-out; }
  @keyframes spin {
    from { transform: rotate(0deg); }
    to   { transform: rotate(360deg); }
  }
  .spinner {
    display: inline-block;
    width: 14px; height: 14px;
    border: 2px solid #eee;
    border-top-color: #E65C00;
    border-radius: 50%;
    animation: spin 0.7s linear infinite;
    vertical-align: middle;
    margin-right: 4px;
  }

  /* ── LAYOUT ── */
  .thermo-outer {
    display: flex;
    flex-direction: row;
    align-items: flex-start;
    justify-content: center;
    margin: 0 auto 8px auto;
  }
  .thermo-labels {
    position: relative;
    width: 95px;
    height: 280px;
    margin-right: 6px;
    flex-shrink: 0;
  }
  .thermo-label {
    position: absolute;
    right: 0;
    font-family: 'Patrick Hand', cursive;
    font-size: 13px;
    color: #bbb;
    text-align: right;
    line-height: 1.3;
  }
  .thermo-label.active { color: #E65C00; font-weight: bold; }
  .thermo-ticks {
    position: relative;
    width: 36px;
    height: 280px;
    margin-left: 6px;
    flex-shrink: 0;
  }
  .tick {
    position: absolute;
    left: 0;
    display: flex;
    align-items: center;
    gap: 5px;
  }
  .tick-line { width: 10px; height: 2.5px; background: #E65C00; border-radius: 1px; flex-shrink: 0; }
  .tick-num  { font-family: 'Patrick Hand', cursive; font-size: 14px; color: #E65C00; line-height: 1; }
  .tick.active .tick-line { width: 14px; background: #CC3322; }
  .tick.active .tick-num  { color: #CC3322; font-weight: bold; }
</style>
</head>
<body>
<div class="card" id="meter">
  <div class="paw-deco tl">&#x1F43E;</div>
  <div class="paw-deco br">&#x1F43E;</div>
  <p class="title">&#x1F321; Wiggle-Meter</p>
  <p class="animal" id="animal-name">Loading...</p>

  <div class="thermo-outer">
    <div class="thermo-labels">
      <div class="thermo-label" id="lbl5" style="top:16px">Full Body<br>Wiggle!</div>
      <div class="thermo-label" id="lbl4" style="top:53px">Definite<br>Wag</div>
      <div class="thermo-label" id="lbl3" style="top:90px">Tail<br>Twitch</div>
      <div class="thermo-label" id="lbl2" style="top:127px">One Paw<br>Out</div>
      <div class="thermo-label" id="lbl1" style="top:164px">Tentative<br>Sniff</div>
    </div>

    <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 60 280" width="60" height="280" style="flex-shrink:0;">
      <defs>
        <lineargradient id="ogFill" x1="0%" y1="100%" x2="0%" y2="0%">
          <stop offset="0%" stop-color="#BF3A00"/>
          <stop offset="50%" stop-color="#E65C00"/>
          <stop offset="100%" stop-color="#FF9944"/>
        </lineargradient>
        <clippath id="innerClip">
          <rect x="20" y="15" width="20" height="207"/>
          <circle cx="30" cy="245" r="22"/>
        </clippath>
      </defs>
      <!-- Thermometer outline -->
      <path d="M 17,26 Q 17,8 30,8 Q 43,8 43,26 L 43,212 Q 43,218 40,220 A 25,25 0 1,1 20,220 Q 17,218 17,212 Z" fill="#f9f9f9" stroke="#CC3322" stroke-width="2.8" stroke-linejoin="round"/>
      <!-- Orange fill -->
      <g clip-path="url(#innerClip)">
        <rect id="thermo-fill" x="17" width="26" y="280" height="0" fill="url(#ogFill)"/>
      </g>
      <!-- Outline redrawn on top -->
      <path d="M 17,26 Q 17,8 30,8 Q 43,8 43,26 L 43,212 Q 43,218 40,220 A 25,25 0 1,1 20,220 Q 17,218 17,212 Z" fill="none" stroke="#CC3322" stroke-width="2.8" stroke-linejoin="round"/>
      <!-- Shine -->
      <rect x="21" y="16" width="6" height="190" rx="3" fill="white" opacity="0.4"/>
      <ellipse cx="22" cy="236" rx="5" ry="4" fill="white" opacity="0.3"/>
    </svg>

    <div class="thermo-ticks">
      <div class="tick" id="tick5" style="top:16px"> <div class="tick-line"></div><div class="tick-num">5</div></div>
      <div class="tick" id="tick4" style="top:53px"> <div class="tick-line"></div><div class="tick-num">4</div></div>
      <div class="tick" id="tick3" style="top:90px"> <div class="tick-line"></div><div class="tick-num">3</div></div>
      <div class="tick" id="tick2" style="top:127px"><div class="tick-line"></div><div class="tick-num">2</div></div>
      <div class="tick" id="tick1" style="top:164px"><div class="tick-line"></div><div class="tick-num">1</div></div>
    </div>
  </div>

  <p class="score-display">wiggle level: <span id="score-num">&#x2014;</span><span style="font-size:14px;color:#ddd"> /5</span></p>
  <p class="level-name" id="level-name">loading score...</p>
  <p class="loading-msg" id="loading-msg"></p>

  <hr>

  <!-- Vote section — shown to paid members, hidden to others -->
  <div id="vote-section">
    <p class="vote-label" id="vote-label">&#x1F5F3; cast your wiggle vote:</p>
    <div class="vote-buttons" id="vote-buttons">
      <button class="vote-btn" onclick="castVote(1)">1</button>
      <button class="vote-btn" onclick="castVote(2)">2</button>
      <button class="vote-btn" onclick="castVote(3)">3</button>
      <button class="vote-btn" onclick="castVote(4)">4</button>
      <button class="vote-btn" onclick="castVote(5)">5</button>
    </div>
    <p class="status-msg" id="status-msg"></p>
  </div>

  <p class="vote-count" id="vote-count"></p>
  <p class="paid-note" id="paid-note"></p>
</div>

<script>
  // ═══════════════════════════════════════════════
  // CONFIGURATION — change these per post
  // ═══════════════════════════════════════════════
  const ANIMAL_ID   = "biscuit-the-beagle";   // ← CHANGE THIS for each animal post
  const ANIMAL_NAME = "Biscuit the Beagle";   // ← CHANGE THIS for each animal post

  // Supabase credentials
  const SUPABASE_URL = "https://efbylljsyrwpfpgpghoo.supabase.co";
  const SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImVmYnlsbGpzeXJ3cGZwZ3BnaG9vIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzMwMzY4MTcsImV4cCI6MjA4ODYxMjgxN30.bXiD4-D3IurkXIRsy3fzNKorrN-6qgQM7X47fZHK6J0";

  // ═══════════════════════════════════════════════
  // FILL POSITIONS — hardcoded for perfect alignment
  // ═══════════════════════════════════════════════
  const POSITIONS = {
    0: { y: 280, h: 0   },
    1: { y: 164, h: 117 },
    2: { y: 127, h: 154 },
    3: { y: 90,  h: 191 },
    4: { y: 53,  h: 228 },
    5: { y: 16,  h: 265 }
  };

  const levelNames = {
    1: "Tentative Sniff",
    2: "One Paw Out",
    3: "Tail Twitch",
    4: "Definite Wag",
    5: "Full Body Wiggle! 🎉"
  };

  // ═══════════════════════════════════════════════
  // GHOST MEMBER DETECTION
  // Uses Ghost's /members/api/member/ endpoint
  // which is the reliable way to get member data
  // ═══════════════════════════════════════════════
  let _memberData = undefined;

  async function fetchMemberData() {
    if (_memberData !== undefined) return _memberData;
    try {
      const res = await fetch('/members/api/member/');
      if (res.status === 204 || res.status === 401) {
        _memberData = null;
        return null;
      }
      const data = await res.json();
      _memberData = data;
      return data;
    } catch(e) {
      _memberData = null;
      return null;
    }
  }

  async function isPaidMember() {
    const member = await fetchMemberData();
    if (!member) return false;
    if (member.paid) return true;
    if (member.subscriptions && member.subscriptions.length > 0) {
      return member.subscriptions.some(s => s.status === 'active');
    }
    return false;
  }

  async function getMemberEmail() {
    const member = await fetchMemberData();
    return member ? member.email : null;
  }

  // ═══════════════════════════════════════════════
  // SUPABASE API CALLS
  // ═══════════════════════════════════════════════
  const headers = {
    'apikey': SUPABASE_KEY,
    'Authorization': `Bearer ${SUPABASE_KEY}`,
    'Content-Type': 'application/json',
    'Prefer': 'return=representation'
  };

  // Fetch current average score for this animal
  async function fetchScore() {
    const res = await fetch(
      `${SUPABASE_URL}/rest/v1/wiggle_scores?animal_id=eq.${encodeURIComponent(ANIMAL_ID)}&select=average_score,total_votes`,
      { headers }
    );
    const data = await res.json();
    return data && data.length > 0 ? data[0] : { average_score: null, total_votes: 0 };
  }

  // Check if this member has already voted for this animal
  async function fetchExistingVote(email) {
    const res = await fetch(
      `${SUPABASE_URL}/rest/v1/wiggle_votes?animal_id=eq.${encodeURIComponent(ANIMAL_ID)}&member_email=eq.${encodeURIComponent(email)}&select=score`,
      { headers }
    );
    const data = await res.json();
    return data && data.length > 0 ? data[0].score : null;
  }

  // Submit a vote
  async function submitVote(email, score) {
    const res = await fetch(
      `${SUPABASE_URL}/rest/v1/wiggle_votes`,
      {
        method: 'POST',
        headers: { ...headers, 'Prefer': 'resolution=ignore-duplicates' },
        body: JSON.stringify({
          animal_id: ANIMAL_ID,
          member_email: email,
          score: score
        })
      }
    );
    return res.ok || res.status === 409; // 409 = already voted
  }

  // ═══════════════════════════════════════════════
  // UI HELPERS
  // ═══════════════════════════════════════════════
  function updateThermometer(avg, totalVotes) {
    const rounded = avg ? Math.round(avg) : 0;
    const pos = POSITIONS[rounded];

    // Animate fill
    const fill = document.getElementById('thermo-fill');
    fill.style.transition = 'y 0.9s cubic-bezier(0.25,1.4,0.5,1), height 0.9s cubic-bezier(0.25,1.4,0.5,1)';
    fill.setAttribute('y', pos.y);
    fill.setAttribute('height', pos.h);

    // Score text
    document.getElementById('score-num').textContent =
      avg ? parseFloat(avg).toFixed(1) : '—';
    document.getElementById('level-name').textContent =
      avg ? levelNames[rounded] : 'no wiggles yet';

    // Vote count
    document.getElementById('vote-count').textContent =
      totalVotes === 0 ? 'be the first to wiggle!' :
      totalVotes === 1 ? '1 wiggle cast' :
      `${totalVotes} wiggles cast`;

    // Highlight labels and ticks
    for (let i = 1; i <= 5; i++) {
      const active = (i === rounded && avg);
      document.getElementById('tick' + i).classList.toggle('active', active);
      document.getElementById('lbl'  + i).classList.toggle('active', active);
    }
  }

  function highlightButton(score) {
    document.querySelectorAll('.vote-btn').forEach((b,i) =>
      b.classList.toggle('selected', i+1 === score));
  }

  function wiggleMeter() {
    const m = document.getElementById('meter');
    m.classList.add('wiggling');
    setTimeout(() => m.classList.remove('wiggling'), 450);
  }

  function setStatus(msg, colour) {
    const el = document.getElementById('status-msg');
    el.textContent = msg;
    el.style.color = colour || '#2E7D32';
  }

  function disableButtons() {
    document.querySelectorAll('.vote-btn').forEach(b => b.disabled = true);
  }

  // ═══════════════════════════════════════════════
  // CAST VOTE
  // ═══════════════════════════════════════════════
  async function castVote(score) {
    const email = await getMemberEmail();
    if (!email) {
      setStatus('Please log in to vote.', '#CC3322');
      return;
    }
    if (!await isPaidMember()) {
      setStatus('Paid members only — upgrade to vote!', '#CC3322');
      return;
    }

    setStatus('💫 casting your wiggle...', '#888');
    disableButtons();

    const success = await submitVote(email, score);
    if (success) {
      highlightButton(score);
      setStatus('✅ wiggle cast — thank you!', '#2E7D32');
      wiggleMeter();

      // Refresh score from database
      const { average_score, total_votes } = await fetchScore();
      updateThermometer(average_score, total_votes);
    } else {
      setStatus('something went wrong — please try again', '#CC3322');
      document.querySelectorAll('.vote-btn').forEach(b => b.disabled = false);
    }
  }

  // ═══════════════════════════════════════════════
  // INITIALISE
  // ═══════════════════════════════════════════════
  async function init() {
    // Set animal name
    document.getElementById('animal-name').textContent = ANIMAL_NAME;

    // Show loading
    document.getElementById('loading-msg').innerHTML =
      '<span class="spinner"></span> loading wiggle score...';

    // Fetch current score
    const { average_score, total_votes } = await fetchScore();
    updateThermometer(average_score, total_votes);
    document.getElementById('loading-msg').textContent = '';

    // Check membership
    const paid = await isPaidMember();
    const email = await getMemberEmail();
    const voteSection = document.getElementById('vote-section');
    const paidNote = document.getElementById('paid-note');

    if (paid && email) {
      // Check if already voted
      const existingVote = await fetchExistingVote(email);
      if (existingVote) {
        // Already voted — show their vote, disable buttons
        highlightButton(existingVote);
        disableButtons();
        setStatus(`✅ you voted ${existingVote} — thank you!`, '#2E7D32');
        document.getElementById('vote-label').textContent = '🗳 your wiggle vote:';
      } else {
        document.getElementById('vote-label').textContent = '🗳 cast your wiggle vote:';
      }
      paidNote.textContent = '✦ paid members only ✦';
      voteSection.style.display = 'block';
    } else if (email) {
      // Free member — show upgrade prompt
      voteSection.style.display = 'none';
      paidNote.innerHTML = '✦ <a href="/#/portal/upgrade" style="color:#CC3322">upgrade to vote</a> on the Wiggle-Meter ✦';
    } else {
      // Not logged in
      voteSection.style.display = 'none';
      paidNote.innerHTML = '✦ <a href="/#/portal/signup" style="color:#CC3322">sign in</a> or <a href="/#/portal/upgrade" style="color:#CC3322">subscribe</a> to vote ✦';
    }
  }

  // Run on page load
  init();
</script>
</body>
</html>
<!--kg-card-end: html-->
]]></content:encoded></item><item><title><![CDATA[Welcome to WiggleWaggleWorth]]></title><description><![CDATA[<!--kg-card-begin: html-->
<p><em>A note from The Butler, on the occasion of WiggleWaggleWorth opening its doors.</em></p>

<p>You have arrived at WiggleWaggleWorth.</p>

<p>We are glad you are here. We are also, if we are being entirely candid, mildly surprised that any of this works. The server has been wrestled into submission, the couch has</p>]]></description><link>https://wigglewaggleworth.com/welcome-to-wigglewaggleworth/</link><guid isPermaLink="false">69a3a8079f55f46308208f73</guid><dc:creator><![CDATA[The Butler]]></dc:creator><pubDate>Sun, 01 Mar 2026 02:51:49 GMT</pubDate><content:encoded><![CDATA[
<!--kg-card-begin: html-->
<p><em>A note from The Butler, on the occasion of WiggleWaggleWorth opening its doors.</em></p>

<p>You have arrived at WiggleWaggleWorth.</p>

<p>We are glad you are here. We are also, if we are being entirely candid, mildly surprised that any of this works. The server has been wrestled into submission, the couch has been fluffed to regulation standard, and the animals &#x2014; metaphorically speaking &#x2014; have been informed that company is coming.</p>

<p>WiggleWaggleWorth exists because of a simple and stubbornly optimistic belief: that beneath every wild, frightened, chaotic, or thoroughly bewildered rescue animal, there is a wiggle waiting to happen. Our job &#x2014; yours and mine both &#x2014; is to find it.</p>

<p>This is a place for stories. For the dog who spent three weeks under the bed and then one Tuesday morning simply didn&apos;t. For the cat who arrived hissing at everything and now hisses at only most things, which is, frankly, progress. For the rabbit who has never once done what anyone expected and shows absolutely no intention of starting.</p>

<p>Every week, our community nominates one remarkable animal for the <a href="https://wigglewaggleworth.com/hall-of-the-wigglewaggles/">Hall of the WiggleWaggles</a> &#x2014; our highest honour, awarded by public vote to those who have shown extraordinary progress on their rehabilitation journey. Voting is open to all members. The results are announced with appropriate ceremony.</p>

<p>We also have <a href="https://wigglewaggleworth.com/tag/training-tips/">Training Tips</a>, written in the firm belief that positive reinforcement is a serious business that deserves to be discussed with considerably less seriousness than it usually receives.</p>

<p>There are <a href="https://wigglewaggleworth.com/departments/">Departments</a>. There is a <a href="https://wigglewaggleworth.com/the-wigglewaggle-pledge/">Pledge</a>. There is a <a href="https://wigglewaggleworth.com/code-of-conduct/">Code of Conduct</a>, which is mostly common sense dressed up in rather good prose.</p>

<p>And there is a form, should you have a story of your own to share. We hope you do. We are very much in the business of stories.</p>

<p>If you would like to participate fully &#x2014; to vote, to comment, to contest, to receive the complete weekly newsletter &#x2014; a <a href="https://wigglewaggleworth.com/#/portal/signup">paid membership</a> is available for $2 per month. In return, you receive our gratitude, our newsletter in its entirety, and the quiet satisfaction of knowing you are doing something good.</p>

<p>Welcome, then. Mind the cat. She is not technically supposed to be on the keyboard but has made her position on the matter extremely clear.</p>

<br>

<p><em>Established in Chaos, Refined in Love.</em></p>
<p><strong>&#x2014; The Butler</strong></p>
<!--kg-card-end: html-->
]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[<p>This is WiggleWaggleWorth, a brand new site that&apos;s just getting started. Things will be up and running here shortly, but you can <a href="#/portal/">subscribe</a> in the meantime if you&apos;d like to stay up to date and receive emails when new content is published!</p>]]></description><link>https://wigglewaggleworth.com/coming-soon/</link><guid isPermaLink="false">699aab3fffe76356bdf387b9</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[The Butler]]></dc:creator><pubDate>Sun, 22 Feb 2026 07:07:43 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/feature-image.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/feature-image.jpg" alt="Coming soon"><p>This is WiggleWaggleWorth, a brand new site that&apos;s just getting started. Things will be up and running here shortly, but you can <a href="#/portal/">subscribe</a> in the meantime if you&apos;d like to stay up to date and receive emails when new content is published!</p>]]></content:encoded></item></channel></rss>