#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
class Time
{
private :
int hour;
int minute;
int second;
string midday;
public :
Time( )
{
}
Time( int h, int m, int s)
{
hour = h;
minute = m;
second = s;
}
void setHour( int h)
{
if ( h >= 0 && h <= 24 )
{
if ( h == 24 )
{
hour = 0 ;
midday = "AM" ;
}
else if ( h > 12 )
{
hour = h - 12 ;
midday = "PM" ;
}
else if ( h == 0 )
{
hour = 12 ;
midday = "AM" ;
}
else if ( h == 12 )
{
hour = h;
midday = "PM" ;
}
else
{
hour = h;
midday = "AM" ;
}
}
}
string getmidday( )
{
return midday;
}
int getHour( )
{
return hour;
}
void setMinute( int m)
{
if ( m >= 0 && m <= 59 )
{
minute = m;
}
else
{
minute = 0 ;
}
}
int getMinute( )
{
return minute;
}
void setSecond( int s)
{
if ( s >= 0 && s <= 59 )
{
second = s;
}
else
{
second = 0 ;
}
}
int getSecond( )
{
return second;
}
void printTime_info( )
{
cout << " the time is " << setfill( '0' ) << setw( 2 ) << hour << ":" ;
cout << setfill( '0' ) << setw( 2 ) << minute << ":" ;
cout << setfill( '0' ) << setw( 2 ) << second << " " << midday << endl;
}
} ;
class Country
{
Time timezone;
bool found;
string stadt;
unordered_map< string, int > country = {
{ "afghanistan" , 4 } , { "alaska" , - 9 } , { "argentina" , - 3 } , { "armenia" , 4 } , { "azores" , - 1 } ,
{ "bangladesh" , 6 } , { "bhutan" , 6 } , { "brasilia" , - 3 } , { "brazil" , - 3 } , { "cambodia" , 7 } ,
{ "canada" , - 5 } , { "cape verde island" , - 1 } , { "caracas" , - 4 } , { "central america" , - 6 } , { "chihuahua" , - 7 } ,
{ "china" , 8 } , { "colombia" , - 5 } , { "cuba" , - 5 } , { "egypt" , 2 } , { "fiji" , 12 } ,
{ "france" , 1 } , { "georgia" , 4 } , { "germany" , 1 } , { "ghana" , 0 } , { "greece" , 2 } ,
{ "greenland" , - 3 } , { "guam" , 10 } , { "hawaii" , - 10 } , { "iceland" , 0 } , { "india" , 5 } ,
{ "indonesia" , 7 } , { "iran" , 3 } , { "iraq" , 3 } , { "italy" , 1 } , { "jakarta" , 7 } ,
{ "japan" , 9 } , { "kazakhstan" , 5 } , { "kenya" , 3 } , { "korea" , 9 } , { "kuwait" , 3 } ,
{ "la paz" , - 4 } , { "mali" , 0 } , { "malaysia" , 8 } , { "marshall island" , 12 } , { "mazatlan" , - 7 } ,
{ "melbourne" , 10 } , { "mexico" , - 6 } , { "midway island" , - 11 } , { "moscow" , 3 } , { "myanmar" , 6 } ,
{ "nepal" , 5 } , { "new zealand" , 12 } , { "newfoundland" , - 3 } , { "nigeria" , 1 } , { "oman" , 4 } ,
{ "pakistan" , 5 } , { "peru" , - 5 } , { "philippines" , 8 } , { "poland" , 1 } , { "rio" , - 3 } ,
{ "russia" , 3 } , { "samoa" , - 11 } , { "santiago" , - 4 } , { "saudi arabia" , 3 } , { "senegal" , 0 } ,
{ "singapore" , 8 } , { "solomon island" , 11 } , { "south africa" , 2 } , { "south korea" , 9 } , { "spain" , 1 } ,
{ "sri lanka" , 5 } , { "sweden" , 1 } , { "sydney" , 10 } , { "thailand" , 7 } , { "tijuana" , - 8 } ,
{ "turkey" , 3 } , { "ukraine" , 2 } , { "united arab emirates" , 4 } , { "united kingdom" , 0 } , { "united states" , - 5 } ,
{ "uzbekistan" , 5 } , { "vanuatu" , 11 } , { "vietnam" , 7 } , { "vladivostok" , 10 } } ;
int Levenstein_Distance( const string & word1, const string & word2)
{
int m = word1.length ( ) ;
int n = word2.length ( ) ;
vector< vector < int >> dif( m + 1 , vector< int > ( n+ 1 ) ) ;
for ( int i = 0 ; i <= m; i++ )
{
dif[ i] [ 0 ] = i;
}
for ( int j = 0 ; j <= n; j++ )
{
dif[ 0 ] [ j] = j;
}
for ( int i = 1 ; i <= m; i++ )
{
for ( int j = 1 ; j <= n; j++ )
{
if ( word1[ i - 1 ] == word2[ j- 1 ] )
{
dif[ i] [ j] = dif[ i- 1 ] [ j- 1 ] ;
}
else {
dif[ i] [ j] = min( { dif[ i- 1 ] [ j- 1 ] + 1 , /// substitute
dif[ i- 1 ] [ j] + 1 , /// deletion
dif[ i] [ j- 1 ] + 1 } ) ; /// insertation
}
}
}
return dif[ m] [ n] ;
}
public :
Country( ) : found( false ) { }
void setTimeLine( string paese, Time UTC)
{
for ( int i = 0 ; i < paese.size ( ) ; i++ )
{
if ( paese[ i] >= 'A' && paese[ i] <= 'Z' )
{
paese[ i] = paese[ i] + 32 ;
}
}
int min_distance = 100 ;
string best_match;
for ( auto it = country.begin ( ) ; it ! = country.end ( ) ; it++ )
{
int distance = Levenstein_Distance( paese,it- > first) ;
if ( distance == 0 )
{
found = true ;
best_match = it- > first;
break ;
}
else if ( distance < min_distance)
{
min_distance = distance;
best_match = it- > first;
}
}
if ( min_distance <= 2 )
{
auto it = country.find ( best_match) ;
found = true ;
stadt = best_match;
int hour = it- > second;
int newHour = UTC.getHour ( ) + hour;
timezone = UTC;
timezone.setHour ( newHour) ;
}
else
{
cout << " Not valid country name" << endl;
found = false ;
}
}
string getCountry( )
{
return stadt;
}
Time gettimeZone( )
{
return timezone;
}
void printnewTime( )
{
if ( found == true )
{
cout << " the local time in " << stadt << " is " << setfill( '0' ) << setw( 2 ) << timezone.getHour ( ) << ":" ;
cout << setfill( '0' ) << setw( 2 ) << timezone.getMinute ( ) << ":" ;
cout << setfill( '0' ) << setw( 2 ) << timezone.getSecond ( ) << " " << timezone.getmidday ( ) << endl;
cout << endl;
cout << "A fun fact: Airplane travelers can be considered time travelers since they journey through both space and time." << endl;
}
else {
return ;
}
}
} ;
int main( )
{
// int ora, minu, secondo;
//
// cout << "what's the time now in your country" << endl;
// cout << endl;
// cout << "enter hour then minutes then second" << endl;
//
// cin >> ora >> minu >> secondo;
//
// Time zone1(ora,minu,secondo);
//
Country c;
//
// cout << "enter the city that you are traveling to: ";
// string city;
//
// cin.ignore();
//
// getline(cin,city);
// cout<<endl;
//
//
// c.setTimeLine(city,zone1);
// c.printnewTime();
// cout<<endl;
//
// cout<<endl;
Time t1( 20 ,30 ,0 ) ;
c.setTimeLine ( "itly" , t1) ; // Should auto-correct to "italy"
c.printnewTime ( ) ;
cout << endl;
Time t2( 10 ,0 ,0 ) ;
c.setTimeLine ( "z" , t2) ;
c.printnewTime ( ) ;
cout << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVGltZQp7CnByaXZhdGU6CiAgICBpbnQgaG91cjsKICAgIGludCBtaW51dGU7CiAgICBpbnQgc2Vjb25kOwogICAgc3RyaW5nIG1pZGRheTsKCnB1YmxpYzoKCiAgICBUaW1lKCkKICAgIHsKICAgIH0KCiAgICBUaW1lKGludCBoLCBpbnQgbSwgaW50IHMpCiAgICB7CiAgICAgICAgaG91ciA9IGg7CiAgICAgICAgbWludXRlID0gbTsKICAgICAgICBzZWNvbmQgPSBzOwoKICAgIH0KCiAgICB2b2lkIHNldEhvdXIoaW50IGgpCiAgICB7CiAgICAgICAgaWYgKGggPj0gMCAmJiBoIDw9IDI0KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGggPT0gMjQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGhvdXIgPSAwOwogICAgICAgICAgICAgICAgbWlkZGF5ID0gIkFNIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChoID4gMTIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGhvdXIgPSBoIC0gMTI7CiAgICAgICAgICAgICAgICBtaWRkYXkgPSAiUE0iOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChoID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGhvdXIgPSAxMjsKICAgICAgICAgICAgICAgIG1pZGRheSA9ICJBTSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaCA9PSAxMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaG91ciA9IGg7CiAgICAgICAgICAgICAgICBtaWRkYXkgPSAiUE0iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGhvdXIgPSBoOwogICAgICAgICAgICAgICAgbWlkZGF5ID0gIkFNIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBzdHJpbmcgZ2V0bWlkZGF5KCkKICAgIHsKICAgICAgICByZXR1cm4gbWlkZGF5OwogICAgfQoKICAgIGludCBnZXRIb3VyKCkKICAgIHsKICAgICAgICByZXR1cm4gaG91cjsKICAgIH0KCiAgICB2b2lkIHNldE1pbnV0ZShpbnQgbSkKICAgIHsKICAgICAgICBpZiAobSA+PSAwICYmIG0gPD0gNTkpCiAgICAgICAgewogICAgICAgICAgICBtaW51dGUgPSBtOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBtaW51dGUgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgZ2V0TWludXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gbWludXRlOwogICAgfQoKICAgIHZvaWQgc2V0U2Vjb25kKGludCBzKQogICAgewogICAgICAgIGlmIChzID49IDAgJiYgcyA8PSA1OSkKICAgICAgICB7CiAgICAgICAgICAgIHNlY29uZCA9IHM7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNlY29uZCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGludCBnZXRTZWNvbmQoKQogICAgewogICAgICAgIHJldHVybiBzZWNvbmQ7CiAgICB9CgogICAgdm9pZCBwcmludFRpbWVfaW5mbygpCiAgICB7CiAgICAgICAgY291dCA8PCAiIHRoZSB0aW1lIGlzICIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgaG91ciA8PCAiOiI7CiAgICAgICAgY291dCA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKSA8PCBtaW51dGUgPDwgIjoiOwogICAgICAgIGNvdXQgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgc2Vjb25kIDw8ICIgIiA8PCBtaWRkYXkgPDwgZW5kbDsKICAgIH0KCn07CgoKY2xhc3MgQ291bnRyeQp7CiAgICBUaW1lIHRpbWV6b25lOwoKICAgIGJvb2wgZm91bmQ7CgogICAgc3RyaW5nIHN0YWR0OwoKICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLCBpbnQ+IGNvdW50cnkgPSB7CiAgICB7ImFmZ2hhbmlzdGFuIiwgNH0sIHsiYWxhc2thIiwgLTl9LCB7ImFyZ2VudGluYSIsIC0zfSwgeyJhcm1lbmlhIiwgNH0sIHsiYXpvcmVzIiwgLTF9LAogICAgeyJiYW5nbGFkZXNoIiwgNn0sIHsiYmh1dGFuIiwgNn0sIHsiYnJhc2lsaWEiLCAtM30sIHsiYnJhemlsIiwgLTN9LCB7ImNhbWJvZGlhIiwgN30sCiAgICB7ImNhbmFkYSIsIC01fSwgeyJjYXBlIHZlcmRlIGlzbGFuZCIsIC0xfSwgeyJjYXJhY2FzIiwgLTR9LCB7ImNlbnRyYWwgYW1lcmljYSIsIC02fSwgeyJjaGlodWFodWEiLCAtN30sCiAgICB7ImNoaW5hIiwgOH0sIHsiY29sb21iaWEiLCAtNX0sIHsiY3ViYSIsIC01fSwgeyJlZ3lwdCIsIDJ9LCB7ImZpamkiLCAxMn0sCiAgICB7ImZyYW5jZSIsIDF9LCB7Imdlb3JnaWEiLCA0fSwgeyJnZXJtYW55IiwgMX0sIHsiZ2hhbmEiLCAwfSwgeyJncmVlY2UiLCAyfSwKICAgIHsiZ3JlZW5sYW5kIiwgLTN9LCB7Imd1YW0iLCAxMH0sIHsiaGF3YWlpIiwgLTEwfSwgeyJpY2VsYW5kIiwgMH0sIHsiaW5kaWEiLCA1fSwKICAgIHsiaW5kb25lc2lhIiwgN30sIHsiaXJhbiIsIDN9LCB7ImlyYXEiLCAzfSwgeyJpdGFseSIsIDF9LCB7Impha2FydGEiLCA3fSwKICAgIHsiamFwYW4iLCA5fSwgeyJrYXpha2hzdGFuIiwgNX0sIHsia2VueWEiLCAzfSwgeyJrb3JlYSIsIDl9LCB7Imt1d2FpdCIsIDN9LAogICAgeyJsYSBwYXoiLCAtNH0sIHsibWFsaSIsIDB9LCB7Im1hbGF5c2lhIiwgOH0sIHsibWFyc2hhbGwgaXNsYW5kIiwgMTJ9LCB7Im1hemF0bGFuIiwgLTd9LAogICAgeyJtZWxib3VybmUiLCAxMH0sIHsibWV4aWNvIiwgLTZ9LCB7Im1pZHdheSBpc2xhbmQiLCAtMTF9LCB7Im1vc2NvdyIsIDN9LCB7Im15YW5tYXIiLCA2fSwKICAgIHsibmVwYWwiLCA1fSwgeyJuZXcgemVhbGFuZCIsIDEyfSwgeyJuZXdmb3VuZGxhbmQiLCAtM30sIHsibmlnZXJpYSIsIDF9LCB7Im9tYW4iLCA0fSwKICAgIHsicGFraXN0YW4iLCA1fSwgeyJwZXJ1IiwgLTV9LCB7InBoaWxpcHBpbmVzIiwgOH0sIHsicG9sYW5kIiwgMX0sIHsicmlvIiwgLTN9LAogICAgeyJydXNzaWEiLCAzfSwgeyJzYW1vYSIsIC0xMX0sIHsic2FudGlhZ28iLCAtNH0sIHsic2F1ZGkgYXJhYmlhIiwgM30sIHsic2VuZWdhbCIsIDB9LAogICAgeyJzaW5nYXBvcmUiLCA4fSwgeyJzb2xvbW9uIGlzbGFuZCIsIDExfSwgeyJzb3V0aCBhZnJpY2EiLCAyfSwgeyJzb3V0aCBrb3JlYSIsIDl9LCB7InNwYWluIiwgMX0sCiAgICB7InNyaSBsYW5rYSIsIDV9LCB7InN3ZWRlbiIsIDF9LCB7InN5ZG5leSIsIDEwfSwgeyJ0aGFpbGFuZCIsIDd9LCB7InRpanVhbmEiLCAtOH0sCiAgICB7InR1cmtleSIsIDN9LCB7InVrcmFpbmUiLCAyfSwgeyJ1bml0ZWQgYXJhYiBlbWlyYXRlcyIsIDR9LCB7InVuaXRlZCBraW5nZG9tIiwgMH0sIHsidW5pdGVkIHN0YXRlcyIsIC01fSwKICAgIHsidXpiZWtpc3RhbiIsIDV9LCB7InZhbnVhdHUiLCAxMX0sIHsidmlldG5hbSIsIDd9LCB7InZsYWRpdm9zdG9rIiwgMTB9fTsKCmludCBMZXZlbnN0ZWluX0Rpc3RhbmNlKGNvbnN0IHN0cmluZyAmd29yZDEsIGNvbnN0IHN0cmluZyAmd29yZDIpCiAgICB7CiAgICAgICAgaW50IG0gPSB3b3JkMS5sZW5ndGgoKTsKICAgICAgICBpbnQgbiA9IHdvcmQyLmxlbmd0aCgpOwoKICAgICAgIHZlY3RvcjwgdmVjdG9yIDwgaW50Pj4gZGlmKG0gKzEsIHZlY3RvcjxpbnQ+IChuKzEpKTsKCiAgICAgICBmb3IoIGludCBpID0gMDsgaSA8PSBtOyBpKyspCiAgICAgICB7CiAgICAgICAgICAgZGlmW2ldWzBdID0gaTsKICAgICAgIH0KCiAgICAgICBmb3IoaW50IGogPSAwOyBqIDw9IG47IGorKykKICAgICAgIHsKICAgICAgICAgICBkaWZbMF1bal0gPSBqOwogICAgICAgfQoKICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8PSBtOyBpKyspCiAgICAgICB7CiAgICAgICAgICAgIGZvcihpbnQgaiA9IDE7IGogPD0gbjsgaisrKQogICAgICAgewogICAgICAgICAgIGlmKHdvcmQxW2kgLSAxXSA9PSB3b3JkMltqLTFdKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgZGlmW2ldW2pdID0gZGlmW2ktMV1bai0xXTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZXsKCiAgICAgICAgICAgICBkaWZbaV1bal0gPSBtaW4oe2RpZltpLTFdW2otMV0rMSwgLy8vIHN1YnN0aXR1dGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZbaS0xXVtqXSsxLCAgIC8vLyBkZWxldGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZltpXVtqLTFdKzF9KTsgIC8vLyBpbnNlcnRhdGlvbgogICAgICAgICAgIH0KICAgICAgIH0KICAgIH0KICAgICAgICAgICByZXR1cm4gZGlmW21dW25dOwogICAgfQoKcHVibGljOgoKICAgIENvdW50cnkoKTogZm91bmQoZmFsc2Upe30KCiAgICB2b2lkIHNldFRpbWVMaW5lKHN0cmluZyBwYWVzZSwgVGltZSBVVEMpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWVzZS5zaXplKCk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwYWVzZVtpXSA+PSAnQScgJiYgcGFlc2VbaV0gPD0gJ1onKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYWVzZVtpXSA9IHBhZXNlW2ldICsgMzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGludCBtaW5fZGlzdGFuY2UgPSAxMDA7CiAgICAgICAgc3RyaW5nIGJlc3RfbWF0Y2g7CgogICAgIGZvciggYXV0byBpdCA9IGNvdW50cnkuYmVnaW4oKTsgaXQgIT0gY291bnRyeS5lbmQoKTsgaXQrKykKICAgICAgewogICAgICAgIGludCBkaXN0YW5jZSA9IExldmVuc3RlaW5fRGlzdGFuY2UocGFlc2UsaXQtPmZpcnN0KTsKCiAgICAgICAgaWYgKGRpc3RhbmNlID09IDApCiAgICAgICAgewogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJlc3RfbWF0Y2ggPSBpdC0+Zmlyc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgIGVsc2UgaWYgKGRpc3RhbmNlIDwgbWluX2Rpc3RhbmNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICBtaW5fZGlzdGFuY2UgPSBkaXN0YW5jZTsKICAgICAgICAgICAgIGJlc3RfbWF0Y2ggPSBpdC0+Zmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgfQoKICAgICBpZiAobWluX2Rpc3RhbmNlIDw9IDIpCiAgICAgICAgICB7CiAgICAgICAgICAgIGF1dG8gaXQgPSBjb3VudHJ5LmZpbmQoYmVzdF9tYXRjaCk7CiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgc3RhZHQgPSBiZXN0X21hdGNoOwogICAgICAgICAgICBpbnQgaG91ciA9IGl0LT5zZWNvbmQ7CiAgICAgICAgICAgIGludCBuZXdIb3VyID0gVVRDLmdldEhvdXIoKStob3VyOwogICAgICAgICAgICB0aW1lem9uZSA9IFVUQzsKICAgICAgICAgICAgdGltZXpvbmUuc2V0SG91cihuZXdIb3VyKTsKICAgICAgICAgIH0KCiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCAiIE5vdCB2YWxpZCBjb3VudHJ5IG5hbWUiIDw8IGVuZGw7CiAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CiAgICAgICAgfQp9CgogICAgc3RyaW5nIGdldENvdW50cnkoKQogICAgewogICAgICAgIHJldHVybiBzdGFkdDsKICAgIH0KCgogICAgVGltZSBnZXR0aW1lWm9uZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHRpbWV6b25lOwogICAgfQoKCiAgICAgICAgdm9pZCBwcmludG5ld1RpbWUoKQogICAgICAgIHsKICAgICAgICAgICAgaWYoZm91bmQgPT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICIgdGhlIGxvY2FsIHRpbWUgaW4gIiA8PCBzdGFkdCA8PCAiIGlzICIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgdGltZXpvbmUuZ2V0SG91cigpIDw8ICI6IjsKICAgICAgICAgICAgY291dCA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKSA8PCB0aW1lem9uZS5nZXRNaW51dGUoKSA8PCAiOiI7CiAgICAgICAgICAgIGNvdXQgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgdGltZXpvbmUuZ2V0U2Vjb25kKCkgPDwgIiAiIDw8IHRpbWV6b25lLmdldG1pZGRheSgpIDw8IGVuZGw7CgogICAgICAgICAgICAgIGNvdXQ8PGVuZGw7CgogICAgICAgICAgICAgIGNvdXQ8PCAiQSBmdW4gZmFjdDogQWlycGxhbmUgdHJhdmVsZXJzIGNhbiBiZSBjb25zaWRlcmVkIHRpbWUgdHJhdmVsZXJzIHNpbmNlIHRoZXkgam91cm5leSB0aHJvdWdoIGJvdGggc3BhY2UgYW5kIHRpbWUuIjw8ZW5kbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZXsKCiAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KfTsKCmludCBtYWluKCkKewoKLy8gICAgaW50IG9yYSwgbWludSwgc2Vjb25kbzsKLy8KLy8gICAgY291dCA8PCAid2hhdCdzIHRoZSB0aW1lIG5vdyBpbiB5b3VyIGNvdW50cnkiIDw8IGVuZGw7Ci8vICAgIGNvdXQgPDwgZW5kbDsKLy8gICAgY291dCA8PCAiZW50ZXIgaG91ciB0aGVuIG1pbnV0ZXMgdGhlbiBzZWNvbmQiIDw8IGVuZGw7Ci8vCi8vICAgIGNpbiA+PiBvcmEgPj4gbWludSA+PiBzZWNvbmRvOwovLwovLyAgICBUaW1lIHpvbmUxKG9yYSxtaW51LHNlY29uZG8pOwovLwogICAgQ291bnRyeSBjOwovLwovLyAgICBjb3V0IDw8ICJlbnRlciB0aGUgY2l0eSB0aGF0IHlvdSBhcmUgdHJhdmVsaW5nIHRvOiAiOwovLyAgICBzdHJpbmcgY2l0eTsKLy8KLy8gICAgY2luLmlnbm9yZSgpOwovLwovLyAgICBnZXRsaW5lKGNpbixjaXR5KTsKLy8gICAgIGNvdXQ8PGVuZGw7Ci8vCi8vCi8vICAgICBjLnNldFRpbWVMaW5lKGNpdHksem9uZTEpOwovLyAgICBjLnByaW50bmV3VGltZSgpOwoKLy8gICAgY291dDw8ZW5kbDsKLy8KLy8gICAgICAgIGNvdXQ8PGVuZGw7CgogICAgICAgIFRpbWUgdDEoMjAsMzAsMCk7CiAgICBjLnNldFRpbWVMaW5lKCJpdGx5IiwgdDEpOyAvLyBTaG91bGQgYXV0by1jb3JyZWN0IHRvICJpdGFseSIKICAgIGMucHJpbnRuZXdUaW1lKCk7CgogICAgICAgIGNvdXQ8PGVuZGw7CgogICAgICAgIFRpbWUgdDIoMTAsMCwwKTsKCiAgICBjLnNldFRpbWVMaW5lKCJ6IiwgdDIpOwogICAgYy5wcmludG5ld1RpbWUoKTsKCiAgICAgICAgY291dDw8ZW5kbDsKCgogICAgcmV0dXJuIDA7Cn0K