LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCiNpZm5kZWYgQURDX0NQUF9QRV9WQUZVX0hYWAojZGVmaW5lIEFEQ19DUFBfUEVfVkFGVV9IWFgKCi8vIEJBU0UgQ0xBU1NFUwojaW5jbHVkZSAiY3BwX3BlLmh4eCIKLy8gVVNFRCBTRVJWSUNFUwojaW5jbHVkZSA8c2VtYW50aWMvY2FsbGYuaHh4PgojaW5jbHVkZSA8c2VtYW50aWMvc3ViX3BldS5oeHg+CiNpbmNsdWRlIDxhcnkvY3BwL2NfdHlwZXM0Y3BwLmh4eD4KI2luY2x1ZGUgPGFyeS9jcHAvY192ZmZsYWcuaHh4PgoKCgpuYW1lc3BhY2UgY3BwCnsKCmNsYXNzIFBFX1R5cGU7CmNsYXNzIFBFX1ZhcmlhYmxlOwpjbGFzcyBQRV9GdW5jdGlvbjsKY2xhc3MgUEVfSWdub3JlOwoKCgoKY2xhc3MgUEVfVmFyRnVuYyA6IHB1YmxpYyBDcHBfUEUKewogIHB1YmxpYzoKCWVudW0gRV9TdGF0ZQoJewoJCXN0YXJ0LAoJCWV4cGVjdEN0b3IsCgkJYWZ0ZXJDbGFzc0RlY2wsICAgICAvLyBBbHNvIHVzZWQgZm9yIGFmdGVyIGVudW0gZGVjbGFyYXRpb24uCgkJZXhwZWN0TmFtZSwKCQlhZnRlck5hbWUsCiAgICAgICAgYWZ0ZXJOYW1lX2luRXJyYW5lb3VzVGVtcGxhdGUsCgkJZmluaXNoZWQsCiAgICAgICAgZmluaXNoZWRJbmNsdWRpbmdGdW5jdGlvbkltcGxlbWVudGF0aW9uLAoJCXNpemVfb2Zfc3RhdGVzCgl9OwogICAgZW51bSBFX1Jlc3VsdFR5cGUKICAgIHsKICAgICAgICByZXN1bHRfdW5rbm93biA9IDAsCgkJcmVzdWx0X2lnbm9yZSwgICAgICAgICAJLy8vIFVzZWQgZm9yIGNsYXNzIGFuZCBlbnVtIGRlY2xhcmF0aW9ucyBhbmQgcHJlZGVjbGFyYXRpb25zIGFuZCBmb3IgZXh0ZXJuIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLgoJCXJlc3VsdF92YXJpYWJsZSwKCQlyZXN1bHRfZnVuY3Rpb24KICAgIH07CgoJdHlwZWRlZiBhcnk6OmNwcDo6RV9Qcm90ZWN0aW9uIAkJCQlFX1Byb3RlY3Rpb247CgoKCQkJCQkJUEVfVmFyRnVuYygKCQkJCQkJCUNwcF9QRSAqCQkJaV9wUGFyZW50ICk7CgkJCQkJCX5QRV9WYXJGdW5jKCk7CgoJdmlydHVhbCB2b2lkCQlDYWxsX0hhbmRsZXIoCgkJCQkJCQljb25zdCBjcHA6OlRva2VuICYJaV9yVG9rICk7CgoJY29uc3Qgc3RkOjp2ZWN0b3I8YXJ5OjpjcHA6OkNlX2lkPiAmCiAgICAgICAgICAgIAkJCVJlc3VsdF9JZHMoKSBjb25zdDsKCWFyeTo6Y3BwOjpUeXBlX2lkICAgUmVzdWx0X0Zyb250VHlwZSgpIGNvbnN0OwoJY29uc3QgU3RyaW5nVmVjdG9yICYKICAgICAgICAgICAgCQkJUmVzdWx0X05hbWVzKCkgY29uc3Q7CglFX1Jlc3VsdFR5cGUJCVJlc3VsdF9DZVR5cGUoKSBjb25zdDsKCiAgcHJpdmF0ZToKCXR5cGVkZWYgU3ViUGU8IFBFX1ZhckZ1bmMsIFBFX1R5cGUgPgkJU1BfVHlwZTsKCXR5cGVkZWYgU3ViUGVVc2U8IFBFX1ZhckZ1bmMsIFBFX1R5cGUgPgkJU1BVX1R5cGU7Cgl0eXBlZGVmIFN1YlBlPCBQRV9WYXJGdW5jLCBQRV9WYXJpYWJsZSA+CVNQX1ZhcmlhYmxlOwoJdHlwZWRlZiBTdWJQZVVzZTwgUEVfVmFyRnVuYywgUEVfVmFyaWFibGUgPglTUFVfVmFyaWFibGU7Cgl0eXBlZGVmIFN1YlBlPCBQRV9WYXJGdW5jLCBQRV9GdW5jdGlvbiA+CVNQX0Z1bmN0aW9uOwoJdHlwZWRlZiBTdWJQZVVzZTwgUEVfVmFyRnVuYywgUEVfRnVuY3Rpb24gPglTUFVfRnVuY3Rpb247Cgl0eXBlZGVmIFN1YlBlPCBQRV9WYXJGdW5jLCBQRV9JZ25vcmUgPgkJU1BfSWdub3JlOwoJdHlwZWRlZiBTdWJQZVVzZTwgUEVfVmFyRnVuYywgUEVfSWdub3JlID4gICBTUFVfSWdub3JlOwoKCXZvaWQJCQkJU2V0dXBfU3RhdHVzRnVuY3Rpb25zKCk7Cgl2aXJ0dWFsIHZvaWQJCUluaXREYXRhKCk7Cgl2aXJ0dWFsIHZvaWQJCVRyYW5zZmVyRGF0YSgpOwoJdm9pZCAgCQkJCUhkbF9Vbmtub3duVG9rZW4oIGNvbnN0IGNoYXIgKik7CgoJdm9pZAkJCQlTcEluaXRfRnVuY3Rpb25TdGQoKTsKCXZvaWQJCQkJU3BJbml0X0Z1bmN0aW9uQ3RvcigpOwoJdm9pZAkJCQlTcEluaXRfRnVuY3Rpb25EdG9yKCk7Cgl2b2lkCQkJCVNwSW5pdF9GdW5jdGlvbkNhc3RPcGVyYXRvcigpOwoJdm9pZAkJCQlTcEluaXRfRnVuY3Rpb25Ob3JtYWxPcGVyYXRvcigpOwoJdm9pZAkJCQlTcFJldHVybl9UeXBlKCk7Cgl2b2lkCQkJCVNwUmV0dXJuX1ZhcmlhYmxlKCk7Cgl2b2lkCQkJCVNwUmV0dXJuX0Z1bmN0aW9uU3RkKCk7Cgl2b2lkCQkJCVNwUmV0dXJuX0lnbm9yZSgpOwoKCXZvaWQJCQkJT25fc3RhcnRfSWRlbnRpZmllcihjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX3N0YXJ0X29wZXJhdG9yKGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCXZvaWQJCQkJT25fc3RhcnRfVHlwZUtleShjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX3N0YXJ0X3ZpcnR1YWwoY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9zdGFydF9UaWxkZShjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX3N0YXJ0X2NvbnN0KGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCXZvaWQJCQkJT25fc3RhcnRfdm9sYXRpbGUoY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9zdGFydF9leHRlcm4oY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9zdGFydF9zdGF0aWMoY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9zdGFydF9tdXRhYmxlKGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCXZvaWQJCQkJT25fc3RhcnRfcmVnaXN0ZXIoY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9zdGFydF9pbmxpbmUoY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9zdGFydF9leHBsaWNpdChjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX3N0YXJ0X0JyYWNrZXRfUmlnaHQoY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZCAgICAgICAgICAgICAgICBPbl9zdGFydF90eXBlbmFtZShjb25zdCBjaGFyICogaV9zVGV4dCk7CgoJdm9pZAkJCQlPbl9leHBlY3RDdG9yX0JyYWNrZXRfTGVmdChjb25zdCBjaGFyICogaV9zVGV4dCk7CgoJdm9pZAkJCQlPbl9hZnRlckNsYXNzRGVjbF9TZW1pY29sb24oY29uc3QgY2hhciAqIGlfc1RleHQpOwoKCXZvaWQJCQkJT25fZXhwZWN0TmFtZV9JZGVudGlmaWVyKGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCXZvaWQJCQkJT25fZXhwZWN0TmFtZV9vcGVyYXRvcihjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX2V4cGVjdE5hbWVfQnJhY2tldF9MZWZ0KGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCgl2b2lkCQkJCU9uX2FmdGVyTmFtZV9BcnJheUJyYWNrZXRfTGVmdChjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX2FmdGVyTmFtZV9CcmFja2V0X0xlZnQoY29uc3QgY2hhciAqIGlfc1RleHQpOwogICAgdm9pZCAgICAgICAgICAgICAgICBPbl9hZnRlck5hbWVfRG91YmxlQ29sb24oY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9hZnRlck5hbWVfU2VtaWNvbG9uKGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCXZvaWQJCQkJT25fYWZ0ZXJOYW1lX0NvbW1hKGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCXZvaWQJCQkJT25fYWZ0ZXJOYW1lX0Fzc2lnbihjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX2FmdGVyTmFtZV9MZXNzKGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKCiAgICB2b2lkICAgICAgICAgICAgICAgIE9uX2FmdGVyTmFtZV9pbkVycmFuZW91c1RlbXBsYXRlX0xlc3MoY29uc3QgY2hhciAqIGlfc1RleHQpOwogICAgdm9pZCAgICAgICAgICAgICAgICBPbl9hZnRlck5hbWVfaW5FcnJhbmVvdXNUZW1wbGF0ZV9HcmVhdGVyKGNvbnN0IGNoYXIgKiBpX3NUZXh0KTsKICAgIHZvaWQgICAgICAgICAgICAgICAgT25fYWZ0ZXJOYW1lX2luRXJyYW5lb3VzVGVtcGxhdGVfRGVmYXVsdChjb25zdCBjaGFyICogaV9zVGV4dCk7CgoJdm9pZAkJCQlPbl9maW5pc2hlZF9TZW1pY29sb24oY29uc3QgY2hhciAqIGlfc1RleHQpOwoJdm9pZAkJCQlPbl9maW5pc2hlZF9Db21tYShjb25zdCBjaGFyICogaV9zVGV4dCk7Cgl2b2lkCQkJCU9uX2ZpbmlzaGVkX0RlZmF1bHQoY29uc3QgY2hhciAqIGlfc1RleHQpOwoKICAgIHZvaWQgICAgICAgICAgICAgICAgT25fZmluaXNoZWRJbmNsdWRpbmdGdW5jdGlvbkltcGxlbWVudGF0aW9uX0RlZmF1bHQoY29uc3QgY2hhciAqIGlfc1RleHQpOwoKICAgIGFyeTo6Y3BwOjpGdW5jdGlvbkZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUZ1bmN0aW9uRmxhZ3MoKTsKCiAgICAvLyBEQVRBCglEeW48IFBlU3RhdHVzQXJyYXk8UEVfVmFyRnVuYz4gPgoJCQkJCQlwU3RhdGk7CgoJRHluPFNQX1R5cGU+CSAgICBwU3BUeXBlOwoJRHluPFNQVV9UeXBlPgkgCXBTcHVUeXBlOwoJRHluPFNQX1ZhcmlhYmxlPglwU3BWYXJpYWJsZTsKCUR5bjxTUFVfVmFyaWFibGU+CXBTcHVWYXJpYWJsZTsKCUR5bjxTUF9GdW5jdGlvbj4JcFNwRnVuY3Rpb247CglEeW48U1BVX0Z1bmN0aW9uPiAJcFNwdUZ1bmN0aW9uU3RkOwoJRHluPFNQVV9GdW5jdGlvbj4gCXBTcHVGdW5jdGlvbkN0b3I7CglEeW48U1BVX0Z1bmN0aW9uPiAJcFNwdUZ1bmN0aW9uRHRvcjsKCUR5bjxTUFVfRnVuY3Rpb24+IAlwU3B1RnVuY3Rpb25DYXN0T3BlcmF0b3I7CglEeW48U1BVX0Z1bmN0aW9uPiAJcFNwdUZ1bmN0aW9uTm9ybWFsT3BlcmF0b3I7CglEeW48U1BfSWdub3JlPgkgICAgcFNwSWdub3JlOwoJRHluPFNQVV9JZ25vcmU+CSAJcFNwdUlnbm9yZTsKCiAgICBpbnR0ICAgICAgICAgICAgICAgIG5Db3VudGVyX1RlbXBsYXRlQnJhY2tldHM7CiAgICBib29sICAgICAgICAgICAgICAgIGJJbkRlc3RydWN0b3I7CgogICAgc3RkOjp2ZWN0b3I8YXJ5OjpjcHA6OkNlX2lkPgogICAgICAgICAgICAgICAgICAgICAgICBhUmVzdWx0SWRzOwoJYXJ5OjpjcHA6OlR5cGVfaWQJblJlc3VsdEZyb250VHlwZTsKICAgIEVfUmVzdWx0VHlwZSAgICAgICAgZVJlc3VsdFR5cGU7CgoJLy8gUHJlLVJlc3VsdHMKICAgIFN0cmluZyAgICAgICAgICAgICAgc05hbWU7CgogICAgYm9vbCAgICAgICAgICAgICAgICBiVmlydHVhbDsKICAgIGJvb2wgICAgICAgICAgICAgICAgYlN0YXRpYzsKICAgIGJvb2wgICAgICAgICAgICAgICAgYkV4dGVybjsKICAgIGJvb2wgICAgICAgICAgICAgICAgYkV4dGVybkM7CiAgICBib29sICAgICAgICAgICAgICAgIGJNdXRhYmxlOwogICAgYm9vbCAgICAgICAgICAgICAgICBiSW5saW5lOwogICAgYm9vbCAgICAgICAgICAgICAgICBiUmVnaXN0ZXI7CiAgICBib29sICAgICAgICAgICAgICAgIGJFeHBsaWNpdDsKfTsKCgoKLy8gSU1QTEVNRU5UQVRJT04KCmlubGluZSBjb25zdCBzdGQ6OnZlY3Rvcjxhcnk6OmNwcDo6Q2VfaWQ+ICYKUEVfVmFyRnVuYzo6UmVzdWx0X0lkcygpIGNvbnN0CiAgICB7IHJldHVybiBhUmVzdWx0SWRzOyB9CmlubGluZSBhcnk6OmNwcDo6VHlwZV9pZApQRV9WYXJGdW5jOjpSZXN1bHRfRnJvbnRUeXBlKCkgY29uc3QKICAgIHsgcmV0dXJuIG5SZXN1bHRGcm9udFR5cGU7IH0KaW5saW5lIFBFX1ZhckZ1bmM6OkVfUmVzdWx0VHlwZQpQRV9WYXJGdW5jOjpSZXN1bHRfQ2VUeXBlKCkgY29uc3QKICAgIHsgcmV0dXJuIGVSZXN1bHRUeXBlOyB9CgoKCn0gICAvLyBuYW1lc3BhY2UgY3BwCgoKCgojZW5kaWYKCgovKgkvLyBPdmVydmlldyBvZiBTdGF0aQoKVW5kZWNpZGVkCi0tLS0tLS0tLQoKc3RhcnQJCQkvLyB2b3IgdW5kIHfkaHJlbmQgc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJuCiAgICBhbnkgICAgICAgICAtPnN0YXkKICAgIG9wZXJhYXRvciAgIC0+Z290byBGdW5jdGlvbgoKLT5UeXAKCmV4cGVjdE5hbWUKICAgIElkZW50aWZpZXIgIC0+c3RheQogICAgb3BlcmF0b3IgICAgLT5nb3RvIEZ1bmN0aW9uCgphZnRlck5hbWUgICAgICAgLT5nb3RvIFZhcmlhYmxlIG9yIEZ1bmN0aW9uCgoKCgpWYXJpYWJsZQotLS0tLS0tLQoKc3RhcnQJCQkvLyB2b3IgdW5kIHfkaHJlbmQgc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJuCgotPlR5cAoKZXhwZWN0TmFtZQkJLy8gVHlwIGlzdCBkYSAgLT4gaW0gRmFsbGUgdm9uICcoJzogbm90eWV0aW1wbGVtZW50ZWQKYWZ0ZXJOYW1lCgpleHBlY3RTaXplICAJLy8gYWZ0ZXIgWwpleHBlY3RGaW5pc2gKCQkJCS8vIHZvciA7IG9kZXIgLApleHBlY3ROZXh0VmFyTmFtZSAgLy8gYW5kZXJzIGFscyBiZWkgZXhwZWN0TmFtZSBrYW5uIGhpZXIgYXVjaCAqIG9kZXIgJiBrb21tZW4KCgoKCgpGdW5jdGlvbgotLS0tLS0tLQoKc3RhcnQJCQkJLy8gdm9yIHVuZCB35GhyZW5kIHN0b3JhZ2UgY2xhc3Mgc3BlY2lmaWVybgoKLT5UeXAKCmV4cGVjdE5hbWUJCQkvLyBUeXAgaXN0IGRhCmV4cGVjdEJyYWNrZXQJCS8vIE5hY2ggTmFtZQpleHBlY3RQYXJhbWV0ZXIJCS8vIG5hY2ggKCBvZGVyICwKLT4gUGFyYW1ldGVyCmFmdGVyIFBhcmFtZXRlcnMgICAgLy8gYmVmb3JlIGNvbnN0LCB2b2xhdGlsZSB0aHJvdyBvciA9IDAuCmFmdGVyIHRocm93CQkJLy8gZXhwZWN0ICgKZXhwZWN0RXhjZXB0aW9uCQkvLyBhZnRlciAoCmFmdGVyIGV4Y2VwdGlvbnMJLy8gPSAwIG9kZXIgOyBvZGVyICwKCgpleHBlY3ROZXh0VmFyTmFtZSAgLy8gYW5kZXJzIGFscyBiZWkgZXhwZWN0TmFtZSBrYW5uIGhpZXIgYXVjaCAqIG9kZXIgJiBrb21tZW4KCgoKCgoKCiovCg==