#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
#include<set>
#include<math.h>
#include<map>
using namespace std;
#define mp make_pair
#define pb push_back
#define STEP 100
typedef pair< int ,int > pii;
typedef pair< pii,int > piii;
int n;
string s;
int sortIndex[ STEP] [ 1500 ] ;
int main( )
{
cin >> s;
n= s.size ( ) ;
memset ( sortIndex,0 ,sizeof ( sortIndex) ) ;
for ( int i= 0 ; i< n; i++ )
sortIndex[ 0 ] [ i] = a[ i] - 'A' ;
int doneTill= 1 ;
int step= 1 ;
while ( doneTill < n) {
vector < piii> L;
for ( int i= 0 ; i< n; i++ ) {
L.pb ( piii( pii( sortIndex[ step- 1 ] [ i] ,sortIndex[ step- 1 ] [ i+ doneTill] ) ,i) ) ;
}
sort( L.begin ( ) ,L.end ( ) ) ;
for ( int i= 0 ; i< n; i++ ) {
int x1,x2,y1,y2;
x1 = ( L[ i] .first ) .first ;
y1 = ( L[ i] .first ) .second ;
if ( i! = 0 ) {
x2 = ( L[ i- 1 ] .first ) .first ;
y2 = ( L[ i- 1 ] .first ) .second ;
}
if ( x1== x2 && y1== y2)
sortIndex[ step] [ L[ i] .second ] = sortIndex[ step] [ L[ i- 1 ] .second ] ;
else
sortIndex[ step] [ L[ i] .second ] = i;
}
doneTill * = 2 ;
step++ ;
}
cout << "...\n " ; s
for ( int i= 0 ; i< n; i++ ) {
cout << sortIndex[ step- 1 ] [ i] ;
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPHN0cmluZy5oPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8bWF0aC5oPgojaW5jbHVkZTxtYXA+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawoKI2RlZmluZSBTVEVQIDEwMAoKdHlwZWRlZiBwYWlyPGludCxpbnQ+IHBpaTsKdHlwZWRlZiBwYWlyPHBpaSxpbnQ+IHBpaWk7CgppbnQgbjsKc3RyaW5nIHM7CgppbnQgc29ydEluZGV4W1NURVBdWzE1MDBdOwoKaW50IG1haW4oKQp7CiAgICBjaW4+PnM7CiAgICBuPXMuc2l6ZSgpOwogICAgbWVtc2V0KHNvcnRJbmRleCwwLHNpemVvZihzb3J0SW5kZXgpKTsKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICAgICAgc29ydEluZGV4WzBdW2ldPWFbaV0tJ0EnOwogICAgaW50IGRvbmVUaWxsPTE7CiAgICBpbnQgc3RlcD0xOwogICAgd2hpbGUoZG9uZVRpbGwgPCBuKSB7CiAgICAgICAgdmVjdG9yIDxwaWlpPiBMOwogICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspIHsKICAgICAgICAgICAgTC5wYihwaWlpKCBwaWkoc29ydEluZGV4W3N0ZXAtMV1baV0sc29ydEluZGV4W3N0ZXAtMV1baStkb25lVGlsbF0pICxpKSApOwogICAgICAgIH0KICAgICAgICBzb3J0KEwuYmVnaW4oKSxMLmVuZCgpKTsKICAgICAgICBmb3IoaW50IGk9MDtpPG47aSsrKSB7CiAgICAgICAgICAgIGludCB4MSx4Mix5MSx5MjsKICAgICAgICAgICAgeDEgPSAoTFtpXS5maXJzdCkuZmlyc3Q7CiAgICAgICAgICAgIHkxID0gKExbaV0uZmlyc3QpLnNlY29uZDsKICAgICAgICAgICAgaWYoaSE9MCkgewogICAgICAgICAgICAgICAgeDIgPSAoTFtpLTFdLmZpcnN0KS5maXJzdDsKICAgICAgICAgICAgICAgIHkyID0gKExbaS0xXS5maXJzdCkuc2Vjb25kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHgxPT14MiAmJiB5MT09eTIpCiAgICAgICAgICAgICAgICBzb3J0SW5kZXhbc3RlcF1bTFtpXS5zZWNvbmRdID0gc29ydEluZGV4W3N0ZXBdW0xbaS0xXS5zZWNvbmRdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzb3J0SW5kZXhbc3RlcF1bTFtpXS5zZWNvbmRdID0gaTsKICAgICAgICB9CiAgICAgICAgZG9uZVRpbGwgKj0gMjsKICAgICAgICBzdGVwKys7CiAgICB9CiAgICBjb3V0PDwiLi4uXG4iO3MKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspIHsKICAgICAgICBjb3V0PDxzb3J0SW5kZXhbc3RlcC0xXVtpXTsKICAgIH0KfQo=