Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLy8gbW9ycGhvX25vaXNlX3JlZHVjdGlvbi5oDQovLyBbU0pJUy9DUkxGXSB7IIKgIJWEjYaJu5X7jq6OqZOulLuS6JdwIH0NCi8vDQovLyBDb3B5cmlnaHQoYykgMjAwNi0yMDEyIE1vcnBobyxJbmMuDQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiNpZm5kZWYgTU9SUEhPX05PSVNFX1JFRFVDVElPTl9IDQojIGRlZmluZSBNT1JQSE9fTk9JU0VfUkVEVUNUSU9OX0gNCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGluY2x1ZGUgIm1vcnBob19hcGkuaCINCiMgaW5jbHVkZSAibW9ycGhvX2Vycm9yLmgiDQojIGluY2x1ZGUgIm1vcnBob19pbWFnZV9kYXRhLmgiDQojIGluY2x1ZGUgIm1vcnBob19tb3Rpb25fZGF0YS5oIg0KIyBpbmNsdWRlICJtb3JwaG9fcmVjdF9pbnQuaCINCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGlmZGVmIF9fY3BsdXNwbHVzDQpleHRlcm4gIkMiIHsNCiMgZW5kaWYNCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQovKiogg2+BW4NXg4eDk5W2jpqX8SAqLw0KIyBkZWZpbmUgTU9SUEhPX05PSVNFX1JFRFVDVElPTl9WRVJTSU9OICJNb3JwaG8gTm9pc2UgUmVkdWN0aW9uIFZlci4wLjkuMCAyMDEyLzA4LzA5Ig0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovKiogg22DQ4NZj5yLjortICovDQp0eXBlZGVmIHN0cnVjdA0Kew0KICAgIHZvaWQgKnA7IC8qKjwgk+CVlI1ckaKRzILWgsyDfINDg5ODXiAqLw0KfSBtb3JwaG9fTm9pc2VSZWR1Y3Rpb247DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLyoqDQogKiCDb4Fbg1eDh4OTlbaOmpfxgvCO5pO+DQogKg0KICogQHJldHVybiCDb4Fbg1eDh4OTlbaOmpfxKE1PUlBIT19JTUFHRV9TVEFCSUxJWkVSX1ZFUlNJT04pDQogKi8NCk1PUlBIT19BUEkoY29uc3QgY2hhciAqKQ0KbW9ycGhvX05vaXNlUmVkdWN0aW9uX2dldFZlcnNpb24odm9pZCk7DQoNCi8qKg0KICogg22DQ4NZj5yLjo+Il52CyZVLl3aCyIOBg4KDioNUg0ODWYLwjuaTvg0KICogjneS6ILFgquC6YN0g0iBW4N9g2KDZ4LNVFJNgvCOUY/GgUINCiAqDQogKiBAcGFyYW1baW5dIHdpZHRoICCT/JfNieaRnILMlZ0NCiAqIEBwYXJhbVtpbl0gaGVpZ2h0IJP8l82J5pGcgsyNgoKzDQogKiBAcGFyYW1baW5dIGZvcm1hdCCJ5pGcg3SDSIFbg32DYoNnlbaOmpfxDQogKiBAcmV0dXJuIJVLl3aCyIOBg4KDioNUg0ODWShieXRlKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19Ob2lzZVJlZHVjdGlvbl9nZXRCdWZmZXJTaXplKA0KICAgIGludCB3aWR0aCwNCiAgICBpbnQgaGVpZ2h0LA0KICAgIGNvbnN0IGNoYXIgKmZvcm1hdCk7DQoNCi8qKg0KICogg22DQ4NZj5yLjortgsyPiYr6ibsNCiAqDQogKiBAcGFyYW1bb3V0XSByZWR1Y2VyICCDbYNDg1mPnIuOiu0NCiAqIEBwYXJhbVtvdXRdIGJ1ZmZlciAgICAgIINtg0ODWY+ci46K7YLJioSC6JOWgsSC6YOBg4KDioLWgsyDfINDg5ODXg0KICogQHBhcmFtW2luXSAgYnVmZmVyX3NpemUgg22DQ4NZj5yLjortgsmKhILok5aCxILpg4GDgoOKgsyDVINDg1kuDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaChtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fTm9pc2VSZWR1Y3Rpb25faW5pdGlhbGl6ZSgNCiAgICBtb3JwaG9fTm9pc2VSZWR1Y3Rpb24gKnJlZHVjZXIsDQogICAgdm9pZCAqYnVmZmVyLA0KICAgIGludCBidWZmZXJfc2l6ZSk7DQoNCi8qKg0KICogg22DQ4NZj5yLjortgsyDToOKgVuDk4NBg2KDdg0KICoNCiAqIEBwYXJhbVtpbixvdXRdIHJlZHVjZXIgg22DQ4NZj5yLjortDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaChtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fTm9pc2VSZWR1Y3Rpb25fZmluYWxpemUoDQogICAgbW9ycGhvX05vaXNlUmVkdWN0aW9uICpyZWR1Y2VyKTsNCg0KLyoqDQogKiCDbYNDg1mPnIuOj4iXnTogj4iXnYpKjm4NCiAqII9vl82J5pGcKG91dHB1dF9pbWFnZSmCzTGWh5bagsyT/JfNieaRnILGk6+CtoLFguCXx4KiDQogKg0KICogQHBhcmFtW2luLG91dF0gcmVkdWNlciAgICCDbYNDg1mPnIuOiu0NCiAqIEBwYXJhbVtvdXRdICAgIG91dHB1dF9pbWFnZSAgj2+XzYnmkZwNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoKG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19Ob2lzZVJlZHVjdGlvbl9zdGFydCgNCiAgICBtb3JwaG9fTm9pc2VSZWR1Y3Rpb24gKnJlZHVjZXIsDQogICAgbW9ycGhvX0ltYWdlRGF0YSAqb3V0cHV0X2ltYWdlKTsNCg0KLyoqDQogKiCDbYNDg1mPnIuOj4iXnTogg22DQ4NZj5yLjg0KICoNCiAqIEBwYXJhbVtpbixvdXRdIHJlZHVjZXIgICCDbYNDg1mPnIuOiu0NCiAqIEBwYXJhbVtvdXRdICAgIGlucHV0X2ltYWdlICCPb5fNieaRnA0KICogQHJldHVybiCDR4OJgVuDUoFbg2gobW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX05vaXNlUmVkdWN0aW9uX3JlZHVjZU5vaXNlKA0KICAgIG1vcnBob19Ob2lzZVJlZHVjdGlvbiAqcmVkdWNlciwNCiAgICBtb3JwaG9fSW1hZ2VEYXRhICppbnB1dF9pbWFnZSk7DQoNCi8qKg0KICogieaRnIN0g0iBW4N9g2KDZ4LwjuaTvg0KICogaW5pdGlhbGl6ZSgpjsCNc4zjgsmO5pO+icKUXA0KICogg2+DYoN0g0CDVINDg1mCzTMyiMiP44LGgreC6YKxgsYNCiAqDQogKiBAcGFyYW1baW4sb3V0XSByZWR1Y2VyIINtg0ODWY+ci46K7Q0KICogQHBhcmFtW291dF0gZm9ybWF0IInmkZyDdINIgVuDfYNig2eVto6al/GCqopplFuCs4LqgukNCiAqIEBwYXJhbVtpbl0gYnVmZmVyX3NpemUgg2+DYoN0g0CDVINDg1kNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoKG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19Ob2lzZVJlZHVjdGlvbl9nZXRJbWFnZUZvcm1hdCgNCiAgICBtb3JwaG9fTm9pc2VSZWR1Y3Rpb24gKnJlZHVjZXIsDQogICAgY2hhciAqZm9ybWF0LA0KICAgIGNvbnN0IGludCBidWZmZXJfc2l6ZSk7DQoNCi8qKg0KICogi1CTeINtg0ODWY+ci46LrZN4g4yDeIOLgvCO5pO+DQogKiBpbml0aWFsaXplKCmOwI1zjOOCyY7mk76JwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gcmVkdWNlciCDbYNDg1mPnIuOiu0NCiAqIEBwYXJhbVtvdXRdIGxldmVsIItQk3iDbYNDg1mPnIuOi62TeIOMg3iDi4KqimmUW4KzguqC6Q0KICogQHJldHVybiCDR4OJgVuDUoFbg2gobW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX05vaXNlUmVkdWN0aW9uX2dldEx1bWFOb2lzZVJlZHVjdGlvbkxldmVsKA0KICAgIG1vcnBob19Ob2lzZVJlZHVjdGlvbiAqcmVkdWNlciwNCiAgICBpbnQgKmxldmVsKTsNCg0KLyoqDQogKiCDToONg32DbYNDg1mPnIuOi62TeIOMg3iDi4LwjuaTvg0KICogaW5pdGlhbGl6ZSgpjsCNc4zjgsmO5pO+icKUXA0KICoNCiAqIEBwYXJhbVtpbixvdXRdIHJlZHVjZXIgg22DQ4NZj5yLjortDQogKiBAcGFyYW1bb3V0XSBsZXZlbCCDToONg32DbYNDg1mPnIuOi62TeIOMg3iDi4KqimmUW4KzguqC6Q0KICogQHJldHVybiCDR4OJgVuDUoFbg2gobW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX05vaXNlUmVkdWN0aW9uX2dldENocm9tYU5vaXNlUmVkdWN0aW9uTGV2ZWwoDQogICAgbW9ycGhvX05vaXNlUmVkdWN0aW9uICpyZWR1Y2VyLA0KICAgIGludCAqbGV2ZWwpOw0KDQovKioNCiAqIInmkZyDdINIgVuDfYNig2eC8JDdkugNCiAqIGluaXRpYWxpemUoKY7AjXOM44KpgsJzdGFydCgpjsCNc5FPgsmQ3ZLoicKUXA0KICogjneS6ILFgquC6YN0g0iBW4N9g2KDZ4LNVFJNgvCOUY/GgUINCiAqDQogKiBAcGFyYW1baW4sb3V0XSByZWR1Y2VyIINtg0ODWY+ci46K7Q0KICogQHBhcmFtW2luXSBmb3JtYXQgieaRnIN0g0iBW4N9g2KDZ5W2jpqX8Q0KICogQHJldHVybiCDR4OJgVuDUoFbg2gobW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX05vaXNlUmVkdWN0aW9uX3NldEltYWdlRm9ybWF0KA0KICAgIG1vcnBob19Ob2lzZVJlZHVjdGlvbiAqcmVkdWNlciwNCiAgICBjb25zdCBjaGFyICpmb3JtYXQpOw0KDQovKioNCiAqIItQk3iDbYNDg1mPnIuOi62TeIOMg3iDi4LwkN2S6A0KICogaW5pdGlhbGl6ZSgpjsCNc4zjgqmCwnN0YXJ0KCmOwI1zkU+CyZDdkuiJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gcmVkdWNlciCDbYNDg1mPnIuOiu0NCiAqIEBwYXJhbVtpbl0gbGV2ZWwgi1CTeINtg0ODWY+ci46LrZN4g4yDeIOLKDAtNykNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoKG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19Ob2lzZVJlZHVjdGlvbl9zZXRMdW1hTm9pc2VSZWR1Y3Rpb25MZXZlbCgNCiAgICBtb3JwaG9fTm9pc2VSZWR1Y3Rpb24gKnJlZHVjZXIsDQogICAgaW50IGxldmVsKTsNCg0KLyoqDQogKiCDToONg32DbYNDg1mPnIuOi62TeIOMg3iDi4LwkN2S6A0KICogaW5pdGlhbGl6ZSgpjsCNc4zjgqmCwnN0YXJ0KCmOwI1zkU+CyZDdkuiJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gcmVkdWNlciCDbYNDg1mPnIuOiu0NCiAqIEBwYXJhbVtpbl0gbGV2ZWwgg06DjYN9g22DQ4NZj5yLjoutk3iDjIN4g4soMC03KQ0KICogQHJldHVybiCDR4OJgVuDUoFbg2gobW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX05vaXNlUmVkdWN0aW9uX3NldENocm9tYU5vaXNlUmVkdWN0aW9uTGV2ZWwoDQogICAgbW9ycGhvX05vaXNlUmVkdWN0aW9uICpyZWR1Y2VyLA0KICAgIGludCBsZXZlbCk7DQoNCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIyBpZmRlZiBfX2NwbHVzcGx1cw0KfSAvLyBleHRlcm4gIkMiDQojIGVuZGlmDQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KI2VuZGlmIC8vICFNT1JQSE9fSU1BR0VfU1RBQklMSVpFUjNfSA0KDQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQovLyBbRU9GXQ0K