## [Retina], <s>51</s> 47 bytes

*Happy birthday from a fellow string-processing language!*

Byte count assumes ISO 8859-1 encoding.

    $
    $.`$* 
    $
    ¶$`
    O$^r`.\G
    
    ;{*`.¶
    
    (\S.*).¶.
     $1¶

[Try it online!]

[Retina]: https://github.com/m-ender/retina
[Try it online!]: https://tio.run/nexus/retina#@6/CpaKXoKKlwKXCdWibSgKXv0pcUYJejDsXl3W1VoLeoW1cXBoxwXpamkCmHpeCiuGhbf//e6Tm5OQDAA "Retina – TIO Nexus"

### Explanation

    $
    $.`$* 

This appends `n` spaces (where `n` is the string length), by matching the end of the string, retrieving the length of the string with ``$.` ``, and repeating a space that many times with `$*`.

    $
    ¶$`

We duplicate the entire string (separated by a linefeed), by matching the end of the string again and inserting the string itself with ``$` ``.

<pre><code>O$^r`.\G

</code></pre>

This reverses the second line by matching from right-to-left (`r`), then matching one character at a time (`.`) but making sure that they're all adjacent (`\G`). This way, the matches can't get past the linefeed. This is then used in a sort-stage. By using the sort-by mode (`$`) but replacing each match with an empty string, no actual sorting is done. But due to the `^` option, the matches are reversed at the end, reversing the entire second line.


<pre><code>;{*`.¶

</code></pre>

This stage is for output and also affects the rest of the program. `{` wraps the remaining stages in a loop which is repeated until those stages fail to change the string (which will happen because the last stage won't match any more). The `;` disables output at the end of the program. The `*` turns this stage into a dry-run which means that the stage is processed and the result is printed, but afterwards the previous string is restored.

The stage itself simply removes a linefeed and the preceding character. Which gives us one line of the desired output (starting with the first line).

    (\S.*).¶.
     $1¶

Finally, this stage turns each line into the next. This is done by inserting a space in front of the first non-space character, removing the last character on the first line, as well as the first character on the second line. This process stops once there is only one non-space character left on the first line, which corresponds to the last line of the output.