#include <iostream>
using namespace std;
void Multiplication( int ( & Multiplicand) [ 64 ] ,int ( & Multiplier) [ 32 ] ,int ( & Product) [ 64 ] ,int Exponent1,int Exponent2,int RemExponent1,int RemExponent2) ;
int ConvertToBinary_Multiplicand( unsigned long long first,int ( & Multiplicand) [ 64 ] ,int & Exponent) ;
int ConvertToBinary_Multiplier( unsigned long long Second,int ( & Multiplier) [ 32 ] ,int & Exponent) ;
int Convert_Fraction_Part_To_Binary( double remainder,int ( & Goku) [ 5 ] ,int & RemainderExp) ;
void UpdateMultiplicand( int ( & DecimalPart) [ 64 ] ,int ( & FractionPart) [ 5 ] ,int Exponent,int RemainderExp,double & remainder) ;
void UpdateMultiplier( int ( & DecimalPart) [ 32 ] ,int ( & FractionPart) [ 5 ] ,int Exponent,int RemainderExp,double & remainder) ;
int main( )
{
int MutiplicandDecimalPart[ 64 ] = { } ,MutiplicandFractionPart[ 5 ] = { } ,MutiplierDecimalPart[ 32 ] = { } ,MutiplierFractionPart[ 5 ] = { } ,Product[ 64 ] = { } ,Multiplicand_Decimal_Exponent= 0 ,Multiplier_Decimal_Exponent= 0 ,Multiplicand_Remainder_Exponent= 0 ,Multiplier_Remainder_Exponent= 0 ;
unsigned long long first,second;
double a,b,MultiplicandRemainder,MultiplierRemainder;
cin >> a;
cin >> b;
first= ( unsigned long long ) a;
second= ( unsigned long long ) b;
MultiplicandRemainder= a- first;
MultiplierRemainder= b- second;
ConvertToBinary_Multiplicand( first,MutiplicandDecimalPart,Multiplicand_Decimal_Exponent) ;
if ( MultiplicandRemainder> 0.0 )
{
Convert_Fraction_Part_To_Binary( MultiplicandRemainder,MutiplicandFractionPart,Multiplicand_Remainder_Exponent) ; // 0.5 ki trha k numbers ka binary find kre ga
}
ConvertToBinary_Multiplier( second,MutiplierDecimalPart,Multiplier_Decimal_Exponent) ;
if ( MultiplierRemainder> 0.0 )
{
Convert_Fraction_Part_To_Binary( MultiplierRemainder,MutiplierFractionPart,Multiplier_Remainder_Exponent) ;
}
UpdateMultiplicand( MutiplicandDecimalPart,MutiplicandFractionPart,Multiplicand_Decimal_Exponent,Multiplicand_Remainder_Exponent,MultiplicandRemainder) ;
UpdateMultiplier( MutiplierDecimalPart,MutiplierFractionPart,Multiplier_Decimal_Exponent,Multiplier_Remainder_Exponent,MultiplicandRemainder) ;
Multiplication( MutiplicandDecimalPart,MutiplierDecimalPart,Product,Multiplicand_Decimal_Exponent,Multiplier_Decimal_Exponent,Multiplicand_Remainder_Exponent,Multiplier_Remainder_Exponent) ;
return 0 ;
}
int ConvertToBinary_Multiplicand( unsigned long long first,int ( & Multiplicand) [ 64 ] ,int & Exponent)
{
// converts the decimal part of multiplicand into binary
for ( Exponent= 0 ; first! = 0 ; Exponent++ )
{
if ( first & 1 )
Multiplicand[ Exponent] = 1 ;
else
Multiplicand[ Exponent] = 0 ;
first>>= 1 ;
}
}
int ConvertToBinary_Multiplier( unsigned long long Second,int ( & Multiplier) [ 32 ] ,int & Exponent)
{
// converts decimal part of multiplier into binary
for ( Exponent= 0 ; Second! = 0 ; Exponent++ )
{
if ( Second & 1 )
Multiplier[ Exponent] = 1 ;
else
Multiplier[ Exponent] = 0 ;
Second>>= 1 ;
}
}
int Convert_Fraction_Part_To_Binary( double remainder,int ( & Goku) [ 5 ] ,int & RemainderExp)
{
// converts fraction parts in to binary
int x= 0 ;
for ( int i= 0 ; i< 5 ; i++ )
{
remainder* = 2 ;
if ( remainder> 1.0 )
{
remainder- = 1.0 ;
Goku[ x] = 1 ;
x++ ;
}
else
if ( remainder< 1.0 )
{
Goku[ x] = 0 ;
x++ ;
}
else
if ( remainder== 1.0 )
{
Goku[ x] = 1 ;
break ;
}
}
RemainderExp= x;
}
void UpdateMultiplicand( int ( & DecimalPart) [ 64 ] ,int ( & FractionPart) [ 5 ] ,int Exponent,int RemainderExp,double & remainder)
{
// Copies the binary bits of fraction part in DecimalPart array
// so that I won't have to handle two arrays separatly for multplication
if ( RemainderExp== 5 )
RemainderExp- = 1 ;
int p= Exponent+ RemainderExp;
if ( remainder> 0.0 )
{
for ( int i= p- 2 ; i>= 0 ; i-- )
{
DecimalPart[ i+ 1 + RemainderExp] = DecimalPart[ i] ;
}
for ( int i= 0 ; i<= RemainderExp; i++ )
{
DecimalPart[ i] = FractionPart[ i] ;
}
}
}
void UpdateMultiplier( int ( & DecimalPart) [ 32 ] ,int ( & FractionPart) [ 5 ] ,int Exponent,int RemainderExp,double & remainder)
{
// Copies the binary bits of fraction part in DecimalPart array
// so that I won't have to handle two arrays separatly for multplication
if ( RemainderExp== 5 )
RemainderExp- = 1 ;
int p= Exponent+ RemainderExp;
if ( remainder> 0.0 )
{
for ( int i= p- 2 ; i>= 0 ; i-- )
{
DecimalPart[ i+ 1 + RemainderExp] = DecimalPart[ i] ;
}
for ( int i= 0 ; i<= RemainderExp; i++ )
{
DecimalPart[ i] = FractionPart[ i] ;
}
}
}
void Multiplication( int ( & Multiplicand) [ 64 ] ,int ( & Multiplier) [ 32 ] ,int ( & Product) [ 64 ] ,int Exponent1,int Exponent2,int RemExponent1,int RemExponent2)
{
// Multiplies binary forms of Multiplicand and multiplier
int i= 0 ,carry= 0 ; bool OneOccuredBefore= false ;
while ( true )
{
if ( Multiplier[ i] ! = 0 ) // multiplier
for ( int j= 0 ; j< 64 ; j++ )
{
const int sum = Product[ j] + Multiplicand[ j] + carry;
Product[ j] = sum % 2 ;
carry= sum / 2 ;
}
for ( int h= 63 ; h>= 0 ; h-- )
{
if ( h== 0 )
{
Multiplicand[ 0 ] = 0 ; // shifting left
}
else
{
Multiplicand[ h] = Multiplicand[ h- 1 ] ;
Multiplicand[ h- 1 ] = 0 ;
}
}
if ( i== 31 )
break ;
i++ ;
}
bool oneOccured= false ;
// then I display the Product array on screen which contains the product.
for ( int i= 63 ; i>= 0 ; i++ )
{
if ( Product[ i] == 1 && oneOccured== false )
cout << Product[ i] ;
else
if ( oneOccured== true )
cout << Product[ i] ;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgTXVsdGlwbGljYXRpb24oaW50ICgmTXVsdGlwbGljYW5kKVs2NF0saW50ICgmTXVsdGlwbGllcilbMzJdLGludCAoJlByb2R1Y3QpWzY0XSxpbnQgRXhwb25lbnQxLGludCBFeHBvbmVudDIsaW50IFJlbUV4cG9uZW50MSxpbnQgUmVtRXhwb25lbnQyKTsKaW50IENvbnZlcnRUb0JpbmFyeV9NdWx0aXBsaWNhbmQodW5zaWduZWQgbG9uZyBsb25nIGZpcnN0LGludCAoJk11bHRpcGxpY2FuZClbNjRdLGludCAmRXhwb25lbnQpOwppbnQgQ29udmVydFRvQmluYXJ5X011bHRpcGxpZXIodW5zaWduZWQgbG9uZyBsb25nIFNlY29uZCxpbnQgKCZNdWx0aXBsaWVyKVszMl0saW50ICZFeHBvbmVudCk7CmludCBDb252ZXJ0X0ZyYWN0aW9uX1BhcnRfVG9fQmluYXJ5KGRvdWJsZSByZW1haW5kZXIsaW50ICgmR29rdSlbNV0saW50ICZSZW1haW5kZXJFeHApOwp2b2lkIFVwZGF0ZU11bHRpcGxpY2FuZChpbnQgKCZEZWNpbWFsUGFydClbNjRdLGludCAoJkZyYWN0aW9uUGFydClbNV0saW50IEV4cG9uZW50LGludCBSZW1haW5kZXJFeHAsZG91YmxlICZyZW1haW5kZXIpOwp2b2lkIFVwZGF0ZU11bHRpcGxpZXIoaW50ICgmRGVjaW1hbFBhcnQpWzMyXSxpbnQgKCZGcmFjdGlvblBhcnQpWzVdLGludCBFeHBvbmVudCxpbnQgUmVtYWluZGVyRXhwLGRvdWJsZSAmcmVtYWluZGVyKTsKIAogCmludCBtYWluKCkKewogICAgaW50IE11dGlwbGljYW5kRGVjaW1hbFBhcnRbNjRdPXt9LE11dGlwbGljYW5kRnJhY3Rpb25QYXJ0WzVdPXt9LE11dGlwbGllckRlY2ltYWxQYXJ0WzMyXT17fSxNdXRpcGxpZXJGcmFjdGlvblBhcnRbNV09e30sUHJvZHVjdFs2NF09e30sTXVsdGlwbGljYW5kX0RlY2ltYWxfRXhwb25lbnQ9MCxNdWx0aXBsaWVyX0RlY2ltYWxfRXhwb25lbnQ9MCxNdWx0aXBsaWNhbmRfUmVtYWluZGVyX0V4cG9uZW50PTAsTXVsdGlwbGllcl9SZW1haW5kZXJfRXhwb25lbnQ9MDsKICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgZmlyc3Qsc2Vjb25kOwogICAgICAgIGRvdWJsZSBhLGIsTXVsdGlwbGljYW5kUmVtYWluZGVyLE11bHRpcGxpZXJSZW1haW5kZXI7CiAKICAgICAgICBjaW4+PiBhOwogICAgICAgIGNpbj4+YjsKICAgICAgICBmaXJzdD0odW5zaWduZWQgbG9uZyBsb25nKSBhOwogICAgICAgIHNlY29uZD0odW5zaWduZWQgbG9uZyBsb25nKSBiOwogCiAgICAgICAgTXVsdGlwbGljYW5kUmVtYWluZGVyPWEtZmlyc3Q7CiAgICAgICAgTXVsdGlwbGllclJlbWFpbmRlcj1iLXNlY29uZDsKIAogCiAKICAgICAgICBDb252ZXJ0VG9CaW5hcnlfTXVsdGlwbGljYW5kKGZpcnN0LE11dGlwbGljYW5kRGVjaW1hbFBhcnQsTXVsdGlwbGljYW5kX0RlY2ltYWxfRXhwb25lbnQpOwogCiAgICAgICAgaWYoTXVsdGlwbGljYW5kUmVtYWluZGVyPjAuMCkKICAgICAgICB7CiAgICAgICAgICAgICAgICBDb252ZXJ0X0ZyYWN0aW9uX1BhcnRfVG9fQmluYXJ5KE11bHRpcGxpY2FuZFJlbWFpbmRlcixNdXRpcGxpY2FuZEZyYWN0aW9uUGFydCxNdWx0aXBsaWNhbmRfUmVtYWluZGVyX0V4cG9uZW50KTsgLy8gMC41IGtpIHRyaGEgayBudW1iZXJzIGthIGJpbmFyeSBmaW5kIGtyZSBnYQogICAgICAgIH0KIAogCiAgICAgICAgQ29udmVydFRvQmluYXJ5X011bHRpcGxpZXIoc2Vjb25kLE11dGlwbGllckRlY2ltYWxQYXJ0LE11bHRpcGxpZXJfRGVjaW1hbF9FeHBvbmVudCk7CiAKICAgICAgICBpZihNdWx0aXBsaWVyUmVtYWluZGVyPjAuMCkKICAgICAgICB7CiAgICAgICAgICAgICAgICBDb252ZXJ0X0ZyYWN0aW9uX1BhcnRfVG9fQmluYXJ5KE11bHRpcGxpZXJSZW1haW5kZXIsTXV0aXBsaWVyRnJhY3Rpb25QYXJ0LE11bHRpcGxpZXJfUmVtYWluZGVyX0V4cG9uZW50KTsKICAgICAgICB9CiAKICAgICAgICBVcGRhdGVNdWx0aXBsaWNhbmQoTXV0aXBsaWNhbmREZWNpbWFsUGFydCxNdXRpcGxpY2FuZEZyYWN0aW9uUGFydCxNdWx0aXBsaWNhbmRfRGVjaW1hbF9FeHBvbmVudCxNdWx0aXBsaWNhbmRfUmVtYWluZGVyX0V4cG9uZW50LE11bHRpcGxpY2FuZFJlbWFpbmRlcik7CiAgICAgICAgCiAgICAgICAgVXBkYXRlTXVsdGlwbGllcihNdXRpcGxpZXJEZWNpbWFsUGFydCxNdXRpcGxpZXJGcmFjdGlvblBhcnQsTXVsdGlwbGllcl9EZWNpbWFsX0V4cG9uZW50LE11bHRpcGxpZXJfUmVtYWluZGVyX0V4cG9uZW50LE11bHRpcGxpY2FuZFJlbWFpbmRlcik7CiAKIAogICAgICAgIE11bHRpcGxpY2F0aW9uKE11dGlwbGljYW5kRGVjaW1hbFBhcnQsTXV0aXBsaWVyRGVjaW1hbFBhcnQsUHJvZHVjdCxNdWx0aXBsaWNhbmRfRGVjaW1hbF9FeHBvbmVudCxNdWx0aXBsaWVyX0RlY2ltYWxfRXhwb25lbnQsTXVsdGlwbGljYW5kX1JlbWFpbmRlcl9FeHBvbmVudCxNdWx0aXBsaWVyX1JlbWFpbmRlcl9FeHBvbmVudCk7CiAgIAogICByZXR1cm4gMDsKfQogCmludCBDb252ZXJ0VG9CaW5hcnlfTXVsdGlwbGljYW5kKHVuc2lnbmVkIGxvbmcgbG9uZyBmaXJzdCxpbnQgKCZNdWx0aXBsaWNhbmQpWzY0XSxpbnQgJkV4cG9uZW50KQp7CiAgICAvLyBjb252ZXJ0cyB0aGUgZGVjaW1hbCBwYXJ0IG9mIG11bHRpcGxpY2FuZCBpbnRvIGJpbmFyeQogCiAgICAgICAgZm9yKEV4cG9uZW50PTA7Zmlyc3QhPTA7RXhwb25lbnQrKykKICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihmaXJzdCAmIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxpY2FuZFtFeHBvbmVudF09MTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGljYW5kW0V4cG9uZW50XT0wOwogCiAgICAgICAgICAgICAgICBmaXJzdD4+PTE7CiAgICAgICAgfQp9CiAKIAppbnQgQ29udmVydFRvQmluYXJ5X011bHRpcGxpZXIodW5zaWduZWQgbG9uZyBsb25nIFNlY29uZCxpbnQgKCZNdWx0aXBsaWVyKVszMl0saW50ICZFeHBvbmVudCkKewogICAgICAgIC8vIGNvbnZlcnRzIGRlY2ltYWwgcGFydCBvZiBtdWx0aXBsaWVyIGludG8gYmluYXJ5CiAKICAgICAgICBmb3IoRXhwb25lbnQ9MDtTZWNvbmQhPTA7RXhwb25lbnQrKykKICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihTZWNvbmQgJiAxKQogICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsaWVyW0V4cG9uZW50XT0xOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsaWVyW0V4cG9uZW50XT0wOwogICAgICAgICAgICAgICAgU2Vjb25kPj49MTsgCiAgICAgICAgfQp9CiAKIAppbnQgQ29udmVydF9GcmFjdGlvbl9QYXJ0X1RvX0JpbmFyeShkb3VibGUgcmVtYWluZGVyLGludCAoJkdva3UpWzVdLGludCAmUmVtYWluZGVyRXhwKQp7CiAgICAgICAgLy8gY29udmVydHMgZnJhY3Rpb24gcGFydHMgaW4gdG8gYmluYXJ5CiAKICAgICAgICBpbnQgeD0wOwogICAgICAgIGZvcihpbnQgaT0wO2k8NTtpKyspCiAgICAgICAgewogICAgICAgICAgICAgICAgcmVtYWluZGVyKj0yOwogCiAgICAgICAgICAgICAgICBpZihyZW1haW5kZXI+MS4wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXItPTEuMDsKICAgICAgICAgICAgICAgICAgICAgICAgR29rdVt4XT0xOwogICAgICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlbWFpbmRlcjwxLjApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb2t1W3hdPTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZW1haW5kZXI9PTEuMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb2t1W3hdPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIH0KIAogICAgICAgICAgIFJlbWFpbmRlckV4cD14Owp9CiAKIAp2b2lkIFVwZGF0ZU11bHRpcGxpY2FuZChpbnQgKCZEZWNpbWFsUGFydClbNjRdLGludCAoJkZyYWN0aW9uUGFydClbNV0saW50IEV4cG9uZW50LGludCBSZW1haW5kZXJFeHAsZG91YmxlICZyZW1haW5kZXIpCnsKICAgIC8vIENvcGllcyB0aGUgYmluYXJ5IGJpdHMgb2YgZnJhY3Rpb24gcGFydCBpbiBEZWNpbWFsUGFydCBhcnJheQogCiAgICAvLyBzbyB0aGF0IEkgd29uJ3QgaGF2ZSB0byBoYW5kbGUgdHdvIGFycmF5cyBzZXBhcmF0bHkgZm9yIG11bHRwbGljYXRpb24KIAogICAgICAgIGlmKFJlbWFpbmRlckV4cD09NSkKICAgICAgICAgICAgICAgIFJlbWFpbmRlckV4cC09MTsKIAogICAgICAgIGludCBwPUV4cG9uZW50K1JlbWFpbmRlckV4cDsKIAogICAgICAgIGlmKHJlbWFpbmRlcj4wLjApCiAgICAgICAgewogICAgICAgICAgICAgICAgZm9yKGludCBpPXAtMjtpPj0wO2ktLSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbFBhcnRbaSsxK1JlbWFpbmRlckV4cF09RGVjaW1hbFBhcnRbaV07CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8PVJlbWFpbmRlckV4cDtpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxQYXJ0W2ldPUZyYWN0aW9uUGFydFtpXTsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgIH0KfQogCnZvaWQgVXBkYXRlTXVsdGlwbGllcihpbnQgKCZEZWNpbWFsUGFydClbMzJdLGludCAoJkZyYWN0aW9uUGFydClbNV0saW50IEV4cG9uZW50LGludCBSZW1haW5kZXJFeHAsZG91YmxlICZyZW1haW5kZXIpCnsKICAgICAgICAvLyBDb3BpZXMgdGhlIGJpbmFyeSBiaXRzIG9mIGZyYWN0aW9uIHBhcnQgaW4gRGVjaW1hbFBhcnQgYXJyYXkKIAogICAgLy8gc28gdGhhdCBJIHdvbid0IGhhdmUgdG8gaGFuZGxlIHR3byBhcnJheXMgc2VwYXJhdGx5IGZvciBtdWx0cGxpY2F0aW9uCiAKICAgICAgICBpZihSZW1haW5kZXJFeHA9PTUpCiAgICAgICAgICAgICAgICBSZW1haW5kZXJFeHAtPTE7CiAKICAgICAgICBpbnQgcD1FeHBvbmVudCtSZW1haW5kZXJFeHA7CiAKICAgICAgICBpZihyZW1haW5kZXI+MC4wKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgaT1wLTI7aT49MDtpLS0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxQYXJ0W2krMStSZW1haW5kZXJFeHBdPURlY2ltYWxQYXJ0W2ldOwogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPD1SZW1haW5kZXJFeHA7aSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsUGFydFtpXT1GcmFjdGlvblBhcnRbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogCn0KIAogCnZvaWQgTXVsdGlwbGljYXRpb24oaW50ICgmTXVsdGlwbGljYW5kKVs2NF0saW50ICgmTXVsdGlwbGllcilbMzJdLGludCAoJlByb2R1Y3QpWzY0XSxpbnQgRXhwb25lbnQxLGludCBFeHBvbmVudDIsaW50IFJlbUV4cG9uZW50MSxpbnQgUmVtRXhwb25lbnQyKQp7CiAgICAgICAgLy8gTXVsdGlwbGllcyBiaW5hcnkgZm9ybXMgb2YgTXVsdGlwbGljYW5kIGFuZCBtdWx0aXBsaWVyIAogCiAgICAgICAgaW50IGk9MCxjYXJyeT0wO2Jvb2wgT25lT2NjdXJlZEJlZm9yZT1mYWxzZTsKIAogICAgICAgIHdoaWxlKHRydWUpCiAgICAgICAgewogICAgICAgICAgICAgICAgaWYoTXVsdGlwbGllcltpXSE9MCkvLyBtdWx0aXBsaWVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8NjQ7aisrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3VtID0gUHJvZHVjdFtqXSArIE11bHRpcGxpY2FuZFtqXSArIGNhcnJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3Rbal09c3VtICUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJyeT1zdW0gLyAyOwogCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAKIAogICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGg9NjM7aD49MDtoLS0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihoPT0wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxpY2FuZFswXT0wOyAvLyBzaGlmdGluZyBsZWZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsaWNhbmRbaF09TXVsdGlwbGljYW5kW2gtMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsaWNhbmRbaC0xXT0wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaT09MzEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgIH0KIAogICAgYm9vbCBvbmVPY2N1cmVkPWZhbHNlOwovLyB0aGVuIEkgZGlzcGxheSB0aGUgUHJvZHVjdCBhcnJheSBvbiBzY3JlZW4gd2hpY2ggY29udGFpbnMgdGhlIHByb2R1Y3QuCiAKICAgIGZvcihpbnQgaT02MztpPj0wO2krKykKICAgIHsKICAgICAgICBpZihQcm9kdWN0W2ldPT0xICYmIG9uZU9jY3VyZWQ9PWZhbHNlKQogICAgICAgICAgICBjb3V0PDxQcm9kdWN0W2ldOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaWYob25lT2NjdXJlZD09dHJ1ZSkKICAgICAgICAgICAgICAgIGNvdXQ8PFByb2R1Y3RbaV07CiAgICB9CiAKfQ==