In the following, we examine the utility of using GPS distance
between phones to predict physical proximity. If successful, this means
we can estimate if partners are together or not at any moment in time.
Alternatively, and to acquire even more precise estimation of proximity,
we can implement logging of “nearby interaction” based on iPhone ultra
wideband (radio) chip using the Apple Developer toolkit https://developer.apple.com/documentation/nearbyinteraction.
This will give precise distance measures up to 100 meters.
The data we use is collected by students on a 4-day trip to New York.
During the trip, the students participated in with various events
together and also had free time to explore New York by them selves or in
smaller groups (self-organized). More information about the data can be
found here: https://rpubs.com/jych/audioexplorers2023
Thus,
we will examine how well the GPS distance classify if the students are
together and participating in an event or not.
To do this, we will assess:
Average distance between all students.
As GPS is noisy (especially around and inside buildings), we expect
that the average distance will be a good group proximity measure.
Distance between selected pairs.
I.e., do the continuous distance between pairs predict togetherness
throughout the day (during events + spare time)?
Pre-processing
Prior to computing the distance between GPS coordinates in meters, we
remove erroneous GPS logs (values extreme compared to medians). Then, we
aggregate data across 1 minute intervals (i.e., across 3 data points).
Next, for each 1-min average, the mutual distance between all students
are computed (using “geosphere” R package) and averaged.
Data visualizations
Noise and heart rarte
First, we inspect the logged mean noise floor and heart rate.

Group proximity
Next, we inspect the group proximity. That is, the average mutual
distance (in meters) between all students. As seen, the distance between
students rise and is highest for “Free time”, “Bus”, “Coney Island”, and
“Walk”, which are all events where the students are scattered. At the
same time, proximity is highest (lowest mutual distance) for “Dinner”
and various presentations where all students were together.

Pair proximity
Finally, we focus on the distance between a selected pair of the
students. Again, the distance measure seems to be a good proxy for
proximity across the days.

LS0tDQp0aXRsZTogIkdQUyBhcyBwcm94aW1pdHkgZGV0ZWN0b3IiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0gDQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsZWNobyA9IEZBTFNFLGZpZy5hbGlnbiA9ICdjZW50ZXInKSANCmdldHdkKCkNCg0KYGBgDQoNCkluIHRoZSBmb2xsb3dpbmcsIHdlIGV4YW1pbmUgdGhlIHV0aWxpdHkgb2YgdXNpbmcgR1BTIGRpc3RhbmNlIGJldHdlZW4gcGhvbmVzIHRvIHByZWRpY3QgcGh5c2ljYWwgcHJveGltaXR5LiBJZiBzdWNjZXNzZnVsLCB0aGlzIG1lYW5zIHdlIGNhbiBlc3RpbWF0ZSBpZiBwYXJ0bmVycyBhcmUgdG9nZXRoZXIgb3Igbm90IGF0IGFueSBtb21lbnQgaW4gdGltZS4gQWx0ZXJuYXRpdmVseSwgYW5kIHRvIGFjcXVpcmUgZXZlbiBtb3JlIHByZWNpc2UgZXN0aW1hdGlvbiBvZiBwcm94aW1pdHksIHdlIGNhbiBpbXBsZW1lbnQgbG9nZ2luZyBvZiAibmVhcmJ5IGludGVyYWN0aW9uIiBiYXNlZCBvbiBpUGhvbmUgdWx0cmEgd2lkZWJhbmQgKHJhZGlvKSBjaGlwIHVzaW5nIHRoZSBBcHBsZSBEZXZlbG9wZXIgdG9vbGtpdCBbaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vbmVhcmJ5aW50ZXJhY3Rpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL25lYXJieWludGVyYWN0aW9uKXt0YXJnZXQ9Il9ibGFuayJ9LiBUaGlzIHdpbGwgZ2l2ZSBwcmVjaXNlIGRpc3RhbmNlIG1lYXN1cmVzIHVwIHRvIDEwMCBtZXRlcnMuPGJyPiAgIA0KVGhlIGRhdGEgd2UgdXNlIGlzIGNvbGxlY3RlZCBieSBzdHVkZW50cyBvbiBhIDQtZGF5IHRyaXAgdG8gTmV3IFlvcmsuIER1cmluZyB0aGUgdHJpcCwgdGhlIHN0dWRlbnRzIHBhcnRpY2lwYXRlZCBpbiB3aXRoIHZhcmlvdXMgZXZlbnRzIHRvZ2V0aGVyIGFuZCBhbHNvIGhhZCBmcmVlIHRpbWUgdG8gZXhwbG9yZSBOZXcgWW9yayBieSB0aGVtIHNlbHZlcyBvciBpbiBzbWFsbGVyIGdyb3VwcyAoc2VsZi1vcmdhbml6ZWQpLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIGNhbiBiZSBmb3VuZCBoZXJlOiBbaHR0cHM6Ly9ycHVicy5jb20vanljaC9hdWRpb2V4cGxvcmVyczIwMjNdKGh0dHBzOi8vcnB1YnMuY29tL2p5Y2gvYXVkaW9leHBsb3JlcnMyMDIzKXt0YXJnZXQ9Il9ibGFuayJ9IA0KPGJyPg0KVGh1cywgd2Ugd2lsbCBleGFtaW5lIGhvdyB3ZWxsIHRoZSBHUFMgZGlzdGFuY2UgY2xhc3NpZnkgaWYgdGhlIHN0dWRlbnRzIGFyZSB0b2dldGhlciBhbmQgcGFydGljaXBhdGluZyBpbiBhbiBldmVudCBvciBub3QuICANCjxicj4NClRvIGRvIHRoaXMsIHdlIHdpbGwgYXNzZXNzOg0KDQojIyMjIEF2ZXJhZ2UgZGlzdGFuY2UgYmV0d2VlbiBhbGwgc3R1ZGVudHMuIA0KDQpBcyBHUFMgaXMgbm9pc3kgKGVzcGVjaWFsbHkgYXJvdW5kIGFuZCBpbnNpZGUgYnVpbGRpbmdzKSwgd2UgZXhwZWN0IHRoYXQgdGhlIGF2ZXJhZ2UgZGlzdGFuY2Ugd2lsbCBiZSBhIGdvb2QgZ3JvdXAgcHJveGltaXR5IG1lYXN1cmUuICANCg0KIyMjIyBEaXN0YW5jZSBiZXR3ZWVuIHNlbGVjdGVkIHBhaXJzLiANCg0KSS5lLiwgZG8gdGhlIGNvbnRpbnVvdXMgZGlzdGFuY2UgYmV0d2VlbiBwYWlycyBwcmVkaWN0IHRvZ2V0aGVybmVzcyB0aHJvdWdob3V0IHRoZSBkYXkgKGR1cmluZyBldmVudHMgKyBzcGFyZSB0aW1lKT8gDQoNCiMjIFByZS1wcm9jZXNzaW5nDQoNClByaW9yIHRvIGNvbXB1dGluZyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBHUFMgY29vcmRpbmF0ZXMgaW4gbWV0ZXJzLCB3ZSByZW1vdmUgZXJyb25lb3VzIEdQUyBsb2dzICh2YWx1ZXMgZXh0cmVtZSBjb21wYXJlZCB0byBtZWRpYW5zKS4gVGhlbiwgd2UgYWdncmVnYXRlIGRhdGEgYWNyb3NzIDEgbWludXRlIGludGVydmFscyAoaS5lLiwgYWNyb3NzIDMgZGF0YSBwb2ludHMpLiBOZXh0LCBmb3IgZWFjaCAxLW1pbiBhdmVyYWdlLCB0aGUgbXV0dWFsIGRpc3RhbmNlIGJldHdlZW4gYWxsIHN0dWRlbnRzIGFyZSBjb21wdXRlZCAodXNpbmcgImdlb3NwaGVyZSIgUiBwYWNrYWdlKSBhbmQgYXZlcmFnZWQuICANCg0KYGBge3IgZGF0YW1hbmdsaW5nfQ0Kc2V0d2QoJ0M6L1VzZXJzL2p5Y2gvRGVtYW50LytUZWFtIEF1ZGlvIEV4cGxvcmVyIDIwMjEgLSBkYXRhIGFuZCBjb21wZXRpdGlvbnMgLSBEb2N1bWVudHMvQ29kZS8nKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShtYXB2aWV3KQ0KbGlicmFyeShwbG90cml4KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoZW1tZWFucykNCmxpYnJhcnkoZ2Vvc3BoZXJlKQ0KDQp0aGVtZV9zZXQodGhlbWVfcHVicigpKQ0KbG9hZCgnQzovVXNlcnMvanljaC9EZW1hbnQvK1RlYW0gQXVkaW8gRXhwbG9yZXIgMjAyMSAtIGRhdGEgYW5kIGNvbXBldGl0aW9ucyAtIERvY3VtZW50cy9EYXRhL0F1Z3VzdDIwMjMuUmRhdGEnKQ0KZGYuZ2FybWluJEhvdXIgPC0gaG91cihkZi5nYXJtaW4kVGltZXN0YW1wKQ0KZGYuZ2FybWluJERhdGUgPC0gZGF0ZShkZi5nYXJtaW4kVGltZXN0YW1wKQ0KZGYuZ2FybWluIDwtIGRmLmdhcm1pbltkZi5nYXJtaW4kSUQhPSdGcmFueicsXQ0KZGYuZ2FybWluJHJUaW1lIDwtIGNlaWxpbmdfZGF0ZShkZi5nYXJtaW4kVGltZXN0YW1wLCcxIG1pbnV0ZXMnKQ0KZGYuZ2FybWluJERheXMgPC0gZGF0ZShkZi5nYXJtaW4kclRpbWUpDQpjb2xzID0gYygnIzJkYjdjNScsJyNjNzAxN2YnKQ0KYGBgDQoNCg0KYGBge3IgdGltZXNlcmllcyBjb21wLGVjaG89RkFMU0V9DQpkYXRhdG1wIDwtIGRmLmdhcm1pbltkYXRlKGRmLmdhcm1pbiRyVGltZSk+JzIwMjMtMDgtMzAnICYNCiAgICAgICAgICAgICAgICAgICAgIGRhdGUoZGYuZ2FybWluJHJUaW1lKTwnMjAyMy0wOS0wNCcgJiANCiAgICAgICAgICAgICAgICAgICAgICAgZGYuZ2FybWluJEhvdXI+NyAmDQogICAgICAgICAgICAgICAgICAgICAgIGRmLmdhcm1pbiRJRCE9J1ZpbmNlbnQnLF0NCg0KZGYucGxvdC5uZiA8LSBhZ2dyZWdhdGUoTkYuZEJBfnJUaW1lK0V2ZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGF0bXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgRlVOPWZ1bmN0aW9uKHgpbWVkaWFuKHgsbmEucm09VCkpDQoNCmRmLnBsb3Quc3BsIDwtIGFnZ3JlZ2F0ZShTUEwuZEJBfnJUaW1lK0V2ZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGF0bXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgRlVOPWZ1bmN0aW9uKHgpbWVkaWFuKHgsbmEucm09VCkpDQoNCmRmLnBsb3QuaHIgPC0gYWdncmVnYXRlKGJlYXRzUGVyTWludXRlfnJUaW1lK0V2ZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YXRtcCwNCiAgICAgICAgICAgICAgICAgICAgICAgIEZVTj1mdW5jdGlvbih4KW1lYW4oeCxuYS5ybT1UKSkNCg0KDQpkZi5wbG90Lm5mIDwtIGRmLnBsb3QubmYgJT4lDQogIG11dGF0ZSh4ID0gaG91cihyVGltZSkgKyBtaW51dGUoclRpbWUpLzYwICsgc2Vjb25kKHJUaW1lKS8zNjAwKQ0KZGYucGxvdC5ociA8LSBkZi5wbG90LmhyICU+JQ0KICBtdXRhdGUoeCA9IGhvdXIoclRpbWUpICsgbWludXRlKHJUaW1lKS82MCArIHNlY29uZChyVGltZSkvMzYwMCkNCg0KZGYucGxvdC5uZiRFdmVudHNOIDwtIGFzLmZhY3RvcihkZi5wbG90Lm5mJEV2ZW50cykNCmxldmVscyhkZi5wbG90Lm5mJEV2ZW50c04pIDwtIDE6bGVuZ3RoKGxldmVscyhkZi5wbG90Lm5mJEV2ZW50c04pKQ0KZGYucGxvdC5uZiRFdmVudHNOIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmLnBsb3QubmYkRXZlbnRzTikpDQoNCmRmLnBsb3QubmYkRXZlbnRzU2VsIDwtIDANCmRmLnBsb3QubmYkRXZlbnRzU2VsW3doaWNoKGRpZmYoYygwLGRmLnBsb3QubmYkRXZlbnRzTikpIT0wKSsxXSA8LSAxDQoNCg0KcDEgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YT1kZi5wbG90Lm5mLGFlcyh4PXgseT1ORi5kQkEpLGFscGhhPTAuNSxjb2xvcj1jb2xzWzFdLHNpemU9MSkrDQogIGdlb21fcG9pbnQoZGF0YT1kZi5wbG90LmhyLGFlcyh4PXgseT1iZWF0c1Blck1pbnV0ZSksYWxwaGE9MC41LGNvbG9yPWNvbHNbMl0sc2l6ZT0xKSsNCiAgdGhlbWVfbGlnaHQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgICMgRmVhdHVyZXMgb2YgdGhlIGZpcnN0IGF4aXMNCiAgICBuYW1lID0gIk5vaXNlIGZsb29yIGxldmVsIChkQikiLGxpbWl0cyA9IGMoNTAsMTEwKSwNCiAgICAjIEFkZCBhIHNlY29uZCBheGlzIGFuZCBzcGVjaWZ5IGl0cyBmZWF0dXJlcw0KICAgIHNlYy5heGlzID0gc2VjX2F4aXMoIHRyYW5zPX4uLzEsIG5hbWU9IkhlYXJ0IHJhdGUgKGJwbSkiKQ0KICApKw0KICB0aGVtZShheGlzLnRpdGxlLnkucmlnaHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSBjb2xzWzJdKSkrDQogIHRoZW1lKGF4aXMudGl0bGUueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gY29sc1sxXSkpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPSJsZWZ0IiwgDQogICAgICAgIGxlZ2VuZC5ib3guc3BhY2luZyA9IHVuaXQoMCwgInB0IiksDQogICAgICAgIGF4aXMudGlja3MueS5yaWdodCA9IGVsZW1lbnRfbGluZShjb2xvciA9IGNvbHNbMl0pLA0KICAgICAgICBheGlzLnRleHQueS5yaWdodCA9IGVsZW1lbnRfdGV4dChjb2xvciA9IGNvbHNbMl0pLA0KICAgICAgICBheGlzLnRpY2tzLnkubGVmdCAgPSBlbGVtZW50X2xpbmUoY29sb3IgPSBjb2xzWzFdKSwNCiAgICAgICAgYXhpcy50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChjb2xvciA9IGNvbHNbMV0pKSsNCiAgbGFicyh4PScnKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoOCwyNCksYnJlYWtzID0gc2VxKDgsMjQsMiksbGFiZWxzID0gcGFzdGUoc2VxKDgsMjQsMiksJzowMCcsc2VwID0gIiIpKSsNCiAgZ3JpZHMoJ3h5JykrDQogZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZi5wbG90Lm5mW2RmLnBsb3QubmYkRXZlbnRzU2VsPT0xJmRmLnBsb3QubmYkRXZlbnRzIT0nTm90IGtub3duJyxdLCBhZXMobGFiZWwgPSBFdmVudHMseD14LHk9TkYuZEJBLGNvbG9yPUV2ZW50cyksZm9udGZhY2UgPSAiYm9sZCIsbWF4Lm92ZXJsYXBzID0gODAsZm9yY2UgPSA4LG51ZGdlX3kgPSAtMTAsYWxwaGE9MSxzaXplPTMpKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBkZi5wbG90Lm5mW2RmLnBsb3QubmYkRXZlbnRzU2VsPT0xJmRmLnBsb3QubmYkRXZlbnRzIT0nTm90IGtub3duJyxdLCBhZXMoeGludGVyY2VwdD14LGNvbG9yPUV2ZW50cyksYWxwaGE9MSxsaW5ldHlwZT0nZGFzaGVkJykrDQogIGZhY2V0X3dyYXAofmRhdGUoclRpbWUpLHNjYWxlcz0nZnJlZV94JyxuY29sPTEpKw0KICBndWlkZXMoY29sb3I9J25vbmUnKQ0KDQoNCmBgYA0KDQpgYGB7ciBwcm94eSBkb3NlIGNvbXAsZWNobz1GQUxTRX0NCmRhdGF0bXAgPC0gZGYuZ2FybWluW2RhdGUoZGYuZ2FybWluJHJUaW1lKT4nMjAyMy0wOC0zMCcgJg0KICAgICAgICAgICAgICAgICAgICAgZGF0ZShkZi5nYXJtaW4kclRpbWUpPCcyMDIzLTA5LTA0JyAmIA0KICAgICAgICAgICAgICAgICAgICAgICBkZi5nYXJtaW4kSG91cj43ICYNCiAgICAgICAgICAgICAgICAgICAgICAgZGYuZ2FybWluJElEIT0nVmluY2VudCcsXQ0KDQojIGZpbHRlciBOQSBHUFMNCmRhdGF0bXAkbGF0aXR1ZGVbZGF0YXRtcCRsYXRpdHVkZTwzMF0gPC0gTkENCmRhdGF0bXAkbG9uZ2l0dWRlW2RhdGF0bXAkbG9uZ2l0dWRlPigtMTApXSA8LSBOQQ0KDQoNCmRmLmdwcyA8LSBhZ2dyZWdhdGUoLn5yVGltZStJRCtFdmVudHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhdG1wW2MoJ3JUaW1lJywnSUQnLCdsYXRpdHVkZScsJ2xvbmdpdHVkZScsJ0V2ZW50cycpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGVU49ZnVuY3Rpb24oeCltZWRpYW4oeCxuYS5ybT1UKSkNCg0KDQpkZi5ncHMkRG0gPC0gTkENCmRmLmdwcyRWbSA8LSBOQQ0KZm9yKGkgaW4gMTpkaW0oZGYuZ3BzKVsxXSl7DQogDQogdG1wIDwtIGRmLmdwc1tkZi5ncHMkclRpbWU9PWRmLmdwcyRyVGltZVtpXSxdIA0KIGxvbmdpdHVkZSA8LSBkZi5ncHMkbG9uZ2l0dWRlW2ldDQogbGF0aXR1ZGUgPC0gZGYuZ3BzJGxhdGl0dWRlW2ldDQogDQogZCA8LSBOVUxMDQogZm9yKGlpIGluIDE6ZGltKHRtcClbMV0pew0KICBsb25naXR1ZGUyIDwtIHRtcCRsb25naXR1ZGVbaWldDQogIGxhdGl0dWRlMiA8LSB0bXAkbGF0aXR1ZGVbaWldDQogIGQgPC0gYyhkLGRpc3RtKGMobG9uZ2l0dWRlLCBsYXRpdHVkZSksIGMobG9uZ2l0dWRlMiwgbGF0aXR1ZGUyKSwgZnVuID0gZGlzdEdlbykpDQogfQ0KIA0KIGRbZD4zMDAwMF0gPC0gTkENCiBkW2Q9PTBdIDwtIE5BDQogZGYuZ3BzJERtW2ldIDwtIG1lYW4oZCxuYS5ybT1UKQ0KDQp9DQoNCmRmLmdwcyA8LSBkZi5ncHMgJT4lDQogIG11dGF0ZSh4ID0gaG91cihyVGltZSkgKyBtaW51dGUoclRpbWUpLzYwICsgc2Vjb25kKHJUaW1lKS8zNjAwKQ0KDQpkZi5ncHMucGxvdCA8LSBhZ2dyZWdhdGUoRG1+clRpbWUrRXZlbnRzLEZVTj1mdW5jdGlvbih4KW1lZGlhbih4LG5hLnJtPVQpLGRhdGE9ZGYuZ3BzWyxjKCdyVGltZScsJ0RtJywnRXZlbnRzJyldKQ0KZGYuZ3BzLnBsb3QkU0UgPC0gYWdncmVnYXRlKERtfnJUaW1lK0V2ZW50cyxGVU49ZnVuY3Rpb24oeClzdGQuZXJyb3IoeCxuYS5ybT1UKSxkYXRhPWRmLmdwc1ssYygnclRpbWUnLCdEbScsJ0V2ZW50cycpXSkkRG0NCg0KZGYuZ3BzLnBsb3QgPC0gZGYuZ3BzLnBsb3QgJT4lDQogIG11dGF0ZSh4ID0gaG91cihyVGltZSkgKyBtaW51dGUoclRpbWUpLzYwICsgc2Vjb25kKHJUaW1lKS8zNjAwKQ0KDQpkZi5ncHMucGxvdCRFdmVudHNOIDwtIGFzLmZhY3RvcihkZi5ncHMucGxvdCRFdmVudHMpDQpsZXZlbHMoZGYuZ3BzLnBsb3QkRXZlbnRzTikgPC0gMTpsZW5ndGgobGV2ZWxzKGRmLmdwcy5wbG90JEV2ZW50c04pKQ0KZGYuZ3BzLnBsb3QkRXZlbnRzTiA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZi5ncHMucGxvdCRFdmVudHNOKSkNCmRmLmdwcy5wbG90JEV2ZW50c1NlbCA8LSAwDQpkZi5ncHMucGxvdCRFdmVudHNTZWxbd2hpY2goZGlmZihjKDAsZGYuZ3BzLnBsb3QkRXZlbnRzTikpIT0wKSsxXSA8LSAxDQoNCg0KcDIgPC0gZ2dwbG90KCkrDQogIGdlb21fY29sKGRhdGE9ZGYuZ3BzLnBsb3QsYWVzKHg9eCx5PURtKSxmaWxsPSdncmV5NjAnLGFscGhhPTAuOCkrDQogIGdlb21fY29sKGRhdGE9ZGYuZ3BzLnBsb3QsYWVzKHg9eCx5PShEbStTRSkpLGZpbGw9J2dyZXk2MCcsYWxwaGE9MC4yKSsNCiAgdGhlbWVfbGlnaHQoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS55LmxlZnQgPSBlbGVtZW50X3RleHQoKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIiwNCiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249ImxlZnQiLCANCiAgICAgICAgbGVnZW5kLmJveC5zcGFjaW5nID0gdW5pdCgwLCAicHQiKSkrDQogIGxhYnMoeD0nJyx5PSdHcm91cCBwcm94aW1pdHkgKG11dHVhbCBkaXN0YW5jZSwgbWV0ZXJzKScpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyg4LDI0KSxicmVha3MgPSBzZXEoOCwyNCwyKSxsYWJlbHMgPSBwYXN0ZShzZXEoOCwyNCwyKSwnOjAwJyxzZXAgPSAiIikpKw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmLmdwcy5wbG90W2RmLmdwcy5wbG90JEV2ZW50c1NlbD09MSxdLCBhZXMobGFiZWwgPSBFdmVudHMseD14LHk9RG0sY29sb3I9RXZlbnRzKSxmb250ZmFjZSA9ICJib2xkIixtYXgub3ZlcmxhcHMgPSA4MCxmb3JjZSA9IDgsbnVkZ2VfeSA9IDkwMDAsYWxwaGE9MSxzaXplPTMpKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBkZi5ncHMucGxvdFtkZi5ncHMucGxvdCRFdmVudHNTZWw9PTEsXSwgYWVzKHhpbnRlcmNlcHQ9eCxjb2xvcj1FdmVudHMpLGFscGhhPTEsbGluZXR5cGU9J2Rhc2hlZCcpKw0KICBncmlkcygneHknKSsNCiAgZmFjZXRfd3JhcCh+ZGF0ZShyVGltZSksc2NhbGVzPSdmcmVlX3gnLG5jb2w9MSkrDQogIGd1aWRlcyhjb2xvcj0nbm9uZScsZmlsbD0nbm9uZScpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCxtYXgoZGYuZ3BzLnBsb3QkRG0pKSkNCg0KYGBgDQoNCmBgYHtyIHByb3h5IGRvc2UgMiBjb21wLGVjaG89RkFMU0V9DQpkZi5nYXJtaW4kclRpbWUgPC0gcm91bmRfZGF0ZShkZi5nYXJtaW4kVGltZXN0YW1wLCcxIG1pbnV0ZXMnKQ0KZGF0YXRtcCA8LSBkZi5nYXJtaW5bZGF0ZShkZi5nYXJtaW4kclRpbWUpPicyMDIzLTA4LTMwJyAmDQogICAgICAgICAgICAgICAgICAgICBkYXRlKGRmLmdhcm1pbiRyVGltZSk8JzIwMjMtMDktMDQnICYgDQogICAgICAgICAgICAgICAgICAgICBkZi5nYXJtaW4kSG91cj43ICYgDQogICAgICAgICAgICAgICAgICAgICAoZGYuZ2FybWluJElEPT0nR2VvcmdlJyB8DQogICAgICAgICAgICAgICAgICAgICBkZi5nYXJtaW4kSUQ9PSdFbWlsJyksXQ0KDQojIGZpbHRlciBOQSBHUFMNCmRhdGF0bXAkbGF0aXR1ZGVbZGF0YXRtcCRsYXRpdHVkZTwzMF0gPC0gTkENCmRhdGF0bXAkbG9uZ2l0dWRlW2RhdGF0bXAkbG9uZ2l0dWRlPigtMTApXSA8LSBOQQ0KDQoNCmRmLmdwcyA8LSBhZ2dyZWdhdGUoLn5yVGltZStJRCtFdmVudHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhdG1wW2MoJ3JUaW1lJywnSUQnLCdsYXRpdHVkZScsJ2xvbmdpdHVkZScsJ0V2ZW50cycpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGVU49ZnVuY3Rpb24oeCltZWRpYW4oeCxuYS5ybT1UKSkNCg0KZGYuZ3BzJERtIDwtIE5BDQpkZi5ncHMkVm0gPC0gTkENCmZvcihpIGluIDE6ZGltKGRmLmdwcylbMV0pew0KIA0KIHRtcCA8LSBkZi5ncHNbZGYuZ3BzJHJUaW1lPT1kZi5ncHMkclRpbWVbaV0sXSANCiBsb25naXR1ZGUgPC0gZGYuZ3BzJGxvbmdpdHVkZVtpXQ0KIGxhdGl0dWRlIDwtIGRmLmdwcyRsYXRpdHVkZVtpXQ0KIA0KIGQgPC0gTlVMTA0KIGZvcihpaSBpbiAxOmRpbSh0bXApWzFdKXsNCiAgbG9uZ2l0dWRlMiA8LSB0bXAkbG9uZ2l0dWRlW2lpXQ0KICBsYXRpdHVkZTIgPC0gdG1wJGxhdGl0dWRlW2lpXQ0KICBkIDwtIGMoZCxkaXN0bShjKGxvbmdpdHVkZSwgbGF0aXR1ZGUpLCBjKGxvbmdpdHVkZTIsIGxhdGl0dWRlMiksIGZ1biA9IGRpc3RHZW8pKQ0KIH0NCiANCiBkW2Q+MzAwMDBdIDwtIE5BDQogZFtkPT0wXSA8LSBOQQ0KIGRmLmdwcyREbVtpXSA8LSBtZWFuKGQsbmEucm09VCkNCg0KfQ0KDQpkZi5ncHMgPC0gZGYuZ3BzICU+JQ0KICBtdXRhdGUoeCA9IGhvdXIoclRpbWUpICsgbWludXRlKHJUaW1lKS82MCArIHNlY29uZChyVGltZSkvMzYwMCkNCg0KDQpkZi5ncHMkRXZlbnRzTiA8LSBhcy5mYWN0b3IoZGYuZ3BzJEV2ZW50cykNCmxldmVscyhkZi5ncHMkRXZlbnRzTikgPC0gMTpsZW5ndGgobGV2ZWxzKGRmLmdwcyRFdmVudHNOKSkNCmRmLmdwcyRFdmVudHNOIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmLmdwcyRFdmVudHNOKSkNCmRmLmdwcyRFdmVudHNTZWwgPC0gMA0KZGYuZ3BzJEV2ZW50c1NlbFt3aGljaChkaWZmKGMoMCxkZi5ncHMkRXZlbnRzTikpIT0wKSsxXSA8LSAxDQoNCg0KcDMgPC0gZ2dwbG90KCkrDQogIGdlb21fY29sKGRhdGE9ZGYuZ3BzLGFlcyh4PXgseT1EbSksZmlsbD0nZ3JleTYwJyxhbHBoYT0wLjgpKw0KICB0aGVtZV9saWdodCgpKw0KICB0aGVtZShheGlzLnRpdGxlLnkubGVmdCA9IGVsZW1lbnRfdGV4dCgpKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiLA0KICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj0ibGVmdCIsIA0KICAgICAgICBsZWdlbmQuYm94LnNwYWNpbmcgPSB1bml0KDAsICJwdCIpKSsNCiAgbGFicyh4PScnLHk9J1BhaXIgcHJveGltaXR5IChtdXR1YWwgZGlzdGFuY2UsIG1ldGVycyknKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoOCwyNCksYnJlYWtzID0gc2VxKDgsMjQsMiksbGFiZWxzID0gcGFzdGUoc2VxKDgsMjQsMiksJzowMCcsc2VwID0gIiIpKSsNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZi5ncHNbZGYuZ3BzJEV2ZW50c1NlbD09MSZkZi5ncHMkRXZlbnRzIT0nTm90IGtub3duJyxdLCBhZXMobGFiZWwgPSBFdmVudHMseD14LHk9RG0sY29sb3I9RXZlbnRzKSxmb250ZmFjZSA9ICJib2xkIixtYXgub3ZlcmxhcHMgPSA4MCxmb3JjZSA9IDgsbnVkZ2VfeSA9IDEwMDAwLGFscGhhPTEsc2l6ZT0zKSsNCiAgZ2VvbV92bGluZShkYXRhID0gZGYuZ3BzW2RmLmdwcyRFdmVudHNTZWw9PTEmZGYuZ3BzJEV2ZW50cyE9J05vdCBrbm93bicsXSwgYWVzKHhpbnRlcmNlcHQ9eCxjb2xvcj1FdmVudHMpLGFscGhhPTEsbGluZXR5cGU9J2Rhc2hlZCcpKw0KICBncmlkcygneHknKSsNCiAgZmFjZXRfd3JhcCh+ZGF0ZShyVGltZSksc2NhbGVzPSdmcmVlX3gnLG5jb2w9MSkrDQogIGd1aWRlcyhjb2xvcj0nbm9uZScsZmlsbD0nbm9uZScpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxNTAwMCkpDQoNCmBgYA0KDQpgYGB7ciBwbG90IGFsaWduLGVjaG89RkFMU0V9DQpwIDwtIGFsaWduX3BhdGNoZXMocDEscDIscDMpDQpgYGANCg0KIyMgRGF0YSB2aXN1YWxpemF0aW9ucw0KDQojIyMgTm9pc2UgYW5kIGhlYXJ0IHJhcnRlDQoNCkZpcnN0LCB3ZSBpbnNwZWN0IHRoZSBsb2dnZWQgbWVhbiBub2lzZSBmbG9vciBhbmQgaGVhcnQgcmF0ZS4gIA0KDQpgYGB7ciBwbG90IDEsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTEwLGRwaT0xMjAwfQ0KcGxvdChwW1sxXV0pDQpgYGANCg0KIyMjIEdyb3VwIHByb3hpbWl0eQ0KDQpOZXh0LCB3ZSBpbnNwZWN0IHRoZSBncm91cCBwcm94aW1pdHkuIFRoYXQgaXMsIHRoZSBhdmVyYWdlIG11dHVhbCBkaXN0YW5jZSAoaW4gbWV0ZXJzKSBiZXR3ZWVuIGFsbCBzdHVkZW50cy4gQXMgc2VlbiwgdGhlIGRpc3RhbmNlIGJldHdlZW4gc3R1ZGVudHMgcmlzZSBhbmQgaXMgaGlnaGVzdCBmb3IgIkZyZWUgdGltZSIsICJCdXMiLCAiQ29uZXkgSXNsYW5kIiwgYW5kICJXYWxrIiwgd2hpY2ggYXJlIGFsbCBldmVudHMgd2hlcmUgdGhlIHN0dWRlbnRzIGFyZSBzY2F0dGVyZWQuIEF0IHRoZSBzYW1lIHRpbWUsIHByb3hpbWl0eSBpcyBoaWdoZXN0IChsb3dlc3QgbXV0dWFsIGRpc3RhbmNlKSBmb3IgIkRpbm5lciIgYW5kIHZhcmlvdXMgcHJlc2VudGF0aW9ucyB3aGVyZSBhbGwgc3R1ZGVudHMgd2VyZSB0b2dldGhlci4gIA0KDQpgYGB7ciBwbG90IDIsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTEwLGRwaT0xMjAwfQ0KcGxvdChwW1syXV0pDQpgYGANCg0KIyMjIFBhaXIgcHJveGltaXR5DQoNCkZpbmFsbHksIHdlIGZvY3VzIG9uIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGEgc2VsZWN0ZWQgcGFpciBvZiB0aGUgc3R1ZGVudHMuIEFnYWluLCB0aGUgZGlzdGFuY2UgbWVhc3VyZSBzZWVtcyB0byBiZSBhIGdvb2QgcHJveHkgZm9yIHByb3hpbWl0eSBhY3Jvc3MgdGhlIGRheXMuIA0KDQpgYGB7ciBwbG90IDMsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTEwLGRwaT0xMjAwfQ0KcGxvdChwW1szXV0pDQpgYGANCg==