- #include <iostream> 
- #include <thread> 
- #include <atomic> 
- #include <string> 
-   
- using namespace std; 
-   
- class Alarm { 
-     public: 
-     Alarm(int hour, int minute, std::string speech); 
-     Alarm(const Alarm& other); 
-     Alarm& operator=(const Alarm& other); 
-     void start(); 
-     void stop(); 
-     bool isStopped() const; 
- //    std::string getStats() const; 
-   
-     private: 
-     int m_hour; 
-     int m_minute; 
-     std::string m_speech; 
-     std::atomic<bool> m_stopped; 
- }; 
-   
- Alarm::Alarm(int hour, int minute, string speech)  
- : m_hour(hour),m_minute(minute),m_speech(speech),m_stopped(false) { 
- } 
-   
- Alarm::Alarm(const Alarm& other)  
- : m_hour(other.m_hour),m_minute(other.m_minute),m_speech(other.m_speech),m_stopped(other.isStopped()) { 
- } 
- Alarm& Alarm::operator=(const Alarm& other) { 
- 	m_hour = other.m_hour; 
- 	m_minute = other.m_minute; 
- 	m_speech = other.m_speech; 
- 	m_stopped.store(other.isStopped()); 
- 	return *this; 
- } 
-   
- void Alarm::start() { 
-     int currentHour, currentMinute; 
-   
-     while (!Alarm::isStopped()) { 
-         time_t now = time(NULL); 
-         struct tm *current = localtime(&now); 
-   
-         currentHour = current->tm_hour; 
-         currentMinute = current->tm_min; 
-   
-         if (currentHour == m_hour && currentMinute == m_minute) { 
-             cout << m_speech << endl; 
-             m_stopped.store(true); 
-         } 
-         else { 
-            this_thread::sleep_for(chrono::milliseconds(1000)); 
-         } 
-      } 
- }     
-   
- void Alarm::stop() { 
-     m_stopped.store(true); 
- } 
-   
- bool Alarm::isStopped() const { 
-     return m_stopped.load(); 
- } 
-   
- int main(int argc, const char * argv[]) {         
-     Alarm test1(12, 12, "foo"); 
-     Alarm test2(12, 12, "foo"); 
-   
-     std::thread t1(&Alarm::start,test1); 
-     std::thread t2(&Alarm::start,test2); 
-   
-     bool stop2ndThread = false; 
-     while(!test1.isStopped() && !test2.isStopped()) { 
-          this_thread::sleep_for(chrono::milliseconds(1000)); 
-          if(!stop2ndThread) { 
-          	 test1.stop(); 
-          } 
-          else { 
-          	 test2.stop(); 
-          } 
-     } 
-   
-     t2.join(); 
-     t1.join(); 
- } 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8YXRvbWljPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEFsYXJtIHsKICAgIHB1YmxpYzoKICAgIEFsYXJtKGludCBob3VyLCBpbnQgbWludXRlLCBzdGQ6OnN0cmluZyBzcGVlY2gpOwogICAgQWxhcm0oY29uc3QgQWxhcm0mIG90aGVyKTsKICAgIEFsYXJtJiBvcGVyYXRvcj0oY29uc3QgQWxhcm0mIG90aGVyKTsKICAgIHZvaWQgc3RhcnQoKTsKICAgIHZvaWQgc3RvcCgpOwogICAgYm9vbCBpc1N0b3BwZWQoKSBjb25zdDsKLy8gICAgc3RkOjpzdHJpbmcgZ2V0U3RhdHMoKSBjb25zdDsKCiAgICBwcml2YXRlOgogICAgaW50IG1faG91cjsKICAgIGludCBtX21pbnV0ZTsKICAgIHN0ZDo6c3RyaW5nIG1fc3BlZWNoOwogICAgc3RkOjphdG9taWM8Ym9vbD4gbV9zdG9wcGVkOwp9OwoKQWxhcm06OkFsYXJtKGludCBob3VyLCBpbnQgbWludXRlLCBzdHJpbmcgc3BlZWNoKSAKOiBtX2hvdXIoaG91ciksbV9taW51dGUobWludXRlKSxtX3NwZWVjaChzcGVlY2gpLG1fc3RvcHBlZChmYWxzZSkgewp9CgpBbGFybTo6QWxhcm0oY29uc3QgQWxhcm0mIG90aGVyKSAKOiBtX2hvdXIob3RoZXIubV9ob3VyKSxtX21pbnV0ZShvdGhlci5tX21pbnV0ZSksbV9zcGVlY2gob3RoZXIubV9zcGVlY2gpLG1fc3RvcHBlZChvdGhlci5pc1N0b3BwZWQoKSkgewp9CkFsYXJtJiBBbGFybTo6b3BlcmF0b3I9KGNvbnN0IEFsYXJtJiBvdGhlcikgewoJbV9ob3VyID0gb3RoZXIubV9ob3VyOwoJbV9taW51dGUgPSBvdGhlci5tX21pbnV0ZTsKCW1fc3BlZWNoID0gb3RoZXIubV9zcGVlY2g7CgltX3N0b3BwZWQuc3RvcmUob3RoZXIuaXNTdG9wcGVkKCkpOwoJcmV0dXJuICp0aGlzOwp9Cgp2b2lkIEFsYXJtOjpzdGFydCgpIHsKICAgIGludCBjdXJyZW50SG91ciwgY3VycmVudE1pbnV0ZTsKCiAgICB3aGlsZSAoIUFsYXJtOjppc1N0b3BwZWQoKSkgewogICAgICAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogICAgICAgIHN0cnVjdCB0bSAqY3VycmVudCA9IGxvY2FsdGltZSgmbm93KTsKCiAgICAgICAgY3VycmVudEhvdXIgPSBjdXJyZW50LT50bV9ob3VyOwogICAgICAgIGN1cnJlbnRNaW51dGUgPSBjdXJyZW50LT50bV9taW47CgogICAgICAgIGlmIChjdXJyZW50SG91ciA9PSBtX2hvdXIgJiYgY3VycmVudE1pbnV0ZSA9PSBtX21pbnV0ZSkgewogICAgICAgICAgICBjb3V0IDw8IG1fc3BlZWNoIDw8IGVuZGw7CiAgICAgICAgICAgIG1fc3RvcHBlZC5zdG9yZSh0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSk7CiAgICAgICAgfQogICAgIH0KfSAgICAKCnZvaWQgQWxhcm06OnN0b3AoKSB7CiAgICBtX3N0b3BwZWQuc3RvcmUodHJ1ZSk7Cn0KCmJvb2wgQWxhcm06OmlzU3RvcHBlZCgpIGNvbnN0IHsKICAgIHJldHVybiBtX3N0b3BwZWQubG9hZCgpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkgeyAgICAgICAgCiAgICBBbGFybSB0ZXN0MSgxMiwgMTIsICJmb28iKTsKICAgIEFsYXJtIHRlc3QyKDEyLCAxMiwgImZvbyIpOwoKICAgIHN0ZDo6dGhyZWFkIHQxKCZBbGFybTo6c3RhcnQsdGVzdDEpOwogICAgc3RkOjp0aHJlYWQgdDIoJkFsYXJtOjpzdGFydCx0ZXN0Mik7CgogICAgYm9vbCBzdG9wMm5kVGhyZWFkID0gZmFsc2U7CiAgICB3aGlsZSghdGVzdDEuaXNTdG9wcGVkKCkgJiYgIXRlc3QyLmlzU3RvcHBlZCgpKSB7CiAgICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCkpOwogICAgICAgICBpZighc3RvcDJuZFRocmVhZCkgewogICAgICAgICAJIHRlc3QxLnN0b3AoKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgCSB0ZXN0Mi5zdG9wKCk7CiAgICAgICAgIH0KICAgIH0KCiAgICB0Mi5qb2luKCk7CiAgICB0MS5qb2luKCk7Cn0=