#include <iostream>
#include <ctime>
using namespace std;
enum class ECursor : unsigned {
Auto,
Cross,
Default,
Pointer,
Move,
VerticalText,
Cell,
ContextMenu,
Alias,
Progress,
NoDrop,
NotAllowed,
ZoomIn,
ZoomOut,
EResize,
NeResize,
NwResize,
NResize,
SeResize,
SwResize,
SResize,
WResize,
EwResize,
NsResize,
NeswResize,
NwseResize,
ColResize,
RowResize,
Text,
Wait,
Help,
AllScroll,
WebkitGrab,
WebkitGrabbing,
Copy,
None
};
enum CSSValueID {
CSSValueInvalid = 0,
CSSValueInherit = 1,
CSSValueInitial = 2,
CSSValueNone = 3,
CSSValueCopy = 148,
CSSValueSourceOver = 149,
CSSValueSourceIn = 150,
CSSValueSourceOut = 151,
CSSValueSourceAtop = 152,
CSSValueDestinationOver = 153,
CSSValueDestinationIn = 154,
CSSValueDestinationOut = 155,
CSSValueDestinationAtop = 156,
CSSValueXor = 157,
CSSValuePlusLighter = 158,
CSSValueBaseline = 159,
CSSValueMiddle = 160,
CSSValueSub = 161,
CSSValueSuper = 162,
CSSValueTextTop = 163,
CSSValueTextBottom = 164,
CSSValueTop = 165,
CSSValueBottom = 166,
CSSValueWebkitBaselineMiddle = 167,
CSSValueWebkitAuto = 168,
CSSValueLeft = 169,
CSSValueRight = 170,
CSSValueCenter = 171,
CSSValueJustify = 172,
CSSValueWebkitLeft = 173,
CSSValueWebkitRight = 174,
CSSValueWebkitCenter = 175,
CSSValueWebkitMatchParent = 176,
CSSValueInternalCenter = 177,
CSSValueInterWord = 178,
CSSValueDistribute = 179,
CSSValueOutside = 180,
CSSValueInside = 181,
CSSValueDisc = 182,
CSSValueCircle = 183,
CSSValueSquare = 184,
CSSValueDecimal = 185,
CSSValueDecimalLeadingZero = 186,
CSSValueArabicIndic = 187,
CSSValueBengali = 188,
CSSValueCambodian = 189,
CSSValueKhmer = 190,
CSSValueDevanagari = 191,
CSSValueGujarati = 192,
CSSValueGurmukhi = 193,
CSSValueKannada = 194,
CSSValueLao = 195,
CSSValueMalayalam = 196,
CSSValueMongolian = 197,
CSSValueMyanmar = 198,
CSSValueOriya = 199,
CSSValuePersian = 200,
CSSValueUrdu = 201,
CSSValueTelugu = 202,
CSSValueTibetan = 203,
CSSValueThai = 204,
CSSValueLowerRoman = 205,
CSSValueUpperRoman = 206,
CSSValueLowerGreek = 207,
CSSValueLowerAlpha = 208,
CSSValueLowerLatin = 209,
CSSValueUpperAlpha = 210,
CSSValueUpperLatin = 211,
CSSValueCjkEarthlyBranch = 212,
CSSValueCjkHeavenlyStem = 213,
CSSValueEthiopicHalehame = 214,
CSSValueEthiopicHalehameAm = 215,
CSSValueEthiopicHalehameTiEr = 216,
CSSValueEthiopicHalehameTiEt = 217,
CSSValueHangul = 218,
CSSValueHangulConsonant = 219,
CSSValueKoreanHangulFormal = 220,
CSSValueKoreanHanjaFormal = 221,
CSSValueKoreanHanjaInformal = 222,
CSSValueHebrew = 223,
CSSValueArmenian = 224,
CSSValueLowerArmenian = 225,
CSSValueUpperArmenian = 226,
CSSValueGeorgian = 227,
CSSValueCjkIdeographic = 228,
CSSValueSimpChineseFormal = 229,
CSSValueSimpChineseInformal = 230,
CSSValueTradChineseFormal = 231,
CSSValueTradChineseInformal = 232,
CSSValueHiragana = 233,
CSSValueKatakana = 234,
CSSValueHiraganaIroha = 235,
CSSValueKatakanaIroha = 236,
CSSValueInline = 237,
CSSValueBlock = 238,
CSSValueListItem = 239,
CSSValueInlineBlock = 240,
CSSValueTable = 241,
CSSValueInlineTable = 242,
CSSValueTableRowGroup = 243,
CSSValueTableHeaderGroup = 244,
CSSValueTableFooterGroup = 245,
CSSValueTableRow = 246,
CSSValueTableColumnGroup = 247,
CSSValueTableColumn = 248,
CSSValueTableCell = 249,
CSSValueTableCaption = 250,
CSSValueWebkitBox = 251,
CSSValueWebkitInlineBox = 252,
CSSValueFlex = 253,
CSSValueInlineFlex = 254,
CSSValueGrid = 255,
CSSValueInlineGrid = 256,
CSSValueContents = 257,
CSSValueWebkitFlex = 258,
CSSValueWebkitInlineFlex = 259,
CSSValueAuto = 260,
CSSValueCrosshair = 261,
CSSValueDefault = 262,
CSSValuePointer = 263,
CSSValueMove = 264,
CSSValueVerticalText = 265,
CSSValueCell = 266,
CSSValueContextMenu = 267,
CSSValueAlias = 268,
CSSValueProgress = 269,
CSSValueNoDrop = 270,
CSSValueNotAllowed = 271,
CSSValueZoomIn = 272,
CSSValueZoomOut = 273,
CSSValueEResize = 274,
CSSValueNeResize = 275,
CSSValueNwResize = 276,
CSSValueNResize = 277,
CSSValueSeResize = 278,
CSSValueSwResize = 279,
CSSValueSResize = 280,
CSSValueWResize = 281,
CSSValueEwResize = 282,
CSSValueNsResize = 283,
CSSValueNeswResize = 284,
CSSValueNwseResize = 285,
CSSValueColResize = 286,
CSSValueRowResize = 287,
CSSValueText = 288,
CSSValueWait = 289,
CSSValueHelp = 290,
CSSValueAllScroll = 291,
CSSValueWebkitGrab = 292,
CSSValueWebkitGrabbing = 293,
CSSValueWebkitZoomIn = 294,
CSSValueWebkitZoomOut = 295,
};
inline ECursor convertToSwitch(CSSValueID m_valueID) {
switch (m_valueID) {
case CSSValueAuto:
return ECursor::Auto;
case CSSValueCrosshair:
return ECursor::Cross;
case CSSValueDefault:
return ECursor::Default;
case CSSValuePointer:
return ECursor::Pointer;
case CSSValueMove:
return ECursor::Move;
case CSSValueCell:
return ECursor::Cell;
case CSSValueVerticalText:
return ECursor::VerticalText;
case CSSValueContextMenu:
return ECursor::ContextMenu;
case CSSValueAlias:
return ECursor::Alias;
case CSSValueCopy:
return ECursor::Copy;
case CSSValueNone:
return ECursor::None;
case CSSValueProgress:
return ECursor::Progress;
case CSSValueNoDrop:
return ECursor::NoDrop;
case CSSValueNotAllowed:
return ECursor::NotAllowed;
case CSSValueZoomIn:
case CSSValueWebkitZoomIn:
return ECursor::ZoomIn;
case CSSValueZoomOut:
case CSSValueWebkitZoomOut:
return ECursor::ZoomOut;
case CSSValueEResize:
return ECursor::EResize;
case CSSValueNeResize:
return ECursor::NeResize;
case CSSValueNwResize:
return ECursor::NwResize;
case CSSValueNResize:
return ECursor::NResize;
case CSSValueSeResize:
return ECursor::SeResize;
case CSSValueSwResize:
return ECursor::SwResize;
case CSSValueSResize:
return ECursor::SResize;
case CSSValueWResize:
return ECursor::WResize;
case CSSValueEwResize:
return ECursor::EwResize;
case CSSValueNsResize:
return ECursor::NsResize;
case CSSValueNeswResize:
return ECursor::NeswResize;
case CSSValueNwseResize:
return ECursor::NwseResize;
case CSSValueColResize:
return ECursor::ColResize;
case CSSValueRowResize:
return ECursor::RowResize;
case CSSValueText:
return ECursor::Text;
case CSSValueWait:
return ECursor::Wait;
case CSSValueHelp:
return ECursor::Help;
case CSSValueAllScroll:
return ECursor::AllScroll;
case CSSValueWebkitGrab:
return ECursor::WebkitGrab;
case CSSValueWebkitGrabbing:
return ECursor::WebkitGrabbing;
default:
//NOTREACHED();
return ECursor::Auto;
}
}
inline ECursor convertToCast(CSSValueID m_valueID) {
switch (m_valueID) {
case CSSValueCopy:
return ECursor::Copy;
case CSSValueWebkitZoomIn:
return ECursor::ZoomIn;
case CSSValueWebkitZoomOut:
return ECursor::ZoomOut;
case CSSValueNone:
return ECursor::None;
default:
return static_cast<ECursor>(m_valueID - CSSValueAuto);
}
}
static ECursor result;
int main() {
clock_t start, end;
int i;
const int N_ITERATIONS = 100000000;
start = clock();
for (i = 0; i < N_ITERATIONS; i++) {
result = convertToSwitch(CSSValueAuto);
result = convertToSwitch(CSSValueCrosshair);
result = convertToSwitch(CSSValueDefault);
result = convertToSwitch(CSSValuePointer);
result = convertToSwitch(CSSValueMove);
result = convertToSwitch(CSSValueCell);
result = convertToSwitch(CSSValueVerticalText);
result = convertToSwitch(CSSValueContextMenu);
result = convertToSwitch(CSSValueAlias);
result = convertToSwitch(CSSValueCopy);
result = convertToSwitch(CSSValueNone);
result = convertToSwitch(CSSValueProgress);
result = convertToSwitch(CSSValueNoDrop);
result = convertToSwitch(CSSValueNotAllowed);
result = convertToSwitch(CSSValueZoomIn);
result = convertToSwitch(CSSValueWebkitZoomIn);
result = convertToSwitch(CSSValueZoomOut);
result = convertToSwitch(CSSValueWebkitZoomOut);
result = convertToSwitch(CSSValueEResize);
result = convertToSwitch(CSSValueNeResize);
result = convertToSwitch(CSSValueNwResize);
result = convertToSwitch(CSSValueNResize);
result = convertToSwitch(CSSValueSeResize);
result = convertToSwitch(CSSValueSwResize);
result = convertToSwitch(CSSValueSResize);
result = convertToSwitch(CSSValueWResize);
result = convertToSwitch(CSSValueEwResize);
result = convertToSwitch(CSSValueNsResize);
result = convertToSwitch(CSSValueNeswResize);
result = convertToSwitch(CSSValueNwseResize);
result = convertToSwitch(CSSValueColResize);
result = convertToSwitch(CSSValueRowResize);
result = convertToSwitch(CSSValueText);
result = convertToSwitch(CSSValueWait);
result = convertToSwitch(CSSValueHelp);
result = convertToSwitch(CSSValueAllScroll);
result = convertToSwitch(CSSValueWebkitGrab);
result = convertToSwitch(CSSValueWebkitGrabbing);
}
end = clock();
cout << "Time (switch): " << (end - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << endl;
start = clock();
for (i = 0; i < N_ITERATIONS; i++) {
result = convertToCast(CSSValueAuto);
result = convertToCast(CSSValueCrosshair);
result = convertToCast(CSSValueDefault);
result = convertToCast(CSSValuePointer);
result = convertToCast(CSSValueMove);
result = convertToCast(CSSValueCell);
result = convertToCast(CSSValueVerticalText);
result = convertToCast(CSSValueContextMenu);
result = convertToCast(CSSValueAlias);
result = convertToCast(CSSValueCopy);
result = convertToCast(CSSValueNone);
result = convertToCast(CSSValueProgress);
result = convertToCast(CSSValueNoDrop);
result = convertToCast(CSSValueNotAllowed);
result = convertToCast(CSSValueZoomIn);
result = convertToCast(CSSValueWebkitZoomIn);
result = convertToCast(CSSValueZoomOut);
result = convertToCast(CSSValueWebkitZoomOut);
result = convertToCast(CSSValueEResize);
result = convertToCast(CSSValueNeResize);
result = convertToCast(CSSValueNwResize);
result = convertToCast(CSSValueNResize);
result = convertToCast(CSSValueSeResize);
result = convertToCast(CSSValueSwResize);
result = convertToCast(CSSValueSResize);
result = convertToCast(CSSValueWResize);
result = convertToCast(CSSValueEwResize);
result = convertToCast(CSSValueNsResize);
result = convertToCast(CSSValueNeswResize);
result = convertToCast(CSSValueNwseResize);
result = convertToCast(CSSValueColResize);
result = convertToCast(CSSValueRowResize);
result = convertToCast(CSSValueText);
result = convertToCast(CSSValueWait);
result = convertToCast(CSSValueHelp);
result = convertToCast(CSSValueAllScroll);
result = convertToCast(CSSValueWebkitGrab);
result = convertToCast(CSSValueWebkitGrabbing);
}
end = clock();
cout << "Time (cast): " << (end - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << endl;
cout << static_cast<unsigned>(result) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgplbnVtIGNsYXNzIEVDdXJzb3IgOiB1bnNpZ25lZCB7CiAgQXV0bywKICBDcm9zcywKICBEZWZhdWx0LAogIFBvaW50ZXIsCiAgTW92ZSwKICBWZXJ0aWNhbFRleHQsCiAgQ2VsbCwKICBDb250ZXh0TWVudSwKICBBbGlhcywKICBQcm9ncmVzcywKICBOb0Ryb3AsCiAgTm90QWxsb3dlZCwKICBab29tSW4sCiAgWm9vbU91dCwKICBFUmVzaXplLAogIE5lUmVzaXplLAogIE53UmVzaXplLAogIE5SZXNpemUsCiAgU2VSZXNpemUsCiAgU3dSZXNpemUsCiAgU1Jlc2l6ZSwKICBXUmVzaXplLAogIEV3UmVzaXplLAogIE5zUmVzaXplLAogIE5lc3dSZXNpemUsCiAgTndzZVJlc2l6ZSwKICBDb2xSZXNpemUsCiAgUm93UmVzaXplLAogIFRleHQsCiAgV2FpdCwKICBIZWxwLAogIEFsbFNjcm9sbCwKICBXZWJraXRHcmFiLAogIFdlYmtpdEdyYWJiaW5nLAogIENvcHksCiAgTm9uZQp9OwoKZW51bSBDU1NWYWx1ZUlEIHsKICAgIENTU1ZhbHVlSW52YWxpZCA9IDAsCiAgICBDU1NWYWx1ZUluaGVyaXQgPSAxLAogICAgQ1NTVmFsdWVJbml0aWFsID0gMiwKICAgIENTU1ZhbHVlTm9uZSA9IDMsCiAgICBDU1NWYWx1ZUNvcHkgPSAxNDgsCiAgICBDU1NWYWx1ZVNvdXJjZU92ZXIgPSAxNDksCiAgICBDU1NWYWx1ZVNvdXJjZUluID0gMTUwLAogICAgQ1NTVmFsdWVTb3VyY2VPdXQgPSAxNTEsCiAgICBDU1NWYWx1ZVNvdXJjZUF0b3AgPSAxNTIsCiAgICBDU1NWYWx1ZURlc3RpbmF0aW9uT3ZlciA9IDE1MywKICAgIENTU1ZhbHVlRGVzdGluYXRpb25JbiA9IDE1NCwKICAgIENTU1ZhbHVlRGVzdGluYXRpb25PdXQgPSAxNTUsCiAgICBDU1NWYWx1ZURlc3RpbmF0aW9uQXRvcCA9IDE1NiwKICAgIENTU1ZhbHVlWG9yID0gMTU3LAogICAgQ1NTVmFsdWVQbHVzTGlnaHRlciA9IDE1OCwKICAgIENTU1ZhbHVlQmFzZWxpbmUgPSAxNTksCiAgICBDU1NWYWx1ZU1pZGRsZSA9IDE2MCwKICAgIENTU1ZhbHVlU3ViID0gMTYxLAogICAgQ1NTVmFsdWVTdXBlciA9IDE2MiwKICAgIENTU1ZhbHVlVGV4dFRvcCA9IDE2MywKICAgIENTU1ZhbHVlVGV4dEJvdHRvbSA9IDE2NCwKICAgIENTU1ZhbHVlVG9wID0gMTY1LAogICAgQ1NTVmFsdWVCb3R0b20gPSAxNjYsCiAgICBDU1NWYWx1ZVdlYmtpdEJhc2VsaW5lTWlkZGxlID0gMTY3LAogICAgQ1NTVmFsdWVXZWJraXRBdXRvID0gMTY4LAogICAgQ1NTVmFsdWVMZWZ0ID0gMTY5LAogICAgQ1NTVmFsdWVSaWdodCA9IDE3MCwKICAgIENTU1ZhbHVlQ2VudGVyID0gMTcxLAogICAgQ1NTVmFsdWVKdXN0aWZ5ID0gMTcyLAogICAgQ1NTVmFsdWVXZWJraXRMZWZ0ID0gMTczLAogICAgQ1NTVmFsdWVXZWJraXRSaWdodCA9IDE3NCwKICAgIENTU1ZhbHVlV2Via2l0Q2VudGVyID0gMTc1LAogICAgQ1NTVmFsdWVXZWJraXRNYXRjaFBhcmVudCA9IDE3NiwKICAgIENTU1ZhbHVlSW50ZXJuYWxDZW50ZXIgPSAxNzcsCiAgICBDU1NWYWx1ZUludGVyV29yZCA9IDE3OCwKICAgIENTU1ZhbHVlRGlzdHJpYnV0ZSA9IDE3OSwKICAgIENTU1ZhbHVlT3V0c2lkZSA9IDE4MCwKICAgIENTU1ZhbHVlSW5zaWRlID0gMTgxLAogICAgQ1NTVmFsdWVEaXNjID0gMTgyLAogICAgQ1NTVmFsdWVDaXJjbGUgPSAxODMsCiAgICBDU1NWYWx1ZVNxdWFyZSA9IDE4NCwKICAgIENTU1ZhbHVlRGVjaW1hbCA9IDE4NSwKICAgIENTU1ZhbHVlRGVjaW1hbExlYWRpbmdaZXJvID0gMTg2LAogICAgQ1NTVmFsdWVBcmFiaWNJbmRpYyA9IDE4NywKICAgIENTU1ZhbHVlQmVuZ2FsaSA9IDE4OCwKICAgIENTU1ZhbHVlQ2FtYm9kaWFuID0gMTg5LAogICAgQ1NTVmFsdWVLaG1lciA9IDE5MCwKICAgIENTU1ZhbHVlRGV2YW5hZ2FyaSA9IDE5MSwKICAgIENTU1ZhbHVlR3VqYXJhdGkgPSAxOTIsCiAgICBDU1NWYWx1ZUd1cm11a2hpID0gMTkzLAogICAgQ1NTVmFsdWVLYW5uYWRhID0gMTk0LAogICAgQ1NTVmFsdWVMYW8gPSAxOTUsCiAgICBDU1NWYWx1ZU1hbGF5YWxhbSA9IDE5NiwKICAgIENTU1ZhbHVlTW9uZ29saWFuID0gMTk3LAogICAgQ1NTVmFsdWVNeWFubWFyID0gMTk4LAogICAgQ1NTVmFsdWVPcml5YSA9IDE5OSwKICAgIENTU1ZhbHVlUGVyc2lhbiA9IDIwMCwKICAgIENTU1ZhbHVlVXJkdSA9IDIwMSwKICAgIENTU1ZhbHVlVGVsdWd1ID0gMjAyLAogICAgQ1NTVmFsdWVUaWJldGFuID0gMjAzLAogICAgQ1NTVmFsdWVUaGFpID0gMjA0LAogICAgQ1NTVmFsdWVMb3dlclJvbWFuID0gMjA1LAogICAgQ1NTVmFsdWVVcHBlclJvbWFuID0gMjA2LAogICAgQ1NTVmFsdWVMb3dlckdyZWVrID0gMjA3LAogICAgQ1NTVmFsdWVMb3dlckFscGhhID0gMjA4LAogICAgQ1NTVmFsdWVMb3dlckxhdGluID0gMjA5LAogICAgQ1NTVmFsdWVVcHBlckFscGhhID0gMjEwLAogICAgQ1NTVmFsdWVVcHBlckxhdGluID0gMjExLAogICAgQ1NTVmFsdWVDamtFYXJ0aGx5QnJhbmNoID0gMjEyLAogICAgQ1NTVmFsdWVDamtIZWF2ZW5seVN0ZW0gPSAyMTMsCiAgICBDU1NWYWx1ZUV0aGlvcGljSGFsZWhhbWUgPSAyMTQsCiAgICBDU1NWYWx1ZUV0aGlvcGljSGFsZWhhbWVBbSA9IDIxNSwKICAgIENTU1ZhbHVlRXRoaW9waWNIYWxlaGFtZVRpRXIgPSAyMTYsCiAgICBDU1NWYWx1ZUV0aGlvcGljSGFsZWhhbWVUaUV0ID0gMjE3LAogICAgQ1NTVmFsdWVIYW5ndWwgPSAyMTgsCiAgICBDU1NWYWx1ZUhhbmd1bENvbnNvbmFudCA9IDIxOSwKICAgIENTU1ZhbHVlS29yZWFuSGFuZ3VsRm9ybWFsID0gMjIwLAogICAgQ1NTVmFsdWVLb3JlYW5IYW5qYUZvcm1hbCA9IDIyMSwKICAgIENTU1ZhbHVlS29yZWFuSGFuamFJbmZvcm1hbCA9IDIyMiwKICAgIENTU1ZhbHVlSGVicmV3ID0gMjIzLAogICAgQ1NTVmFsdWVBcm1lbmlhbiA9IDIyNCwKICAgIENTU1ZhbHVlTG93ZXJBcm1lbmlhbiA9IDIyNSwKICAgIENTU1ZhbHVlVXBwZXJBcm1lbmlhbiA9IDIyNiwKICAgIENTU1ZhbHVlR2VvcmdpYW4gPSAyMjcsCiAgICBDU1NWYWx1ZUNqa0lkZW9ncmFwaGljID0gMjI4LAogICAgQ1NTVmFsdWVTaW1wQ2hpbmVzZUZvcm1hbCA9IDIyOSwKICAgIENTU1ZhbHVlU2ltcENoaW5lc2VJbmZvcm1hbCA9IDIzMCwKICAgIENTU1ZhbHVlVHJhZENoaW5lc2VGb3JtYWwgPSAyMzEsCiAgICBDU1NWYWx1ZVRyYWRDaGluZXNlSW5mb3JtYWwgPSAyMzIsCiAgICBDU1NWYWx1ZUhpcmFnYW5hID0gMjMzLAogICAgQ1NTVmFsdWVLYXRha2FuYSA9IDIzNCwKICAgIENTU1ZhbHVlSGlyYWdhbmFJcm9oYSA9IDIzNSwKICAgIENTU1ZhbHVlS2F0YWthbmFJcm9oYSA9IDIzNiwKICAgIENTU1ZhbHVlSW5saW5lID0gMjM3LAogICAgQ1NTVmFsdWVCbG9jayA9IDIzOCwKICAgIENTU1ZhbHVlTGlzdEl0ZW0gPSAyMzksCiAgICBDU1NWYWx1ZUlubGluZUJsb2NrID0gMjQwLAogICAgQ1NTVmFsdWVUYWJsZSA9IDI0MSwKICAgIENTU1ZhbHVlSW5saW5lVGFibGUgPSAyNDIsCiAgICBDU1NWYWx1ZVRhYmxlUm93R3JvdXAgPSAyNDMsCiAgICBDU1NWYWx1ZVRhYmxlSGVhZGVyR3JvdXAgPSAyNDQsCiAgICBDU1NWYWx1ZVRhYmxlRm9vdGVyR3JvdXAgPSAyNDUsCiAgICBDU1NWYWx1ZVRhYmxlUm93ID0gMjQ2LAogICAgQ1NTVmFsdWVUYWJsZUNvbHVtbkdyb3VwID0gMjQ3LAogICAgQ1NTVmFsdWVUYWJsZUNvbHVtbiA9IDI0OCwKICAgIENTU1ZhbHVlVGFibGVDZWxsID0gMjQ5LAogICAgQ1NTVmFsdWVUYWJsZUNhcHRpb24gPSAyNTAsCiAgICBDU1NWYWx1ZVdlYmtpdEJveCA9IDI1MSwKICAgIENTU1ZhbHVlV2Via2l0SW5saW5lQm94ID0gMjUyLAogICAgQ1NTVmFsdWVGbGV4ID0gMjUzLAogICAgQ1NTVmFsdWVJbmxpbmVGbGV4ID0gMjU0LAogICAgQ1NTVmFsdWVHcmlkID0gMjU1LAogICAgQ1NTVmFsdWVJbmxpbmVHcmlkID0gMjU2LAogICAgQ1NTVmFsdWVDb250ZW50cyA9IDI1NywKICAgIENTU1ZhbHVlV2Via2l0RmxleCA9IDI1OCwKICAgIENTU1ZhbHVlV2Via2l0SW5saW5lRmxleCA9IDI1OSwKICAgIENTU1ZhbHVlQXV0byA9IDI2MCwKICAgIENTU1ZhbHVlQ3Jvc3NoYWlyID0gMjYxLAogICAgQ1NTVmFsdWVEZWZhdWx0ID0gMjYyLAogICAgQ1NTVmFsdWVQb2ludGVyID0gMjYzLAogICAgQ1NTVmFsdWVNb3ZlID0gMjY0LAogICAgQ1NTVmFsdWVWZXJ0aWNhbFRleHQgPSAyNjUsCiAgICBDU1NWYWx1ZUNlbGwgPSAyNjYsCiAgICBDU1NWYWx1ZUNvbnRleHRNZW51ID0gMjY3LAogICAgQ1NTVmFsdWVBbGlhcyA9IDI2OCwKICAgIENTU1ZhbHVlUHJvZ3Jlc3MgPSAyNjksCiAgICBDU1NWYWx1ZU5vRHJvcCA9IDI3MCwKICAgIENTU1ZhbHVlTm90QWxsb3dlZCA9IDI3MSwKICAgIENTU1ZhbHVlWm9vbUluID0gMjcyLAogICAgQ1NTVmFsdWVab29tT3V0ID0gMjczLAogICAgQ1NTVmFsdWVFUmVzaXplID0gMjc0LAogICAgQ1NTVmFsdWVOZVJlc2l6ZSA9IDI3NSwKICAgIENTU1ZhbHVlTndSZXNpemUgPSAyNzYsCiAgICBDU1NWYWx1ZU5SZXNpemUgPSAyNzcsCiAgICBDU1NWYWx1ZVNlUmVzaXplID0gMjc4LAogICAgQ1NTVmFsdWVTd1Jlc2l6ZSA9IDI3OSwKICAgIENTU1ZhbHVlU1Jlc2l6ZSA9IDI4MCwKICAgIENTU1ZhbHVlV1Jlc2l6ZSA9IDI4MSwKICAgIENTU1ZhbHVlRXdSZXNpemUgPSAyODIsCiAgICBDU1NWYWx1ZU5zUmVzaXplID0gMjgzLAogICAgQ1NTVmFsdWVOZXN3UmVzaXplID0gMjg0LAogICAgQ1NTVmFsdWVOd3NlUmVzaXplID0gMjg1LAogICAgQ1NTVmFsdWVDb2xSZXNpemUgPSAyODYsCiAgICBDU1NWYWx1ZVJvd1Jlc2l6ZSA9IDI4NywKICAgIENTU1ZhbHVlVGV4dCA9IDI4OCwKICAgIENTU1ZhbHVlV2FpdCA9IDI4OSwKICAgIENTU1ZhbHVlSGVscCA9IDI5MCwKICAgIENTU1ZhbHVlQWxsU2Nyb2xsID0gMjkxLAogICAgQ1NTVmFsdWVXZWJraXRHcmFiID0gMjkyLAogICAgQ1NTVmFsdWVXZWJraXRHcmFiYmluZyA9IDI5MywKICAgIENTU1ZhbHVlV2Via2l0Wm9vbUluID0gMjk0LAogICAgQ1NTVmFsdWVXZWJraXRab29tT3V0ID0gMjk1LAp9OwoKaW5saW5lIEVDdXJzb3IgY29udmVydFRvU3dpdGNoKENTU1ZhbHVlSUQgbV92YWx1ZUlEKSB7CiAgc3dpdGNoIChtX3ZhbHVlSUQpIHsKICAgIGNhc2UgQ1NTVmFsdWVBdXRvOgogICAgICByZXR1cm4gRUN1cnNvcjo6QXV0bzsKICAgIGNhc2UgQ1NTVmFsdWVDcm9zc2hhaXI6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpDcm9zczsKICAgIGNhc2UgQ1NTVmFsdWVEZWZhdWx0OgogICAgICByZXR1cm4gRUN1cnNvcjo6RGVmYXVsdDsKICAgIGNhc2UgQ1NTVmFsdWVQb2ludGVyOgogICAgICByZXR1cm4gRUN1cnNvcjo6UG9pbnRlcjsKICAgIGNhc2UgQ1NTVmFsdWVNb3ZlOgogICAgICByZXR1cm4gRUN1cnNvcjo6TW92ZTsKICAgIGNhc2UgQ1NTVmFsdWVDZWxsOgogICAgICByZXR1cm4gRUN1cnNvcjo6Q2VsbDsKICAgIGNhc2UgQ1NTVmFsdWVWZXJ0aWNhbFRleHQ6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpWZXJ0aWNhbFRleHQ7CiAgICBjYXNlIENTU1ZhbHVlQ29udGV4dE1lbnU6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpDb250ZXh0TWVudTsKICAgIGNhc2UgQ1NTVmFsdWVBbGlhczoKICAgICAgcmV0dXJuIEVDdXJzb3I6OkFsaWFzOwogICAgY2FzZSBDU1NWYWx1ZUNvcHk6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpDb3B5OwogICAgY2FzZSBDU1NWYWx1ZU5vbmU6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpOb25lOwogICAgY2FzZSBDU1NWYWx1ZVByb2dyZXNzOgogICAgICByZXR1cm4gRUN1cnNvcjo6UHJvZ3Jlc3M7CiAgICBjYXNlIENTU1ZhbHVlTm9Ecm9wOgogICAgICByZXR1cm4gRUN1cnNvcjo6Tm9Ecm9wOwogICAgY2FzZSBDU1NWYWx1ZU5vdEFsbG93ZWQ6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpOb3RBbGxvd2VkOwogICAgY2FzZSBDU1NWYWx1ZVpvb21JbjoKICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRab29tSW46CiAgICAgIHJldHVybiBFQ3Vyc29yOjpab29tSW47CiAgICBjYXNlIENTU1ZhbHVlWm9vbU91dDoKICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRab29tT3V0OgogICAgICByZXR1cm4gRUN1cnNvcjo6Wm9vbU91dDsKICAgIGNhc2UgQ1NTVmFsdWVFUmVzaXplOgogICAgICByZXR1cm4gRUN1cnNvcjo6RVJlc2l6ZTsKICAgIGNhc2UgQ1NTVmFsdWVOZVJlc2l6ZToKICAgICAgcmV0dXJuIEVDdXJzb3I6Ok5lUmVzaXplOwogICAgY2FzZSBDU1NWYWx1ZU53UmVzaXplOgogICAgICByZXR1cm4gRUN1cnNvcjo6TndSZXNpemU7CiAgICBjYXNlIENTU1ZhbHVlTlJlc2l6ZToKICAgICAgcmV0dXJuIEVDdXJzb3I6Ok5SZXNpemU7CiAgICBjYXNlIENTU1ZhbHVlU2VSZXNpemU6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpTZVJlc2l6ZTsKICAgIGNhc2UgQ1NTVmFsdWVTd1Jlc2l6ZToKICAgICAgcmV0dXJuIEVDdXJzb3I6OlN3UmVzaXplOwogICAgY2FzZSBDU1NWYWx1ZVNSZXNpemU6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpTUmVzaXplOwogICAgY2FzZSBDU1NWYWx1ZVdSZXNpemU6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpXUmVzaXplOwogICAgY2FzZSBDU1NWYWx1ZUV3UmVzaXplOgogICAgICByZXR1cm4gRUN1cnNvcjo6RXdSZXNpemU7CiAgICBjYXNlIENTU1ZhbHVlTnNSZXNpemU6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpOc1Jlc2l6ZTsKICAgIGNhc2UgQ1NTVmFsdWVOZXN3UmVzaXplOgogICAgICByZXR1cm4gRUN1cnNvcjo6TmVzd1Jlc2l6ZTsKICAgIGNhc2UgQ1NTVmFsdWVOd3NlUmVzaXplOgogICAgICByZXR1cm4gRUN1cnNvcjo6TndzZVJlc2l6ZTsKICAgIGNhc2UgQ1NTVmFsdWVDb2xSZXNpemU6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpDb2xSZXNpemU7CiAgICBjYXNlIENTU1ZhbHVlUm93UmVzaXplOgogICAgICByZXR1cm4gRUN1cnNvcjo6Um93UmVzaXplOwogICAgY2FzZSBDU1NWYWx1ZVRleHQ6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpUZXh0OwogICAgY2FzZSBDU1NWYWx1ZVdhaXQ6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpXYWl0OwogICAgY2FzZSBDU1NWYWx1ZUhlbHA6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpIZWxwOwogICAgY2FzZSBDU1NWYWx1ZUFsbFNjcm9sbDoKICAgICAgcmV0dXJuIEVDdXJzb3I6OkFsbFNjcm9sbDsKICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRHcmFiOgogICAgICByZXR1cm4gRUN1cnNvcjo6V2Via2l0R3JhYjsKICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRHcmFiYmluZzoKICAgICAgcmV0dXJuIEVDdXJzb3I6OldlYmtpdEdyYWJiaW5nOwogICAgZGVmYXVsdDoKICAgICAgLy9OT1RSRUFDSEVEKCk7CiAgICAgIHJldHVybiBFQ3Vyc29yOjpBdXRvOwogIH0KfQoKCmlubGluZSBFQ3Vyc29yIGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVJRCBtX3ZhbHVlSUQpIHsKICBzd2l0Y2ggKG1fdmFsdWVJRCkgewogICAgY2FzZSBDU1NWYWx1ZUNvcHk6CiAgICAgIHJldHVybiBFQ3Vyc29yOjpDb3B5OwogICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFpvb21JbjoKICAgICAgcmV0dXJuIEVDdXJzb3I6Olpvb21JbjsKICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRab29tT3V0OgogICAgICByZXR1cm4gRUN1cnNvcjo6Wm9vbU91dDsKICAgIGNhc2UgQ1NTVmFsdWVOb25lOgogICAgICByZXR1cm4gRUN1cnNvcjo6Tm9uZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFQ3Vyc29yPihtX3ZhbHVlSUQgLSBDU1NWYWx1ZUF1dG8pOwogIH0KfQoKc3RhdGljIEVDdXJzb3IgcmVzdWx0OwoKCmludCBtYWluKCkgewogICAgY2xvY2tfdCBzdGFydCwgZW5kOwogICAgaW50IGk7CiAgICBjb25zdCBpbnQgTl9JVEVSQVRJT05TID0gMTAwMDAwMDAwOwoKICAgIHN0YXJ0ID0gY2xvY2soKTsKICAgIGZvciAoaSA9IDA7IGkgPCBOX0lURVJBVElPTlM7IGkrKykgewogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZUF1dG8pOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZUNyb3NzaGFpcik7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlRGVmYXVsdCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlUG9pbnRlcik7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlTW92ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlQ2VsbCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlVmVydGljYWxUZXh0KTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVDb250ZXh0TWVudSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlQWxpYXMpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZUNvcHkpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZU5vbmUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZVByb2dyZXNzKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVOb0Ryb3ApOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZU5vdEFsbG93ZWQpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZVpvb21Jbik7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlV2Via2l0Wm9vbUluKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVab29tT3V0KTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVXZWJraXRab29tT3V0KTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVFUmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVOZVJlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlTndSZXNpemUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZU5SZXNpemUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZVNlUmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVTd1Jlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlU1Jlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlV1Jlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlRXdSZXNpemUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZU5zUmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVOZXN3UmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVOd3NlUmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVDb2xSZXNpemUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb1N3aXRjaChDU1NWYWx1ZVJvd1Jlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlVGV4dCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlV2FpdCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlSGVscCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvU3dpdGNoKENTU1ZhbHVlQWxsU2Nyb2xsKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVXZWJraXRHcmFiKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9Td2l0Y2goQ1NTVmFsdWVXZWJraXRHcmFiYmluZyk7CiAgICB9CiAgICBlbmQgPSBjbG9jaygpOwogICAgY291dCA8PCAiVGltZSAoc3dpdGNoKTogIiA8PCAoZW5kIC0gc3RhcnQpIC8gKGRvdWJsZSkoQ0xPQ0tTX1BFUl9TRUMgLyAxMDAwKSA8PCAiIG1zIiA8PCBlbmRsOwoKCiAgICBzdGFydCA9IGNsb2NrKCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgTl9JVEVSQVRJT05TOyBpKyspIHsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlQXV0byk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZUNyb3NzaGFpcik7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZURlZmF1bHQpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVQb2ludGVyKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlTW92ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZUNlbGwpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVWZXJ0aWNhbFRleHQpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVDb250ZXh0TWVudSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZUFsaWFzKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlQ29weSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZU5vbmUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVQcm9ncmVzcyk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZU5vRHJvcCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZU5vdEFsbG93ZWQpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVab29tSW4pOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVXZWJraXRab29tSW4pOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVab29tT3V0KTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlV2Via2l0Wm9vbU91dCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZUVSZXNpemUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVOZVJlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZU53UmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlTlJlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZVNlUmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlU3dSZXNpemUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVTUmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlV1Jlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZUV3UmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlTnNSZXNpemUpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVOZXN3UmVzaXplKTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlTndzZVJlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZUNvbFJlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZVJvd1Jlc2l6ZSk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZVRleHQpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVXYWl0KTsKICAgICAgICByZXN1bHQgPSBjb252ZXJ0VG9DYXN0KENTU1ZhbHVlSGVscCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZUFsbFNjcm9sbCk7CiAgICAgICAgcmVzdWx0ID0gY29udmVydFRvQ2FzdChDU1NWYWx1ZVdlYmtpdEdyYWIpOwogICAgICAgIHJlc3VsdCA9IGNvbnZlcnRUb0Nhc3QoQ1NTVmFsdWVXZWJraXRHcmFiYmluZyk7CiAgICB9CiAgICBlbmQgPSBjbG9jaygpOwogICAgY291dCA8PCAiVGltZSAoY2FzdCk6ICIgPDwgKGVuZCAtIHN0YXJ0KSAvIChkb3VibGUpKENMT0NLU19QRVJfU0VDIC8gMTAwMCkgPDwgIiBtcyIgPDwgZW5kbDsKCiAgICBjb3V0IDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihyZXN1bHQpIDw8IGVuZGw7CgoKICAgIHJldHVybiAwOwp9Cg==