Convert Salesforce 15-character ID to 18-character In Salesforce CRM, every object has 15-character alphanumeric ID, which is case-sensitive. If anyone's curious, actually it's base-62 number.
However, tools used for data migration and integration may or may not support case sensitivity. To overcome that, IDs can be safely converted to 18-character case-insensitive alphanumeric IDs. In that process 3-character alphanumeric checksum is appended to the ID. The conversion algorithm is:

Example:

a0RE000000IJmcN



Split ID into three 5-character chunks.

a0RE0  00000  IJmcN

Reverse each chunk.

0ER0a  00000  NcmJI

Replace each character in every chunk by 1 if it's uppercase or by 0 if otherwise.

01100  00000  10011

For each 5-digit binary number i, get character at position i in concatenation of uppercase alphabet and digits 0-5 (ABCDEFGHIJKLMNOPQRSTUVWXYZ012345).

00000 -&gt; A,
00001 -&gt; B,
00010 -&gt; C, ..., 
11010 -&gt; Z, 
11011 -&gt; 0, ...,
11111 -&gt; 5`


Yielding:

M  A  T

Append these characters, the checksum, to the original ID.


Output:

a0RE000000IJmcNMAT


Write program or function which takes 15-character alphanumeric (ASCII) string as input and returns 18-character ID.

Input validation is out of scope of this question. Programs may return any value or crash on invalid input.

Please, don't use Salesforce propretiary languages' features that make this challenge trivial (such as formula CASESAFEID(), converting Id to String in APEX &amp;c).

Test Cases

a01M00000062mPg    -&gt; a01M00000062mPgIAI
001M000000qfPyS    -&gt; 001M000000qfPySIAU
a0FE000000D6r3F    -&gt; a0FE000000D6r3FMAR
0F9E000000092w2    -&gt; 0F9E000000092w2KAA
aaaaaaaaaaaaaaa    -&gt; aaaaaaaaaaaaaaaAAA
AbCdEfGhIjKlMnO    -&gt; AbCdEfGhIjKlMnOVKV
aBcDEfgHIJKLMNO    -&gt; aBcDEfgHIJKLMNO025
Pyth, 23 22 bytes
1 byte saved by FryAmTheEggman.
sm@s+JrG1U6i}RJ_d2c3pz

Try it online. Test suite.
This might be the first time I've used the print instruction in golfing.
Explanation
     JrG1                   save uppercase alphabet in J
                     z      input string
                    p       print it without newline
                  c3        split into 3 parts
 m              d           for each part:
               _              reverse
            }R                map characters to being in
              J                 uppercase alphabet (saved in J)
           i     2            parse list of bools as binary
  @                           get correct item of
     J                          uppercase alphabet (saved in J)
   s+    U6                     add nums 0-5 to it
s                           concatenate and print