<?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[Sh*t You Should Know]]></title><description><![CDATA[A collection of curated global news and original editorial, exploring various general topics and examining all sides of an issue. ]]></description><link>https://shtyoushouldknow.com/</link><image><url>https://shtyoushouldknow.com/favicon.png</url><title>Sh*t You Should Know</title><link>https://shtyoushouldknow.com/</link></image><generator>Ghost 3.40</generator><lastBuildDate>Mon, 05 Jan 2026 15:45:25 GMT</lastBuildDate><atom:link href="https://shtyoushouldknow.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Pigging out on palm oil]]></title><description><![CDATA[Palm oil futures' rally is being threatened by a surge in Chinese pig farming. The rally, fueled by limited supply and increased global demand due to COVID restrictions, is threatened by palm oil's growing price and the promise of a glut of soybean oil production related to Chinese pig farming.]]></description><link>https://shtyoushouldknow.com/pigging-out-on-palm-oil/</link><guid isPermaLink="false">600f848843e0c304e1fc79fa</guid><category><![CDATA[Finance]]></category><dc:creator><![CDATA[Ivan Parra-Orlandoni]]></dc:creator><pubDate>Tue, 26 Jan 2021 05:20:06 GMT</pubDate><media:content url="https://shtyoushouldknow.com/content/images/2021/01/4074823996_c4a83bd86e_b.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><img src="https://shtyoushouldknow.com/content/images/2021/01/4074823996_c4a83bd86e_b.jpg" alt="Pigging out on palm oil"><p style="font-size: .7em; margin-bottom: 20px; line-height: 1.3em !important;"><i><a href="https://www.flickr.com/photos/8819274@N04/4074823996"> "Palm oil mill" </a> by <a href="https://www.flickr.com/photos/8819274@N04">Marufish</a> is licensed under <a href="https://creativecommons.org/licenses/by-sa/2.0/?ref=ccsearch&atype=rich">CC BY-SA 2.0</a></i></p>
<style>
    @media only screen and (max-width: 767px){
.post-content div.text p {

    font-size: 1.2em;
    line-height: 1.85em;
        }}
   .twitter-tweet{
    margin-left: auto;
    margin-right: auto;
    }
</style><!--kg-card-end: html--><!--kg-card-begin: html--><style>
/*Initial Play Button*/
 @-webkit-keyframes spinInit {
  to {
    transform: rotate(360deg);
  }
}
@keyframes spinInit {
  to {
    transform: rotate(360deg);
  }
}
.stroke-dottedInit {
  opacity: 0;
  stroke-dasharray: 4,5;
  stroke-width: 1px;
  transform-origin: 50% 50%;
  -webkit-animation: spinInit 4s infinite linear;
          animation: spinInit 4s infinite linear;
  transition: opacity 1s ease,  stroke-width 1s ease;
}

.stroke-solidInit {
  stroke-dashoffset: 0;
  stroke-dashArray: 300;
  stroke-width: 4px;
  transition: stroke-dashoffset 1s ease,  opacity 1s ease;
}

.iconInit {
  transform-origin: 50% 50%;
  transition: transform 200ms ease-out;
}

#playInit:hover .stroke-dottedInit {
  stroke-width: 4px;
  opacity: 1;
}
#playInit:hover .stroke-solidInit {
  opacity: 0;
  stroke-dashoffset: 300;
}
#playInit:hover .icon {
  transform: scale(1.05);
}


#playInit {
  cursor: pointer;
}
 /*End Initial Play Button*/
 
 /*Audio Player*/
.holder {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-top: 0px;
  margin-bottom: 24px;
  font-family: "Roboto";
  color: #55606E;
}

.audio.green-audio-player {
  width: 320px;
  min-width: 200px;
  max-width: 75vw;
  height: 56px;
  box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.07);
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-left: 24px;
  padding-right: 24px;
  border-radius: 4px;
  user-select: none;
  -webkit-user-select: none;
  background-color: #fff;
}
.audio.green-audio-player .play-pause-btn {
  display: none;
  cursor: pointer;
}
.audio.green-audio-player .spinner {
  width: 18px;
  height: 18px;
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/355309/loading.png);
  background-size: cover;
  background-repeat: no-repeat;
  animation: spin 0.4s linear infinite;
}
.audio.green-audio-player .slider {
  flex-grow: 1;
  background-color: #D8D8D8;
  cursor: pointer;
  position: relative;
}
.audio.green-audio-player .slider .progress {
  background-color: #44BFA3;
  border-radius: inherit;
  position: absolute;
  pointer-events: none;
}
.audio.green-audio-player .slider .progress .pin {
  height: 16px;
  width: 16px;
  border-radius: 8px;
  background-color: #44BFA3;
  position: absolute;
  pointer-events: all;
  box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.32);
}
.audio.green-audio-player .controls {
  font-family: "Roboto", sans-serif;
  font-size: 16px;
  line-height: 18px;
  color: #55606E;
  display: flex;
  flex-grow: 1;
  justify-content: space-between;
  align-items: center;
  margin-left: 24px;
  margin-right: 24px;
}
.audio.green-audio-player .controls .slider {
  margin-left: 16px;
  margin-right: 16px;
  border-radius: 2px;
  height: 4px;
}
.audio.green-audio-player .controls .slider .progress {
  width: 0;
  height: 100%;
}
.audio.green-audio-player .controls .slider .progress .pin {
  right: -8px;
  top: -6px;
}
.audio.green-audio-player .controls {
  cursor: default;
}
.audio.green-audio-player .volume {
  position: relative;
}
.audio.green-audio-player .volume .volume-btn {
  cursor: pointer;
}
.audio.green-audio-player .volume .volume-btn.open path {
  fill: #44BFA3;
}
.audio.green-audio-player .volume .volume-controls {
  width: 30px;
  height: 135px;
  background-color: rgba(0, 0, 0, 0.62);
  border-radius: 7px;
  position: absolute;
  left: -3px;
  bottom: 52px;
  flex-direction: column;
  align-items: center;
  display: flex;
}
.audio.green-audio-player .volume .volume-controls.hidden {
  display: none;
}
.audio.green-audio-player .volume .volume-controls .slider {
  margin-top: 12px;
  margin-bottom: 12px;
  width: 6px;
  border-radius: 3px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress {
  bottom: 0;
  height: 100%;
  width: 6px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress .pin {
  left: -5px;
  top: -8px;
}

.playerControlSVG {
    display: block;
    }

@keyframes spin {
  from {
    transform: rotateZ(0);
  }
  to {
    transform: rotateZ(1turn);
  }
}
/*End Audio Player*/
</style>

<div id="textToSynth" style="margin-bottom: 80px;">
<div class="audioWrapper">
    <div type="text" style="height:0px; overflow: hidden;" id="textEntry">
    </div>
    <div class="audioPrompt" style="float:left; margin-right:25px;"><i><p id="result" style>Listen to this article <span id="minutesHolder">(<span id="audioMinutes">3</span> minutes)</span></p></i></div>

    <div class="audiocontrolwrapper" style="float:left;">
    <!--<audio id="audioPlayback" controls>
      <source id="audioSource" type="audio/mp3" https://shtyoushouldknow.com/pigging-out-on-palm-oil/https://shtyoushouldknow.com/pigging-out-on-palm-oil/src="">
    </audio>-->
        
          <div class="audioInit" onclick="speakText()">
      <svg version="1.1" id="playInit" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" height="50px" width="50px" viewbox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
  <path class="stroke-solidInit" fill="none" stroke="black" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7
    C97.3,23.7,75.7,2.3,49.9,2.5"/>
  <path class="stroke-dottedInit" fill="none" stroke="black" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7
    C97.3,23.7,75.7,2.3,49.9,2.5"/>
  <path class="iconInit" fill="black" d="M38,69c-1,0.5-1.8,0-1.8-1.1V32.1c0-1.1,0.8-1.6,1.8-1.1l34,18c1,0.5,1,1.4,0,1.9L38,69z"/>
</svg>
  </div>
        
    <div class="holder" style="display:none;">

  <div class="audio green-audio-player">
    <div class="loading">
      <div class="spinner"></div>
    </div>
    <div class="play-pause-btn">  
      <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="18" height="24" viewbox="0 0 18 24">
        <path fill="#566574" fill-rule="evenodd" d="M18 12L0 24V0" class="play-pause-icon" id="playPause"/>
      </svg>
    </div>

    <div class="controls">
      <span class="current-time">0:00</span>
      <div class="slider" data-direction="horizontal">
        <div class="progress">
          <div class="pin" id="progress-pin" data-method="rewind"></div>
          </div>
      </div>
        <span class="total-time">0:00</span>
    </div>

    <div class="volume">
      <div class="volume-btn">
        <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24">
          <path fill="#566574" fill-rule="evenodd" d="M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z" id="speaker"/>
        </svg>
      </div>
      <div class="volume-controls hidden">
        <div class="slider" data-direction="vertical">
          <div class="progress">
            <div class="pin" id="volume-pin" data-method="changeVolume"></div>
          </div>
        </div>
      </div>
    </div>


    <audio id="audioPlayback" crossorigin>
      <source id="audioSource" type="audio/mp3" src>    
    </audio>

  </div>
</div>
        
    </div>
</div>
</div>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.410.0.min.js"></script>
    <script type="text/javascript">

        // Initialize the Amazon Cognito credentials provider
        AWS.config.region = 'us-west-2'; // Region
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: 'us-west-2:9d8089ba-33fe-47dd-a5ca-4f5f7a236021',
        });
        
        // Function invoked by button click
        function speakText() 
        {
        $( ".audioInit" ).hide();
        $(".holder").animate({width:'toggle'},320);

        // Create the Polly service object and presigner object
          var polly = new AWS.Polly({apiVersion: '2016-06-10'});
            //var signer = new AWS.Polly.Presigner(speechParams, polly)
          var textBlob = document.getElementById("textEntry").innerHTML;


          
          var masterArray = new Uint8Array;
          var subArray = new Uint8Array;
          var startCounter = 0;
          var midCounter = 0;
          var counter = textBlob.length;
          var substr;

          if (textBlob.length > 3000)
          {
              callLargePolly(masterArray);
          }
          else
          {
            callPolly();
          }
             


          function callLargePolly(inputArray)
          {

            subArray = masterArray;

            masterArray = new Uint8Array(subArray.length + inputArray.length);

            masterArray.set(subArray);
            masterArray.set(inputArray, subArray.length);
            console.log("Let's check in on our master array :" + masterArray);
            

            if(counter - startCounter > 2999)
              midCounter = 2999;
            else
              midCounter = counter-startCounter;

            substr = textBlob.substr(startCounter, midCounter);
            startCounter += 2999;

            console.log ("Let's get LargePolly Going with this text:" + substr);

            var params = {        
            OutputFormat: 'mp3', /* required */
            Text: substr,
            VoiceId: 'Amy', /* required */
            TextType: 'text'
            };

    
            polly.synthesizeSpeech(params, function(err, data) {
              if (err)
              {
                console.log(err, err.stack);
              } // an error occurred
              else
              {

                if(startCounter < counter)
                {
                  console.log("wer'e in LargePolly and it worked!")
                  console.log("looks like startCounter < counter: startCounter is: "+startCounter+" and counter is: "+counter )
                  console.log(data.AudioStream);
                  var uInt8Array = new Uint8Array(data.AudioStream);
                  
                  callLargePolly(uInt8Array);
                }
                else
                { 

                  subArray = masterArray;
                  var uInt8Array = new Uint8Array(data.AudioStream);

                  masterArray = new Uint8Array(subArray.length + uInt8Array.length);

                  masterArray.set(subArray);
                  masterArray.set(uInt8Array, subArray.length);


                  console.log("looks like we broke the loops and we're finishing up with masterArray "+masterArray);

                  var arrayBuffer = masterArray.buffer;
                  var blob = new Blob([arrayBuffer], {type: 'audio/mpeg'});
                  var url = URL.createObjectURL(blob);

                  console.log("now we're cooking with gas - we've set a url: " + url );
                  document.getElementById('audioSource').src = url;
                  document.getElementById('audioPlayback').load();

                  audioSource.src = url;

                  initiatePlayer();
                  
                }
              }
            });
          }

          function callPolly()
          {
            console.log("We are calling Polly fools");
            /*var params = {        
            OutputFormat: 'mp3', 
            Text: textBlob,
            VoiceId: 'Amy', 
            TextType: 'text'
            };*/

            //var masterArray = new Uint8Array();
            var url = "https://shtyoushouldknow.com/assets/01_25_pal_oil.mp3";
            audioSource.src = url;
            document.getElementById('audioSource').src = url;
            document.getElementById('audioPlayback').load();
            initiatePlayer();
    
            /*polly.synthesizeSpeech(params, function(err, data) {
              if (err)
              {
                console.log(err, err.stack);
              } // an error occurred
              else
              {

                console.log("wer'e in polly and it worked!")
                console.log(data.AudioStream);
                var uInt8Array = new Uint8Array(data.AudioStream);
                var arrayBuffer = uInt8Array.buffer;
                var blob = new Blob([arrayBuffer], {type: 'audio/mpeg'});
                var url = URL.createObjectURL(blob);

                audioSource.src = url;
                document.getElementById('audioSource').src = url;
                document.getElementById('audioPlayback').load();


                initiatePlayer();
                togglePlay();
  
              }
            });*/
              
          }

          function initiatePlayer()
          {

                  
                var audioPlayer = document.querySelector('.green-audio-player');
                var playPause = audioPlayer.querySelector('#playPause');
                var playpauseBtn = audioPlayer.querySelector('.play-pause-btn');
                var loading = audioPlayer.querySelector('.loading');
                var progress = audioPlayer.querySelector('.progress');
                var sliders = audioPlayer.querySelectorAll('.slider');
                var volumeBtn = audioPlayer.querySelector('.volume-btn');
                var volumeControls = audioPlayer.querySelector('.volume-controls');
                var volumeProgress = volumeControls.querySelector('.slider .progress');
                var player = audioPlayer.querySelector('audio');
                var currentTime = audioPlayer.querySelector('.current-time');
                var totalTime = audioPlayer.querySelector('.total-time');
                var speaker = audioPlayer.querySelector('#speaker');

                var draggableClasses = ['pin'];
                var currentlyDragged = null;

                window.addEventListener('mousedown', function (event) {

                  if (!isDraggable(event.target)) return false;

                  currentlyDragged = event.target;
                  let handleMethod = currentlyDragged.dataset.method;

                  this.addEventListener('mousemove', window[handleMethod], false);

                  window.addEventListener('mouseup', () => {
                    currentlyDragged = false;
                    window.removeEventListener('mousemove', window[handleMethod], false);
                  }, false);
                });
              
                playpauseBtn.addEventListener('click', togglePlay);
                player.addEventListener('timeupdate', updateProgress);
                player.addEventListener('volumechange', updateVolume);
                player.addEventListener('loadedmetadata', () => {
                  totalTime.textContent = formatTime(player.duration, false);
                  document.querySelector('#audioMinutes').textContent = formatTime(player.duration, true);
                 
                });
                player.addEventListener('canplay', makePlay);
                player.addEventListener('ended', function () {
                  playPause.attributes.d.value = "M18 12L0 24V0";
                  player.currentTime = 0;
                });
                            

                volumeBtn.addEventListener('click', () => {
                  volumeBtn.classList.toggle('open');
                  volumeControls.classList.toggle('hidden');
                });

                window.addEventListener('resize', directionAware);

                sliders.forEach(slider => {
                  let pin = slider.querySelector('.pin');
                  slider.addEventListener('click', window[pin.dataset.method]);
                });

                directionAware();
              togglePlay();
               

              function isDraggable(el) {
                let canDrag = false;
                let classes = Array.from(el.classList);
                draggableClasses.forEach(draggable => {
                  if (classes.indexOf(draggable) !== -1)
                  canDrag = true;
                });
                return canDrag;
              }

              function inRange(event) {
                let rangeBox = getRangeBox(event);
                let rect = rangeBox.getBoundingClientRect();
                let direction = rangeBox.dataset.direction;
                if (direction == 'horizontal') {
                  var min = rangeBox.offsetLeft;
                  var max = min + rangeBox.offsetWidth;
                  if (event.clientX < min || event.clientX > max) return false;
                } else {
                  var min = rect.top;
                  var max = min + rangeBox.offsetHeight;
                  if (event.clientY < min || event.clientY > max) return false;
                }
                return true;
              }

              function updateProgress() {
                var current = player.currentTime;
                var percent = current / player.duration * 100;
                progress.style.width = percent + '%';

                currentTime.textContent = formatTime(current, false);
              }

              function updateVolume() {
                volumeProgress.style.height = player.volume * 100 + '%';
                if (player.volume >= 0.5) {
                  speaker.attributes.d.value = 'M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z';
                } else if (player.volume < 0.5 && player.volume > 0.05) {
                  speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667M17.333 11.373C17.333 9.013 16 6.987 14 6v10.707c2-.947 3.333-2.987 3.333-5.334z';
                } else if (player.volume <= 0.05) {
                  speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667';
                }
              }

              function getRangeBox(event) {
                let rangeBox = event.target;
                let el = currentlyDragged;
                if (event.type == 'click' && isDraggable(event.target)) {
                  rangeBox = event.target.parentElement.parentElement;
                }
                if (event.type == 'mousemove') {
                  rangeBox = el.parentElement.parentElement;
                }
                return rangeBox;
              }

              function getCoefficient(event) {
                let slider = getRangeBox(event);
                let rect = slider.getBoundingClientRect();
                let K = 0;
                if (slider.dataset.direction == 'horizontal') {

                  let offsetX = event.clientX - slider.offsetLeft;
                  let width = slider.clientWidth;
                  K = offsetX / width;

                } else if (slider.dataset.direction == 'vertical') {

                  let height = slider.clientHeight;
                  var offsetY = event.clientY - rect.top;
                  K = 1 - offsetY / height;

                }
                return K;
              }

              function rewind(event) {
                if (inRange(event)) {
                  player.currentTime = player.duration * getCoefficient(event);
                }
              }

              function changeVolume(event) {
                if (inRange(event)) {
                  player.volume = getCoefficient(event);
                }
              }

              function formatTime(time, minutesonly) {
                console.log("format time function:");
                var min = Math.floor(time / 60);
                console.log(min);
                var sec = Math.floor(time % 60);
                console.log(sec);
                if(minutesonly == false)
                {
                   return min + ':' + (sec < 10 ? '0' + sec : sec);
                }
                else
                {
                    if(sec > 30)
                    	return min+1;
                    else
                       return min;
                }
                
              }
                          
              function minutesOnly(time) {
                  console.log("minutes only function:");
                 var min = Math.floor(time / 60);
                  console.log(min);
                  return min;
              }

              function togglePlay() {
                if (player.paused) {
                  playPause.attributes.d.value = "M0 0h6v24H0zM12 0h6v24h-6z";
                  player.play();
                } else {
                  playPause.attributes.d.value = "M18 12L0 24V0";
                  player.pause();
                }
              }

              function makePlay() {
                playpauseBtn.style.display = 'block';
                loading.style.display = 'none';
              }

              function directionAware() {
                if (window.innerHeight < 250) {
                  volumeControls.style.bottom = '-54px';
                  volumeControls.style.left = '54px';
                } else if (audioPlayer.offsetTop < 154) {
                  volumeControls.style.bottom = '-164px';
                  volumeControls.style.left = '-3px';
                } else {
                  volumeControls.style.bottom = '52px';
                  volumeControls.style.left = '-3px';
                }
              }
            }
          }
        //window.onload = speakText();
        
    </script>
<!--kg-card-end: html--><p>There are few things that we agreed on in 2020. One of those few things was, apparently, a <a href="https://www.reuters.com/article/india-palmoil/palm-oil-prices-to-rally-in-first-half-of-2021-say-top-analysts-idINL4N2GZ2RJ">very bullish outlook on palm oil in the first half of 2021</a>.</p><p>And it was looking good - early in January 2021, palm oil future prices hit 961$ per metric ton... their highest point since 2011. This continued a substantial rally starting back in May 2020, seeing around a 100% price increase in those 7 months.</p><p>However, a tide of swine originating from China is threatening this bull run, by glutting the market with soy oil.</p><!--kg-card-begin: html--><div class="flourish-embed flourish-chart" data-src="visualisation/5083116"><script src="https://public.flourish.studio/resources/embed.js"></script></div><!--kg-card-end: html--><h3 id="so-like-palm-oil-what-is-it">So like... palm oil? What is it? </h3><p>Palm oil is a cheap, accessible oil harvested from the fruits of the oil palm, <a href="https://en.wikipedia.org/wiki/Elaeis_guineensis">Elaeis guineensis</a>. It's used widely in food and non-food applications - palm oil plantations account for<a href="http://apps.worldagroforestry.org/downloads/Publications/PDFS/OP16401.pdf"> 10% of global permanent cropland</a>, in order to sustain the roughly 8kg of palm oil that each of 3 billion people across 150 countries consume per year.</p><p>Globally, palm oil is widely used as a cooking oil, in food production, personal items such as cosmetics, and as <a href="https://www.ieabioenergy.com/wp-content/uploads/2013/10/ExCo65-P6-Palm-Oil-as-Feedstock-for-Biodiesel-production-and-export-from-malaysia-Dr.-P.-Wei.pdf">feedstock for biodiesel</a>.</p><p>So why is palm oil a big deal? Palm oil's massive popularity is due to its inexpensive price point, versatility, and lack of trans fats (which caused widespread adoption in the global food industry). Additionally, palm oil has very few substitutes, and certainly none at its price point, making it irreplaceable in countries like India, which accounted for <a href="https://www.statista.com/statistics/489272/palm-oil-consumption-india/#:~:text=Palm%20oil%20consumption%20in%20India%20was%20estimated%20to%20reach%20over,tons%20according%20to%20the%20source.">around 13.2% of global palm oil consumption in 2020.</a></p><p>This popularity was the largest contributor to palm oil's rally. With demand expected to increase as global COVID-related lockdowns drove consumer purchase of food products up, and with palm oil supply contracting due to lockdowns preventing plantation worked from harvesting the oil, this current rally is a basic supply:demand formula.</p><p>This is not a sure thing, however - the effects of palm’s rally may be offset by government stimuli programs. For instance, India, the world’s top palm buyer, <a href="https://www.bloomberg.com/news/articles/2020-11-26/india-cuts-import-duty-on-palm-oil-to-support-consumers">slashed</a> crude palm import duties in November to shield consumers from surging prices, and palm oil prices are potential vulnerable to other global situations.</p><h3 id="pigs-on-the-bean">Pigs on the Bean</h3><p>This supply:demand curve makes sense - scarcity is not unique to palm oil, meaning soy oil (largely seen as the closest alternative to palm oil) has faced the same supply issues... but comes at a higher price point, so it's less attractive to consumers, meaning its demand hasn't peaked quite as high as palm oil's.</p><p>Pig production in China has been ticking up since mid 2020, in an aggresive recovery from an outbreak of African swine fever that decimated the pig population starting August, 2018, through 2019. The country's Agricultural ministry reported that in August, <a href="https://www.reuters.com/article/us-usa-pork-braun/column-china-exchanges-u-s-pork-for-soybeans-after-both-lead-2020-exports-braun-idUSKBN2663JR">the country's pig herd was up 31.3%, and it's sow herd up 37%</a>. </p><p>This growth in pig farming hasn't slowed down, and a pig's gotta eat... with the favored pig feed being derived from soy beans. The boom in pig population is leading to a substantial increase in Chinese soybean imports. </p><p>What does this have to do with the price of palm oil? When soybeans are crushed into feed, two byproducts are formed: meal (for the piggies to eat), and oil (which the piggies don't eat). <a href="https://www.theedgemarkets.com/article/chinas-pigs-become-unexpected-threat-palm-oils-rally">Says Shi Lihong, an analyst with China Futures Co</a>, “The extra soyoil supplies will replace imports of palm oil and other edible oils...”, predicting a soymeal demand boost of 8-10%, which brings soybean import (and, tangentially, soy oil production) to a fresh record.</p><p>With the price of palm oil increasing, and a new global glut of soy oil on the horizon, <a href="https://www.spglobal.com/platts/en/market-insights/latest-news/agriculture/123120-commodities-2021-tight-production-demand-expectations-to-support-asian-palm-oil-prices">palm oil's sure thing 2021 rally</a> seems to be on shaky grounds.</p>]]></content:encoded></item><item><title><![CDATA[Market manipulation? Reddit users vs institutional investors - a tale of video games and securities battlegrounds]]></title><description><![CDATA[Gamestop's (GME) 1500% price increase is the result of sparring between Reddit's WallStreetBets community and established institutional investors. WSB investors organized to drive GME's price up, causing institutional investors to lose billions, and turning a meme into an actual market event.]]></description><link>https://shtyoushouldknow.com/reddit-market-movers-gamestop/</link><guid isPermaLink="false">600c7310e1e23c04ce218865</guid><category><![CDATA[Finance]]></category><dc:creator><![CDATA[Ivan Parra-Orlandoni]]></dc:creator><pubDate>Sun, 24 Jan 2021 03:22:41 GMT</pubDate><media:content url="https://shtyoushouldknow.com/content/images/2021/01/markus-spiske-3Tf1J8q9bBA-unsplash.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><img src="https://shtyoushouldknow.com/content/images/2021/01/markus-spiske-3Tf1J8q9bBA-unsplash.jpg" alt="Market manipulation? Reddit users vs institutional investors - a tale of video games and securities battlegrounds"><p style="font-size: .7em; margin-bottom: 20px; line-height: 1.3em !important;"><i>(photo credit: Photo by <a href="https://unsplash.com/@markusspiske?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Markus Spiske</a> on <a href="https://unsplash.com/s/photos/stocks?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></i></p>
<style>
    @media only screen and (max-width: 767px){
.post-content div.text p {

    font-size: 1.2em;
    line-height: 1.85em;
        }}
   .twitter-tweet{
    margin-left: auto;
    margin-right: auto;
    }
</style><!--kg-card-end: html--><!--kg-card-begin: html--><style>
/*Initial Play Button*/
 @-webkit-keyframes spinInit {
  to {
    transform: rotate(360deg);
  }
}
@keyframes spinInit {
  to {
    transform: rotate(360deg);
  }
}
.stroke-dottedInit {
  opacity: 0;
  stroke-dasharray: 4,5;
  stroke-width: 1px;
  transform-origin: 50% 50%;
  -webkit-animation: spinInit 4s infinite linear;
          animation: spinInit 4s infinite linear;
  transition: opacity 1s ease,  stroke-width 1s ease;
}

.stroke-solidInit {
  stroke-dashoffset: 0;
  stroke-dashArray: 300;
  stroke-width: 4px;
  transition: stroke-dashoffset 1s ease,  opacity 1s ease;
}

.iconInit {
  transform-origin: 50% 50%;
  transition: transform 200ms ease-out;
}

#playInit:hover .stroke-dottedInit {
  stroke-width: 4px;
  opacity: 1;
}
#playInit:hover .stroke-solidInit {
  opacity: 0;
  stroke-dashoffset: 300;
}
#playInit:hover .icon {
  transform: scale(1.05);
}


#playInit {
  cursor: pointer;
}
 /*End Initial Play Button*/
 
 /*Audio Player*/
.holder {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-top: 0px;
  margin-bottom: 24px;
  font-family: "Roboto";
  color: #55606E;
}

.audio.green-audio-player {
  width: 320px;
  min-width: 200px;
  max-width: 75vw;
  height: 56px;
  box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.07);
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-left: 24px;
  padding-right: 24px;
  border-radius: 4px;
  user-select: none;
  -webkit-user-select: none;
  background-color: #fff;
}
.audio.green-audio-player .play-pause-btn {
  display: none;
  cursor: pointer;
}
.audio.green-audio-player .spinner {
  width: 18px;
  height: 18px;
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/355309/loading.png);
  background-size: cover;
  background-repeat: no-repeat;
  animation: spin 0.4s linear infinite;
}
.audio.green-audio-player .slider {
  flex-grow: 1;
  background-color: #D8D8D8;
  cursor: pointer;
  position: relative;
}
.audio.green-audio-player .slider .progress {
  background-color: #44BFA3;
  border-radius: inherit;
  position: absolute;
  pointer-events: none;
}
.audio.green-audio-player .slider .progress .pin {
  height: 16px;
  width: 16px;
  border-radius: 8px;
  background-color: #44BFA3;
  position: absolute;
  pointer-events: all;
  box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.32);
}
.audio.green-audio-player .controls {
  font-family: "Roboto", sans-serif;
  font-size: 16px;
  line-height: 18px;
  color: #55606E;
  display: flex;
  flex-grow: 1;
  justify-content: space-between;
  align-items: center;
  margin-left: 24px;
  margin-right: 24px;
}
.audio.green-audio-player .controls .slider {
  margin-left: 16px;
  margin-right: 16px;
  border-radius: 2px;
  height: 4px;
}
.audio.green-audio-player .controls .slider .progress {
  width: 0;
  height: 100%;
}
.audio.green-audio-player .controls .slider .progress .pin {
  right: -8px;
  top: -6px;
}
.audio.green-audio-player .controls {
  cursor: default;
}
.audio.green-audio-player .volume {
  position: relative;
}
.audio.green-audio-player .volume .volume-btn {
  cursor: pointer;
}
.audio.green-audio-player .volume .volume-btn.open path {
  fill: #44BFA3;
}
.audio.green-audio-player .volume .volume-controls {
  width: 30px;
  height: 135px;
  background-color: rgba(0, 0, 0, 0.62);
  border-radius: 7px;
  position: absolute;
  left: -3px;
  bottom: 52px;
  flex-direction: column;
  align-items: center;
  display: flex;
}
.audio.green-audio-player .volume .volume-controls.hidden {
  display: none;
}
.audio.green-audio-player .volume .volume-controls .slider {
  margin-top: 12px;
  margin-bottom: 12px;
  width: 6px;
  border-radius: 3px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress {
  bottom: 0;
  height: 100%;
  width: 6px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress .pin {
  left: -5px;
  top: -8px;
}

.playerControlSVG {
    display: block;
    }

@keyframes spin {
  from {
    transform: rotateZ(0);
  }
  to {
    transform: rotateZ(1turn);
  }
}
/*End Audio Player*/
</style>

<div id="textToSynth" style="margin-bottom: 80px;">
<div class="audioWrapper">
    <div type="text" style="height:0px; overflow: hidden;" id="textEntry">
    </div>
    <div class="audioPrompt" style="float:left; margin-right:25px;"><i><p id="result" style>Listen to this article <span id="minutesHolder">(<span id="audioMinutes">5</span> minutes)</span></p></i></div>

    <div class="audiocontrolwrapper" style="float:left;">
    <!--<audio id="audioPlayback" controls>
      <source id="audioSource" type="audio/mp3" https://shtyoushouldknow.com/reddit-market-movers-gamestop/https://shtyoushouldknow.com/reddit-market-movers-gamestop/src="">
    </audio>-->
        
          <div class="audioInit" onclick="speakText()">
      <svg version="1.1" id="playInit" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" height="50px" width="50px" viewbox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
  <path class="stroke-solidInit" fill="none" stroke="black" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7
    C97.3,23.7,75.7,2.3,49.9,2.5"/>
  <path class="stroke-dottedInit" fill="none" stroke="black" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7
    C97.3,23.7,75.7,2.3,49.9,2.5"/>
  <path class="iconInit" fill="black" d="M38,69c-1,0.5-1.8,0-1.8-1.1V32.1c0-1.1,0.8-1.6,1.8-1.1l34,18c1,0.5,1,1.4,0,1.9L38,69z"/>
</svg>
  </div>
        
    <div class="holder" style="display:none;">

  <div class="audio green-audio-player">
    <div class="loading">
      <div class="spinner"></div>
    </div>
    <div class="play-pause-btn">  
      <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="18" height="24" viewbox="0 0 18 24">
        <path fill="#566574" fill-rule="evenodd" d="M18 12L0 24V0" class="play-pause-icon" id="playPause"/>
      </svg>
    </div>

    <div class="controls">
      <span class="current-time">0:00</span>
      <div class="slider" data-direction="horizontal">
        <div class="progress">
          <div class="pin" id="progress-pin" data-method="rewind"></div>
          </div>
      </div>
        <span class="total-time">0:00</span>
    </div>

    <div class="volume">
      <div class="volume-btn">
        <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24">
          <path fill="#566574" fill-rule="evenodd" d="M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z" id="speaker"/>
        </svg>
      </div>
      <div class="volume-controls hidden">
        <div class="slider" data-direction="vertical">
          <div class="progress">
            <div class="pin" id="volume-pin" data-method="changeVolume"></div>
          </div>
        </div>
      </div>
    </div>


    <audio id="audioPlayback" crossorigin>
      <source id="audioSource" type="audio/mp3" src>    
    </audio>

  </div>
</div>
        
    </div>
</div>
</div>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.410.0.min.js"></script>
    <script type="text/javascript">

        // Initialize the Amazon Cognito credentials provider
        AWS.config.region = 'us-west-2'; // Region
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: 'us-west-2:9d8089ba-33fe-47dd-a5ca-4f5f7a236021',
        });
        
        // Function invoked by button click
        function speakText() 
        {
        $( ".audioInit" ).hide();
        $(".holder").animate({width:'toggle'},320);

        // Create the Polly service object and presigner object
          var polly = new AWS.Polly({apiVersion: '2016-06-10'});
            //var signer = new AWS.Polly.Presigner(speechParams, polly)
          var textBlob = document.getElementById("textEntry").innerHTML;


          
          var masterArray = new Uint8Array;
          var subArray = new Uint8Array;
          var startCounter = 0;
          var midCounter = 0;
          var counter = textBlob.length;
          var substr;

          if (textBlob.length > 3000)
          {
              callLargePolly(masterArray);
          }
          else
          {
            callPolly();
          }
             


          function callLargePolly(inputArray)
          {

            subArray = masterArray;

            masterArray = new Uint8Array(subArray.length + inputArray.length);

            masterArray.set(subArray);
            masterArray.set(inputArray, subArray.length);
            console.log("Let's check in on our master array :" + masterArray);
            

            if(counter - startCounter > 2999)
              midCounter = 2999;
            else
              midCounter = counter-startCounter;

            substr = textBlob.substr(startCounter, midCounter);
            startCounter += 2999;

            console.log ("Let's get LargePolly Going with this text:" + substr);

            var params = {        
            OutputFormat: 'mp3', /* required */
            Text: substr,
            VoiceId: 'Amy', /* required */
            TextType: 'text'
            };

    
            polly.synthesizeSpeech(params, function(err, data) {
              if (err)
              {
                console.log(err, err.stack);
              } // an error occurred
              else
              {

                if(startCounter < counter)
                {
                  console.log("wer'e in LargePolly and it worked!")
                  console.log("looks like startCounter < counter: startCounter is: "+startCounter+" and counter is: "+counter )
                  console.log(data.AudioStream);
                  var uInt8Array = new Uint8Array(data.AudioStream);
                  
                  callLargePolly(uInt8Array);
                }
                else
                { 

                  subArray = masterArray;
                  var uInt8Array = new Uint8Array(data.AudioStream);

                  masterArray = new Uint8Array(subArray.length + uInt8Array.length);

                  masterArray.set(subArray);
                  masterArray.set(uInt8Array, subArray.length);


                  console.log("looks like we broke the loops and we're finishing up with masterArray "+masterArray);

                  var arrayBuffer = masterArray.buffer;
                  var blob = new Blob([arrayBuffer], {type: 'audio/mpeg'});
                  var url = URL.createObjectURL(blob);

                  console.log("now we're cooking with gas - we've set a url: " + url );
                  document.getElementById('audioSource').src = url;
                  document.getElementById('audioPlayback').load();

                  audioSource.src = url;

                  initiatePlayer();
                  
                }
              }
            });
          }

          function callPolly()
          {
            console.log("We are calling Polly fools");
            /*var params = {        
            OutputFormat: 'mp3', 
            Text: textBlob,
            VoiceId: 'Amy', 
            TextType: 'text'
            };*/

            //var masterArray = new Uint8Array();
            var url = "https://shtyoushouldknow.com/assets/01-23-21-reddit-vs-gamestop.mp3";
            audioSource.src = url;
            document.getElementById('audioSource').src = url;
            document.getElementById('audioPlayback').load();
            initiatePlayer();
    
            /*polly.synthesizeSpeech(params, function(err, data) {
              if (err)
              {
                console.log(err, err.stack);
              } // an error occurred
              else
              {

                console.log("wer'e in polly and it worked!")
                console.log(data.AudioStream);
                var uInt8Array = new Uint8Array(data.AudioStream);
                var arrayBuffer = uInt8Array.buffer;
                var blob = new Blob([arrayBuffer], {type: 'audio/mpeg'});
                var url = URL.createObjectURL(blob);

                audioSource.src = url;
                document.getElementById('audioSource').src = url;
                document.getElementById('audioPlayback').load();


                initiatePlayer();
                togglePlay();
  
              }
            });*/
              
          }

          function initiatePlayer()
          {

                  
                var audioPlayer = document.querySelector('.green-audio-player');
                var playPause = audioPlayer.querySelector('#playPause');
                var playpauseBtn = audioPlayer.querySelector('.play-pause-btn');
                var loading = audioPlayer.querySelector('.loading');
                var progress = audioPlayer.querySelector('.progress');
                var sliders = audioPlayer.querySelectorAll('.slider');
                var volumeBtn = audioPlayer.querySelector('.volume-btn');
                var volumeControls = audioPlayer.querySelector('.volume-controls');
                var volumeProgress = volumeControls.querySelector('.slider .progress');
                var player = audioPlayer.querySelector('audio');
                var currentTime = audioPlayer.querySelector('.current-time');
                var totalTime = audioPlayer.querySelector('.total-time');
                var speaker = audioPlayer.querySelector('#speaker');

                var draggableClasses = ['pin'];
                var currentlyDragged = null;

                window.addEventListener('mousedown', function (event) {

                  if (!isDraggable(event.target)) return false;

                  currentlyDragged = event.target;
                  let handleMethod = currentlyDragged.dataset.method;

                  this.addEventListener('mousemove', window[handleMethod], false);

                  window.addEventListener('mouseup', () => {
                    currentlyDragged = false;
                    window.removeEventListener('mousemove', window[handleMethod], false);
                  }, false);
                });
              
                playpauseBtn.addEventListener('click', togglePlay);
                player.addEventListener('timeupdate', updateProgress);
                player.addEventListener('volumechange', updateVolume);
                player.addEventListener('loadedmetadata', () => {
                  totalTime.textContent = formatTime(player.duration, false);
                  document.querySelector('#audioMinutes').textContent = formatTime(player.duration, true);
                 
                });
                player.addEventListener('canplay', makePlay);
                player.addEventListener('ended', function () {
                  playPause.attributes.d.value = "M18 12L0 24V0";
                  player.currentTime = 0;
                });
                            

                volumeBtn.addEventListener('click', () => {
                  volumeBtn.classList.toggle('open');
                  volumeControls.classList.toggle('hidden');
                });

                window.addEventListener('resize', directionAware);

                sliders.forEach(slider => {
                  let pin = slider.querySelector('.pin');
                  slider.addEventListener('click', window[pin.dataset.method]);
                });

                directionAware();
              togglePlay();
               

              function isDraggable(el) {
                let canDrag = false;
                let classes = Array.from(el.classList);
                draggableClasses.forEach(draggable => {
                  if (classes.indexOf(draggable) !== -1)
                  canDrag = true;
                });
                return canDrag;
              }

              function inRange(event) {
                let rangeBox = getRangeBox(event);
                let rect = rangeBox.getBoundingClientRect();
                let direction = rangeBox.dataset.direction;
                if (direction == 'horizontal') {
                  var min = rangeBox.offsetLeft;
                  var max = min + rangeBox.offsetWidth;
                  if (event.clientX < min || event.clientX > max) return false;
                } else {
                  var min = rect.top;
                  var max = min + rangeBox.offsetHeight;
                  if (event.clientY < min || event.clientY > max) return false;
                }
                return true;
              }

              function updateProgress() {
                var current = player.currentTime;
                var percent = current / player.duration * 100;
                progress.style.width = percent + '%';

                currentTime.textContent = formatTime(current, false);
              }

              function updateVolume() {
                volumeProgress.style.height = player.volume * 100 + '%';
                if (player.volume >= 0.5) {
                  speaker.attributes.d.value = 'M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z';
                } else if (player.volume < 0.5 && player.volume > 0.05) {
                  speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667M17.333 11.373C17.333 9.013 16 6.987 14 6v10.707c2-.947 3.333-2.987 3.333-5.334z';
                } else if (player.volume <= 0.05) {
                  speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667';
                }
              }

              function getRangeBox(event) {
                let rangeBox = event.target;
                let el = currentlyDragged;
                if (event.type == 'click' && isDraggable(event.target)) {
                  rangeBox = event.target.parentElement.parentElement;
                }
                if (event.type == 'mousemove') {
                  rangeBox = el.parentElement.parentElement;
                }
                return rangeBox;
              }

              function getCoefficient(event) {
                let slider = getRangeBox(event);
                let rect = slider.getBoundingClientRect();
                let K = 0;
                if (slider.dataset.direction == 'horizontal') {

                  let offsetX = event.clientX - slider.offsetLeft;
                  let width = slider.clientWidth;
                  K = offsetX / width;

                } else if (slider.dataset.direction == 'vertical') {

                  let height = slider.clientHeight;
                  var offsetY = event.clientY - rect.top;
                  K = 1 - offsetY / height;

                }
                return K;
              }

              function rewind(event) {
                if (inRange(event)) {
                  player.currentTime = player.duration * getCoefficient(event);
                }
              }

              function changeVolume(event) {
                if (inRange(event)) {
                  player.volume = getCoefficient(event);
                }
              }

              function formatTime(time, minutesonly) {
                console.log("format time function:");
                var min = Math.floor(time / 60);
                console.log(min);
                var sec = Math.floor(time % 60);
                console.log(sec);
                if(minutesonly == false)
                {
                   return min + ':' + (sec < 10 ? '0' + sec : sec);
                }
                else
                {
                    if(sec > 30)
                    	return min+1;
                    else
                       return min;
                }
                
              }
                          
              function minutesOnly(time) {
                  console.log("minutes only function:");
                 var min = Math.floor(time / 60);
                  console.log(min);
                  return min;
              }

              function togglePlay() {
                if (player.paused) {
                  playPause.attributes.d.value = "M0 0h6v24H0zM12 0h6v24h-6z";
                  player.play();
                } else {
                  playPause.attributes.d.value = "M18 12L0 24V0";
                  player.pause();
                }
              }

              function makePlay() {
                playpauseBtn.style.display = 'block';
                loading.style.display = 'none';
              }

              function directionAware() {
                if (window.innerHeight < 250) {
                  volumeControls.style.bottom = '-54px';
                  volumeControls.style.left = '54px';
                } else if (audioPlayer.offsetTop < 154) {
                  volumeControls.style.bottom = '-164px';
                  volumeControls.style.left = '-3px';
                } else {
                  volumeControls.style.bottom = '52px';
                  volumeControls.style.left = '-3px';
                }
              }
            }
          }
        //window.onload = speakText();
        
    </script>
<!--kg-card-end: html--><p>On Friday, January 22, 2021, GameStop (<a href="https://www.google.com/finance/quote/GME:NYSE">GME</a>) briefly halted trading. Now, while <a href="https://www.investopedia.com/terms/t/tradinghalt.asp#:~:text=across%20numerous%20exchanges.-,Trading%20halts%20are%20typically%20enacted%20in%20anticipation%20of%20a%20news,called%20circuit%20breakers%20or%20curbs.">trading halts</a> are not altogether uncommon, this particular trading halt came as a result of an estimated +69% intraday price spike that was, in part, due to a very strange situation.</p><p>To really tell the story of the Battle of Little Round <strong>Stop</strong> (see what I did there), we need to start back in August, 2020</p><!--kg-card-begin: html--><!-- TradingView Widget BEGIN -->
<style>
    
    #tradingview_c7e4b{
        height: 400px !important;
    }
@media only screen and (max-width: 767px)
{
    #tradingview_c7e4b{
        height: 350px !important;
    }
}
</style>
<div class="tradingview-widget-container">
  <div id="tradingview_c7e4b"></div>
  <div class="tradingview-widget-copyright"><a href="https://www.tradingview.com/symbols/NYSE-GME/" rel="noopener" target="_blank"><span class="blue-text">GME Chart</span></a> by TradingView</div>
  <script type="text/javascript" src="https://s3.tradingview.com/tv.js"></script>
  <script type="text/javascript">
  new TradingView.widget(
  {
  "autosize": true,
  "symbol": "NYSE:GME",
  "timezone": "Etc/UTC",
  "theme": "light",
  "style": "1",
  "locale": "en",
  "toolbar_bg": "#f1f3f6",
  "enable_publishing": true,
  "hide_top_toolbar": true,
  "range": "6M",
  "allow_symbol_change": true,
  "details": true,
  "container_id": "tradingview_c7e4b"
}
  );
  </script>
</div>
<!-- TradingView Widget END --><!--kg-card-end: html--><p>On August 3, 2020, GameStop was trading at $4.15/share, with around 2.5MM shares traded that day... down from a high of $33.48/share on April 27, 2016. Over the past 3-5 years, GameStop had largely been viewed as a dark horse - similar to <a href="https://en.wikipedia.org/wiki/Blockbuster_LLC">Blockbuster</a>, GameStop <a href="https://gamerant.com/gamestop-out-of-business-in-digital-age/">was opined to be selling physical goods in a digital world</a>, a paradigm shift that killed companies from the aforementioned Blockbuster to companies like <a href="https://dealbook.nytimes.com/2011/07/18/borders-calls-off-auction-plans-to-liquidate/?mtrref=www.google.com&amp;gwh=EF5714EAF41CF7B28182531E771D01C8&amp;gwt=regi&amp;assetType=REGIWALL">Borders</a>.</p><h3 id="some-history">Some History</h3><p>That being said, not everyone viewed GameStop as one of the last of a dying breed - On August 19, 2019, Dr. Michael Burry (head of  Scion Capital and... well, the Big Short guy) issued a <a href="https://www.businesswire.com/news/home/20190819005633/en/Scion-Asset-Management-Urges-GameStop-Buy-238">press release</a> urging GameStop to issue a share buyback of ~300MM$, in order to "<em>...create(s) the opportunity to enter 2020 with a dramatically reduced share count along with multi-fold greater impact per share for every single other achievement of management...</em>" Essentially, Michael Burry was asking GameStop to consolidate their outstanding shares to reduce price volatility (since at that point around ~63% of GameStop shares had short interest) and magnify the impact of the next video game console cycle (PS5/Xbox X, of which both had been set to release at the end of 2020).</p><p>Now earlier that year, in April 2019, GameStop had <a href="https://news.gamestop.com/leaders/george-sherman">brought in a new chief executive</a> - George Sherman, of Best Buy stock. Sherman's focus seemed to be growing GameStops e-commerce business, which he accomplished with rousing success, seeing a 500% YoY e-commerce revenue grown in Q1 2020, and an 800% YoY e-commerce revenue growth in Q2 2020.</p><p>Sherman's leadership didn't go unnoticed in the wider market - in December of 2020, Ryan Cohen (of Chewy fame), purchased <a href="https://www.sec.gov/Archives/edgar/data/1326380/000119380520001571/0001193805-20-001571-index.htm">9MM Gamestop shares in a $76MM deal</a>. Despite Sherman's experience in e-commerce growth, however, Cohen <a href="http://wsj.com/public/resources/documents/RC%20Ventures%20Letter%20to%20GameStop.pdf">believed the company could be even more aggressive</a> in driving changes to grow their e-commerce business.</p><p><a href="http://wsj.com/public/resources/documents/RC%20Ventures%20Letter%20to%20GameStop.pdf">In a press release from</a> RC Ventures, LLC (the holding company for Cohen's GameStop investment), Cohen recommended the following imperative strategies (direct quote):</p><ol><li>Forgo the upcoming 2-year lease renewal on all underperforming stores</li><li>Non-core operations in Europe and Australia to be streamlined or sold.</li><li>By cutting cost with the above two methods and with the revenue generated from the biggest ever console cycle, GameStop should invest heavily on boosting E-comm sales.</li></ol><p>And essentially demanded that GameStop lay out the company's roadmap during the December 2020 earnings call to basically drastically increase investment in e-commerce talent acquisition and digital transformation.</p><h3 id="the-reddit-angle">The Reddit Angle</h3><p>Now this  investor interest and renewed focus on e-commerce was not lost on the citizens of financial forums across the internet... one of the most prominent, of course, being <a href="https://reddit.com/r/wallstreetbets">/r/wallstreetbets</a>, a massively popular subreddit who describes themselves as "<em>Like 4chan found a Bloomberg Terminal</em>". (For those that don't know, essentially, WSB is a subreddit where alpha enthusiasts talk trading strategies, share war stories, and work together to discover market opportunities that day traders could profit from.)</p><p>Needless to say, GameStop had not gone unnoticed by members of wallstreetbets - one user in particular, with the username user <a href="https://www.reddit.com/user/DeepFuckingValue/">u/DeepFuckingValue/</a>, seemed to be substantially betting on GME as <a href="https://www.reddit.com/r/wallstreetbets/comments/d1g7x0/hey_burry_thanks_a_lot_for_jacking_up_my_cost/">early as April of 20</a>20 (<a href="https://www.reddit.com/r/wallstreetbets/comments/kxjom8/udeepfuckingvalue_single_handedly_owns_2_of/">one enthusiastic post</a> estimates that DeepFuckingValue now owns 0.2% of GameStop). And DeepFuckingValue wasn't the only one - soon, GME became, well, a meme... even making it to the front page of Reddit several times.</p><h3 id="wsb-vs-the-world">WSB vs. the world</h3><p>As is the case with every epic finance story, there has to be some conflict. As such, alluding to WSB as Scott Pilgrim allows us to make a play on "Scott Pilgrim vs. The world" (because, well, pop culture?). Here, "the world" starts with Citron Research. Headed by Andrew Left, Citron Research, a financial newsletter that reports on companies that Left believes to be overvalued or fraudulent in some fashion. You can see where this is going - Left <a href="https://www.benzinga.com/analyst-ratings/analyst-color/21/01/19261270/citrons-andrew-left-says-gamestop-is-pretty-much-in-terminal-decline?itm_source=parsely-api">believed that GameStop was overvalued</a>, and some people got kind of mad... so they said mean things on Twitter and then went about their business.</p><p>Sadly, that last bit was a lie - in actual fact, Left claims that Citron Research's <a href="https://markets.businessinsider.com/news/stocks/citron-research-livestream-gamestop-position-halted-twitter-hack-attempts-2021-1-1029993391">Twitter was hacked multiple times</a>, and that his short selling fund Citron Capital <a href="https://www.thestreet.com/investing/gamestop-shares-soar-citron-abandons-stock">divested its short position on GameStop due to "harassment from bulls"</a>.</p><p>Citron wasn't the only institutional investor with a substantial short position in GameStop - hedge funds like <a href="https://melvincapital.com/">Melvin Capital</a> (among others), who had a short position on 5.5MM shares going into 2021, has announced that it closed it's GameStop position,<a href="https://www.wsj.com/articles/short-bets-pummel-hot-hedge-fund-melvin-capital-11611349217"> substantially contributing to it's ~$2BB in losses (the fund is down 15%)</a> in January 2021.</p><p>This dynamic has almost turned into a David and Goliath story, with institutional investors crying foul and claiming market manipulation, and WSB members alluding to institutional traders flouting common sense and, well, getting caught with their pants down.</p><p>Oh, and WSB made a song about the situation:</p><figure class="kg-card kg-embed-card">
    <blockquote class="reddit-card">
      <a href="https://www.reddit.com/r/wallstreetbets/comments/l0dfrp/the_tendieman_lyrics_and_video_by_uquigonshin/?ref_source=embed&amp;ref=share">The Tendieman - Lyrics and video by u/quigonshin</a> from
      <a href="https://www.reddit.com/r/wallstreetbets/">wallstreetbets</a>
    </blockquote>
    <script async src="https://embed.redditmedia.com/widgets/platform.js" charset="UTF-8"></script>
</figure><h3 id="the-short-squeeze">The Short Squeeze</h3><p>GameStop's stock, in its current state, is entering into short squeeze territory. A short squeeze is <em>a rapid increase in the price of a stock owing primarily to technical factors in the market rather than underlying fundamentals</em>... essentially saying that GameStop's stock price has skyrocketed 1500% in the past 9 months not entirely due to the company fundamentals, but rather due to large over-exposed short positions held by institutional investors.</p><p>What the hell is an over-exposed short position? Essentially, in this case, institutional investors shorted more GME than the stock's float, or <em>the number of <strong>shares</strong> available for trading of a particular stock. </em>Essentially, in this case, institutional investors had outstanding contracts to sell more shares of GME stock than was currently available for trading. <em>(</em>Remember that press release from Michael Burry wayyyyy back in 2019 urging GameStop to buy back a massive quantity of stock?) </p><p>Basically, a short position is an <strong><a href="https://www.investopedia.com/terms/o/option.asp">option</a></strong> known as a <strong>put contract,</strong> and is a bet that a stock's value will go down... so an investor can purchase a contract that empowers them to sell a stock at a fixed, agreed-upon price to a buyer at a later date. The idea is that, if you purchase a contract to sell a stock at 10$, and the trading price of that stock goes to 1$ one month later, you can buy shares of the stock at 1$, and turn around and immediately sell them to the buyer at the sale price of the contract - in this case, 10$ a share.</p><p>Institutional investors in this case got a little greedy - there was so much confidence that GameStop was a dying company that institutional investors basically gorged themselves on put contracts, thinking that GameStop shares would be so dirt cheap when their options were near expiring that they'd make a massive gain when the options were exercised.</p><p>However, popular investor interest started driving up <a href="https://markets.businessinsider.com/news/stocks/gamestop-stock-price-retail-traders-shorts-citron-andrew-left-gme-2021-1-1029994276">retail investor long positions in a big way</a>. The opposite of a short position, a<strong> long position</strong> is a bet that a company's stock price will increase. A long position an be as simple as buying a share of the stock (with the intention of selling it at a later date for a profit), or can get more complex with <strong><a href="https://www.investopedia.com/terms/c/calloption.asp">call options</a></strong>, which is a contract that allows an investor to buy a stock at a fixed price at a later date (the idea being that, if a stock price goes up to 10$, you'll be able to buy that stock for 1$ and immediately sell it to the open market for a 9$ profit).</p><p>So, now institutional traders are panicking... essentially, there is a huge demand for GameStop stocks (since there are so many unfilled short positions) and limited supply of stock (since so many people are opening long positions in GME), leading to an increase in stock price, and drastically reducing if not completely zero-ing the value of the outstanding short positions.</p><h3 id="what-s-next">What's next</h3><p>As of this writing, GameStop stock is flying high at $65.01 a share. What remains to be seen is how this short squeeze situation plays out, but one thing is certain... organized crowdsourcing of retail investors can move markets.</p>]]></content:encoded></item><item><title><![CDATA[Planes, Trains, and Hoovers: How a travel promotion nearly killed an appliance empire]]></title><description><![CDATA[In 1992, Hoover messed up... with a promotion promising two international flights (a 600£ value) in exchange for a 100£ purchase. Ultimately, Hoover incurred tens of millions in debt, fired several executives, lost their Royal Warrant, and divested their European business to Italy's Candy SpA.]]></description><link>https://shtyoushouldknow.com/planes-trains-and-hoovers-how-a-travel-promotion-nearly-killed-an-appliance-empire/</link><guid isPermaLink="false">6005fdfdf2fce704c47f8504</guid><category><![CDATA[Learn Something]]></category><dc:creator><![CDATA[Ivan Parra-Orlandoni]]></dc:creator><pubDate>Wed, 20 Jan 2021 04:49:37 GMT</pubDate><media:content url="https://shtyoushouldknow.com/content/images/2021/01/8145595536_a48f6176bf_b.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><img src="https://shtyoushouldknow.com/content/images/2021/01/8145595536_a48f6176bf_b.jpg" alt="Planes, Trains, and Hoovers: How a travel promotion nearly killed an appliance empire"><p style="font-size: .7em; margin-bottom: 20px; line-height: 1.3em !important;"><em>(photo credit: <a href="https://www.flickr.com/photos/76061588@N03/8145595536">"1920s vintage HOOVER Vacuum Housewife cleaning Wicker Furniture Illustrated Ad Adve... http://wicker.tw/JeGZDt"</a> by <a href="https://www.flickr.com/photos/76061588@N03">Wicker Paradise</a> is licensed under <a href="https://creativecommons.org/licenses/by/2.0/?ref=ccsearch&atype=rich">CC BY 2.0</a>)</em></p>
<style>
    @media only screen and (max-width: 767px){
.post-content div.text p {

    font-size: 1.2em;
    line-height: 1.85em;
        }}
   .twitter-tweet{
    margin-left: auto;
    margin-right: auto;
    }
</style><!--kg-card-end: html--><!--kg-card-begin: html--><p style="margin-bottom: 5px !important;"><a href="https://shtyoushouldknow.slack.com">Join our slack channel</a> for realtime notifications</p><!--kg-card-end: html--><h3 id="hoover-a-vacuuming-powerhouse-with-a-royal-warrant">Hoover - a vacuuming powerhouse with a Royal Warrant</h3><p>In the 1980's, the <a href="https://en.m.wikipedia.org/wiki/The_Hoover_Company">Hoover Company</a>, under their parent <a href="https://en.wikipedia.org/wiki/Maytag">Maytag</a> (which finalized their purchase of Hoover in 1989), was one of the dominant vacuum and household appliance companies in their market segments, having enjoyed a roughly 50% ownership of the vacuum market for almost 40 years, and were primed for expansion, focusing specifically on UK expansion.</p><p>Unluckily, this growth agenda overlapped a <a href="https://en.wikipedia.org/wiki/Early_1990s_recession">global recession in 1990-1992</a> that severely impacted consumer spend (and hit the UK particularly hard)... so they did what any self respecting appliance company would do when faced with an almost 50% drop in annual revenue ( from $147 million in 1987 to $74 million by 1992), and made a <a href="https://youtu.be/SX_kjLREx_E">talking vacuum cleaner.</a></p><p>Shockingly, this didn't solve their financial woes. So they did the second thing any self respecting company does when faced with a drop in income... in 1992 they laid off a bunch of employees and launched a crazy marketing campaign.</p><p>You see, Hoover's main issue was that their stockpile of unsold inventory was becoming massive... they hadn't counted on a recession driving up unemployment and driving down discretionary consumer spend, so they ramped up production and accidentally ended up with a crap load (scientific term) of aging vacuum cleaners that they absolutely had to sell within a couple of years (because why buy a 4 year old Hoover when you can buy a shiny new <a href="https://fortune.com/2017/09/09/james-dyson-vacuum/">Dyson</a>?)</p><p>What a conundrum... how do you convince a bunch of people who don't want to spend over 100£ on a new vacuum cleaner (around 260£  in 2020 dollars) during the height of a recession that it is, in fact, a fantastic idea to spend &gt;100£ on a new vacuum cleaner? Well, <a href="https://www.independent.co.uk/life-style/great-financial-disasters-our-time-hoover-fiasco-1171711.html">Michael Gilbey and Brian Webb</a>, two marketing execs at Hoover UK, had a stroke of genius: entice potential customers with a commodity even more valuable (and less recession friendly)!<br><br>And here was the lightbulb moment... a travel agency called JSI travel was also feeling the recession pinch, and had gotten wind that Hoover UK was trying to do something crazy to sell more vacuums. They pitched Hoover an idea that fit the bill for wild, crazy, and just a little reckless... </p><p>Hoover UK agreed to run a promotion where any customer who spent more than 100£ would be eligible to receive two free round-trip tickets to any destination in Europe. It was a win-win - Hoover would unload its aging product, and JSI would sell tickets to Hoover in bulk to fulfill the promotional terms. No problems at all, right?</p><h3 id="some-funny-math">Some funny math</h3><p>So wait a minute... were airline tickets way cheaper in the early 90's or something? Not really... the average intra-continental round trip flight cost ~150-200£, meaning Hoover was potentially on the hook for ~400£ per customer. Something about this deal seems... off, right? I mean a company struggling financially giving away around 300£ for every single 100£ vacuum sold?</p><p>No worries - Hoover thought of this. They had a "foolproof" 3-step plan to ensure they didn't lose money: first, upsell the <em>crap</em> out of anyone who bought a vacuum, second, allow JSI to offset the cost of the tickets with trip add-ons (trip insurance, etc...), and third, work with JSI to make their customers hate them. This last point might seem melodramatic, but take a look at the multi-step process to actually redeem the promotional offer below:</p><!--kg-card-begin: html--><style>
@font-face {
  font-family: tyfyicons;
  src: url("../fonts/tyfyicons/tyfyicons.eot");
  src: url("../fonts/tyfyicons/tyfyicons.eot?#iefix") format("embedded-opentype"), url("../fonts/tyfyicons/tyfyicons.woff2") format("woff2"), url("../fonts/tyfyicons/tyfyicons.woff") format("woff"), url("../fonts/tyfyicons/tyfyicons.ttf") format("truetype"), url("../fonts/tyfyicons/tyfyicons.svg#tyfyicons") format("svg");
  font-style: normal;
  font-weight: 400
}

*+.tabs-container {
  margin-top: 1.625rem
}

.tabs-container+h2,
.tabs-container+h3,
.tabs-container+h4,
.tabs-container+h5,
.tabs_container+h6 {
  margin-top: 2.4375rem
}

.tabs-container ul.tabs {
  -webkit-box-align: stretch;
  align-items: stretch;
  border-bottom: 2px rgba(0, 0, 0, 0.2) solid;
  display: none;
  margin: 0;
  padding: 0
}

.tabs-container ul.tabs *+* {
  margin-top: 0rem
}

@media (min-width: 40em) {
  .tabs-container ul.tabs {
    display: -webkit-box;
    display: flex
  }
}

.tabs-container ul.tabs li {
  background-color: rgba(0, 0, 0, 0.05);
  border: 2px rgba(0, 0, 0, 0.2) solid;
  border-bottom: 0;
  border-radius: .20312rem .20312rem 0 0;
  cursor: pointer;
  display: block;
  -webkit-box-flex: 1;
  flex: 1;
  font-family: "Zilla Slab", "Georgia", serif;
  margin: 0 0 -2px 0;
  padding: .8125rem 1.625rem;
  text-align: center;
  transition-duration: .25s;
  transition-property: background-color
}

.tabs-container ul.tabs li:hover {
  background-color: rgba(0, 0, 0, 0.1)
}

.tabs-container ul.tabs li.open {
  background-color: transparent;
  border-bottom: 2px rgba(255, 255, 255, 0.7) solid;
  font-weight: 600
}

.tabs-container ul.tabs li+li {
  margin-left: .8125rem
}

.tabs-container.tabs-processed .tab-label {
  background-color: transparent;
  border: 2px rgba(0, 0, 0, 0.2) solid;
  border-bottom: 2px transparent solid;
  clear: both;
  cursor: pointer;
  font-size: 1.728rem;
  line-height: 2.4375rem;
  margin: 0;
  padding: 1.625rem 4.875rem .8125rem 1.625rem;
  position: relative;
  transition-duration: .5s;
  transition-property: padding-top
}

.tabs-container.tabs-processed .tab-label:before {
  border-radius: 50%;
  content: "î¨…";
  font-family: tyfyicons;
  font-size: 1rem;
  font-style: normal;
  font-weight: normal;
  position: absolute;
  right: 1.625rem;
  text-align: center;
  top: 1.625rem;
  transition-duration: .5s;
  transition-property: background-color, color, top;
  transition-timing-function: ease-in-out;
  width: 2.4375rem
}

@media (min-width: 40em) {
  .tabs-container.tabs-processed .tab-label {
    display: none
  }
}

.tabs-container.tabs-processed .tab-label.collapsed {
  border-bottom: 2px rgba(0, 0, 0, 0.2) solid;
  padding-top: .8125rem
}

.tabs-container.tabs-processed .tab-label.collapsed:before {
  content: "î¨";
  top: .8125rem
}

.tabs-container.tabs-processed .tab-label.transition {
  border-bottom-color: transparent;
  padding-top: .8125rem
}

.tabs-container.tabs-processed .tab-label.transition:before {
  top: .8125rem
}

.tabs-container.tabs-processed .tab-label.transition.collapsed {
  padding-top: 1.625rem
}

.tabs-container.tabs-processed .tab-label.transition.collapsed:before {
  top: 1.625rem
}

.tabs-container.tabs-processed .tab-label:hover:before {
  background-color: #5fb31f;
  color: white
}

.tabs-container.tabs-processed *+.tab-label {
  margin-top: 1.625rem
}

.tabs-container.tabs-processed .tab-panel {
  border: 2px rgba(0, 0, 0, 0.2) solid;
  border-top: none;
  border-radius: 0 0 0.25rem 0.25rem;
  margin-top: 0rem;
  overflow: hidden;
  padding: .8125rem 1.625rem 1.625rem
}

@media (min-width: 40em) {
  .tabs-container.tabs-processed .tab-panel {
    display: none;
    padding-top: 1.625rem
  }
}

.tabs-container.tabs-processed .tab-panel.open {
  display: block
}

@media (max-width: 39.996em) {
  .tabs-container.tabs-processed .tab-panel.collapsed {
    border: none;
    height: 1px;
    padding-bottom: 0;
    padding-top: 0;
    position: absolute
  }
}

section {
  margin: 0 auto;
  max-width: 55rem;
  padding: 1.625rem;
}
section.demo {
  border: 2px dashed #e6e6e6;
  border-radius: 0.8125rem;
  box-shadow: inset 0px 0px 1.625rem rgba(0, 0, 0, 0.05);
  margin-top: 1.625rem;
}

</style>

<section class="demo">
 			<div class="tabs-container">
				<h2 class="tab-label">Step 1</h2>
        <p class="tabParagraph">A customer spends over £100 on Hoover products. They then fill out a lengthy application, and mail the completed application and their original receipt to the content PO Box within 14 days of their purchase.</p>

				<h2 class="tab-label collapsed">Step 2</h2>
        <p class="tabParagraph">14 days later - Hoover then sends the client a registration form, which the client must fill out and mail back to Hoovder wihtin 14 days of receipt.</p>
				<h2 class="tab-label collapsed">Step 3</h2>
				<p class="tabParagraph">14 days later - Hoover sends the client a travel voucher. The client must select three different departure airport, destination, and flight time combinations, and send the travel voucher back to Hoover within 30 days</p>
        <h2 class="tab-label collapsed">Step 4</h2>
        <p class="tabParagraph">30 days later - Hoover has the right to reject the customer's selections. Hoover sends a notice to the customer that their selection has been declined and another travel voucher, on which the customer must select 3 more travel options and mail back to Hoover within 30 days.</p>
        <h2 class="tab-label collapsed">Step 5</h2>
        <p class="tabParagraph">30 days later - Hoover has the right to decline the customer's second travel selections as well. Hoover mails the customer three travel options of Hoover's choosing, and the customer has 30 days to either select one of the presented options or decline. If a customer declines all of these options, the customer forfeits their prize.</p>
			</div>
  </section>

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

  <script>
    $(document).ready(function(){
  
  GoToAnchor = function(){
    // find the anchor and any tab it might be in
    selected_anchor_name = encodeURIComponent(window.location.hash.substring(1));
    selected_anchor = $('a[name="'+selected_anchor_name+'"], a[id="'+selected_anchor_name+'"]');
    parent_tab = selected_anchor.parents('.tab-panel');
    // account for an anchor in a label
    parent_label = selected_anchor.parents('.tab-label');
    if (parent_label.length) {
      parent_tab = parent_label.next('.tab-panel');
    }
    // do the steps of this function only if we have an anchor link and a tab panel
    if (selected_anchor.length && parent_tab.length) {
      parent_tab_label = parent_tab.prev('.tab-label');
      parent_tab_index = parent_tab_label.attr('data-tabindex');
      parent_tab.parent().find('ul.tabs li').eq(parent_tab_index).click();
      if (parent_tab.hasClass('collapsed')) {
        parent_tab.removeClass('collapsed');
        parent_tab_label.removeClass('collapsed');
      }
      // scroll to the anchor
      var s = selected_anchor.offset().top - 50; // console.log(s);
      $('body,html').animate({'scrollTop':s},500,'swing');
    }
  };
  
  // prepare HTML structure for each tab container
  $('.tabs-container').each(function(){
    if (!$(this).hasClass('tabs-processed')) {
      // find the headings that are tab labels
      my_tablabels = $(this).find('.tab-label');
      // create tabs
      if ($(this).find('ul.tabs').length === 0) {
        $(this).prepend('<ul class="tabs"></ul>');
        var x;
        for (x=0;x<my_tablabels.length;x++) {
          $(this).find('ul.tabs').append('<li data-tabindex="'+x+'">'+my_tablabels.eq(x).text()+'</li>');
        }
      }
      // structure all labels and wrap all tab panels
      if ($(this).find('.tab-panel').length === 0) {
        my_tablabels.each(function(i){
          $(this).attr('data-tabindex',i);
          $(this).wrapInner('<a id="'+encodeURIComponent($(this).text())+'"></a>');
          kids = $(this).nextUntil('.tab-label').wrapAll('<div class="tab-panel"></div>');
          // default state class for when tabs are collapsable sections
          $(this).addClass('collapsed').next('.tab-panel').addClass('collapsed');
        });    
      }
      // open initial tab
      $(this).find('ul.tabs li').eq(0).addClass('open');
      my_tablabels.eq(0).addClass('open').next('.tab-panel').addClass('open');
      // tab click events
      $('.tabs-container ul.tabs li').each(function(i){
        $(this).click(function(){
          if (!$(this).hasClass('open')) {
            $('.tabs-container .open').removeClass('open');
            my_tabindex = $(this).attr('data-tabindex');
            $(this).addClass('open');
            $('.tabs-container .tab-label').eq(my_tabindex).addClass('open');
            $('.tabs-container .tab-panel').eq(my_tabindex).addClass('open');
          }
        });
      });
      // collapsable header click event
      $('.tabs-container .tab-label').click(function(){
        if (!$(this).hasClass('transition')) {
          kids = $(this).next('.tab-panel');
          kids.removeClass('collapsed');
          var fullHeight = kids.outerHeight();
          $(this).addClass('transition');
          kids.addClass('transition');

          if ($(this).hasClass('collapsed')) {
            kids.css({'height':'0px','padding-bottom':'0px','padding-top':'0px'}).animate({
              height:fullHeight+'px',
              paddingBottom:'32px',
              paddingTop:'16px',
            },500,function(){
              $('.tabs-container .transition').removeClass('collapsed').removeClass('transition').removeAttr('style');
            });
          }
          else {
            kids.css('height',fullHeight+'px').animate({
              height:'0px',
              paddingBottom:'0px',
              paddingTop:'0px',
            },500,function(){
              $('.tabs-container .transition').addClass('collapsed').removeClass('transition').removeAttr('style');
            });
          }
        }
      }); 
      // indicate state of readiness
      $(this).addClass('tabs-processed');
    }  
  });
  // if there are tabs and someone has linked to an anchor inside a tab
  console.log(window.location.hash);
  if (window.location.hash != '') {
    GoToAnchor();
  }
  // handle case when page is already loaded
  $(window).on('hashchange',function(){
    GoToAnchor();
  });
});

  </script><!--kg-card-end: html--><h3 id="against-all-odds-the-strategy-worked">Against all odds... the strategy worked</h3><p>Hoover and JSI, between their salescraft and the whole "become the target of all of our customers' deep, deep rage" tractics, actually only saw a ticket redemption of 10%, while Hoover was offloading product like crazy - and who wouldn't, with an advertising slogan like: "<a href="https://www.newspapers.com/image/260336685/?terms=hoover%2Bfree%2Bflight"><em>Two free flights</em>: <strong>Unbelievable</strong></a>."</p><p>So the job was done... Hoover ran a successful promotion, JSI pulled themselves out of the recession, and Hoover became the world's incumbent vacuum company.</p><p>"But wait... I came for drama, not some sappy feel good story about a successful marketing promotion". No worries! We here at <a href="https://shtyoushouldknow.com/planes-trains-and-hoovers-how-a-travel-promotion-nearly-killed-an-appliance-empire/shtyoushouldknow.com">Sh*t You Should Know</a> are here for the drama. That whole Hoover running a successful promotion thing and quitting while they were ahead thing? Total lie (C'mon... have you ever been to a casino? How many people quit while they're ahead?)</p><p>See Hoover UK did so well at clearing inventory, they had a cunning idea... what if they make the promotion even <strong>more</strong> enticing? They had some pretty aggressive growth goals, and the executives at Hoover UK likely saw some fat bonuses in their futures if they could hit these growth goals amidst a global recession. So then this happened:</p><figure class="kg-card kg-image-card"><img src="https://shtyoushouldknow.com/content/images/2021/01/Hoover-free-flights-1.jpg" class="kg-image" alt="Planes, Trains, and Hoovers: How a travel promotion nearly killed an appliance empire" srcset="https://shtyoushouldknow.com/content/images/size/w600/2021/01/Hoover-free-flights-1.jpg 600w, https://shtyoushouldknow.com/content/images/2021/01/Hoover-free-flights-1.jpg 815w" sizes="(min-width: 720px) 720px"></figure><h3 id="oh-yeah-they-doubled-down-big-time">Oh yeah, they doubled down... big time</h3><p>The intra-continental European flights worked so well, Hoover decided to up the ante with an even bigger prize - two roundtrip flights to America. Talk about a star spangled incentive!</p><p>And boy, if that European flight deal worked, this US flight deal was gangbusters. Product was flying off the shelves, and Hoover could barely keep up with demand despite nearly doubling production staff in their factories.</p><h3 id="when-funny-math-stops-being-funny">When funny math stops being funny</h3><p>The deal for UK-&gt;US roundtrip airfare was structured the same as the deal for Europe-only airfare... customers only had to spend 100£ to be eligible for the promotion. Hoover was banking on being able to upsell customers on accessories, higher end models, etc... but this wasn't shaking out as planned. </p><p>The most popular vacuum model to meet the 100£ minimum was the Turbopower Total system, which came in at a retail price of 119.99£... and this particular model accounted for a whopping &gt;80% of promotion sales. Hoover's upsell attempts (extended warranties, accessories, higher-tier models, etc...) went largely ignored, and customers mostly walked out of Hoover stores dragging their 119.99£ Turbopower Total systems, and, ostensibly, chucking them in the industrial-sized garbage cans sitting outside each Hoover UK storefront (kidding but maybe not really?) </p><p>On each of these units, Hoover made around a ~30£ profit. The issue was that the value of the two round trip fares that were offered as part of the promotion was around 600£, and people were certainly redeeming the offer.</p><p>Based on data from Hoover UK's first promotion (with Europe-only round trips), they were expecting around a 5-10% redemption rate. In actuality, they saw a &gt;50% redemption rate, eventually having an estimated half million customers who redeemed their free flight offers.</p><p>As far as a vehicle to increase total sales, the promotion worked like a treat - they ended up 10-x'ing their projections and selling 30MM£  more in vacuums and washing machines. However, they also ended up on the hook for <a href="http://news.bbc.co.uk/2/hi/business/3704669.stm">72MM£ in flights for around 220,000 customers</a>.</p><h3 id="-i-love-it-when-a-plan-comes-together">"...I love it when a plan comes together"</h3><p>... said no one at Hoover. In order to prevent themselves from forking over almost 50MM£, Hoover engaged in some... questionable practices to prevent themselves from going bankrupt trying to fulfill these flights... questionable practices that Harry Cichy, founder of the Hoover Holiday Pressure Group, tirelessly sought to expose to get customers their just deserves. These efforts culminated in a <a href="https://apnews.com/article/8ce46d33e133c48329aab9093b998f57">series of lawsuits </a>that got 220,000 customers their free flights, with an estimated 350,000 more customers having grounds to sue Hoover directly.</p><p>Hoover ended up having to charter flights to Florida and New York from American Airlines, British Airways, and Virgin Atlantic, as well as charter private planes to fulfill their dues.</p><p>The net result? Michael Gilbey, Brian Webb, and Hoover's European president William Foust were all fired. Hoover's royal warrant was revoked. A series of lawsuits continued to plague Hoover some 10 years later. <a href="https://www.independent.co.uk/news/hoover-gets-sucked-blockage-over-free-air-tickets-dispute-1488932.html">And a man name Dave Dixon (who some call a hero) held a Hoover van captive in his driveway for several weeks.</a></p><p>As if all that weren't enough, Hoover's long tail sales pipeline was ruined because people were just buying vacuums for the free flights. The UK market was flooded with Turbopower Total Systems (which were a popular hand me down gift for almost two decades after the debacle) and Hoover's sales and reputation took such. a massive hit that they had to sell Hoover Europe to the Italian appliance company Candy SpA.</p><p>Truly a sweet end to a sour situation.</p>]]></content:encoded></item><item><title><![CDATA[Spycraft, assassination attempts, and a disgruntled Russian government vs Alexei Navalny]]></title><description><![CDATA[Alexei Navalny, prominent Russian government detractor, is arrested on his return to Moscow after being poisoned on a business trip several months ago. Both side claim wrongdoing... Navalny of Russian government involvement in the poisoning, and the Kremlin of Navalny's criminal activity.]]></description><link>https://shtyoushouldknow.com/tinker-tailor-soldier-navalny/</link><guid isPermaLink="false">6004aad7f2fce704c47f8329</guid><category><![CDATA[World News]]></category><dc:creator><![CDATA[Ivan Parra-Orlandoni]]></dc:creator><pubDate>Sun, 17 Jan 2021 02:59:00 GMT</pubDate><media:content url="https://shtyoushouldknow.com/content/images/2021/01/Yulia_Navalny-_Alexey_Navalny_and_Ilya_Yashin_at_Moscow_rally_2013-06-12_2.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><img src="https://shtyoushouldknow.com/content/images/2021/01/Yulia_Navalny-_Alexey_Navalny_and_Ilya_Yashin_at_Moscow_rally_2013-06-12_2.jpeg" alt="Spycraft, assassination attempts, and a disgruntled Russian government vs Alexei Navalny"><p style="font-size: .7em; margin-bottom: 20px; line-height: 1.3em !important;"><i>(photo credit: <a href="https://commons.wikimedia.org/w/index.php?curid=26782841">"File:Yulia Navalny, Alexey Navalny and Ilya Yashin at Moscow rally 2013-06-12 2.JPG"</a> by <a href="https://commons.wikimedia.org/wiki/User:Bogomolov.PL">Bogomolov.PL</a> is licensed under <a href="https://creativecommons.org/licenses/by-sa/3.0?ref=ccsearch&atype=rich">CC BY-SA 3.0</a>)</i></p>
<style>
    @media only screen and (max-width: 767px){
.post-content div.text p {

    font-size: 1.2em;
    line-height: 1.85em;
        }}
   .twitter-tweet{
    margin-left: auto;
    margin-right: auto;
    }
</style><!--kg-card-end: html--><!--kg-card-begin: html--><style>
/*Initial Play Button*/
 @-webkit-keyframes spinInit {
  to {
    transform: rotate(360deg);
  }
}
@keyframes spinInit {
  to {
    transform: rotate(360deg);
  }
}
.stroke-dottedInit {
  opacity: 0;
  stroke-dasharray: 4,5;
  stroke-width: 1px;
  transform-origin: 50% 50%;
  -webkit-animation: spinInit 4s infinite linear;
          animation: spinInit 4s infinite linear;
  transition: opacity 1s ease,  stroke-width 1s ease;
}

.stroke-solidInit {
  stroke-dashoffset: 0;
  stroke-dashArray: 300;
  stroke-width: 4px;
  transition: stroke-dashoffset 1s ease,  opacity 1s ease;
}

.iconInit {
  transform-origin: 50% 50%;
  transition: transform 200ms ease-out;
}

#playInit:hover .stroke-dottedInit {
  stroke-width: 4px;
  opacity: 1;
}
#playInit:hover .stroke-solidInit {
  opacity: 0;
  stroke-dashoffset: 300;
}
#playInit:hover .icon {
  transform: scale(1.05);
}


#playInit {
  cursor: pointer;
}
 /*End Initial Play Button*/
 
 /*Audio Player*/
.holder {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-top: 0px;
  margin-bottom: 24px;
  font-family: "Roboto";
  color: #55606E;
}

.audio.green-audio-player {
  width: 320px;
  min-width: 200px;
  max-width: 75vw;
  height: 56px;
  box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.07);
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-left: 24px;
  padding-right: 24px;
  border-radius: 4px;
  user-select: none;
  -webkit-user-select: none;
  background-color: #fff;
}
.audio.green-audio-player .play-pause-btn {
  display: none;
  cursor: pointer;
}
.audio.green-audio-player .spinner {
  width: 18px;
  height: 18px;
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/355309/loading.png);
  background-size: cover;
  background-repeat: no-repeat;
  animation: spin 0.4s linear infinite;
}
.audio.green-audio-player .slider {
  flex-grow: 1;
  background-color: #D8D8D8;
  cursor: pointer;
  position: relative;
}
.audio.green-audio-player .slider .progress {
  background-color: #44BFA3;
  border-radius: inherit;
  position: absolute;
  pointer-events: none;
}
.audio.green-audio-player .slider .progress .pin {
  height: 16px;
  width: 16px;
  border-radius: 8px;
  background-color: #44BFA3;
  position: absolute;
  pointer-events: all;
  box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.32);
}
.audio.green-audio-player .controls {
  font-family: "Roboto", sans-serif;
  font-size: 16px;
  line-height: 18px;
  color: #55606E;
  display: flex;
  flex-grow: 1;
  justify-content: space-between;
  align-items: center;
  margin-left: 24px;
  margin-right: 24px;
}
.audio.green-audio-player .controls .slider {
  margin-left: 16px;
  margin-right: 16px;
  border-radius: 2px;
  height: 4px;
}
.audio.green-audio-player .controls .slider .progress {
  width: 0;
  height: 100%;
}
.audio.green-audio-player .controls .slider .progress .pin {
  right: -8px;
  top: -6px;
}
.audio.green-audio-player .controls {
  cursor: default;
}
.audio.green-audio-player .volume {
  position: relative;
}
.audio.green-audio-player .volume .volume-btn {
  cursor: pointer;
}
.audio.green-audio-player .volume .volume-btn.open path {
  fill: #44BFA3;
}
.audio.green-audio-player .volume .volume-controls {
  width: 30px;
  height: 135px;
  background-color: rgba(0, 0, 0, 0.62);
  border-radius: 7px;
  position: absolute;
  left: -3px;
  bottom: 52px;
  flex-direction: column;
  align-items: center;
  display: flex;
}
.audio.green-audio-player .volume .volume-controls.hidden {
  display: none;
}
.audio.green-audio-player .volume .volume-controls .slider {
  margin-top: 12px;
  margin-bottom: 12px;
  width: 6px;
  border-radius: 3px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress {
  bottom: 0;
  height: 100%;
  width: 6px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress .pin {
  left: -5px;
  top: -8px;
}

.playerControlSVG {
    display: block;
    }

@keyframes spin {
  from {
    transform: rotateZ(0);
  }
  to {
    transform: rotateZ(1turn);
  }
}
/*End Audio Player*/
</style>

<div id="textToSynth" style="margin-bottom: 80px;">
<div class="audioWrapper">
    <div type="text" style="height:0px; overflow: hidden;" id="textEntry">
Billed as Russia's leading Kremlin critic, Alexei Navalny was detained by police in Moscow on Sunday, moments after his return to Russia from Germany. Navalny's flight from Berlin was rerouted to away from Vnukovo airport to Sheremetyevo airport, leaving crowds gathered at Vnukovo to greet him perplexed. 
According to Kira Yarmysh, Alexei's spokesperson, he was "...taken away by police officers at the border. without explaining the reason..." 
According to reports, Navalny stated "...I am not afraid. I know that I am in the right and that all the criminal cases against me are fabricated.” moments before being led away for detention by police.
Vyacheslav Gimadi, a defense attorney who states he has "notatorial power of attorney", has tweeted that "... Navalny is located in the 2nd department of the Department of Internal Affairs of Khimki: Prospect Mira 23A. I, a defense attorney with a notarial power of attorney, are not allowed to see him, they say he is sleeping..."
This is the latest in escalating tension between Navalny and the Kremlin... the former stating that the Kremlin is responsible for the attempt on his life and for attempting to use force to silence him, the latter continuing to claim that criminal allegations against Navalny are legitimate, despite a verdict from the European Court of Human Rights that "... ruled that Russian opposition politician Aleksei Navalny and his brother Oleg were unfairly convicted of financial crimes at trial in the so-called Yves Rocher case in 2014..."
        
...The poisoning of Alexei Navalny...,
        
The 7:40 AM S7 flight 2614 from Tomsk to Moscow started unremarkably. Alexei Navalny, running late, grabbed a quick cup of tea at the Tomsk airport's Vienna Café. 
Less than two hours into the flight, Alexei was screaming in apparent agony. He'd been poisoned with a Novichok nerve agent , and he reportedly felt that he knew he was dying. The prevailing thought was that the quick cup of tea he'd had at the airport was the vehicle for his poisoning.
In an interview with the Moscow Times, Navalny describes the experience: "...Organophosphorus compounds attack your nervous system like a DDoS attack attacks the computer — it's an overload that breaks you..."
When asked whether he felt pain due to the widespread footage of his seemingly screaming in agony, Navalny said, "...It was something else, worse. Pain makes you feel like you're alive. But in this case, you sense: This is the end..."
By 9 AM, just 90 minutes after takeoff, Alexei was unconscious, and the flight had to make an emergency landing in Omsk, where Navalny was rushed to the City Clinical Emergency Hospital No. 1.
Fearing for his life, Navalny was evacuated to Berlin by the Cinema for Peace Foundation on a Challenger 604 air ambulance.
Once he recovered, the activist said that Russian authorities were behind the attempt on his life, an allegation supported by a joint investigative journalist effort from The Insider, Der Spiegel, CNN, and Bellingcat, but denied by the Kremlin. In December 2020, Navalny (working with Bellingcat) released footage of a phone call he made with an alleged member of the Kremlin's "Poison Squad", one "Konstantin Kudryavtsev". In this footage, Kudryavstev is recorded to have said that the "...crotch of Navalny's underwear..." was targeted as the vehicle for the poison.
        
...The Kremlin's view on Navalny...,
        
Putin broadly dismissed the investigation, saying that it was "...a trick to attack the leaders of Russia..." and claiming that Navalny enjoyed the support of U.S. intelligence, hence the Kremlin's keeping close tabs on Navalny.
Putin also defended against the allegations of Russian official involvement in the poisoning, stating, "...If someone had wanted to poison him they would have finished him off...", while the FSB has called the recording of a conversation between Navalny and alleged Russian agent Kudryastev, "a fake designed to discredit the Kremlin".
With a poll from the Levada-Center showing that half of Russia believed that either Navalny was not poisoned, or that his poisoning was an act of intentional disinformation in collusion with US intelligence, the Kremlin has some support in it's assertions of innocence. The Kremlin maintains its position that Navalny is a financial criminal, opening another criminal case against him in late December 2020, accusing him of fraudulently spending donations to organizations he controls on his personal needs.
Because of his criminal sentencing, Navalny remains ineligible to run for president of Russia. Previously, Navalny entered a bid for the 2018 election in 2016, but he was found ineligible to participate in the election due to his status as a convicted felon. The Leninsky district court of Kirov repeated its sentence of 2013 (which was previously annulled after the decision of ECHR) and charged him with a five-year suspended sentence.

        
    </div>
    <div class="audioPrompt" style="float:left; margin-right:25px;"><i><p id="result" style>Listen to this article <span id="minutesHolder">(<span id="audioMinutes">5</span> minutes)</span></p></i></div>

    <div class="audiocontrolwrapper" style="float:left;">
    <!--<audio id="audioPlayback" controls>
      <source id="audioSource" type="audio/mp3" https://shtyoushouldknow.com/tinker-tailor-soldier-navalny/https://shtyoushouldknow.com/tinker-tailor-soldier-navalny/src="">
    </audio>-->
        
          <div class="audioInit" onclick="speakText()">
      <svg version="1.1" id="playInit" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" height="50px" width="50px" viewbox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
  <path class="stroke-solidInit" fill="none" stroke="black" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7
    C97.3,23.7,75.7,2.3,49.9,2.5"/>
  <path class="stroke-dottedInit" fill="none" stroke="black" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7
    C97.3,23.7,75.7,2.3,49.9,2.5"/>
  <path class="iconInit" fill="black" d="M38,69c-1,0.5-1.8,0-1.8-1.1V32.1c0-1.1,0.8-1.6,1.8-1.1l34,18c1,0.5,1,1.4,0,1.9L38,69z"/>
</svg>
  </div>
        
    <div class="holder" style="display:none;">

  <div class="audio green-audio-player">
    <div class="loading">
      <div class="spinner"></div>
    </div>
    <div class="play-pause-btn">  
      <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="18" height="24" viewbox="0 0 18 24">
        <path fill="#566574" fill-rule="evenodd" d="M18 12L0 24V0" class="play-pause-icon" id="playPause"/>
      </svg>
    </div>

    <div class="controls">
      <span class="current-time">0:00</span>
      <div class="slider" data-direction="horizontal">
        <div class="progress">
          <div class="pin" id="progress-pin" data-method="rewind"></div>
          </div>
      </div>
        <span class="total-time">0:00</span>
    </div>

    <div class="volume">
      <div class="volume-btn">
        <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24">
          <path fill="#566574" fill-rule="evenodd" d="M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z" id="speaker"/>
        </svg>
      </div>
      <div class="volume-controls hidden">
        <div class="slider" data-direction="vertical">
          <div class="progress">
            <div class="pin" id="volume-pin" data-method="changeVolume"></div>
          </div>
        </div>
      </div>
    </div>


    <audio id="audioPlayback" crossorigin>
      <source id="audioSource" type="audio/mp3" src>    
    </audio>

  </div>
</div>
        
    </div>
</div>
</div>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.410.0.min.js"></script>
    <script type="text/javascript">

        // Initialize the Amazon Cognito credentials provider
        AWS.config.region = 'us-west-2'; // Region
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: 'us-west-2:9d8089ba-33fe-47dd-a5ca-4f5f7a236021',
        });
        
        // Function invoked by button click
        function speakText() 
        {
        $( ".audioInit" ).hide();
        $(".holder").animate({width:'toggle'},320);

        // Create the Polly service object and presigner object
          var polly = new AWS.Polly({apiVersion: '2016-06-10'});
            //var signer = new AWS.Polly.Presigner(speechParams, polly)
          var textBlob = document.getElementById("textEntry").innerHTML;


          
          var masterArray = new Uint8Array;
          var subArray = new Uint8Array;
          var startCounter = 0;
          var midCounter = 0;
          var counter = textBlob.length;
          var substr;

          if (textBlob.length > 3000)
          {
              callLargePolly(masterArray);
          }
          else
          {
            callPolly();
          }
             


          function callLargePolly(inputArray)
          {

            subArray = masterArray;

            masterArray = new Uint8Array(subArray.length + inputArray.length);

            masterArray.set(subArray);
            masterArray.set(inputArray, subArray.length);
            console.log("Let's check in on our master array :" + masterArray);
            

            if(counter - startCounter > 2999)
              midCounter = 2999;
            else
              midCounter = counter-startCounter;

            substr = textBlob.substr(startCounter, midCounter);
            startCounter += 2999;

            console.log ("Let's get LargePolly Going with this text:" + substr);

            var params = {        
            OutputFormat: 'mp3', /* required */
            Text: substr,
            VoiceId: 'Amy', /* required */
            TextType: 'text'
            };

    
            polly.synthesizeSpeech(params, function(err, data) {
              if (err)
              {
                console.log(err, err.stack);
              } // an error occurred
              else
              {

                if(startCounter < counter)
                {
                  console.log("wer'e in LargePolly and it worked!")
                  console.log("looks like startCounter < counter: startCounter is: "+startCounter+" and counter is: "+counter )
                  console.log(data.AudioStream);
                  var uInt8Array = new Uint8Array(data.AudioStream);
                  
                  callLargePolly(uInt8Array);
                }
                else
                { 

                  subArray = masterArray;
                  var uInt8Array = new Uint8Array(data.AudioStream);

                  masterArray = new Uint8Array(subArray.length + uInt8Array.length);

                  masterArray.set(subArray);
                  masterArray.set(uInt8Array, subArray.length);


                  console.log("looks like we broke the loops and we're finishing up with masterArray "+masterArray);

                  var arrayBuffer = masterArray.buffer;
                  var blob = new Blob([arrayBuffer], {type: 'audio/mpeg'});
                  var url = URL.createObjectURL(blob);

                  console.log("now we're cooking with gas - we've set a url: " + url );
                  document.getElementById('audioSource').src = url;
                  document.getElementById('audioPlayback').load();

                  audioSource.src = url;

                  initiatePlayer();
                  
                }
              }
            });
          }

          function callPolly()
          {
            console.log("We are calling Polly fools");
            var params = {        
            OutputFormat: 'mp3', /* required */
            Text: textBlob,
            VoiceId: 'Amy', /* required */
            TextType: 'text'
            };

            var masterArray = new Uint8Array();
    
            polly.synthesizeSpeech(params, function(err, data) {
              if (err)
              {
                console.log(err, err.stack);
              } // an error occurred
              else
              {

                console.log("wer'e in polly and it worked!")
                console.log(data.AudioStream);
                var uInt8Array = new Uint8Array(data.AudioStream);
                var arrayBuffer = uInt8Array.buffer;
                var blob = new Blob([arrayBuffer], {type: 'audio/mpeg'});
                var url = URL.createObjectURL(blob);

                audioSource.src = url;
                document.getElementById('audioSource').src = url;
                document.getElementById('audioPlayback').load();


                initiatePlayer();
                togglePlay();
  
              }
            });
          }

          function initiatePlayer()
          {

                  
                var audioPlayer = document.querySelector('.green-audio-player');
                var playPause = audioPlayer.querySelector('#playPause');
                var playpauseBtn = audioPlayer.querySelector('.play-pause-btn');
                var loading = audioPlayer.querySelector('.loading');
                var progress = audioPlayer.querySelector('.progress');
                var sliders = audioPlayer.querySelectorAll('.slider');
                var volumeBtn = audioPlayer.querySelector('.volume-btn');
                var volumeControls = audioPlayer.querySelector('.volume-controls');
                var volumeProgress = volumeControls.querySelector('.slider .progress');
                var player = audioPlayer.querySelector('audio');
                var currentTime = audioPlayer.querySelector('.current-time');
                var totalTime = audioPlayer.querySelector('.total-time');
                var speaker = audioPlayer.querySelector('#speaker');

                var draggableClasses = ['pin'];
                var currentlyDragged = null;

                window.addEventListener('mousedown', function (event) {

                  if (!isDraggable(event.target)) return false;

                  currentlyDragged = event.target;
                  let handleMethod = currentlyDragged.dataset.method;

                  this.addEventListener('mousemove', window[handleMethod], false);

                  window.addEventListener('mouseup', () => {
                    currentlyDragged = false;
                    window.removeEventListener('mousemove', window[handleMethod], false);
                  }, false);
                });
              
                playpauseBtn.addEventListener('click', togglePlay);
                player.addEventListener('timeupdate', updateProgress);
                player.addEventListener('volumechange', updateVolume);
                player.addEventListener('loadedmetadata', () => {
                  totalTime.textContent = formatTime(player.duration, false);
                  document.querySelector('#audioMinutes').textContent = formatTime(player.duration, true);
                 
                });
                player.addEventListener('canplay', makePlay);
                player.addEventListener('ended', function () {
                  playPause.attributes.d.value = "M18 12L0 24V0";
                  player.currentTime = 0;
                });
                            

                volumeBtn.addEventListener('click', () => {
                  volumeBtn.classList.toggle('open');
                  volumeControls.classList.toggle('hidden');
                });

                window.addEventListener('resize', directionAware);

                sliders.forEach(slider => {
                  let pin = slider.querySelector('.pin');
                  slider.addEventListener('click', window[pin.dataset.method]);
                });

                directionAware();
              togglePlay();
               

              function isDraggable(el) {
                let canDrag = false;
                let classes = Array.from(el.classList);
                draggableClasses.forEach(draggable => {
                  if (classes.indexOf(draggable) !== -1)
                  canDrag = true;
                });
                return canDrag;
              }

              function inRange(event) {
                let rangeBox = getRangeBox(event);
                let rect = rangeBox.getBoundingClientRect();
                let direction = rangeBox.dataset.direction;
                if (direction == 'horizontal') {
                  var min = rangeBox.offsetLeft;
                  var max = min + rangeBox.offsetWidth;
                  if (event.clientX < min || event.clientX > max) return false;
                } else {
                  var min = rect.top;
                  var max = min + rangeBox.offsetHeight;
                  if (event.clientY < min || event.clientY > max) return false;
                }
                return true;
              }

              function updateProgress() {
                var current = player.currentTime;
                var percent = current / player.duration * 100;
                progress.style.width = percent + '%';

                currentTime.textContent = formatTime(current, false);
              }

              function updateVolume() {
                volumeProgress.style.height = player.volume * 100 + '%';
                if (player.volume >= 0.5) {
                  speaker.attributes.d.value = 'M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z';
                } else if (player.volume < 0.5 && player.volume > 0.05) {
                  speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667M17.333 11.373C17.333 9.013 16 6.987 14 6v10.707c2-.947 3.333-2.987 3.333-5.334z';
                } else if (player.volume <= 0.05) {
                  speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667';
                }
              }

              function getRangeBox(event) {
                let rangeBox = event.target;
                let el = currentlyDragged;
                if (event.type == 'click' && isDraggable(event.target)) {
                  rangeBox = event.target.parentElement.parentElement;
                }
                if (event.type == 'mousemove') {
                  rangeBox = el.parentElement.parentElement;
                }
                return rangeBox;
              }

              function getCoefficient(event) {
                let slider = getRangeBox(event);
                let rect = slider.getBoundingClientRect();
                let K = 0;
                if (slider.dataset.direction == 'horizontal') {

                  let offsetX = event.clientX - slider.offsetLeft;
                  let width = slider.clientWidth;
                  K = offsetX / width;

                } else if (slider.dataset.direction == 'vertical') {

                  let height = slider.clientHeight;
                  var offsetY = event.clientY - rect.top;
                  K = 1 - offsetY / height;

                }
                return K;
              }

              function rewind(event) {
                if (inRange(event)) {
                  player.currentTime = player.duration * getCoefficient(event);
                }
              }

              function changeVolume(event) {
                if (inRange(event)) {
                  player.volume = getCoefficient(event);
                }
              }

              function formatTime(time, minutesonly) {
                console.log("format time function:");
                var min = Math.floor(time / 60);
                console.log(min);
                var sec = Math.floor(time % 60);
                console.log(sec);
                if(minutesonly == false)
                {
                   return min + ':' + (sec < 10 ? '0' + sec : sec);
                }
                else
                {
                    if(sec > 30)
                    	return min+1;
                    else
                       return min;
                }
                
              }
                          
              function minutesOnly(time) {
                  console.log("minutes only function:");
                 var min = Math.floor(time / 60);
                  console.log(min);
                  return min;
              }

              function togglePlay() {
                if (player.paused) {
                  playPause.attributes.d.value = "M0 0h6v24H0zM12 0h6v24h-6z";
                  player.play();
                } else {
                  playPause.attributes.d.value = "M18 12L0 24V0";
                  player.pause();
                }
              }

              function makePlay() {
                playpauseBtn.style.display = 'block';
                loading.style.display = 'none';
              }

              function directionAware() {
                if (window.innerHeight < 250) {
                  volumeControls.style.bottom = '-54px';
                  volumeControls.style.left = '54px';
                } else if (audioPlayer.offsetTop < 154) {
                  volumeControls.style.bottom = '-164px';
                  volumeControls.style.left = '-3px';
                } else {
                  volumeControls.style.bottom = '52px';
                  volumeControls.style.left = '-3px';
                }
              }
            }
          }
        //window.onload = speakText();
        
    </script>
<!--kg-card-end: html--><!--kg-card-begin: html--><p style="margin-bottom: 5px !important;"><a href="https://shtyoushouldknow.slack.com">Join our slack channel</a> for realtime notifications</p><!--kg-card-end: html--><h3 id="kremlin-opposition-leader-alexei-navalny-has-been-detained-by-russian-police-after-flying-back-to-moscow-five-months-after-he-was-poisoned-and-nearly-killed">Kremlin opposition leader Alexei Navalny has been detained by Russian police after flying back to Moscow five months after he was poisoned and nearly killed</h3><p>Billed as Russia's leading Kremlin critic, Alexei Navalny<a href="https://www.bbc.com/news/world-europe-55694598"> was detained by police in Moscow on Sunday</a>, moments after his return to Russia from Germany. Navalny's flight from Berlin was <a href="https://www.france24.com/en/europe/20210117-kremlin-critic-navalny-faces-potential-arrest-as-he-flies-back-to-russia">rerouted to away from Vnukovo airport to Sheremetyevo airport</a>, leaving crowds gathered at Vnukovo to greet him perplexed. </p><p><a href="https://twitter.com/Kira_Yarmysh/status/1350866034136387588">According to Kira Yarmysh, Alexei's spokesperson</a>, he was "...taken away by police officers at the border. without explaining the reason..." </p><p>According to reports, Navalny stated "...I am not afraid. I know that I am in the right and that all the criminal cases against me are fabricated.” <a href="https://www.nytimes.com/2021/01/17/world/europe/navalny-russia-return.html?smid=tw-nytimes&amp;smtyp=cur">moments before being led away for detention by police</a>.</p><p><a href="https://twitter.com/vigimadi">Vyacheslav Gimadi</a>, a defense attorney who states he has "<a href="https://twitter.com/vigimadi/status/1350938053636984835">notatorial power of attorney</a>", has tweeted that "... Navalny is located in the 2nd department of the Department of Internal Affairs of Khimki: Prospect Mira 23A. I, a defense attorney with a notarial power of attorney, are not allowed to see him, they say he is sleeping..."</p><!--kg-card-begin: html--><blockquote class="twitter-tweet"><p lang="ru" dir="ltr">Навальный находится во 2 отделе УВД Химки: проспект Мира 23А. Меня, защитника с нотариальной доверенностью, к нему не пускают, говорят он спит. На закон, конечно же, не ссылаются. Подал заявление о допуске. <a href="https://t.co/6eX1GIBwfz">pic.twitter.com/6eX1GIBwfz</a></p>&mdash; Vyacheslav Gimadi (@vigimadi) <a href="https://twitter.com/vigimadi/status/1350938053636984835?ref_src=twsrc%5Etfw">January 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><!--kg-card-end: html--><p>This is the latest in escalating tension between Navalny and the Kremlin... the former stating that the Kremlin is responsible for the attempt on his life and for <a href="https://www.bbc.com/news/av/world-europe-23353401">attempting to use force to silence him</a>, the latter continuing to claim that criminal allegations against Navalny are legitimate, despite a verdict from the European Court of Human Rights that "<a href="https://www.rferl.org/a/aleksei-oleg-navalny-yves-rocher-case-echr-unfairly-convicted/28799784.html">... ruled that Russian opposition politician Aleksei Navalny and his brother Oleg were unfairly convicted of financial crimes at trial in the so-called Yves Rocher case in 2014...</a>"</p><h3 id="the-poisoning-of-alexei-navalny">The poisoning of Alexei Navalny</h3><p>On Thursday, August 20, 2020, the 7:40 AM S7 flight 2614 from Tomsk to Moscow started unremarkably. Alexei Navalny, running late, grabbed a quick cup of tea at the Tomsk airport's Vienna Café. </p><p>Less than two hours into the flight, Alexei was <a href="https://www.cnn.com/2020/08/20/europe/russia-navalny-hospitalized-intl-hnk/index.html">screaming in apparent agony</a>. He'd been poisoned with a <a href="https://en.wikipedia.org/wiki/Novichok_agent">Novichok</a> nerve agent , and he reportedly felt that he knew he was dying. The prevailing thought was that the quick cup of tea he'd had at the airport was the vehicle for his poisoning.</p><p><a href="https://www.themoscowtimes.com/2020/10/01/all-i-know-is-that-i-am-dying-navalny-recounts-ordeal-a71623">In an interview with the Moscow Times</a>, Navalny describes the experience: "...Organophosphorus compounds attack your nervous system like a DDoS attack attacks the computer — it's an overload that breaks you..."</p><p>When asked whether he felt pain due to the widespread footage of his seemingly screaming in agony, Navalny said "...It was something else, worse. Pain makes you feel like you're alive. But in this case, you sense: This is the end..."</p><p>By 9 AM, just 90 minutes after takeoff, Alexei was unconscious, and the flight had to make an emergency landing in Omsk, where Navalny was rushed to the City Clinical Emergency Hospital No. 1.</p><p>Fearing for his life, Navalny was evacuated to Berlin by the<a href="https://www.cinemaforpeace-foundation.org/"> Cinema for Peace Foundation</a> on a <a href="https://www.fai.ag/air-ambulance/challenger604/" rel="noopener noreferrer">Challenger 604 air ambulance</a> on August 22, 2020.</p><p>Once he recovered, the activist said that Russian authorities were behind the attempt on his life, an allegation supported by a joint <a href="https://www.theguardian.com/world/2021/jan/17/poison-squad-stalked-alexei-navalny-on-40-flights-says-bellingcat-investigator">investigative journalist effort from The Insider, Der Spiegel, CNN, and Bellingcat</a>, but denied by the Kremlin. In December 2020, Navalny (working with Bellingcat) released footage of a phone call he mad with an alleged member of the Kremlins "Poison Squad", one Konstantin Kudryavtsev. In this footage, Kudryavstev is recorded to have said that the "<a href="https://www.cnn.com/2020/12/21/europe/russia-navalny-poisoning-underpants-ward/index.html">...crotch of Navalny's underwear...</a>" was targeted as the vehicle for the poison.</p><h3 id="the-kremlin-s-views-on-navalny">The Kremlin's views on Navalny</h3><p><a href="https://www.reuters.com/article/us-russia-putin-navalny/putin-says-kremlin-critic-navalny-not-worth-poisoning-alleges-u-s-smear-campaign-idUSKBN28R1BJ">Putin broadly dismissed the investigation</a>, saying that it was "...a trick to attack the leaders of Russia..." and claiming that Navalny enjoyed the support of U.S. intelligence, hence the Kremlin's keeping close tabs on Navalny.</p><p>Putin also defended against the allegations of Russian official involvement in the poisoning, stating "...If someone had wanted to poison him they would have finished him off...", while the FSB has called the recording of a conversation between Navalny and alleged Russian agent Kudryastev <a href="https://www.reuters.com/article/us-russia-politics-navalny/half-of-russians-sceptical-kremlin-critic-navalny-was-poisoned-poll-idUSKBN28Y1CX">a fake designed to discredit the Kremlin.</a></p><p><a href="https://www.reuters.com/article/us-russia-politics-navalny/half-of-russians-sceptical-kremlin-critic-navalny-was-poisoned-poll-idUSKBN28Y1CX">With a poll from the Levada-Center</a> showing that half of Russia believed that either Navalny was not poisoned, or that hsi poisoning was intentional disinformation in collusion with US intelligence, the Kremlin has some support in its assertions of innocence. The Kremlin maintains its position that Navalny is a financial criminal, opening another criminal case against him in late December, 2020 accusing him of <a href="https://www.reuters.com/article/us-russia-politics-navalny/russia-opens-new-criminal-case-against-kremlin-critic-alexei-navalny-idUSKBN2931SR">fraudulently spending donations to organizations he controls on his personal needs.</a> </p><p>Because of his criminal sentencing, Navalny remains ineligible to run for president of Russia. Previously, Navalny entered a bid for the 2018 election in 2016, but he was found ineligible to participate in the election due to his status as a convicted felon. The Leninsky district court of Kirov repeated its sentence of 2013 (which was previously annulled after a decision of the <a href="https://en.wikipedia.org/wiki/European_Court_of_Human_Rights">ECHR</a>) in the Kirovles trials, where he and his brother Oleg were convicted of embezzlement, and Alexei was charged with a five-year suspended sentence.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Bobi Wine - Uganda's "Ghetto President"]]></title><description><![CDATA[UGANDA - Bobi Wine, a prominent hip-hop artist, is challenging President Yoweri Museveni. In an election marred by violence, death, and allegations of government misdeeds (such as internet blockage  and voter fraud), Pres. Museveni carries a clear lead in the polls, while the opposition cries foul.]]></description><link>https://shtyoushouldknow.com/bobi-wine-ugandas-ghetto-president/</link><guid isPermaLink="false">60027139f2fce704c47f81d3</guid><category><![CDATA[World News]]></category><dc:creator><![CDATA[Ivan Parra-Orlandoni]]></dc:creator><pubDate>Sat, 16 Jan 2021 04:59:25 GMT</pubDate><media:content url="https://shtyoushouldknow.com/content/images/2021/01/4018696710_0d5cfc9f4c_b.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><img src="https://shtyoushouldknow.com/content/images/2021/01/4018696710_0d5cfc9f4c_b.jpg" alt="Bobi Wine - Uganda's "Ghetto President""><p style="font-size: .7em; margin-bottom: 20px; line-height: 1.3em !important;"><i><a https: shtyoushouldknow.com bobi-wine-ugandas-ghetto-president href>(photo credit: "Natural Fire 10 Opens, U.S. Army Africa, Kitgum, Uganda 091016"by US Army Africa is licensed under CC BY 2.0)</a></i></p>
<style>
    @media only screen and (max-width: 767px){
.post-content div.text p {

    font-size: 1.2em;
    line-height: 1.85em;
        }}
</style><!--kg-card-end: html--><!--kg-card-begin: html--><style>

.holder {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-top: 0px;
  margin-bottom: 24px;
  font-family: "Roboto";
  color: #55606E;
}

.audio.green-audio-player {
  width: 320px;
  min-width: 200px;
  max-width: 75vw;
  height: 56px;
  box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.07);
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-left: 24px;
  padding-right: 24px;
  border-radius: 4px;
  user-select: none;
  -webkit-user-select: none;
  background-color: #fff;
}
.audio.green-audio-player .play-pause-btn {
  display: none;
  cursor: pointer;
}
.audio.green-audio-player .spinner {
  width: 18px;
  height: 18px;
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/355309/loading.png);
  background-size: cover;
  background-repeat: no-repeat;
  animation: spin 0.4s linear infinite;
}
.audio.green-audio-player .slider {
  flex-grow: 1;
  background-color: #D8D8D8;
  cursor: pointer;
  position: relative;
}
.audio.green-audio-player .slider .progress {
  background-color: #44BFA3;
  border-radius: inherit;
  position: absolute;
  pointer-events: none;
}
.audio.green-audio-player .slider .progress .pin {
  height: 16px;
  width: 16px;
  border-radius: 8px;
  background-color: #44BFA3;
  position: absolute;
  pointer-events: all;
  box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.32);
}
.audio.green-audio-player .controls {
  font-family: "Roboto", sans-serif;
  font-size: 16px;
  line-height: 18px;
  color: #55606E;
  display: flex;
  flex-grow: 1;
  justify-content: space-between;
  align-items: center;
  margin-left: 24px;
  margin-right: 24px;
}
.audio.green-audio-player .controls .slider {
  margin-left: 16px;
  margin-right: 16px;
  border-radius: 2px;
  height: 4px;
}
.audio.green-audio-player .controls .slider .progress {
  width: 0;
  height: 100%;
}
.audio.green-audio-player .controls .slider .progress .pin {
  right: -8px;
  top: -6px;
}
.audio.green-audio-player .controls {
  cursor: default;
}
.audio.green-audio-player .volume {
  position: relative;
}
.audio.green-audio-player .volume .volume-btn {
  cursor: pointer;
}
.audio.green-audio-player .volume .volume-btn.open path {
  fill: #44BFA3;
}
.audio.green-audio-player .volume .volume-controls {
  width: 30px;
  height: 135px;
  background-color: rgba(0, 0, 0, 0.62);
  border-radius: 7px;
  position: absolute;
  left: -3px;
  bottom: 52px;
  flex-direction: column;
  align-items: center;
  display: flex;
}
.audio.green-audio-player .volume .volume-controls.hidden {
  display: none;
}
.audio.green-audio-player .volume .volume-controls .slider {
  margin-top: 12px;
  margin-bottom: 12px;
  width: 6px;
  border-radius: 3px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress {
  bottom: 0;
  height: 100%;
  width: 6px;
}
.audio.green-audio-player .volume .volume-controls .slider .progress .pin {
  left: -5px;
  top: -8px;
}

.playerControlSVG {
    display: block;
    }

@keyframes spin {
  from {
    transform: rotateZ(0);
  }
  to {
    transform: rotateZ(1turn);
  }
}
</style>

<div id="textToSynth" style="margin-bottom: 80px;">
<div class="audioWrapper">
    <div type="text" style="height:0px; overflow: hidden;" id="textEntry">
What do a singer, an incumbent president, and blocked internet have in common?
        
They're all parts of the 2021 Ugandan presidential election. 36 year old singer Robert Kyagulanyi, known by his stage name Bobi Wine, is challenging the incumbent president of Uganda, 76 year old Yoweri Museveni, and has claimed that he's won the polls.
        
So where does blocked internet come into play? According to a letter (which has not yet been verified) published to Twitter by journalist Samira Sawlani, the Uganda Communications Commission ordered internet providers to "implement a temporary suspension of the operation of all your internet gateways and associated access points".
        
The alleged internet block is one of many factors that have contributed to this election's tumultuousness... in an escalating set of developments, the opposition leader has claimed that the incumbent president's lead in the polls is a "joke".

The lead up to the election had its share of violence, with 54 people dying during a protest in November, 2020 that broke out in response to an arrest of Bobi Wine. The Ugandan military has certainly taken the threat of unrest seriously, and has deployed a massive military presence to control post-election violence.
        
Who is the opposition, and who is Bobi Wine?
        
In addition to Mr. Kyagulanyi, there were 9 other opposition candidates in this race. However, he is widely considered the strongest among them. He represents the National Unity Platform (NUP), a political party which campaigns for basic needs like access to health care, education, water, and general equality (among other initiatives).
        
Mr. Kyagulanyi grew up in Kampala's Kamwokya slum where he went on to build his now world-famous recording studio. Considered an upstart, he's been arrested several times... once describing being beaten so badly he had to fly to the USA for treatment.
        
Kyagulanyi states "...What I bring to the table is not... unquestionable economic or political skills. What I bring to the table is the ability to bring all these human resources together to think and decide together, as long as it is for the benefit of the people of Uganda..."

Who is President Yoweri Museveni?
        
President Museveni has been in power in Uganda for over 35 years. According to his website, his presidency in Uganda has seen massive benefits for the country, including (among other things) an "Average real economic growth since 1986 to 2019 of 6.1%".
        
However, his presidency has been marred by (among other events) involvement in the civil war in the Democratic Republic of the Congo, the rebellion in Northern Uganda which caused a humanitarian emergency, and broad constitutional amendments scrapping presidential term limits (2005) and the presidential age limit (2017).
        
    </div>
    <div class="audioPrompt" style="float:left; margin-right:25px;"><i><p id="result" style>Listen to this article (<span id="audioMinutes">0</span> minutes)</p></i></div>

    <div class="audiocontrolwrapper" style="float:left;">
    <!--<audio id="audioPlayback" controls>
      <source id="audioSource" type="audio/mp3" https://shtyoushouldknow.com/bobi-wine-ugandas-ghetto-president/https://shtyoushouldknow.com/bobi-wine-ugandas-ghetto-president/src="">
    </audio>-->
    <div class="holder">
  <div class="audio green-audio-player">
    <div class="loading">
      <div class="spinner"></div>
    </div>
    <div class="play-pause-btn">  
      <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="18" height="24" viewbox="0 0 18 24">
        <path fill="#566574" fill-rule="evenodd" d="M18 12L0 24V0" class="play-pause-icon" id="playPause"/>
      </svg>
    </div>

    <div class="controls">
      <span class="current-time">0:00</span>
      <div class="slider" data-direction="horizontal">
        <div class="progress">
          <div class="pin" id="progress-pin" data-method="rewind"></div>
          </div>
      </div>
        <span class="total-time">0:00</span>
    </div>

    <div class="volume">
      <div class="volume-btn">
        <svg class="playerControlSVG" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24">
          <path fill="#566574" fill-rule="evenodd" d="M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z" id="speaker"/>
        </svg>
      </div>
      <div class="volume-controls hidden">
        <div class="slider" data-direction="vertical">
          <div class="progress">
            <div class="pin" id="volume-pin" data-method="changeVolume"></div>
          </div>
        </div>
      </div>
    </div>


    <audio id="audioPlayback" crossorigin>
      <source id="audioSource" type="audio/mp3" src>    
    </audio>

  </div>
</div>
        
    </div>
</div>
</div>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.410.0.min.js"></script>
    <script type="text/javascript">

        // Initialize the Amazon Cognito credentials provider
        
        AWS.config.region = 'us-west-2'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'us-west-2:9d8089ba-33fe-47dd-a5ca-4f5f7a236021',
});
        
        // Function invoked by button click
        function speakText() {
         
            
            // Create the Polly service object and presigner object
            var polly = new AWS.Polly({apiVersion: '2016-06-10'});
            //var signer = new AWS.Polly.Presigner(speechParams, polly)
       
            
                var params = {
                   
        OutputFormat: 'mp3', /* required */
        Text: document.getElementById("textEntry").innerHTML,
        VoiceId: 'Amy', /* required */
        TextType: 'text'
         
    };

    polly.synthesizeSpeech(params, function(err, data) {
        if (err){console.log(err, err.stack);} // an error occurred
        else{
            console.log(data.AudioStream);
             var uInt8Array = new Uint8Array(data.AudioStream);
 var arrayBuffer = uInt8Array.buffer;
 var blob = new Blob([arrayBuffer], {type: 'audio/mpeg'});
 var url = URL.createObjectURL(blob);

 audioSource.src = url;
        /*}// successful response
    });
            
    

                
            // Create presigned URL of synthesized speech file
            signer.getSynthesizeSpeechUrl(speechParams, function(error, url) {
            if (error) {
                document.getElementById('result').innerHTML = error;
            } else {*/
                document.getElementById('audioSource').src = url;
                document.getElementById('audioPlayback').load();
               //document.getElementById('result').innerHTML = "Listen to this article.";
                
                    var audioPlayer = document.querySelector('.green-audio-player');
var playPause = audioPlayer.querySelector('#playPause');
var playpauseBtn = audioPlayer.querySelector('.play-pause-btn');
var loading = audioPlayer.querySelector('.loading');
var progress = audioPlayer.querySelector('.progress');
var sliders = audioPlayer.querySelectorAll('.slider');
var volumeBtn = audioPlayer.querySelector('.volume-btn');
var volumeControls = audioPlayer.querySelector('.volume-controls');
var volumeProgress = volumeControls.querySelector('.slider .progress');
var player = audioPlayer.querySelector('audio');
var currentTime = audioPlayer.querySelector('.current-time');
var totalTime = audioPlayer.querySelector('.total-time');
var speaker = audioPlayer.querySelector('#speaker');

var draggableClasses = ['pin'];
var currentlyDragged = null;

window.addEventListener('mousedown', function (event) {

  if (!isDraggable(event.target)) return false;

  currentlyDragged = event.target;
  let handleMethod = currentlyDragged.dataset.method;

  this.addEventListener('mousemove', window[handleMethod], false);

  window.addEventListener('mouseup', () => {
    currentlyDragged = false;
    window.removeEventListener('mousemove', window[handleMethod], false);
  }, false);
});
            



playpauseBtn.addEventListener('click', togglePlay);
player.addEventListener('timeupdate', updateProgress);
player.addEventListener('volumechange', updateVolume);
player.addEventListener('loadedmetadata', () => {
  totalTime.textContent = formatTime(player.duration, false);
  document.querySelector('#audioMinutes').textContent = formatTime(player.duration, true);
});
player.addEventListener('canplay', makePlay);
player.addEventListener('ended', function () {
  playPause.attributes.d.value = "M18 12L0 24V0";
  player.currentTime = 0;
});
            

volumeBtn.addEventListener('click', () => {
  volumeBtn.classList.toggle('open');
  volumeControls.classList.toggle('hidden');
});

window.addEventListener('resize', directionAware);

sliders.forEach(slider => {
  let pin = slider.querySelector('.pin');
  slider.addEventListener('click', window[pin.dataset.method]);
});

directionAware();

function isDraggable(el) {
  let canDrag = false;
  let classes = Array.from(el.classList);
  draggableClasses.forEach(draggable => {
    if (classes.indexOf(draggable) !== -1)
    canDrag = true;
  });
  return canDrag;
}

function inRange(event) {
  let rangeBox = getRangeBox(event);
  let rect = rangeBox.getBoundingClientRect();
  let direction = rangeBox.dataset.direction;
  if (direction == 'horizontal') {
    var min = rangeBox.offsetLeft;
    var max = min + rangeBox.offsetWidth;
    if (event.clientX < min || event.clientX > max) return false;
  } else {
    var min = rect.top;
    var max = min + rangeBox.offsetHeight;
    if (event.clientY < min || event.clientY > max) return false;
  }
  return true;
}

function updateProgress() {
  var current = player.currentTime;
  var percent = current / player.duration * 100;
  progress.style.width = percent + '%';

  currentTime.textContent = formatTime(current, false);
}

function updateVolume() {
  volumeProgress.style.height = player.volume * 100 + '%';
  if (player.volume >= 0.5) {
    speaker.attributes.d.value = 'M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z';
  } else if (player.volume < 0.5 && player.volume > 0.05) {
    speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667M17.333 11.373C17.333 9.013 16 6.987 14 6v10.707c2-.947 3.333-2.987 3.333-5.334z';
  } else if (player.volume <= 0.05) {
    speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667';
  }
}

function getRangeBox(event) {
  let rangeBox = event.target;
  let el = currentlyDragged;
  if (event.type == 'click' && isDraggable(event.target)) {
    rangeBox = event.target.parentElement.parentElement;
  }
  if (event.type == 'mousemove') {
    rangeBox = el.parentElement.parentElement;
  }
  return rangeBox;
}

function getCoefficient(event) {
  let slider = getRangeBox(event);
  let rect = slider.getBoundingClientRect();
  let K = 0;
  if (slider.dataset.direction == 'horizontal') {

    let offsetX = event.clientX - slider.offsetLeft;
    let width = slider.clientWidth;
    K = offsetX / width;

  } else if (slider.dataset.direction == 'vertical') {

    let height = slider.clientHeight;
    var offsetY = event.clientY - rect.top;
    K = 1 - offsetY / height;

  }
  return K;
}

function rewind(event) {
  if (inRange(event)) {
    player.currentTime = player.duration * getCoefficient(event);
  }
}

function changeVolume(event) {
  if (inRange(event)) {
    player.volume = getCoefficient(event);
  }
}

function formatTime(time, minutesonly) {
  console.log("format time function:");
  var min = Math.floor(time / 60);
  console.log(min);
  var sec = Math.floor(time % 60);
  console.log(sec);
  if(minutesonly == false)
  {
     return min + ':' + (sec < 10 ? '0' + sec : sec);
  }
  else
  {
      if(sec > 30)
      	return min+1;
      else
         return min;
  }
  
}
            
function minutesOnly(time) {
    console.log("minutes only function:");
   var min = Math.floor(time / 60);
    console.log(min);
    return min;
}

function togglePlay() {
  if (player.paused) {
    playPause.attributes.d.value = "M0 0h6v24H0zM12 0h6v24h-6z";
    player.play();
  } else {
    playPause.attributes.d.value = "M18 12L0 24V0";
    player.pause();
  }
}

function makePlay() {
  playpauseBtn.style.display = 'block';
  loading.style.display = 'none';
}

function directionAware() {
  if (window.innerHeight < 250) {
    volumeControls.style.bottom = '-54px';
    volumeControls.style.left = '54px';
  } else if (audioPlayer.offsetTop < 154) {
    volumeControls.style.bottom = '-164px';
    volumeControls.style.left = '-3px';
  } else {
    volumeControls.style.bottom = '52px';
    volumeControls.style.left = '-3px';
  }
}


                
            }
          });
        }
        window.onload = speakText();
    </script>
<!--kg-card-end: html--><p><a href="https://shtyoushouldknow.slack.com">Join our slack channel</a> for realtime notifications</p><h3 id="what-do-a-singer-an-incumbent-president-and-blocked-internet-have-in-common">What do a singer, an incumbent president, and blocked internet have in common?</h3><p>They're all parts of the <a href="https://www.ft.com/content/115662c1-c47d-45c7-8756-f7e7b0df77ae">2021 Ugandan presidential election</a>. 36-year-old Singer Robert Kyagulanyi, known by his stage name <a href="https://twitter.com/HEBobiwine?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1350074095447117824%7Ctwgr%5E%7Ctwcon%5Es1_&amp;ref_url=https%3A%2F%2Fwww.nbcnews.com%2Fnews%2Fworld%2Fuganda-opposition-leader-bobi-wine-says-military-have-taken-control-n1254406">Bobi Wine</a>, is challenging the incumbent president of Uganda, 76-year-old Yoweri Museveni, and has claimed that he's won the polls.</p><p><a href="https://www.bbc.com/news/world-africa-55649467">So where does blocked internet come into play</a>? <a href="https://twitter.com/samirasawlani/status/1349425885485690886">According to a letter</a> (which has not yet been verified) published to Twitter by journalist <a href="https://twitter.com/samirasawlani">Samira Sawlani</a>, the Uganda Communications Commission ordered internet providers to "implement a temporary suspension of the operation of all your internet gateways and associated access points".</p><p>The alleged internet block is one of many factors that have contributed to this election's tumultuousness... in an escalating set of developments, <a href="https://www.bbc.com/news/world-africa-55675887">the opposition leader has claimed that the incumbent president's lead in the polls is a "joke".  </a></p><p>The lead up to the election had its share of violence, with <a href="https://shtyoushouldknow.com/bobi-wine-ugandas-ghetto-president/The%20lead-up%20to%20the%20poll%20has%20been%20marred%20by%20violence.%20At%20least%2054%20people%20died%20in%20protests%20that%20erupted%20in%20November%20after%20the%20arrest%20of%20Wine,%20whose%20real%20name%20is%20Robert%20Kyagulanyi.">54 people dying during a protest in November, 2020 that broke out in response to an arrest of Bobi Wine.</a> The Ugandan military has certainly taken the threat of unrest seriously, and has deployed a massive military presence to control post-election violence.</p><h3 id="who-is-the-opposition-and-who-is-bobi-wine">Who is the opposition, and who is Bobi Wine</h3><p>In addition to Mr. Kyagulanyi, there were 9 other opposition candidates in this race... but he is widely considered the strongest among them. He represents the National Unity Platform (NUP), a political party which campaigns for basic needs like access to health care, education, water, and general equality (among other initiatives).</p><p>Mr. Kyagulanyi grew up in Kampala's Kamwokya slum where he went on to build his now world-famous recording studio. Considered an upstart, he's been arrested several times... once describing being beaten <a href="https://www.npr.org/2018/09/20/650052886/ugandan-opposition-lawmaker-met-with-large-military-presence-upon-arrival-back-h">so badly he had to fly to the USA for treatment.</a></p><p>Kyagulanyi states "...What I bring to the table is not... unquestionable economic or political skills. What I bring to the table is the ability to bring all these human resources together to think and decide together, as long as it is for the benefit of the people of Uganda..."</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.thebrenthurstfoundation.org/videos/the-10-minute-interview-bobi-wine-ugandas-opposition-leader/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The 10 Minute Interview - Bobi Wine, Uganda’s Opposition Leader — Videos</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.thebrenthurstfoundation.org/icons/icon-512x512.png?v&#x3D;d41e9e046b30a25e7e2f066abda89e45" alt="Bobi Wine - Uganda's "Ghetto President""><span class="kg-bookmark-publisher">The Brenthurst Foundation</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.thebrenthurstfoundation.org/static/0ceb66cc6c9519282865ede431d79bf3/7d509/p07hs5sc_1.jpg" alt="Bobi Wine - Uganda's "Ghetto President""></div></a></figure><h3 id="who-is-president-yoweri-museveni">Who is President Yoweri Museveni</h3><p>President Museveni has been in power in Uganda for over 35 years. <a href="https://www.yowerikmuseveni.com/achievements">According to his website</a>, his presidency in Uganda has seen massive benefits for the country, including (among other things) an "Average real economic growth since 1986 to 2019 of 6.1%". </p><p>However, his presidency has been marred by (among other events) involvement in the <a href="https://en.wikipedia.org/wiki/Second_Congo_War">civil war in the Democratic Republic of the Congo</a>, the <a href="https://academic.oup.com/afraf/article-abstract/98/390/5/32908">rebellion in Northern Uganda</a> which caused a humanitarian emergency, and broad constitutional amendments scrapping <a href="https://www.cnn.com/2018/07/27/africa/uganda-presidential-age-limit/index.html">presidential term limits </a>(2005) and the <a href="https://www.nytimes.com/2017/12/20/world/africa/uganda-president-museveni-age-limit.html">presidential age limit</a> (2017).</p>]]></content:encoded></item></channel></rss>