ZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RlYnVnLnJzdCBiL0RvYy9saWJyYXJ5L2RlYnVnLnJzdAppbmRleCA3NDgwMDg3Li5iMmVlNGZhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kZWJ1Zy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGVidWcucnN0CkBAIC0xMiw2ICsxMiw1IEBACiAgICBiZGIucnN0CiAgICBwZGIucnN0CiAgICBwcm9maWxlLnJzdAotICAgaG90c2hvdC5yc3QKICAgIHRpbWVpdC5yc3QKICAgIHRyYWNlLnJzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2hvdHNob3QucnN0IGIvRG9jL2xpYnJhcnkvaG90c2hvdC5yc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMGZhY2QuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYnJhcnkvaG90c2hvdC5yc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotCi06bW9kOmBob3RzaG90YCAtLS0gSGlnaCBwZXJmb3JtYW5jZSBsb2dnaW5nIHByb2ZpbGVyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS4uIG1vZHVsZTo6IGhvdHNob3QKLSAgIDpzeW5vcHNpczogSGlnaCBwZXJmb3JtYW5jZSBsb2dnaW5nIHByb2ZpbGVyLCBtb3N0bHkgd3JpdHRlbiBpbiBDLgotLi4gbW9kdWxlYXV0aG9yOjogRnJlZCBMLiBEcmFrZSwgSnIuIDxmZHJha2VAYWNtLm9yZz4KLS4uIHNlY3Rpb25hdXRob3I6OiBBbnRob255IEJheHRlciA8YW50aG9ueUBpbnRlcmxpbmsuY29tLmF1PgotCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgbmljZXIgaW50ZXJmYWNlIHRvIHRoZSA6bW9kOmBfaG90c2hvdGAgQyBtb2R1bGUuIEhvdHNob3QKLWlzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBleGlzdGluZyA6bW9kOmBwcm9maWxlYCBtb2R1bGUuIEFzIGl0J3Mgd3JpdHRlbiBtb3N0bHkKLWluIEMsIGl0IHNob3VsZCByZXN1bHQgaW4gYSBtdWNoIHNtYWxsZXIgcGVyZm9ybWFuY2UgaW1wYWN0IHRoYW4gdGhlIGV4aXN0aW5nCi06bW9kOmBwcm9maWxlYCBtb2R1bGUuCi0KLS4uIG5vdGU6OgotCi0gICBUaGUgOm1vZDpgaG90c2hvdGAgbW9kdWxlIGZvY3VzZXMgb24gbWluaW1pemluZyB0aGUgb3ZlcmhlYWQgd2hpbGUgcHJvZmlsaW5nLCBhdAotICAgdGhlIGV4cGVuc2Ugb2YgbG9uZyBkYXRhIHBvc3QtcHJvY2Vzc2luZyB0aW1lcy4gRm9yIGNvbW1vbiB1c2FnZXMgaXQgaXMKLSAgIHJlY29tbWVuZGVkIHRvIHVzZSA6bW9kOmBjUHJvZmlsZWAgaW5zdGVhZC4gOm1vZDpgaG90c2hvdGAgaXMgbm90IG1haW50YWluZWQgYW5kCi0gICBtaWdodCBiZSByZW1vdmVkIGZyb20gdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW4gdGhlIGZ1dHVyZS4KLQotLi4gd2FybmluZzo6Ci0KLSAgIFRoZSA6bW9kOmBob3RzaG90YCBwcm9maWxlciBkb2VzIG5vdCB5ZXQgd29yayB3ZWxsIHdpdGggdGhyZWFkcy4gSXQgaXMgdXNlZnVsIHRvCi0gICB1c2UgYW4gdW50aHJlYWRlZCBzY3JpcHQgdG8gcnVuIHRoZSBwcm9maWxlciBvdmVyIHRoZSBjb2RlIHlvdSdyZSBpbnRlcmVzdGVkIGluCi0gICBtZWFzdXJpbmcgaWYgYXQgYWxsIHBvc3NpYmxlLgotCi0KLS4uIGNsYXNzOjogUHJvZmlsZShsb2dmaWxlWywgbGluZWV2ZW50c1ssIGxpbmV0aW1pbmdzXV0pCi0KLSAgIFRoZSBwcm9maWxlciBvYmplY3QuIFRoZSBhcmd1bWVudCAqbG9nZmlsZSogaXMgdGhlIG5hbWUgb2YgYSBsb2cgZmlsZSB0byB1c2UgZm9yCi0gICBsb2dnZWQgcHJvZmlsZSBkYXRhLiBUaGUgYXJndW1lbnQgKmxpbmVldmVudHMqIHNwZWNpZmllcyB3aGV0aGVyIHRvIGdlbmVyYXRlCi0gICBldmVudHMgZm9yIGV2ZXJ5IHNvdXJjZSBsaW5lLCBvciBqdXN0IG9uIGZ1bmN0aW9uIGNhbGwvcmV0dXJuLiBJdCBkZWZhdWx0cyB0bwotICAgYGAwYGAgKG9ubHkgbG9nIGZ1bmN0aW9uIGNhbGwvcmV0dXJuKS4gVGhlIGFyZ3VtZW50ICpsaW5ldGltaW5ncyogc3BlY2lmaWVzCi0gICB3aGV0aGVyIHRvIHJlY29yZCB0aW1pbmcgaW5mb3JtYXRpb24uIEl0IGRlZmF1bHRzIHRvIGBgMWBgIChzdG9yZSB0aW1pbmcKLSAgIGluZm9ybWF0aW9uKS4KLQotCi0uLiBfaG90c2hvdC1vYmplY3RzOgotCi1Qcm9maWxlIE9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLQotCi1Qcm9maWxlIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLQotLi4gbWV0aG9kOjogUHJvZmlsZS5hZGRpbmZvKGtleSwgdmFsdWUpCi0KLSAgIEFkZCBhbiBhcmJpdHJhcnkgbGFiZWxsZWQgdmFsdWUgdG8gdGhlIHByb2ZpbGUgb3V0cHV0LgotCi0KLS4uIG1ldGhvZDo6IFByb2ZpbGUuY2xvc2UoKQotCi0gICBDbG9zZSB0aGUgbG9nZmlsZSBhbmQgdGVybWluYXRlIHRoZSBwcm9maWxlci4KLQotCi0uLiBtZXRob2Q6OiBQcm9maWxlLmZpbGVubygpCi0KLSAgIFJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBwcm9maWxlcidzIGxvZyBmaWxlLgotCi0KLS4uIG1ldGhvZDo6IFByb2ZpbGUucnVuKGNtZCkKLQotICAgUHJvZmlsZSBhbiA6ZnVuYzpgZXhlY2BcIC1jb21wYXRpYmxlIHN0cmluZyBpbiB0aGUgc2NyaXB0IGVudmlyb25tZW50LiBUaGUKLSAgIGdsb2JhbHMgZnJvbSB0aGUgOm1vZDpgX19tYWluX19gIG1vZHVsZSBhcmUgdXNlZCBhcyBib3RoIHRoZSBnbG9iYWxzIGFuZCBsb2NhbHMKLSAgIGZvciB0aGUgc2NyaXB0LgotCi0KLS4uIG1ldGhvZDo6IFByb2ZpbGUucnVuY2FsbChmdW5jLCAqYXJncywgKiprZXl3b3JkcykKLQotICAgUHJvZmlsZSBhIHNpbmdsZSBjYWxsIG9mIGEgY2FsbGFibGUuIEFkZGl0aW9uYWwgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMKLSAgIG1heSBiZSBwYXNzZWQgYWxvbmc7IHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgaXMgcmV0dXJuZWQsIGFuZCBleGNlcHRpb25zIGFyZQotICAgYWxsb3dlZCB0byBwcm9wYWdhdGUgY2xlYW5seSwgd2hpbGUgZW5zdXJpbmcgdGhhdCBwcm9maWxpbmcgaXMgZGlzYWJsZWQgb24gdGhlCi0gICB3YXkgb3V0LgotCi0KLS4uIG1ldGhvZDo6IFByb2ZpbGUucnVuY3R4KGNtZCwgZ2xvYmFscywgbG9jYWxzKQotCi0gICBQcm9maWxlIGFuIDpmdW5jOmBleGVjYFwgLWNvbXBhdGlibGUgc3RyaW5nIGluIGEgc3BlY2lmaWMgZW52aXJvbm1lbnQuIFRoZQotICAgc3RyaW5nIGlzIGNvbXBpbGVkIGJlZm9yZSBwcm9maWxpbmcgYmVnaW5zLgotCi0KLS4uIG1ldGhvZDo6IFByb2ZpbGUuc3RhcnQoKQotCi0gICBTdGFydCB0aGUgcHJvZmlsZXIuCi0KLQotLi4gbWV0aG9kOjogUHJvZmlsZS5zdG9wKCkKLQotICAgU3RvcCB0aGUgcHJvZmlsZXIuCi0KLQotVXNpbmcgaG90c2hvdCBkYXRhCi0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLi4gbW9kdWxlOjogaG90c2hvdC5zdGF0cwotICAgOnN5bm9wc2lzOiBTdGF0aXN0aWNhbCBhbmFseXNpcyBmb3IgSG90c2hvdAotCi0KLVRoaXMgbW9kdWxlIGxvYWRzIGhvdHNob3QgcHJvZmlsaW5nIGRhdGEgaW50byB0aGUgc3RhbmRhcmQgOm1vZDpgcHN0YXRzYCBTdGF0cwotb2JqZWN0cy4KLQotCi0uLiBmdW5jdGlvbjo6IGxvYWQoZmlsZW5hbWUpCi0KLSAgIExvYWQgaG90c2hvdCBkYXRhIGZyb20gKmZpbGVuYW1lKi4gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUKLSAgIDpjbGFzczpgcHN0YXRzLlN0YXRzYCBjbGFzcy4KLQotCi0uLiBzZWVhbHNvOjoKLQotICAgTW9kdWxlIDptb2Q6YHByb2ZpbGVgCi0gICAgICBUaGUgOm1vZDpgcHJvZmlsZWAgbW9kdWxlJ3MgOmNsYXNzOmBTdGF0c2AgY2xhc3MKLQotCi0uLiBfaG90c2hvdC1leGFtcGxlOgotCi1FeGFtcGxlIFVzYWdlCi0tLS0tLS0tLS0tLS0tCi0KLU5vdGUgdGhhdCB0aGlzIGV4YW1wbGUgcnVucyB0aGUgcHl0aG9uICJiZW5jaG1hcmsiIHB5c3RvbmVzLiAgSXQgY2FuIHRha2Ugc29tZQotdGltZSB0byBydW4sIGFuZCB3aWxsIHByb2R1Y2UgbGFyZ2Ugb3V0cHV0IGZpbGVzLiA6OgotCi0gICA+Pj4gaW1wb3J0IGhvdHNob3QsIGhvdHNob3Quc3RhdHMsIHRlc3QucHlzdG9uZQotICAgPj4+IHByb2YgPSBob3RzaG90LlByb2ZpbGUoInN0b25lcy5wcm9mIikKLSAgID4+PiBiZW5jaHRpbWUsIHN0b25lcyA9IHByb2YucnVuY2FsbCh0ZXN0LnB5c3RvbmUucHlzdG9uZXMpCi0gICA+Pj4gcHJvZi5jbG9zZSgpCi0gICA+Pj4gc3RhdHMgPSBob3RzaG90LnN0YXRzLmxvYWQoInN0b25lcy5wcm9mIikKLSAgID4+PiBzdGF0cy5zdHJpcF9kaXJzKCkKLSAgID4+PiBzdGF0cy5zb3J0X3N0YXRzKCd0aW1lJywgJ2NhbGxzJykKLSAgID4+PiBzdGF0cy5wcmludF9zdGF0cygyMCkKLSAgICAgICAgICAgIDg1MDAwNCBmdW5jdGlvbiBjYWxscyBpbiAxMC4wOTAgQ1BVIHNlY29uZHMKLQotICAgICAgT3JkZXJlZCBieTogaW50ZXJuYWwgdGltZSwgY2FsbCBjb3VudAotCi0gICAgICBuY2FsbHMgIHRvdHRpbWUgIHBlcmNhbGwgIGN1bXRpbWUgIHBlcmNhbGwgZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKQotICAgICAgICAgICAxICAgIDMuMjk1ICAgIDMuMjk1ICAgMTAuMDkwICAgMTAuMDkwIHB5c3RvbmUucHk6NzkoUHJvYzApCi0gICAgICAxNTAwMDAgICAgMS4zMTUgICAgMC4wMDAgICAgMS4zMTUgICAgMC4wMDAgcHlzdG9uZS5weToyMDMoUHJvYzcpCi0gICAgICAgNTAwMDAgICAgMS4zMTMgICAgMC4wMDAgICAgMS40NjMgICAgMC4wMDAgcHlzdG9uZS5weToyMjkoRnVuYzIpCi0gICAgLgotICAgIC4KLSAgICAuCi0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3Byb2ZpbGUucnN0IGIvRG9jL2xpYnJhcnkvcHJvZmlsZS5yc3QKaW5kZXggMGNiYmQ4Ni4uY2MwMjQzNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcHJvZmlsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcHJvZmlsZS5yc3QKQEAgLTU3LDcgKzU3LDcgQEAKIEl0IGFsc28gcHJvdmlkZXMgYSBzZXJpZXMgb2YgcmVwb3J0IGdlbmVyYXRpb24gdG9vbHMgdG8gYWxsb3cgdXNlcnMgdG8gcmFwaWRseQogZXhhbWluZSB0aGUgcmVzdWx0cyBvZiBhIHByb2ZpbGUgb3BlcmF0aW9uLgogCi1UaGUgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkgcHJvdmlkZXMgdGhyZWUgZGlmZmVyZW50IHByb2ZpbGVyczoKK1RoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSBwcm92aWRlcyB0d28gZGlmZmVyZW50IHByb2ZpbGVyczoKIAogIy4gOm1vZDpgcHJvZmlsZWAsIGEgcHVyZSBQeXRob24gbW9kdWxlLCBkZXNjcmliZWQgaW4gdGhlIHNlcXVlbC4gQ29weXJpZ2h0IMKpCiAgICAxOTk0LCBieSBJbmZvU2VlayBDb3Jwb3JhdGlvbi4KQEAgLTY2LDE1ICs2NiwxMSBAQAogICAgaXQgc3VpdGFibGUgZm9yIHByb2ZpbGluZyBsb25nLXJ1bm5pbmcgcHJvZ3JhbXMuIEJhc2VkIG9uIDptb2Q6YGxzcHJvZmAsCiAgICBjb250cmlidXRlZCBieSBCcmV0dCBSb3NlbiBhbmQgVGVkIEN6b3R0ZXIuCiAKLSMuIDptb2Q6YGhvdHNob3RgLCBhIEMgbW9kdWxlIGZvY3VzaW5nIG9uIG1pbmltaXppbmcgdGhlIG92ZXJoZWFkIHdoaWxlCi0gICBwcm9maWxpbmcsIGF0IHRoZSBleHBlbnNlIG9mIGxvbmcgZGF0YSBwb3N0LXByb2Nlc3NpbmcgdGltZXMuCi0KIFRoZSA6bW9kOmBwcm9maWxlYCBhbmQgOm1vZDpgY1Byb2ZpbGVgIG1vZHVsZXMgZXhwb3J0IHRoZSBzYW1lIGludGVyZmFjZSwgc28KIHRoZXkgYXJlIG1vc3RseSBpbnRlcmNoYW5nZWFibGVzOyA6bW9kOmBjUHJvZmlsZWAgaGFzIGEgbXVjaCBsb3dlciBvdmVyaGVhZCBidXQKIGlzIG5vdCBzbyBmYXIgYXMgd2VsbC10ZXN0ZWQgYW5kIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHN5c3RlbXMuCiA6bW9kOmBjUHJvZmlsZWAgaXMgcmVhbGx5IGEgY29tcGF0aWJpbGl0eSBsYXllciBvbiB0b3Agb2YgdGhlIGludGVybmFsCi06bW9kOmBfbHNwcm9mYCBtb2R1bGUuICBUaGUgOm1vZDpgaG90c2hvdGAgbW9kdWxlIGlzIHJlc2VydmVkIHRvIHNwZWNpYWxpemVkCi11c2FnZXMuCis6bW9kOmBfbHNwcm9mYCBtb2R1bGUuCiAKIC4uICUgXHNlY3Rpb257SG93IElzIFRoaXMgUHJvZmlsZXIgRGlmZmVyZW50IEZyb20gVGhlIE9sZCBQcm9maWxlcj99CiAuLiAlIFxub2RlbmFtZXtQcm9maWxlciBDaGFuZ2VzfQpkaWZmIC0tZ2l0IGEvTGliL2hvdHNob3QvX19pbml0X18ucHkgYi9MaWIvaG90c2hvdC9fX2luaXRfXy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmNzg2Ni4uMDAwMDAwMAotLS0gYS9MaWIvaG90c2hvdC9fX2luaXRfXy5weQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSIiIkhpZ2gtcGVyZm9tYW5jZSBsb2dnaW5nIHByb2ZpbGVyLCBtb3N0bHkgd3JpdHRlbiBpbiBDLiIiIgotCi1pbXBvcnQgX2hvdHNob3QKLQotZnJvbSBfaG90c2hvdCBpbXBvcnQgUHJvZmlsZXJFcnJvcgotCi0KLWNsYXNzIFByb2ZpbGU6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ2ZuLCBsaW5lZXZlbnRzPTAsIGxpbmV0aW1pbmdzPTEpOgotICAgICAgICBzZWxmLmxpbmVldmVudHMgPSBsaW5lZXZlbnRzIGFuZCAxIG9yIDAKLSAgICAgICAgc2VsZi5saW5ldGltaW5ncyA9IChsaW5ldGltaW5ncyBhbmQgbGluZWV2ZW50cykgYW5kIDEgb3IgMAotICAgICAgICBzZWxmLl9wcm9mID0gcCA9IF9ob3RzaG90LnByb2ZpbGVyKAotICAgICAgICAgICAgbG9nZm4sIHNlbGYubGluZWV2ZW50cywgc2VsZi5saW5ldGltaW5ncykKLQotICAgICAgICAjIEF0dGVtcHQgdG8gYXZvaWQgY29uZnVzaW5nIHJlc3VsdHMgY2F1c2VkIGJ5IHRoZSBwcmVzZW5jZSBvZgotICAgICAgICAjIFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBidXQgb25seSBpZiB3ZSBjYW4KLSAgICAgICAgIyBiZSBzdXJlIHRoZSBtZXRob2RzIGhhdmUgbm90IGJlZW4gb3ZlcnJpZGRlbiBvciBleHRlbmRlZC4KLSAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgUHJvZmlsZToKLSAgICAgICAgICAgIHNlbGYuY2xvc2UgPSBwLmNsb3NlCi0gICAgICAgICAgICBzZWxmLnN0YXJ0ID0gcC5zdGFydAotICAgICAgICAgICAgc2VsZi5zdG9wID0gcC5zdG9wCi0gICAgICAgICAgICBzZWxmLmFkZGluZm8gPSBwLmFkZGluZm8KLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgIiIiQ2xvc2UgdGhlIGxvZ2ZpbGUgYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZmlsZXIuIiIiCi0gICAgICAgIHNlbGYuX3Byb2YuY2xvc2UoKQotCi0gICAgZGVmIGZpbGVubyhzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHByb2ZpbGVyJ3MgbG9nIGZpbGUuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLl9wcm9mLmZpbGVubygpCi0KLSAgICBkZWYgc3RhcnQoc2VsZik6Ci0gICAgICAgICIiIlN0YXJ0IHRoZSBwcm9maWxlci4iIiIKLSAgICAgICAgc2VsZi5fcHJvZi5zdGFydCgpCi0KLSAgICBkZWYgc3RvcChzZWxmKToKLSAgICAgICAgIiIiU3RvcCB0aGUgcHJvZmlsZXIuIiIiCi0gICAgICAgIHNlbGYuX3Byb2Yuc3RvcCgpCi0KLSAgICBkZWYgYWRkaW5mbyhzZWxmLCBrZXksIHZhbHVlKToKLSAgICAgICAgIiIiQWRkIGFuIGFyYml0cmFyeSBsYWJlbGxlZCB2YWx1ZSB0byB0aGUgcHJvZmlsZSBsb2cuIiIiCi0gICAgICAgIHNlbGYuX3Byb2YuYWRkaW5mbyhrZXksIHZhbHVlKQotCi0gICAgIyBUaGVzZSBtZXRob2RzIG9mZmVyIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgcHJvZmlsZS5Qcm9maWxlIGNsYXNzLAotICAgICMgYnV0IGRlbGVnYXRlIG1vc3Qgb2YgdGhlIHdvcmsgdG8gdGhlIEMgaW1wbGVtZW50YXRpb24gdW5kZXJuZWF0aC4KLQotICAgIGRlZiBydW4oc2VsZiwgY21kKToKLSAgICAgICAgIiIiUHJvZmlsZSBhbiBleGVjLWNvbXBhdGlibGUgc3RyaW5nIGluIHRoZSBzY3JpcHQKLSAgICAgICAgZW52aXJvbm1lbnQuCi0KLSAgICAgICAgVGhlIGdsb2JhbHMgZnJvbSB0aGUgX19tYWluX18gbW9kdWxlIGFyZSB1c2VkIGFzIGJvdGggdGhlCi0gICAgICAgIGdsb2JhbHMgYW5kIGxvY2FscyBmb3IgdGhlIHNjcmlwdC4KLSAgICAgICAgIiIiCi0gICAgICAgIGltcG9ydCBfX21haW5fXwotICAgICAgICBkaWN0ID0gX19tYWluX18uX19kaWN0X18KLSAgICAgICAgcmV0dXJuIHNlbGYucnVuY3R4KGNtZCwgZGljdCwgZGljdCkKLQotICAgIGRlZiBydW5jdHgoc2VsZiwgY21kLCBnbG9iYWxzLCBsb2NhbHMpOgotICAgICAgICAiIiJFdmFsdWF0ZSBhbiBleGVjLWNvbXBhdGlibGUgc3RyaW5nIGluIGEgc3BlY2lmaWMKLSAgICAgICAgZW52aXJvbm1lbnQuCi0KLSAgICAgICAgVGhlIHN0cmluZyBpcyBjb21waWxlZCBiZWZvcmUgcHJvZmlsaW5nIGJlZ2lucy4KLSAgICAgICAgIiIiCi0gICAgICAgIGNvZGUgPSBjb21waWxlKGNtZCwgIjxzdHJpbmc+IiwgImV4ZWMiKQotICAgICAgICBzZWxmLl9wcm9mLnJ1bmNvZGUoY29kZSwgZ2xvYmFscywgbG9jYWxzKQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIHJ1bmNhbGwoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3cpOgotICAgICAgICAiIiJQcm9maWxlIGEgc2luZ2xlIGNhbGwgb2YgYSBjYWxsYWJsZS4KLQotICAgICAgICBBZGRpdGlvbmFsIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG1heSBiZSBwYXNzZWQKLSAgICAgICAgYWxvbmc7IHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgaXMgcmV0dXJuZWQsIGFuZCBleGNlcHRpb25zIGFyZQotICAgICAgICBhbGxvd2VkIHRvIHByb3BvZ2F0ZSBjbGVhbmx5LCB3aGlsZSBlbnN1cmluZyB0aGF0IHByb2ZpbGluZyBpcwotICAgICAgICBkaXNhYmxlZCBvbiB0aGUgd2F5IG91dC4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmLl9wcm9mLnJ1bmNhbGwoZnVuYywgYXJncywga3cpCmRpZmYgLS1naXQgYS9MaWIvaG90c2hvdC9sb2cucHkgYi9MaWIvaG90c2hvdC9sb2cucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTE4MjUuLjAwMDAwMDAKLS0tIGEvTGliL2hvdHNob3QvbG9nLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLWltcG9ydCBfaG90c2hvdAotaW1wb3J0IG9zLnBhdGgKLWltcG9ydCBwYXJzZXIKLWltcG9ydCBzeW1ib2wKLWltcG9ydCBzeXMKLQotZnJvbSBfaG90c2hvdCBpbXBvcnQgXAotICAgICBXSEFUX0VOVEVSLCBcCi0gICAgIFdIQVRfRVhJVCwgXAotICAgICBXSEFUX0xJTkVOTywgXAotICAgICBXSEFUX0RFRklORV9GSUxFLCBcCi0gICAgIFdIQVRfREVGSU5FX0ZVTkMsIFwKLSAgICAgV0hBVF9BRERfSU5GTwotCi0KLV9fYWxsX18gPSBbIkxvZ1JlYWRlciIsICJFTlRFUiIsICJFWElUIiwgIkxJTkUiXQotCi0KLUVOVEVSID0gV0hBVF9FTlRFUgotRVhJVCAgPSBXSEFUX0VYSVQKLUxJTkUgID0gV0hBVF9MSU5FTk8KLQotCi1jbGFzcyBMb2dSZWFkZXI6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ2ZuKToKLSAgICAgICAgIyBmaWxlbm8gLT4gZmlsZW5hbWUKLSAgICAgICAgc2VsZi5fZmlsZW1hcCA9IHt9Ci0gICAgICAgICMgKGZpbGVubywgbGluZW5vKSAtPiBmaWxlbmFtZSwgZnVuY25hbWUKLSAgICAgICAgc2VsZi5fZnVuY21hcCA9IHt9Ci0KLSAgICAgICAgc2VsZi5fcmVhZGVyID0gX2hvdHNob3QubG9ncmVhZGVyKGxvZ2ZuKQotICAgICAgICBzZWxmLl9uZXh0aXRlbSA9IHNlbGYuX3JlYWRlci5fX25leHRfXwotICAgICAgICBzZWxmLl9pbmZvID0gc2VsZi5fcmVhZGVyLmluZm8KLSAgICAgICAgaWYgJ2N1cnJlbnQtZGlyZWN0b3J5JyBpbiBzZWxmLl9pbmZvOgotICAgICAgICAgICAgc2VsZi5jd2QgPSBzZWxmLl9pbmZvWydjdXJyZW50LWRpcmVjdG9yeSddCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmN3ZCA9IE5vbmUKLQotICAgICAgICAjIFRoaXMgbWlycm9ycyB0aGUgY2FsbCBzdGFjayBvZiB0aGUgcHJvZmlsZWQgY29kZSBhcyB0aGUgbG9nCi0gICAgICAgICMgaXMgcmVhZCBiYWNrIGluLiAgSXQgY29udGFpbnMgdHVwbGVzIG9mIHRoZSBmb3JtOgotICAgICAgICAjCi0gICAgICAgICMgICAoZmlsZSBuYW1lLCBsaW5lIG51bWJlciBvZiBmdW5jdGlvbiBkZWYsIGZ1bmN0aW9uIG5hbWUpCi0gICAgICAgICMKLSAgICAgICAgc2VsZi5fc3RhY2sgPSBbXQotICAgICAgICBzZWxmLl9hcHBlbmQgPSBzZWxmLl9zdGFjay5hcHBlbmQKLSAgICAgICAgc2VsZi5fcG9wID0gc2VsZi5fc3RhY2sucG9wCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuX3JlYWRlci5jbG9zZSgpCi0KLSAgICBkZWYgZmlsZW5vKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgbG9nIHJlYWRlcidzIGxvZyBmaWxlLiIiIgotICAgICAgICByZXR1cm4gc2VsZi5fcmVhZGVyLmZpbGVubygpCi0KLSAgICBkZWYgYWRkaW5mbyhzZWxmLCBrZXksIHZhbHVlKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBlYWNoIGFkZGl0aW9uYWwgQUREX0lORk8gcmVjb3JkLgotCi0gICAgICAgIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byByZWNlaXZlCi0gICAgICAgIHRoZXNlIGV2ZW50cy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUKLSAgICAgICAgY2FsbGVkIGJ5IGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMuCi0KLSAgICAgICAgVGhlIGluaXRpYWwgc2V0IG9mIEFERF9JTkZPIHJlY29yZHMgZG8gbm90IHBhc3MgdGhyb3VnaCB0aGlzCi0gICAgICAgIG1lY2hhbmlzbTsgdGhpcyBpcyBvbmx5IG5lZWRlZCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuCi0gICAgICAgIG5ldyB2YWx1ZXMgYXJlIGFkZGVkLiAgU3ViY2xhc3NlcyBjYW4gaW5zcGVjdCBzZWxmLl9pbmZvIGFmdGVyCi0gICAgICAgIGNhbGxpbmcgTG9nUmVhZGVyLl9faW5pdF9fKCkuCi0gICAgICAgICIiIgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgZ2V0X2ZpbGVuYW1lKHNlbGYsIGZpbGVubyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9maWxlbWFwW2ZpbGVub10KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBmaWxlbm8iKQotCi0gICAgZGVmIGdldF9maWxlbmFtZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9maWxlbWFwLnZhbHVlcygpCi0KLSAgICBkZWYgZ2V0X2ZpbGVubyhzZWxmLCBmaWxlbmFtZSk6Ci0gICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLm5vcm1wYXRoKGZpbGVuYW1lKSkKLSAgICAgICAgZm9yIGZpbGVubywgbmFtZSBpbiBzZWxmLl9maWxlbWFwLml0ZW1zKCk6Ci0gICAgICAgICAgICBpZiBuYW1lID09IGZpbGVuYW1lOgotICAgICAgICAgICAgICAgIHJldHVybiBmaWxlbm8KLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBmaWxlbmFtZSIpCi0KLSAgICBkZWYgZ2V0X2Z1bmNuYW1lKHNlbGYsIGZpbGVubywgbGluZW5vKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBmdW5jdGlvbiBsb2NhdGlvbiIpCi0KLSAgICAjIEl0ZXJhdGlvbiBzdXBwb3J0OgotICAgICMgVGhpcyBhZGRzIGFuIG9wdGlvbmFsICgmIGlnbm9yZWQpIHBhcmFtZXRlciB0byBuZXh0KCkgc28gdGhhdCB0aGUKLSAgICAjIHNhbWUgYm91bmQgbWV0aG9kIGNhbiBiZSB1c2VkIGFzIHRoZSBfX2dldGl0ZW1fXygpIG1ldGhvZCAtLSB0aGlzCi0gICAgIyBhdm9pZHMgdXNpbmcgYW4gYWRkaXRpb25hbCBtZXRob2QgY2FsbCB3aGljaCBraWxscyB0aGUgcGVyZm9ybWFuY2UuCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZiwgaW5kZXg9MCk6Ci0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAjIFRoaXMgY2FsbCBtYXkgcmFpc2UgU3RvcEl0ZXJhdGlvbjoKLSAgICAgICAgICAgIHdoYXQsIHRkZWx0YSwgZmlsZW5vLCBsaW5lbm8gPSBzZWxmLl9uZXh0aXRlbSgpCi0KLSAgICAgICAgICAgICMgaGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBjYXNlcyBmaXJzdAotCi0gICAgICAgICAgICBpZiB3aGF0ID09IFdIQVRfRU5URVI6Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmNuYW1lID0gc2VsZi5fZGVjb2RlX2xvY2F0aW9uKGZpbGVubywgbGluZW5vKQotICAgICAgICAgICAgICAgIHQgPSAoZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUpCi0gICAgICAgICAgICAgICAgc2VsZi5fYXBwZW5kKHQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdoYXQsIHQsIHRkZWx0YQotCi0gICAgICAgICAgICBpZiB3aGF0ID09IFdIQVRfRVhJVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gd2hhdCwgc2VsZi5fcG9wKCksIHRkZWx0YQotCi0gICAgICAgICAgICBpZiB3aGF0ID09IFdIQVRfTElORU5POgotICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmaXJzdGxpbmVubywgZnVuY25hbWUgPSBzZWxmLl9zdGFja1stMV0KLSAgICAgICAgICAgICAgICByZXR1cm4gd2hhdCwgKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lKSwgdGRlbHRhCi0KLSAgICAgICAgICAgIGlmIHdoYXQgPT0gV0hBVF9ERUZJTkVfRklMRToKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5ub3JtcGF0aCh0ZGVsdGEpKQotICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVtYXBbZmlsZW5vXSA9IGZpbGVuYW1lCi0gICAgICAgICAgICBlbGlmIHdoYXQgPT0gV0hBVF9ERUZJTkVfRlVOQzoKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuX2ZpbGVtYXBbZmlsZW5vXQotICAgICAgICAgICAgICAgIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0gPSAoZmlsZW5hbWUsIHRkZWx0YSkKLSAgICAgICAgICAgIGVsaWYgd2hhdCA9PSBXSEFUX0FERF9JTkZPOgotICAgICAgICAgICAgICAgICMgdmFsdWUgYWxyZWFkeSBsb2FkZWQgaW50byBzZWxmLmluZm87IGNhbGwgdGhlCi0gICAgICAgICAgICAgICAgIyBvdmVycmlkYWJsZSBhZGRpbmZvKCkgaGFuZGxlciBzbyBoaWdoZXItbGV2ZWwgY29kZQotICAgICAgICAgICAgICAgICMgY2FuIHBpY2sgdXAgdGhlIG5ldyB2YWx1ZQotICAgICAgICAgICAgICAgIGlmIHRkZWx0YSA9PSAnY3VycmVudC1kaXJlY3RvcnknOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmN3ZCA9IGxpbmVubwotICAgICAgICAgICAgICAgIHNlbGYuYWRkaW5mbyh0ZGVsdGEsIGxpbmVubykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBldmVudCB0eXBlIikKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgICMKLSAgICAjICBoZWxwZXJzCi0gICAgIwotCi0gICAgZGVmIF9kZWNvZGVfbG9jYXRpb24oc2VsZiwgZmlsZW5vLCBsaW5lbm8pOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fZnVuY21hcFsoZmlsZW5vLCBsaW5lbm8pXQotICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG9ubHkgYmUgbmVlZGVkIHdoZW4gdGhlIGxvZyBmaWxlIGRvZXMgbm90Ci0gICAgICAgICAgICAjIGNvbnRhaW4gYWxsIHRoZSBERUZJTkVfRlVOQyByZWNvcmRzIG5lZWRlZCB0byBhbGxvdyB0aGUKLSAgICAgICAgICAgICMgZnVuY3Rpb24gbmFtZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbG9nIGZpbGUuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICBpZiBzZWxmLl9sb2FkZmlsZShmaWxlbm8pOgotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZnVuY25hbWUgPSBOb25lCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmNuYW1lID0gc2VsZi5fZnVuY21hcFsoZmlsZW5vLCBsaW5lbm8pXQotICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5fZmlsZW1hcC5nZXQoZmlsZW5vKQotICAgICAgICAgICAgICAgIGZ1bmNuYW1lID0gTm9uZQotICAgICAgICAgICAgICAgIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0gPSAoZmlsZW5hbWUsIGZ1bmNuYW1lKQotICAgICAgICByZXR1cm4gZmlsZW5hbWUsIGZ1bmNuYW1lCi0KLSAgICBkZWYgX2xvYWRmaWxlKHNlbGYsIGZpbGVubyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5fZmlsZW1hcFtmaWxlbm9dCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCJDb3VsZCBub3QgaWRlbnRpZnkgZmlsZUlkIiwgZmlsZW5vKQotICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgIGFic25hbWUgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguam9pbihzZWxmLmN3ZCwgZmlsZW5hbWUpKQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZwID0gb3BlbihhYnNuYW1lKQotICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzdCA9IHBhcnNlci5zdWl0ZShmcC5yZWFkKCkpCi0gICAgICAgIGZwLmNsb3NlKCkKLQotICAgICAgICAjIFNjYW4gdGhlIHRyZWUgbG9va2luZyBmb3IgZGVmIGFuZCBsYW1iZGEgbm9kZXMsIGZpbGxpbmcgaW4KLSAgICAgICAgIyBzZWxmLl9mdW5jbWFwIHdpdGggYWxsIHRoZSBhdmFpbGFibGUgaW5mb3JtYXRpb24uCi0gICAgICAgIGZ1bmNkZWYgPSBzeW1ib2wuZnVuY2RlZgotICAgICAgICBsYW1iZGVmID0gc3ltYm9sLmxhbWJkZWYKLQotICAgICAgICBzdGFjayA9IFtzdC50b3R1cGxlKDEpXQotCi0gICAgICAgIHdoaWxlIHN0YWNrOgotICAgICAgICAgICAgdHJlZSA9IHN0YWNrLnBvcCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc3ltID0gdHJlZVswXQotICAgICAgICAgICAgZXhjZXB0IChJbmRleEVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiBzeW0gPT0gZnVuY2RlZjoKLSAgICAgICAgICAgICAgICBzZWxmLl9mdW5jbWFwWyhmaWxlbm8sIHRyZWVbMl1bMl0pXSA9IGZpbGVuYW1lLCB0cmVlWzJdWzFdCi0gICAgICAgICAgICBlbGlmIHN5bSA9PSBsYW1iZGVmOgotICAgICAgICAgICAgICAgIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgdHJlZVsxXVsyXSldID0gZmlsZW5hbWUsICI8bGFtYmRhPiIKLSAgICAgICAgICAgIHN0YWNrLmV4dGVuZChsaXN0KHRyZWVbMTpdKSkKZGlmZiAtLWdpdCBhL0xpYi9ob3RzaG90L3N0YXRzLnB5IGIvTGliL2hvdHNob3Qvc3RhdHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MjdiZDUuLjAwMDAwMDAKLS0tIGEvTGliL2hvdHNob3Qvc3RhdHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0iIiJTdGF0aXN0aWNzIGFuYWx5emVyIGZvciBIb3RTaG90LiIiIgotCi1pbXBvcnQgcHJvZmlsZQotaW1wb3J0IHBzdGF0cwotCi1pbXBvcnQgaG90c2hvdC5sb2cKLQotZnJvbSBob3RzaG90LmxvZyBpbXBvcnQgRU5URVIsIEVYSVQKLQotCi1kZWYgbG9hZChmaWxlbmFtZSk6Ci0gICAgcmV0dXJuIFN0YXRzTG9hZGVyKGZpbGVuYW1lKS5sb2FkKCkKLQotCi1jbGFzcyBTdGF0c0xvYWRlcjoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nZm4pOgotICAgICAgICBzZWxmLl9sb2dmbiA9IGxvZ2ZuCi0gICAgICAgIHNlbGYuX2NvZGUgPSB7fQotICAgICAgICBzZWxmLl9zdGFjayA9IFtdCi0gICAgICAgIHNlbGYucG9wX2ZyYW1lID0gc2VsZi5fc3RhY2sucG9wCi0KLSAgICBkZWYgbG9hZChzZWxmKToKLSAgICAgICAgIyBUaGUgdGltZXIgc2VsZWN0ZWQgYnkgdGhlIHByb2ZpbGVyIHNob3VsZCBuZXZlciBiZSB1c2VkLCBzbyBtYWtlCi0gICAgICAgICMgc3VyZSBpdCBkb2Vzbid0IHdvcms6Ci0gICAgICAgIHAgPSBQcm9maWxlKCkKLSAgICAgICAgcC5nZXRfdGltZSA9IF9icm9rZW50aW1lcgotICAgICAgICBsb2cgPSBob3RzaG90LmxvZy5Mb2dSZWFkZXIoc2VsZi5fbG9nZm4pCi0gICAgICAgIHRhY2N1bSA9IDAKLSAgICAgICAgZm9yIGV2ZW50IGluIGxvZzoKLSAgICAgICAgICAgIHdoYXQsIChmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSksIHRkZWx0YSA9IGV2ZW50Ci0gICAgICAgICAgICBpZiB0ZGVsdGEgPiAwOgotICAgICAgICAgICAgICAgIHRhY2N1bSArPSB0ZGVsdGEKLQotICAgICAgICAgICAgIyBXZSBtdWx0aXBseSB0YWNjdW0gdG8gY29udmVydCBmcm9tIHRoZSBtaWNyb3NlY29uZHMgd2UKLSAgICAgICAgICAgICMgaGF2ZSB0byB0aGUgc2Vjb25kcyB0aGF0IHRoZSBwcm9maWxlL3BzdGF0cyBtb2R1bGUgd29yawotICAgICAgICAgICAgIyB3aXRoOyB0aGlzIGFsbG93cyB0aGUgbnVtYmVycyB0byBoYXZlIHNvbWUgYmFzaXMgaW4KLSAgICAgICAgICAgICMgcmVhbGl0eSAoaWdub3JpbmcgY2FsaWJyYXRpb24gaXNzdWVzIGZvciBub3cpLgotCi0gICAgICAgICAgICBpZiB3aGF0ID09IEVOVEVSOgotICAgICAgICAgICAgICAgIGZyYW1lID0gc2VsZi5uZXdfZnJhbWUoZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUpCi0gICAgICAgICAgICAgICAgcC50cmFjZV9kaXNwYXRjaF9jYWxsKGZyYW1lLCB0YWNjdW0gKiAuMDAwMDAxKQotICAgICAgICAgICAgICAgIHRhY2N1bSA9IDAKLQotICAgICAgICAgICAgZWxpZiB3aGF0ID09IEVYSVQ6Ci0gICAgICAgICAgICAgICAgZnJhbWUgPSBzZWxmLnBvcF9mcmFtZSgpCi0gICAgICAgICAgICAgICAgcC50cmFjZV9kaXNwYXRjaF9yZXR1cm4oZnJhbWUsIHRhY2N1bSAqIC4wMDAwMDEpCi0gICAgICAgICAgICAgICAgdGFjY3VtID0gMAotCi0gICAgICAgICAgICAjIG5vIGZ1cnRoZXIgd29yayBmb3IgbGluZSBldmVudHMKLQotICAgICAgICBhc3NlcnQgbm90IHNlbGYuX3N0YWNrCi0gICAgICAgIHJldHVybiBwc3RhdHMuU3RhdHMocCkKLQotICAgIGRlZiBuZXdfZnJhbWUoc2VsZiwgKmFyZ3MpOgotICAgICAgICAjIGFyZ3MgbXVzdCBiZSBmaWxlbmFtZSwgZmlyc3RsaW5lbm8sIGZ1bmNuYW1lCi0gICAgICAgICMgb3VyIGNvZGUgb2JqZWN0cyBhcmUgY2FjaGVkIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlCi0gICAgICAgICMgbmV3IG9uZXMgZXZlcnkgdGltZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb2RlID0gc2VsZi5fY29kZVthcmdzXQotICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICBjb2RlID0gRmFrZUNvZGUoKmFyZ3MpCi0gICAgICAgICAgICBzZWxmLl9jb2RlW2FyZ3NdID0gY29kZQotICAgICAgICAjIGZyYW1lIG9iamVjdHMgYXJlIGNyZWF0ZSBmcmVzaCwgc2luY2UgdGhlIGJhY2sgcG9pbnRlciB3aWxsCi0gICAgICAgICMgdmFyeSBjb25zaWRlcmFibHkKLSAgICAgICAgaWYgc2VsZi5fc3RhY2s6Ci0gICAgICAgICAgICBiYWNrID0gc2VsZi5fc3RhY2tbLTFdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBiYWNrID0gTm9uZQotICAgICAgICBmcmFtZSA9IEZha2VGcmFtZShjb2RlLCBiYWNrKQotICAgICAgICBzZWxmLl9zdGFjay5hcHBlbmQoZnJhbWUpCi0gICAgICAgIHJldHVybiBmcmFtZQotCi0KLWNsYXNzIFByb2ZpbGUocHJvZmlsZS5Qcm9maWxlKToKLSAgICBkZWYgc2ltdWxhdGVfY21kX2NvbXBsZXRlKHNlbGYpOgotICAgICAgICBwYXNzCi0KLQotY2xhc3MgRmFrZUNvZGU6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBmaXJzdGxpbmVubywgZnVuY25hbWUpOgotICAgICAgICBzZWxmLmNvX2ZpbGVuYW1lID0gZmlsZW5hbWUKLSAgICAgICAgc2VsZi5jb19maXJzdGxpbmVubyA9IGZpcnN0bGluZW5vCi0gICAgICAgIHNlbGYuY29fbmFtZSA9IHNlbGYuX19uYW1lX18gPSBmdW5jbmFtZQotCi0KLWNsYXNzIEZha2VGcmFtZToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSwgYmFjayk6Ci0gICAgICAgIHNlbGYuZl9iYWNrID0gYmFjawotICAgICAgICBzZWxmLmZfY29kZSA9IGNvZGUKLQotCi1kZWYgX2Jyb2tlbnRpbWVyKCk6Ci0gICAgcmFpc2UgUnVudGltZUVycm9yKCJ0aGlzIHRpbWVyIHNob3VsZCBub3QgYmUgY2FsbGVkIikKZGlmZiAtLWdpdCBhL0xpYi9ob3RzaG90L3N0b25lcy5weSBiL0xpYi9ob3RzaG90L3N0b25lcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5NzRiOS4uMDAwMDAwMAotLS0gYS9MaWIvaG90c2hvdC9zdG9uZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1pbXBvcnQgZXJybm8KLWltcG9ydCBob3RzaG90Ci1pbXBvcnQgaG90c2hvdC5zdGF0cwotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGVzdC5weXN0b25lCi0KLWRlZiBtYWluKGxvZ2ZpbGUpOgotICAgIHAgPSBob3RzaG90LlByb2ZpbGUobG9nZmlsZSkKLSAgICBiZW5jaHRpbWUsIHN0b25lcyA9IHAucnVuY2FsbCh0ZXN0LnB5c3RvbmUucHlzdG9uZXMpCi0gICAgcC5jbG9zZSgpCi0KLSAgICBwcmludCgiUHlzdG9uZSglcykgdGltZSBmb3IgJWQgcGFzc2VzID0gJWciICUgXAotICAgICAgICAgICh0ZXN0LnB5c3RvbmUuX192ZXJzaW9uX18sIHRlc3QucHlzdG9uZS5MT09QUywgYmVuY2h0aW1lKSkKLSAgICBwcmludCgiVGhpcyBtYWNoaW5lIGJlbmNobWFya3MgYXQgJWcgcHlzdG9uZXMvc2Vjb25kIiAlIHN0b25lcykKLQotICAgIHN0YXRzID0gaG90c2hvdC5zdGF0cy5sb2FkKGxvZ2ZpbGUpCi0gICAgc3RhdHMuc3RyaXBfZGlycygpCi0gICAgc3RhdHMuc29ydF9zdGF0cygndGltZScsICdjYWxscycpCi0gICAgdHJ5OgotICAgICAgICBzdGF0cy5wcmludF9zdGF0cygyMCkKLSAgICBleGNlcHQgSU9FcnJvciBhcyBlOgotICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVQSVBFOgotICAgICAgICAgICAgcmFpc2UKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBpZiBzeXMuYXJndlsxOl06Ci0gICAgICAgIG1haW4oc3lzLmFyZ3ZbMV0pCi0gICAgZWxzZToKLSAgICAgICAgaW1wb3J0IHRlbXBmaWxlCi0gICAgICAgIG1haW4odGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkubmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaG90c2hvdC5weSBiL0xpYi90ZXN0L3Rlc3RfaG90c2hvdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkODhmNy4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC90ZXN0X2hvdHNob3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotaW1wb3J0IGhvdHNob3QKLWltcG9ydCBob3RzaG90LmxvZwotaW1wb3J0IG9zCi1pbXBvcnQgcHByaW50Ci1pbXBvcnQgdW5pdHRlc3QKLQotZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKLQotZnJvbSBob3RzaG90LmxvZyBpbXBvcnQgRU5URVIsIEVYSVQsIExJTkUKLQotCi1kZWYgc2hvcnRmaWxlbmFtZShmbik6Ci0gICAgIyBXZSB1c2UgYSByZWFsbHkgc2hvcnRlbmVkIGZpbGVuYW1lIHNpbmNlIGFuIGV4YWN0IG1hdGNoIGlzIG1hZGUsCi0gICAgIyBhbmQgdGhlIHNvdXJjZSBtYXkgYmUgZWl0aGVyIGEgUHl0aG9uIHNvdXJjZSBmaWxlIG9yIGEKLSAgICAjIHByZS1jb21waWxlZCBieXRlY29kZSBmaWxlLgotICAgIGlmIGZuOgotICAgICAgICByZXR1cm4gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZuKSlbMF0KLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gZm4KLQotCi1jbGFzcyBVbmxpbmtpbmdMb2dSZWFkZXIoaG90c2hvdC5sb2cuTG9nUmVhZGVyKToKLSAgICAiIiJFeHRlbmQgdGhlIExvZ1JlYWRlciBzbyB0aGUgbG9nIGZpbGUgaXMgdW5saW5rZWQgd2hlbiB3ZSdyZQotICAgIGRvbmUgd2l0aCBpdC4iIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dmbik6Ci0gICAgICAgIHNlbGYuX19sb2dmbiA9IGxvZ2ZuCi0gICAgICAgIGhvdHNob3QubG9nLkxvZ1JlYWRlci5fX2luaXRfXyhzZWxmLCBsb2dmbikKLQotICAgIGRlZiBuZXh0KHNlbGYsIGluZGV4PU5vbmUpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gaG90c2hvdC5sb2cuTG9nUmVhZGVyLm5leHQoc2VsZikKLSAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIG9zLnVubGluayhzZWxmLl9fbG9nZm4pCi0gICAgICAgICAgICByYWlzZQotCi0KLWNsYXNzIEhvdFNob3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIG5ld19wcm9maWxlcihzZWxmLCBsaW5lZXZlbnRzPTAsIGxpbmV0aW1pbmdzPTEpOgotICAgICAgICBzZWxmLmxvZ2ZuID0gdGVzdF9zdXBwb3J0LlRFU1RGTgotICAgICAgICByZXR1cm4gaG90c2hvdC5Qcm9maWxlKHNlbGYubG9nZm4sIGxpbmVldmVudHMsIGxpbmV0aW1pbmdzKQotCi0gICAgZGVmIGdldF9sb2dyZWFkZXIoc2VsZik6Ci0gICAgICAgIHJldHVybiBVbmxpbmtpbmdMb2dSZWFkZXIoc2VsZi5sb2dmbikKLQotICAgIGRlZiBnZXRfZXZlbnRzX3dvdGltZShzZWxmKToKLSAgICAgICAgTCA9IFtdCi0gICAgICAgIGZvciBldmVudCBpbiBzZWxmLmdldF9sb2dyZWFkZXIoKToKLSAgICAgICAgICAgIHdoYXQsIChmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSksIHRkZWx0YSA9IGV2ZW50Ci0gICAgICAgICAgICBMLmFwcGVuZCgod2hhdCwgKHNob3J0ZmlsZW5hbWUoZmlsZW5hbWUpLCBsaW5lbm8sIGZ1bmNuYW1lKSkpCi0gICAgICAgIHJldHVybiBMCi0KLSAgICBkZWYgY2hlY2tfZXZlbnRzKHNlbGYsIGV4cGVjdGVkKToKLSAgICAgICAgZXZlbnRzID0gc2VsZi5nZXRfZXZlbnRzX3dvdGltZSgpCi0gICAgICAgIGlmIGV2ZW50cyAhPSBleHBlY3RlZDoKLSAgICAgICAgICAgIHNlbGYuZmFpbCgKLSAgICAgICAgICAgICAgICAiZXZlbnRzIGRpZCBub3QgbWF0Y2ggZXhwZWN0YXRpb247IGdvdDpcbiVzXG5leHBlY3RlZDpcbiVzIgotICAgICAgICAgICAgICAgICUgKHBwcmludC5wZm9ybWF0KGV2ZW50cyksIHBwcmludC5wZm9ybWF0KGV4cGVjdGVkKSkpCi0KLSAgICBkZWYgcnVuX3Rlc3Qoc2VsZiwgY2FsbGFibGUsIGV2ZW50cywgcHJvZmlsZXI9Tm9uZSk6Ci0gICAgICAgIGlmIHByb2ZpbGVyIGlzIE5vbmU6Ci0gICAgICAgICAgICBwcm9maWxlciA9IHNlbGYubmV3X3Byb2ZpbGVyKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBwcm9maWxlci5fcHJvZi5jbG9zZWQpCi0gICAgICAgIHByb2ZpbGVyLnJ1bmNhbGwoY2FsbGFibGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgcHJvZmlsZXIuX3Byb2YuY2xvc2VkKQotICAgICAgICBwcm9maWxlci5jbG9zZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhwcm9maWxlci5fcHJvZi5jbG9zZWQpCi0gICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGV2ZW50cykKLQotICAgIGRlZiB0ZXN0X2FkZGluZm8oc2VsZik6Ci0gICAgICAgIGRlZiBmKHApOgotICAgICAgICAgICAgcC5hZGRpbmZvKCJ0ZXN0LWtleSIsICJ0ZXN0LXZhbHVlIikKLSAgICAgICAgcHJvZmlsZXIgPSBzZWxmLm5ld19wcm9maWxlcigpCi0gICAgICAgIHByb2ZpbGVyLnJ1bmNhbGwoZiwgcHJvZmlsZXIpCi0gICAgICAgIHByb2ZpbGVyLmNsb3NlKCkKLSAgICAgICAgbG9nID0gc2VsZi5nZXRfbG9ncmVhZGVyKCkKLSAgICAgICAgaW5mbyA9IGxvZy5faW5mbwotICAgICAgICBsaXN0KGxvZykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWyJ0ZXN0LWtleSJdLCBbInRlc3QtdmFsdWUiXSkKLQotICAgIGRlZiB0ZXN0X2xpbmVfbnVtYmVycyhzZWxmKToKLSAgICAgICAgZGVmIGYoKToKLSAgICAgICAgICAgIHkgPSAyCi0gICAgICAgICAgICB4ID0gMQotICAgICAgICBkZWYgZygpOgotICAgICAgICAgICAgZigpCi0gICAgICAgIGZfbGluZW5vID0gZi5fX2NvZGVfXy5jb19maXJzdGxpbmVubwotICAgICAgICBnX2xpbmVubyA9IGcuX19jb2RlX18uY29fZmlyc3RsaW5lbm8KLSAgICAgICAgZXZlbnRzID0gWyhFTlRFUiwgKCJ0ZXN0X2hvdHNob3QiLCBnX2xpbmVubywgImciKSksCi0gICAgICAgICAgICAgICAgICAoTElORSwgICgidGVzdF9ob3RzaG90IiwgZ19saW5lbm8rMSwgImciKSksCi0gICAgICAgICAgICAgICAgICAoRU5URVIsICgidGVzdF9ob3RzaG90IiwgZl9saW5lbm8sICJmIikpLAotICAgICAgICAgICAgICAgICAgKExJTkUsICAoInRlc3RfaG90c2hvdCIsIGZfbGluZW5vKzEsICJmIikpLAotICAgICAgICAgICAgICAgICAgKExJTkUsICAoInRlc3RfaG90c2hvdCIsIGZfbGluZW5vKzIsICJmIikpLAotICAgICAgICAgICAgICAgICAgKEVYSVQsICAoInRlc3RfaG90c2hvdCIsIGZfbGluZW5vLCAiZiIpKSwKLSAgICAgICAgICAgICAgICAgIChFWElULCAgKCJ0ZXN0X2hvdHNob3QiLCBnX2xpbmVubywgImciKSksCi0gICAgICAgICAgICAgICAgICBdCi0gICAgICAgIHNlbGYucnVuX3Rlc3QoZywgZXZlbnRzLCBzZWxmLm5ld19wcm9maWxlcihsaW5lZXZlbnRzPTEpKQotCi0gICAgZGVmIHRlc3Rfc3RhcnRfc3RvcChzZWxmKToKLSAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmV0dXJuIE5VTEwgaW4gdGhlIHN0YXJ0KCkgYW5kIHN0b3AoKQotICAgICAgICAjIG1ldGhvZHMgd2hlbiB0aGVyZSBpc24ndCBhbiBlcnJvci4gIEJ1ZyBpbiAyLjIgbm90ZWQgYnkKLSAgICAgICAgIyBBbnRob255IEJheHRlci4KLSAgICAgICAgcHJvZmlsZXIgPSBzZWxmLm5ld19wcm9maWxlcigpCi0gICAgICAgIHByb2ZpbGVyLnN0YXJ0KCkKLSAgICAgICAgcHJvZmlsZXIuc3RvcCgpCi0gICAgICAgIHByb2ZpbGVyLmNsb3NlKCkKLSAgICAgICAgb3MudW5saW5rKHNlbGYubG9nZm4pCi0KLSAgICBkZWYgdGVzdF9iYWRfc3lzX3BhdGgoc2VsZik6Ci0gICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgaW1wb3J0IG9zCi0gICAgICAgIG9yaWdfcGF0aCA9IHN5cy5wYXRoCi0gICAgICAgIGNvdmVyYWdlID0gaG90c2hvdC5faG90c2hvdC5jb3ZlcmFnZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICAjIHZlcmlmeSB3ZSByZXF1aXJlIGEgbGlzdCBmb3Igc3lzLnBhdGgKLSAgICAgICAgICAgIHN5cy5wYXRoID0gJ2FiYycKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY292ZXJhZ2UsIHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIHJlcXVpcmUgc3lzLnBhdGggZXhpc3RzCi0gICAgICAgICAgICBkZWwgc3lzLnBhdGgKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY292ZXJhZ2UsIHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzeXMucGF0aCA9IG9yaWdfcGF0aAotICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTik6Ci0gICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0KLWRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhvdFNob3RUZXN0Q2FzZSkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5wcmUuaW4gYi9NYWtlZmlsZS5wcmUuaW4KaW5kZXggNWRmMDNmNS4uNDVmNzcxYSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUucHJlLmluCisrKyBiL01ha2VmaWxlLnByZS5pbgpAQCAtNzM3LDcgKzczNyw3IEBACiBQTEFUTUFDUEFUSD06cGxhdC1tYWM6cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzCiBMSUJTVUJESVJTPQlsaWItdGsgc2l0ZS1wYWNrYWdlcyB0ZXN0IHRlc3Qvb3V0cHV0IHRlc3QvZGF0YSBcCiAJCXRlc3QvZGVjaW1hbHRlc3RkYXRhIFwKLQkJZW5jb2RpbmdzIGhvdHNob3QgXAorCQllbmNvZGluZ3MgXAogCQllbWFpbCBlbWFpbC9taW1lIGVtYWlsL3Rlc3QgZW1haWwvdGVzdC9kYXRhIFwKIAkJc3FsaXRlMyBzcWxpdGUzL3Rlc3QgXAogCQlsb2dnaW5nIGJzZGRiIGJzZGRiL3Rlc3QgY3N2IHdzZ2lyZWYgXApkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IGFiMGE3NTMuLmJhMzc4OTEgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTQsNiArNCwxNiBAQAogCiAoZWRpdG9yczogY2hlY2sgTkVXUy5oZWxwIGZvciBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIE5FV1MgdXNpbmcgUmVTVC4pCiAKK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuMGEyPworCisqVW5yZWxlYXNlZCoKKworRXh0ZW5zaW9uIE1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gVGhlIGBob3RzaG90YCBwcm9maWxlciBoYXMgYmVlbiByZW1vdmVkOyB1c2UgYGNQcm9maWxlYCBpbnN0ZWFkLgorCisKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuMGExPwogPT09PT09PT09PT09PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faG90c2hvdC5jIGIvTW9kdWxlcy9faG90c2hvdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRjNTQzLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX2hvdHNob3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NDUgKzAsMCBAQAotLyoKLSAqIFRoaXMgaXMgdGhlIEhpZ2ggUGVyZm9ybWFuY2UgUHl0aG9uIFByb2ZpbGVyIHBvcnRpb24gb2YgSG90U2hvdC4KLSAqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCi0jaW5jbHVkZSAiY29kZS5oIgotI2luY2x1ZGUgImV2YWwuaCIKLSNpbmNsdWRlICJmcmFtZW9iamVjdC5oIgotI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgotCi0vKgotICogV2hpY2ggdGltZXIgdG8gdXNlIHNob3VsZCBiZSBtYWRlIG1vcmUgY29uZmlndXJhYmxlLCBidXQgdGhhdCBzaG91bGQgbm90Ci0gKiBiZSBkaWZmaWN1bHQuICBUaGlzIHdpbGwgZG8gZm9yIG5vdy4KLSAqLwotI2lmZGVmIE1TX1dJTkRPV1MKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpZmRlZiBIQVZFX0RJUkVDVF9ICi0jaW5jbHVkZSA8ZGlyZWN0Lmg+ICAgIC8qIGZvciBnZXRjd2QoKSAqLwotI2VuZGlmCi0KLXR5cGVkZWYgX19pbnQ2NCBoc190aW1lOwotI2RlZmluZSBHRVRUSU1FT0ZEQVkoUF9IU19USU1FKSBcCi0JeyBMQVJHRV9JTlRFR0VSIF90ZW1wOyBcCi0JICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmX3RlbXApOyBcCi0JICAqKFBfSFNfVElNRSkgPSBfdGVtcC5RdWFkUGFydDsgfQotCSAgCi0KLSNlbHNlCi0jaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCi0jZXJyb3IgIlRoaXMgbW9kdWxlIHJlcXVpcmVzIGdldHRpbWVvZmRheSgpIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyEiCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykpIHx8IGRlZmluZWQoX19RTlhfXykKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotdHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCBoc190aW1lOwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoaW5saW5lKQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIGlubGluZSBfX2lubGluZQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBpbmxpbmUKLSNkZWZpbmUgaW5saW5lCi0jZW5kaWYKLQotI2RlZmluZSBCVUZGRVJTSVpFIDEwMjQwCi0KLSNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotI2RlZmluZSBQQVRIX01BWCAyNjAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX3NnaSkgJiYgX0NPTVBJTEVSX1ZFUlNJT04+NzAwICYmICFkZWZpbmVkKFBBVEhfTUFYKQotLyogZml4IFBBVEhfTUFYIG5vdCBiZWluZyBkZWZpbmVkIHdpdGggTUlQU1BybyA3LngKLSAgIGlmIG1vZGUgaXMgQU5TSSBDIChkZWZhdWx0KSAqLwotI2RlZmluZSBQQVRIX01BWCAxMDI0Ci0jZW5kaWYKLQotI2lmbmRlZiBQQVRIX01BWAotIyAgIGlmZGVmIE1BWF9QQVRICi0jICAgICAgIGRlZmluZSBQQVRIX01BWCBNQVhfUEFUSAotIyAgIGVsaWYgZGVmaW5lZCAoX1BPU0lYX1BBVEhfTUFYKQotIyAgICAgICBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCi0jICAgZWxzZQotIyAgICAgICBlcnJvciAiTmVlZCBhIGRlZm4uIGZvciBQQVRIX01BWCBpbiBfaG90c2hvdC5jIgotIyAgIGVuZGlmCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqZmlsZW1hcDsKLSAgICBQeU9iamVjdCAqbG9nZmlsZW5hbWU7Ci0gICAgUHlfc3NpemVfdCBpbmRleDsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltCVUZGRVJTSVpFXTsKLSAgICBGSUxFICpsb2dmcDsKLSAgICBpbnQgbGluZWV2ZW50czsKLSAgICBpbnQgbGluZXRpbWluZ3M7Ci0gICAgaW50IGZyYW1ldGltaW5nczsKLSAgICAvKiBzaXplX3QgZmlsbGVkOyAqLwotICAgIGludCBhY3RpdmU7Ci0gICAgaW50IG5leHRfZmlsZW5vOwotICAgIGhzX3RpbWUgcHJldl90aW1lb2ZkYXk7Ci19IFByb2ZpbGVyT2JqZWN0OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICppbmZvOwotICAgIEZJTEUgKmxvZ2ZwOwotICAgIGludCBsaW5ldGltaW5nczsKLSAgICBpbnQgZnJhbWV0aW1pbmdzOwotfSBMb2dSZWFkZXJPYmplY3Q7Ci0KLXN0YXRpYyBQeU9iamVjdCAqIFByb2ZpbGVyRXJyb3IgPSBOVUxMOwotCi0KLSNpZm5kZWYgTVNfV0lORE9XUwotI2lmZGVmIEdFVFRJTUVPRkRBWV9OT19UWgotI2RlZmluZSBHRVRUSU1FT0ZEQVkocHR2KSBnZXR0aW1lb2ZkYXkoKHB0dikpCi0jZWxzZQotI2RlZmluZSBHRVRUSU1FT0ZEQVkocHR2KSBnZXR0aW1lb2ZkYXkoKHB0diksIChzdHJ1Y3QgdGltZXpvbmUgKilOVUxMKQotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBUaGUgbG9nIHJlYWRlci4uLiAqLwotCi1QeURvY19TVFJWQVIobG9ncmVhZGVyX2Nsb3NlX19kb2NfXywKLSJjbG9zZSgpXG4iCi0iQ2xvc2UgdGhlIGxvZyBmaWxlLCBwcmV2ZW50aW5nIGFkZGl0aW9uYWwgcmVjb3JkcyBmcm9tIGJlaW5nIHJlYWQuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1sb2dyZWFkZXJfY2xvc2UoTG9nUmVhZGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBpZiAoc2VsZi0+bG9nZnAgIT0gTlVMTCkgewotICAgICAgICBmY2xvc2Uoc2VsZi0+bG9nZnApOwotICAgICAgICBzZWxmLT5sb2dmcCA9IE5VTEw7Ci0gICAgfQotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLQotICAgIHJldHVybiBQeV9Ob25lOwotfQotCi1QeURvY19TVFJWQVIobG9ncmVhZGVyX2ZpbGVub19fZG9jX18sCi0iZmlsZW5vKCkgLT4gZmlsZSBkZXNjcmlwdG9yXG4iCi0iUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbG9nIGZpbGUsIGlmIG9wZW4uXG4iCi0iUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIGxvZyBmaWxlIGlzIGNsb3NlZC4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLWxvZ3JlYWRlcl9maWxlbm8oTG9nUmVhZGVyT2JqZWN0ICpzZWxmKQotewotICAgIGlmIChzZWxmLT5sb2dmcCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImxvZ3JlYWRlcidzIGZpbGUgb2JqZWN0IGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmlsZW5vKHNlbGYtPmxvZ2ZwKSk7Ci19Ci0KLQotLyogTG9nIEZpbGUgRm9ybWF0Ci0gKiAtLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBUaGUgbG9nIGZpbGUgY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiB2YXJpYWJsZS1sZW5ndGggcmVjb3Jkcy4KLSAqIEVhY2ggcmVjb3JkIGlzIGlkZW50aWZpZWQgd2l0aCBhIHJlY29yZCB0eXBlIGlkZW50aWZpZXIgaW4gdHdvCi0gKiBiaXRzIG9mIHRoZSBmaXJzdCBieXRlLiAgVGhlIHR3byBiaXRzIGFyZSB0aGUgImxlYXN0IHNpZ25pZmljYW50IgotICogYml0cyBvZiB0aGUgYnl0ZS4KLSAqCi0gKiBMb3cgYml0czogICAgT3Bjb2RlOiAgICAgICAgTWVhbmluZzoKLSAqICAgICAgIDB4MDAgICAgICAgICBFTlRFUiAgICAgZW50ZXIgYSBmcmFtZQotICogICAgICAgMHgwMSAgICAgICAgICBFWElUICAgICBleGl0IGEgZnJhbWUKLSAqICAgICAgIDB4MDIgICAgICAgIExJTkVOTyAgICAgZXhlY3V0aW9uIG1vdmVkIG9udG8gYSBkaWZmZXJlbnQgbGluZQotICogICAgICAgMHgwMyAgICAgICAgIE9USEVSICAgICBtb3JlIGJpdHMgYXJlIG5lZWRlZCB0byBkZWVjb2RlCi0gKgotICogSWYgdGhlIHR5cGUgaXMgT1RIRVIsIHRoZSByZWNvcmQgaXMgbm90IHBhY2tlZCBzbyB0aWdodGx5LCBhbmQgdGhlCi0gKiByZW1haW5pbmcgYml0cyBhcmUgdXNlZCB0byBkaXNhbWJpZ3VhdGUgdGhlIHJlY29yZCB0eXBlLiAgVGhlc2UKLSAqIHJlY29yZHMgYXJlIG5vdCB1c2VkIGFzIGZyZXF1ZW50bHkgc28gY29tcGFjdGlvbiBpcyBub3QgYW4gaXNzdWUuCi0gKiBFYWNoIG9mIHRoZSBmaXJzdCB0aHJlZSByZWNvcmQgdHlwZXMgaGFzIGEgaGlnaGx5IHRhaWxvcmVkCi0gKiBzdHJ1Y3R1cmUgdGhhdCBhbGxvd3MgaXQgdG8gYmUgcGFja2VkIHRpZ2h0bHkuCi0gKgotICogVGhlIE9USEVSIHJlY29yZHMgaGF2ZSB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOgotICoKLSAqIEZpcnN0IGJ5dGU6ICBPcGNvZGU6ICAgICAgICBNZWFuaW5nOgotICogICAgICAgMHgxMyAgICAgIEFERF9JTkZPICAgICBkZWZpbmUgYSBrZXkvdmFsdWUgcGFpcgotICogICAgICAgMHgyMyAgIERFRklORV9GSUxFICAgICBkZWZpbmUgYW4gaW50LT5maWxlbmFtZSBtYXBwaW5nCi0gKiAgICAgICAweDMzICAgIExJTkVfVElNRVMgICAgIGluZGljYXRlcyBpZiBMSU5FTk8gZXZlbnRzIGhhdmUgdGRlbHRhcwotICogICAgICAgMHg0MyAgIERFRklORV9GVU5DICAgICBkZWZpbmUgYSAoZmlsZW5vLGxpbmVubyktPmZ1bmNuYW1lIG1hcHBpbmcKLSAqICAgICAgIDB4NTMgICBGUkFNRV9USU1FUyAgICAgaW5kaWNhdGVzIGlmIEVOVEVSL0VYSVQgZXZlbnRzIGhhdmUgdGRlbHRhcwotICoKLSAqIFBhY2tlZCBJbnRlZ2VycwotICoKLSAqICJQYWNrZWQgaW50ZWdlcnMiIGFyZSBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZXMgZW5jb2RlZCBhcyBhCi0gKiBzZXF1ZW5jZSBvZiBieXRlcy4gIEVhY2ggYnl0ZSBpcyBlbmNvZGVkIHN1Y2ggdGhhdCB0aGUgbW9zdAotICogc2lnbmlmaWNhbnQgYml0IGlzIHNldCBpZiB0aGUgbmV4dCBieXRlIGlzIGFsc28gcGFydCBvZiB0aGUKLSAqIGludGVnZXIuICBFYWNoIGJ5dGUgcHJvdmlkZXMgYml0cyB0byB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgZW5kIG9mCi0gKiB0aGUgcmVzdWx0OyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgbXVzdCBiZSBzaGlmdGVkIHVwIHRvIHBsYWNlIHRoZQotICogbmV3IGJpdHMgaW50byB0aGUgcmVzdWx0LgotICoKLSAqICJNb2RpZmllZCBwYWNrZWQgaW50ZWdlcnMiIGFyZSBwYWNrZWQgaW50ZWdlcnMgd2hlcmUgb25seSBhIHBvcnRpb24KLSAqIG9mIHRoZSBmaXJzdCBieXRlIGlzIHVzZWQuICBJbiB0aGUgcmVzdCBvZiB0aGUgc3BlY2lmaWNhdGlvbiwgdGhlc2UKLSAqIGFyZSByZWZlcnJlZCB0byBhcyAiTVBJKG4sbmFtZSkiLCB3aGVyZSAibiIgaXMgdGhlIG51bWJlciBvZiBiaXRzCi0gKiBkaXNjYXJkZWQgZnJvbSB0aGUgbGVhc3Qtc2lnbmljYW50IHBvc2l0aW9ucyBvZiB0aGUgYnl0ZSwgYW5kCi0gKiAibmFtZSIgaXMgYSBuYW1lIGJlaW5nIGdpdmVuIHRvIHRob3NlICJkaXNjYXJkZWQiIGJpdHMsIHNpbmNlIHRoZXkKLSAqIGFyZSBhIGZpZWxkIHRoZW1zZWx2ZXMuCi0gKgotICogRU5URVIgcmVjb3JkczoKLSAqCi0gKiAgICAgIE1QSSgyLHR5cGUpICBmaWxlbm8gICAgICAgICAgLS0gdHlwZSBpcyAweDAwCi0gKiAgICAgIFBJICAgICAgICAgICBsaW5lbm8KLSAqICAgICAgUEkgICAgICAgICAgIHRkZWx0YSAgICAgICAgICAtLSBpZmYgZnJhbWUgdGltZXMgYXJlIGVuYWJsZWQKLSAqCi0gKiBFWElUIHJlY29yZHMKLSAqCi0gKiAgICAgIE1QSSgyLHR5cGUpICB0ZGVsdGEgICAgICAgICAgLS0gdHlwZSBpcyAweDAxOyB0ZGVsdGEgd2lsbCBiZSAwCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZnJhbWUgdGltZXMgYXJlIGRpc2FibGVkCi0gKgotICogTElORU5PIHJlY29yZHMKLSAqCi0gKiAgICAgIE1QSSgyLHR5cGUpICBsaW5lbm8gICAgICAgICAgLS0gdHlwZSBpcyAweDAyCi0gKiAgICAgIFBJICAgICAgICAgICB0ZGVsdGEgICAgICAgICAgLS0gaWZmIExJTkVOTyBpbmNsdWRlcyBpdAotICoKLSAqIEFERF9JTkZPIHJlY29yZHMKLSAqCi0gKiAgICAgIEJZVEUgICAgICAgICB0eXBlICAgICAgICAgICAgLS0gYWx3YXlzIDB4MTMKLSAqICAgICAgUEkgICAgICAgICAgIGxlbjEgICAgICAgICAgICAtLSBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nCi0gKiAgICAgIEJZVEUgICAgICAgICBzdHJpbmcxW2xlbjFdICAgLS0gbGVuMSBieXRlcyBvZiBzdHJpbmcgZGF0YQotICogICAgICBQSSAgICAgICAgICAgbGVuMiAgICAgICAgICAgIC0tIGxlbmd0aCBvZiBzZWNvbmQgc3RyaW5nCi0gKiAgICAgIEJZVEUgICAgICAgICBzdHJpbmcyW2xlbjJdICAgLS0gbGVuMiBieXRlcyBvZiBzdHJpbmcgZGF0YQotICoKLSAqIERFRklORV9GSUxFIHJlY29yZHMKLSAqCi0gKiAgICAgIEJZVEUgICAgICAgICB0eXBlICAgICAgICAgICAgLS0gYWx3YXlzIDB4MjMKLSAqICAgICAgUEkgICAgICAgICAgIGZpbGVubwotICogICAgICBQSSAgICAgICAgICAgbGVuICAgICAgICAgICAgIC0tIGxlbmd0aCBvZiBmaWxlbmFtZQotICogICAgICBCWVRFICAgICAgICAgZmlsZW5hbWVbbGVuXSAgIC0tIGxlbiBieXRlcyBvZiBzdHJpbmcgZGF0YQotICoKLSAqIERFRklORV9GVU5DIHJlY29yZHMKLSAqCi0gKiAgICAgIEJZVEUgICAgICAgICB0eXBlICAgICAgICAgICAgLS0gYWx3YXlzIDB4NDMKLSAqICAgICAgUEkgICAgICAgICAgIGZpbGVubwotICogICAgICBQSSAgICAgICAgICAgbGluZW5vCi0gKiAgICAgIFBJICAgICAgICAgICBsZW4gICAgICAgICAgICAgLS0gbGVuZ3RoIG9mIGZ1bmNuYW1lCi0gKiAgICAgIEJZVEUgICAgICAgICBmdW5jbmFtZVtsZW5dICAgLS0gbGVuIGJ5dGVzIG9mIHN0cmluZyBkYXRhCi0gKgotICogTElORV9USU1FUyByZWNvcmRzCi0gKgotICogVGhpcyByZWNvcmQgY2FuIGJlIHVzZWQgb25seSBiZWZvcmUgdGhlIHN0YXJ0IG9mIEVOVEVSL0VYSVQvTElORU5PCi0gKiByZWNvcmRzLiAgSWYgaGF2ZV90ZGVsdGEgaXMgdHJ1ZSwgTElORU5PIHJlY29yZHMgd2lsbCBpbmNsdWRlIHRoZQotICogdGRlbHRhIGZpZWxkLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBvbWl0dGVkLiAgSWYgdGhpcyByZWNvcmQgaXMgbm90Ci0gKiBnaXZlbiwgTElORU5PIHJlY29yZHMgd2lsbCBub3QgY29udGFpbiB0aGUgdGRlbHRhIGZpZWxkLgotICoKLSAqICAgICAgQllURSAgICAgICAgIHR5cGUgICAgICAgICAgICAtLSBhbHdheXMgMHgzMwotICogICAgICBCWVRFICAgICAgICAgaGF2ZV90ZGVsdGEgICAgIC0tIDAgaWYgTElORU5PIGRvZXMgKm5vdCogaGF2ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZyBpbmZvcm1hdGlvbgotICogRlJBTUVfVElNRVMgcmVjb3JkcwotICoKLSAqIFRoaXMgcmVjb3JkIGNhbiBiZSB1c2VkIG9ubHkgYmVmb3JlIHRoZSBzdGFydCBvZiBFTlRFUi9FWElUL0xJTkVOTwotICogcmVjb3Jkcy4gIElmIGhhdmVfdGRlbHRhIGlzIHRydWUsIEVOVEVSIGFuZCBFWElUIHJlY29yZHMgd2lsbAotICogaW5jbHVkZSB0aGUgdGRlbHRhIGZpZWxkLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBvbWl0dGVkLiAgSWYgdGhpcwotICogcmVjb3JkIGlzIG5vdCBnaXZlbiwgRU5URVIgYW5kIEVYSVQgcmVjb3JkcyB3aWxsIGNvbnRhaW4gdGhlIHRkZWx0YQotICogZmllbGQuCi0gKgotICogICAgICBCWVRFICAgICAgICAgdHlwZSAgICAgICAgICAgIC0tIGFsd2F5cyAweDUzCi0gKiAgICAgIEJZVEUgICAgICAgICBoYXZlX3RkZWx0YSAgICAgLS0gMCBpZiBFTlRFUi9FWElUIGRvICpub3QqIGhhdmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmcgaW5mb3JtYXRpb24KLSAqLwotCi0jZGVmaW5lIFdIQVRfRU5URVIgICAgICAgIDB4MDAKLSNkZWZpbmUgV0hBVF9FWElUICAgICAgICAgMHgwMQotI2RlZmluZSBXSEFUX0xJTkVOTyAgICAgICAweDAyCi0jZGVmaW5lIFdIQVRfT1RIRVIgICAgICAgIDB4MDMgIC8qIG9ubHkgdXNlZCBpbiBkZWNvZGluZyAqLwotI2RlZmluZSBXSEFUX0FERF9JTkZPICAgICAweDEzCi0jZGVmaW5lIFdIQVRfREVGSU5FX0ZJTEUgIDB4MjMKLSNkZWZpbmUgV0hBVF9MSU5FX1RJTUVTICAgMHgzMwotI2RlZmluZSBXSEFUX0RFRklORV9GVU5DICAweDQzCi0jZGVmaW5lIFdIQVRfRlJBTUVfVElNRVMgIDB4NTMKLQotI2RlZmluZSBFUlJfTk9ORSAgICAgICAgICAwCi0jZGVmaW5lIEVSUl9FT0YgICAgICAgICAgLTEKLSNkZWZpbmUgRVJSX0VYQ0VQVElPTiAgICAtMgotI2RlZmluZSBFUlJfQkFEX1JFQ1RZUEUgIC0zCi0KLSNkZWZpbmUgUElTSVpFICAgICAgICAgICAgKHNpemVvZihpbnQpICsgMSkKLSNkZWZpbmUgTVBJU0laRSAgICAgICAgICAgKFBJU0laRSArIDEpCi0KLS8qIE1heGltdW0gc2l6ZSBvZiAibm9ybWFsIiBldmVudHMgLS0gbm90aGluZyB0aGF0IGNvbnRhaW5zIHN0cmluZyBkYXRhICovCi0jZGVmaW5lIE1BWEVWRU5UU0laRSAgICAgIChNUElTSVpFICsgUElTSVpFKjIpCi0KLQotLyogVW5wYWNrIGEgcGFja2VkIGludGVnZXI7IGlmICJkaXNjYXJkIiBpcyBub24temVybywgdW5wYWNrIGEgbW9kaWZpZWQKLSAqIHBhY2tlZCBpbnRlZ2VyIHdpdGggImRpc2NhcmQiIGRpc2NhcmRlZCBiaXRzLgotICovCi1zdGF0aWMgaW50Ci11bnBhY2tfcGFja2VkX2ludChMb2dSZWFkZXJPYmplY3QgKnNlbGYsIGludCAqcHZhbHVlLCBpbnQgZGlzY2FyZCkKLXsKLSAgICBpbnQgYzsKLSAgICBpbnQgYWNjdW0gPSAwOwotICAgIGludCBiaXRzID0gMDsKLSAgICBpbnQgY29udDsKLQotICAgIGRvIHsKLSAgICAgICAgLyogcmVhZCBieXRlICovCi0JaWYgKChjID0gZmdldGMoc2VsZi0+bG9nZnApKSA9PSBFT0YpCi0gICAgICAgICAgICByZXR1cm4gRVJSX0VPRjsKLSAgICAgICAgYWNjdW0gfD0gKChjICYgMHg3RikgPj4gZGlzY2FyZCkgPDwgYml0czsKLSAgICAgICAgYml0cyArPSAoNyAtIGRpc2NhcmQpOwotICAgICAgICBjb250ID0gYyAmIDB4ODA7Ci0gICAgICAgIGRpc2NhcmQgPSAwOwotICAgIH0gd2hpbGUgKGNvbnQpOwotCi0gICAgKnB2YWx1ZSA9IGFjY3VtOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFVucGFjayBhIHN0cmluZywgd2hpY2ggaXMgZW5jb2RlZCBhcyBhIHBhY2tlZCBpbnRlZ2VyIGdpdmluZyB0aGUKLSAqIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIGRhdGEuCi0gKi8KLXN0YXRpYyBpbnQKLXVucGFja19zdHJpbmcoTG9nUmVhZGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqKnB2YWx1ZSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGVuOwotICAgIGludCBlcnI7Ci0gICAgaW50IGNoOwotICAgIGNoYXIgKmJ1ZjsKLSAgICAKLSAgICBpZiAoKGVyciA9IHVucGFja19wYWNrZWRfaW50KHNlbGYsICZsZW4sIDApKSkKLSAgICAgICAgcmV0dXJuIGVycjsKLQotICAgIGJ1ZiA9IChjaGFyICopbWFsbG9jKGxlbik7Ci0gICAgaWYgKCFidWYpIHsKLQlQeUVycl9Ob01lbW9yeSgpOwotCXJldHVybiBFUlJfRVhDRVBUSU9OOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgY2ggPSBmZ2V0YyhzZWxmLT5sb2dmcCk7Ci0JYnVmW2ldID0gY2g7Ci0gICAgICAgIGlmIChjaCA9PSBFT0YpIHsKLSAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfRU9GOwotICAgICAgICB9Ci0gICAgfQotICAgICpwdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0gICAgZnJlZShidWYpOwotICAgIGlmICgqcHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUl9FWENFUFRJT047Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXVucGFja19hZGRfaW5mbyhMb2dSZWFkZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgUHlPYmplY3QgKmtleTsKLSAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOwotICAgIGludCBlcnI7Ci0KLSAgICBlcnIgPSB1bnBhY2tfc3RyaW5nKHNlbGYsICZrZXkpOwotICAgIGlmICghZXJyKSB7Ci0gICAgICAgIGVyciA9IHVucGFja19zdHJpbmcoc2VsZiwgJnZhbHVlKTsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+aW5mbywga2V5KTsKLSAgICAgICAgICAgIGlmIChsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKLSAgICAgICAgICAgICAgICBpZiAobGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUl9FWENFUFRJT047Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmluZm8sIGtleSwgbGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJfRVhDRVBUSU9OOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIHZhbHVlKSkKLSAgICAgICAgICAgICAgICBlcnIgPSBFUlJfRVhDRVBUSU9OOwotICAgICAgICB9Ci0gICAgfQotIGZpbmFsbHk6Ci0gICAgUHlfWERFQ1JFRihrZXkpOwotICAgIFB5X1hERUNSRUYodmFsdWUpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWVvZl9lcnJvcihMb2dSZWFkZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgZmNsb3NlKHNlbGYtPmxvZ2ZwKTsKLSAgICBzZWxmLT5sb2dmcCA9IE5VTEw7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotICAgICAgICAgICAgICAgICAgICAiZW5kIG9mIGZpbGUgd2l0aCBpbmNvbXBsZXRlIHByb2ZpbGUgcmVjb3JkIik7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1sb2dyZWFkZXJfdHBfaXRlcm5leHQoTG9nUmVhZGVyT2JqZWN0ICpzZWxmKQotewotICAgIGludCBjOwotICAgIGludCB3aGF0OwotICAgIGludCBlcnIgPSBFUlJfTk9ORTsKLSAgICBpbnQgbGluZW5vID0gLTE7Ci0gICAgaW50IGZpbGVubyA9IC0xOwotICAgIGludCB0ZGVsdGEgPSAtMTsKLSAgICBQeU9iamVjdCAqczEgPSBOVUxMLCAqczIgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotI2lmIDAKLSAgICB1bnNpZ25lZCBjaGFyIGIwLCBiMTsKLSNlbmRpZgotCi0gICAgaWYgKHNlbGYtPmxvZ2ZwID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2ZpbGVyRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGl0ZXJhdGUgb3ZlciBjbG9zZWQgTG9nUmVhZGVyIG9iamVjdCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLXJlc3RhcnQ6Ci0gICAgLyogZGVjb2RlIHRoZSByZWNvcmQgdHlwZSAqLwotICAgIGlmICgoYyA9IGZnZXRjKHNlbGYtPmxvZ2ZwKSkgPT0gRU9GKSB7Ci0gICAgICAgIGZjbG9zZShzZWxmLT5sb2dmcCk7Ci0gICAgICAgIHNlbGYtPmxvZ2ZwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHdoYXQgPSBjICYgV0hBVF9PVEhFUjsKLSAgICBpZiAod2hhdCA9PSBXSEFUX09USEVSKQotICAgICAgICB3aGF0ID0gYzsgLyogbmVlZCBhbGwgdGhlIGJpdHMgZm9yIHR5cGUgKi8KLSAgICBlbHNlCi0gICAgICAgIHVuZ2V0YyhjLCBzZWxmLT5sb2dmcCk7IC8qIHR5cGUgYnl0ZSBpbmNsdWRlcyBwYWNrZWQgaW50ICovCi0KLSAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICBjYXNlIFdIQVRfRU5URVI6Ci0gICAgICAgIGVyciA9IHVucGFja19wYWNrZWRfaW50KHNlbGYsICZmaWxlbm8sIDIpOwotICAgICAgICBpZiAoIWVycikgewotICAgICAgICAgICAgZXJyID0gdW5wYWNrX3BhY2tlZF9pbnQoc2VsZiwgJmxpbmVubywgMCk7Ci0gICAgICAgICAgICBpZiAoc2VsZi0+ZnJhbWV0aW1pbmdzICYmICFlcnIpCi0gICAgICAgICAgICAgICAgZXJyID0gdW5wYWNrX3BhY2tlZF9pbnQoc2VsZiwgJnRkZWx0YSwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXSEFUX0VYSVQ6Ci0gICAgICAgIGVyciA9IHVucGFja19wYWNrZWRfaW50KHNlbGYsICZ0ZGVsdGEsIDIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdIQVRfTElORU5POgotICAgICAgICBlcnIgPSB1bnBhY2tfcGFja2VkX2ludChzZWxmLCAmbGluZW5vLCAyKTsKLSAgICAgICAgaWYgKHNlbGYtPmxpbmV0aW1pbmdzICYmICFlcnIpCi0gICAgICAgICAgICBlcnIgPSB1bnBhY2tfcGFja2VkX2ludChzZWxmLCAmdGRlbHRhLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXSEFUX0FERF9JTkZPOgotICAgICAgICBlcnIgPSB1bnBhY2tfYWRkX2luZm8oc2VsZik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV0hBVF9ERUZJTkVfRklMRToKLSAgICAgICAgZXJyID0gdW5wYWNrX3BhY2tlZF9pbnQoc2VsZiwgJmZpbGVubywgMCk7Ci0gICAgICAgIGlmICghZXJyKSB7Ci0gICAgICAgICAgICBlcnIgPSB1bnBhY2tfc3RyaW5nKHNlbGYsICZzMSk7Ci0gICAgICAgICAgICBpZiAoIWVycikgewotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICBzMiA9IFB5X05vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXSEFUX0RFRklORV9GVU5DOgotICAgICAgICBlcnIgPSB1bnBhY2tfcGFja2VkX2ludChzZWxmLCAmZmlsZW5vLCAwKTsKLSAgICAgICAgaWYgKCFlcnIpIHsKLSAgICAgICAgICAgIGVyciA9IHVucGFja19wYWNrZWRfaW50KHNlbGYsICZsaW5lbm8sIDApOwotICAgICAgICAgICAgaWYgKCFlcnIpCi0gICAgICAgICAgICAgICAgZXJyID0gdW5wYWNrX3N0cmluZyhzZWxmLCAmczEpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV0hBVF9MSU5FX1RJTUVTOgotICAgICAgICBpZiAoKGMgPSBmZ2V0YyhzZWxmLT5sb2dmcCkpID09IEVPRikKLSAgICAgICAgICAgIGVyciA9IEVSUl9FT0Y7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2VsZi0+bGluZXRpbWluZ3MgPSBjID8gMSA6IDA7Ci0JICAgIGdvdG8gcmVzdGFydDsKLQl9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV0hBVF9GUkFNRV9USU1FUzoKLSAgICAgICAgaWYgKChjID0gZmdldGMoc2VsZi0+bG9nZnApKSA9PSBFT0YpCi0gICAgICAgICAgICBlcnIgPSBFUlJfRU9GOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNlbGYtPmZyYW1ldGltaW5ncyA9IGMgPyAxIDogMDsKLQkgICAgZ290byByZXN0YXJ0OwotCX0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgZXJyID0gRVJSX0JBRF9SRUNUWVBFOwotICAgIH0KLSAgICBpZiAoZXJyID09IEVSUl9CQURfUkVDVFlQRSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHJlY29yZCB0eXBlIGluIGxvZyBmaWxlIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVyciA9PSBFUlJfRU9GKSB7Ci0gICAgICAgIGVvZl9lcnJvcihzZWxmKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIWVycikgewotICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyg0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBQeUludF9Gcm9tTG9uZyh3aGF0KSk7Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAyLCBQeUludF9Gcm9tTG9uZyhmaWxlbm8pKTsKLSAgICAgICAgaWYgKHMxID09IE5VTEwpCi0gICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMSwgUHlJbnRfRnJvbUxvbmcodGRlbHRhKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBzMSk7Ci0gICAgICAgIGlmIChzMiA9PSBOVUxMKQotICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDMsIFB5SW50X0Zyb21Mb25nKGxpbmVubykpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMywgczIpOwotICAgIH0KLSAgICAvKiBUaGUgb25seSBvdGhlciBjYXNlIGlzIGVyciA9PSBFUlJfRVhDRVBUSU9OLCBpbiB3aGljaCBjYXNlIHRoZQotICAgICAqIGV4Y2VwdGlvbiBpcyBhbHJlYWR5IHNldC4KLSAgICAgKi8KLSNpZiAwCi0gICAgYjAgPSBzZWxmLT5idWZmZXJbc2VsZi0+aW5kZXhdOwotICAgIGIxID0gc2VsZi0+YnVmZmVyW3NlbGYtPmluZGV4ICsgMV07Ci0gICAgaWYgKGIwICYgMSkgewotICAgICAgICAvKiBUaGlzIGlzIGEgbGluZS1udW1iZXIgZXZlbnQuICovCi0gICAgICAgIHdoYXQgPSBQeVRyYWNlX0xJTkU7Ci0gICAgICAgIGxpbmVubyA9ICgoYjAgJiB+MSkgPDwgNykgKyBiMTsKLSAgICAgICAgc2VsZi0+aW5kZXggKz0gMjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHdoYXQgPSAoYjAgJiAweDBFKSA+PiAxOwotICAgICAgICB0ZGVsdGEgPSAoKGIwICYgMHhGMCkgPDwgNCkgKyBiMTsKLSAgICAgICAgaWYgKHdoYXQgPT0gUHlUcmFjZV9DQUxMKSB7Ci0gICAgICAgICAgICAvKiB3ZSBrbm93IHRoZXJlJ3MgYSAyLWJ5dGUgZmlsZSBJRCAmIDItYnl0ZSBsaW5lIG51bWJlciAqLwotICAgICAgICAgICAgZmlsZW5vID0gKChzZWxmLT5idWZmZXJbc2VsZi0+aW5kZXggKyAyXSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICsgc2VsZi0+YnVmZmVyW3NlbGYtPmluZGV4ICsgM10pOwotICAgICAgICAgICAgbGluZW5vID0gKChzZWxmLT5idWZmZXJbc2VsZi0+aW5kZXggKyA0XSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICsgc2VsZi0+YnVmZmVyW3NlbGYtPmluZGV4ICsgNV0pOwotICAgICAgICAgICAgc2VsZi0+aW5kZXggKz0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZWxmLT5pbmRleCArPSAyOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sb2dyZWFkZXJfZGVhbGxvYyhMb2dSZWFkZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgaWYgKHNlbGYtPmxvZ2ZwICE9IE5VTEwpIHsKLSAgICAgICAgZmNsb3NlKHNlbGYtPmxvZ2ZwKTsKLSAgICAgICAgc2VsZi0+bG9nZnAgPSBOVUxMOwotICAgIH0KLSAgICBQeV9YREVDUkVGKHNlbGYtPmluZm8pOwotICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWxvZ3JlYWRlcl9zcV9pdGVtKExvZ1JlYWRlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCkKLXsKLSAgICBQeU9iamVjdCAqcmVzdWx0ID0gbG9ncmVhZGVyX3RwX2l0ZXJuZXh0KHNlbGYpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgIm5vIG1vcmUgZXZlbnRzIGluIGxvZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3N0b3AoUHJvZmlsZXJPYmplY3QgKnNlbGYpOwotCi1zdGF0aWMgaW50Ci1mbHVzaF9kYXRhKFByb2ZpbGVyT2JqZWN0ICpzZWxmKQotewotICAgIC8qIE5lZWQgdG8gZHVtcCBkYXRhIHRvIHRoZSBsb2cgZmlsZS4uLiAqLwotICAgIHNpemVfdCB3cml0dGVuID0gZndyaXRlKHNlbGYtPmJ1ZmZlciwgMSwgc2VsZi0+aW5kZXgsIHNlbGYtPmxvZ2ZwKTsKLSAgICBpZiAod3JpdHRlbiA9PSAoc2l6ZV90KXNlbGYtPmluZGV4KQotICAgICAgICBzZWxmLT5pbmRleCA9IDA7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1lbW1vdmUoc2VsZi0+YnVmZmVyLCAmc2VsZi0+YnVmZmVyW3dyaXR0ZW5dLAotICAgICAgICAgICAgICAgIHNlbGYtPmluZGV4IC0gd3JpdHRlbik7Ci0gICAgICAgIHNlbGYtPmluZGV4IC09IHdyaXR0ZW47Ci0gICAgICAgIGlmICh3cml0dGVuID09IDApIHsKLSAgICAgICAgICAgIGNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5sb2dmaWxlbmFtZSk7Ci0gICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoUHlFeGNfSU9FcnJvciwgcyk7Ci0gICAgICAgICAgICBkb19zdG9wKHNlbGYpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh3cml0dGVuID4gMCkgewotICAgICAgICBpZiAoZmZsdXNoKHNlbGYtPmxvZ2ZwKSkgewotICAgICAgICAgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmxvZ2ZpbGVuYW1lKTsKLSAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLCBzKTsKLSAgICAgICAgICAgIGRvX3N0b3Aoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wYWNrX3BhY2tlZF9pbnQoUHJvZmlsZXJPYmplY3QgKnNlbGYsIGludCB2YWx1ZSkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIHBhcnRpYWw7Ci0KLSAgICBkbyB7Ci0gICAgICAgIHBhcnRpYWwgPSB2YWx1ZSAmIDB4N0Y7Ci0gICAgICAgIHZhbHVlID4+PSA3OwotICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICBwYXJ0aWFsIHw9IDB4ODA7Ci0gICAgICAgIHNlbGYtPmJ1ZmZlcltzZWxmLT5pbmRleF0gPSBwYXJ0aWFsOwotICAgICAgICBzZWxmLT5pbmRleCsrOwotICAgIH0gd2hpbGUgKHZhbHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogRW5jb2RlIGEgbW9kaWZpZWQgcGFja2VkIGludGVnZXIsIHdpdGggYSBzdWJmaWVsZCBvZiBtb2RzaXplIGJpdHMKLSAqIGNvbnRhaW5pbmcgdGhlIHZhbHVlICJzdWJmaWVsZCIuICBUaGUgdmFsdWUgb2Ygc3ViZmllbGQgaXMgbm90Ci0gKiBjaGVja2VkIHRvIGVuc3VyZSBpdCBhY3R1YWxseSBmaXRzIGluIG1vZHNpemUgYml0cy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXBhY2tfbW9kaWZpZWRfcGFja2VkX2ludChQcm9maWxlck9iamVjdCAqc2VsZiwgaW50IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RzaXplLCBpbnQgc3ViZmllbGQpCi17Ci0gICAgY29uc3QgaW50IG1heHZhbHVlc1tdID0gey0xLCAxLCAzLCA3LCAxNSwgMzEsIDYzLCAxMjd9OwotCi0gICAgaW50IGJpdHMgPSA3IC0gbW9kc2l6ZTsKLSAgICBpbnQgcGFydGlhbCA9IHZhbHVlICYgbWF4dmFsdWVzW2JpdHNdOwotICAgIHVuc2lnbmVkIGNoYXIgYiA9IHN1YmZpZWxkIHwgKHBhcnRpYWwgPDwgbW9kc2l6ZSk7Ci0KLSAgICBpZiAocGFydGlhbCAhPSB2YWx1ZSkgewotICAgICAgICBiIHw9IDB4ODA7Ci0gICAgICAgIHNlbGYtPmJ1ZmZlcltzZWxmLT5pbmRleF0gPSBiOwotICAgICAgICBzZWxmLT5pbmRleCsrOwotICAgICAgICByZXR1cm4gcGFja19wYWNrZWRfaW50KHNlbGYsIHZhbHVlID4+IGJpdHMpOwotICAgIH0KLSAgICBzZWxmLT5idWZmZXJbc2VsZi0+aW5kZXhdID0gYjsKLSAgICBzZWxmLT5pbmRleCsrOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1wYWNrX3N0cmluZyhQcm9maWxlck9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCi17Ci0gICAgaWYgKGxlbiArIFBJU0laRSArIHNlbGYtPmluZGV4ID49IEJVRkZFUlNJWkUpIHsKLSAgICAgICAgaWYgKGZsdXNoX2RhdGEoc2VsZikgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBhc3NlcnQobGVuIDwgSU5UX01BWCk7Ci0gICAgaWYgKHBhY2tfcGFja2VkX2ludChzZWxmLCAoaW50KWxlbikgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgbWVtY3B5KHNlbGYtPmJ1ZmZlciArIHNlbGYtPmluZGV4LCBzLCBsZW4pOwotICAgIHNlbGYtPmluZGV4ICs9IGxlbjsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcGFja19hZGRfaW5mbyhQcm9maWxlck9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQotewotICAgIFB5X3NzaXplX3QgbGVuMSA9IHN0cmxlbihzMSk7Ci0gICAgUHlfc3NpemVfdCBsZW4yID0gc3RybGVuKHMyKTsKLQotICAgIGlmIChsZW4xICsgbGVuMiArIFBJU0laRSoyICsgMSArIHNlbGYtPmluZGV4ID49IEJVRkZFUlNJWkUpIHsKLSAgICAgICAgaWYgKGZsdXNoX2RhdGEoc2VsZikgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzZWxmLT5idWZmZXJbc2VsZi0+aW5kZXhdID0gV0hBVF9BRERfSU5GTzsKLSAgICBzZWxmLT5pbmRleCsrOwotICAgIGlmIChwYWNrX3N0cmluZyhzZWxmLCBzMSwgbGVuMSkgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIHBhY2tfc3RyaW5nKHNlbGYsIHMyLCBsZW4yKTsKLX0KLQotc3RhdGljIGludAotcGFja19kZWZpbmVfZmlsZShQcm9maWxlck9iamVjdCAqc2VsZiwgaW50IGZpbGVubywgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotCi0gICAgaWYgKGxlbiArIFBJU0laRSoyICsgMSArIHNlbGYtPmluZGV4ID49IEJVRkZFUlNJWkUpIHsKLSAgICAgICAgaWYgKGZsdXNoX2RhdGEoc2VsZikgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzZWxmLT5idWZmZXJbc2VsZi0+aW5kZXhdID0gV0hBVF9ERUZJTkVfRklMRTsKLSAgICBzZWxmLT5pbmRleCsrOwotICAgIGlmIChwYWNrX3BhY2tlZF9pbnQoc2VsZiwgZmlsZW5vKSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gcGFja19zdHJpbmcoc2VsZiwgZmlsZW5hbWUsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhY2tfZGVmaW5lX2Z1bmMoUHJvZmlsZXJPYmplY3QgKnNlbGYsIGludCBmaWxlbm8sIGludCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lKQotewotICAgIFB5X3NzaXplX3QgbGVuID0gc3RybGVuKGZ1bmNuYW1lKTsKLQotICAgIGlmIChsZW4gKyBQSVNJWkUqMyArIDEgKyBzZWxmLT5pbmRleCA+PSBCVUZGRVJTSVpFKSB7Ci0gICAgICAgIGlmIChmbHVzaF9kYXRhKHNlbGYpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgc2VsZi0+YnVmZmVyW3NlbGYtPmluZGV4XSA9IFdIQVRfREVGSU5FX0ZVTkM7Ci0gICAgc2VsZi0+aW5kZXgrKzsKLSAgICBpZiAocGFja19wYWNrZWRfaW50KHNlbGYsIGZpbGVubykgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKHBhY2tfcGFja2VkX2ludChzZWxmLCBsaW5lbm8pIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldHVybiBwYWNrX3N0cmluZyhzZWxmLCBmdW5jbmFtZSwgbGVuKTsKLX0KLQotc3RhdGljIGludAotcGFja19saW5lX3RpbWVzKFByb2ZpbGVyT2JqZWN0ICpzZWxmKQotewotICAgIGlmICgyICsgc2VsZi0+aW5kZXggPj0gQlVGRkVSU0laRSkgewotICAgICAgICBpZiAoZmx1c2hfZGF0YShzZWxmKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHNlbGYtPmJ1ZmZlcltzZWxmLT5pbmRleF0gPSBXSEFUX0xJTkVfVElNRVM7Ci0gICAgc2VsZi0+YnVmZmVyW3NlbGYtPmluZGV4ICsgMV0gPSBzZWxmLT5saW5ldGltaW5ncyA/IDEgOiAwOwotICAgIHNlbGYtPmluZGV4ICs9IDI7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhY2tfZnJhbWVfdGltZXMoUHJvZmlsZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgaWYgKDIgKyBzZWxmLT5pbmRleCA+PSBCVUZGRVJTSVpFKSB7Ci0gICAgICAgIGlmIChmbHVzaF9kYXRhKHNlbGYpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgc2VsZi0+YnVmZmVyW3NlbGYtPmluZGV4XSA9IFdIQVRfRlJBTUVfVElNRVM7Ci0gICAgc2VsZi0+YnVmZmVyW3NlbGYtPmluZGV4ICsgMV0gPSBzZWxmLT5mcmFtZXRpbWluZ3MgPyAxIDogMDsKLSAgICBzZWxmLT5pbmRleCArPSAyOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotcGFja19lbnRlcihQcm9maWxlck9iamVjdCAqc2VsZiwgaW50IGZpbGVubywgaW50IHRkZWx0YSwgaW50IGxpbmVubykKLXsKLSAgICBpZiAoTVBJU0laRSArIFBJU0laRSoyICsgc2VsZi0+aW5kZXggPj0gQlVGRkVSU0laRSkgewotICAgICAgICBpZiAoZmx1c2hfZGF0YShzZWxmKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHBhY2tfbW9kaWZpZWRfcGFja2VkX2ludChzZWxmLCBmaWxlbm8sIDIsIFdIQVRfRU5URVIpOwotICAgIHBhY2tfcGFja2VkX2ludChzZWxmLCBsaW5lbm8pOwotICAgIGlmIChzZWxmLT5mcmFtZXRpbWluZ3MpCi0gICAgICAgIHJldHVybiBwYWNrX3BhY2tlZF9pbnQoc2VsZiwgdGRlbHRhKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotcGFja19leGl0KFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBpbnQgdGRlbHRhKQotewotICAgIGlmIChNUElTSVpFICsgc2VsZi0+aW5kZXggPj0gQlVGRkVSU0laRSkgewotICAgICAgICBpZiAoZmx1c2hfZGF0YShzZWxmKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChzZWxmLT5mcmFtZXRpbWluZ3MpCi0gICAgICAgIHJldHVybiBwYWNrX21vZGlmaWVkX3BhY2tlZF9pbnQoc2VsZiwgdGRlbHRhLCAyLCBXSEFUX0VYSVQpOwotICAgIHNlbGYtPmJ1ZmZlcltzZWxmLT5pbmRleF0gPSBXSEFUX0VYSVQ7Ci0gICAgc2VsZi0+aW5kZXgrKzsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXBhY2tfbGluZW5vKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBpbnQgbGluZW5vKQotewotICAgIGlmIChNUElTSVpFICsgc2VsZi0+aW5kZXggPj0gQlVGRkVSU0laRSkgewotICAgICAgICBpZiAoZmx1c2hfZGF0YShzZWxmKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBwYWNrX21vZGlmaWVkX3BhY2tlZF9pbnQoc2VsZiwgbGluZW5vLCAyLCBXSEFUX0xJTkVOTyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wYWNrX2xpbmVub190ZGVsdGEoUHJvZmlsZXJPYmplY3QgKnNlbGYsIGludCBsaW5lbm8sIGludCB0ZGVsdGEpCi17Ci0gICAgaWYgKE1QSVNJWkUgKyBQSVNJWkUgKyBzZWxmLT5pbmRleCA+PSBCVUZGRVJTSVpFKSB7Ci0gICAgICAgIGlmIChmbHVzaF9kYXRhKHNlbGYpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAocGFja19tb2RpZmllZF9wYWNrZWRfaW50KHNlbGYsIGxpbmVubywgMiwgV0hBVF9MSU5FTk8pIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldHVybiBwYWNrX3BhY2tlZF9pbnQoc2VsZiwgdGRlbHRhKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWdldF9maWxlbm8oUHJvZmlsZXJPYmplY3QgKnNlbGYsIFB5Q29kZU9iamVjdCAqZmNvZGUpCi17Ci0gICAgLyogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIEVOVEVSIGV2ZW50cy4gKi8KLQotICAgIFB5T2JqZWN0ICpvYmo7Ci0gICAgUHlPYmplY3QgKmRpY3Q7Ci0gICAgaW50IGZpbGVubzsKLQotICAgIG9iaiA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPmZpbGVtYXAsIGZjb2RlLT5jb19maWxlbmFtZSk7Ci0gICAgaWYgKG9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIGZpcnN0IHNpZ2h0aW5nIG9mIHRoaXMgZmlsZSAqLwotICAgICAgICBkaWN0ID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZmlsZW5vID0gc2VsZi0+bmV4dF9maWxlbm87Ci0gICAgICAgIG9iaiA9IFB5X0J1aWxkVmFsdWUoImlOIiwgZmlsZW5vLCBkaWN0KTsKLSAgICAgICAgaWYgKG9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZpbGVtYXAsIGZjb2RlLT5jb19maWxlbmFtZSwgb2JqKSkgewotICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi0+bmV4dF9maWxlbm8rKzsKLSAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgIGlmIChwYWNrX2RlZmluZV9maWxlKHNlbGYsIGZpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGZjb2RlLT5jb19maWxlbmFtZSkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGFscmVhZHkga25vdyB0aGlzIElEICovCi0gICAgICAgIGZpbGVubyA9IFB5SW50X0FTX0xPTkcoUHlUdXBsZV9HRVRfSVRFTShvYmosIDApKTsKLSAgICAgICAgZGljdCA9IFB5VHVwbGVfR0VUX0lURU0ob2JqLCAxKTsKLSAgICB9Ci0gICAgLyogbWFrZSBzdXJlIHdlIHNhdmUgYSBmdW5jdGlvbiBuYW1lIGZvciB0aGlzIChmaWxlbm8sIGxpbmVubykgKi8KLSAgICBvYmogPSBQeUludF9Gcm9tTG9uZyhmY29kZS0+Y29fZmlyc3RsaW5lbm8pOwotICAgIGlmIChvYmogPT0gTlVMTCkgewotICAgICAgICAvKiBXZSBqdXN0IHdvbid0IGhhdmUgaXQgc2F2ZWQ7IHRvbyBiYWQuICovCi0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG9iaik7Ci0gICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChwYWNrX2RlZmluZV9mdW5jKHNlbGYsIGZpbGVubywgZmNvZGUtPmNvX2ZpcnN0bGluZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzU3RyaW5nKGZjb2RlLT5jb19uYW1lKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIG9iaiwgZmNvZGUtPmNvX25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihvYmopOwotICAgIH0KLSAgICByZXR1cm4gZmlsZW5vOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotZ2V0X3RkZWx0YShQcm9maWxlck9iamVjdCAqc2VsZikKLXsKLSAgICBpbnQgdGRlbHRhOwotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBoc190aW1lIHR2OwotICAgIGhzX3RpbWUgZGlmZjsKLQotICAgIEdFVFRJTUVPRkRBWSgmdHYpOwotICAgIGRpZmYgPSB0diAtIHNlbGYtPnByZXZfdGltZW9mZGF5OwotICAgIHRkZWx0YSA9IChpbnQpZGlmZjsKLSNlbHNlCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0KLSAgICBHRVRUSU1FT0ZEQVkoJnR2KTsKLQotICAgIHRkZWx0YSA9IHR2LnR2X3VzZWMgLSBzZWxmLT5wcmV2X3RpbWVvZmRheS50dl91c2VjOwotICAgIGlmICh0di50dl9zZWMgIT0gc2VsZi0+cHJldl90aW1lb2ZkYXkudHZfc2VjKQotICAgICAgICB0ZGVsdGEgKz0gKHR2LnR2X3NlYyAtIHNlbGYtPnByZXZfdGltZW9mZGF5LnR2X3NlYykgKiAxMDAwMDAwOwotI2VuZGlmCi0gICAgLyogdGltZSBjYW4gZ28gYmFja3dhcmRzIG9uIHNvbWUgbXVsdGlwcm9jZXNzb3Igc3lzdGVtcyBvciBieSBOVFAgKi8KLSAgICBpZiAodGRlbHRhIDwgMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBzZWxmLT5wcmV2X3RpbWVvZmRheSA9IHR2OwotICAgIHJldHVybiB0ZGVsdGE7Ci19Ci0KLQotLyogVGhlIHdvcmtob3JzZTogIHRoZSBwcm9maWxlciBjYWxsYmFjayBmdW5jdGlvbi4gKi8KLQotc3RhdGljIGludAotdHJhY2VyX2NhbGxiYWNrKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZykKLXsKLSAgICBpbnQgZmlsZW5vOwotCi0gICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgY2FzZSBQeVRyYWNlX0NBTEw6Ci0gICAgICAgIGZpbGVubyA9IGdldF9maWxlbm8oc2VsZiwgZnJhbWUtPmZfY29kZSk7Ci0gICAgICAgIGlmIChmaWxlbm8gPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gcGFja19lbnRlcihzZWxmLCBmaWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZyYW1ldGltaW5ncyA/IGdldF90ZGVsdGEoc2VsZikgOiAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm8pOwotCi0gICAgY2FzZSBQeVRyYWNlX1JFVFVSTjoKLSAgICAgICAgcmV0dXJuIHBhY2tfZXhpdChzZWxmLCBnZXRfdGRlbHRhKHNlbGYpKTsKLQotICAgIGNhc2UgUHlUcmFjZV9MSU5FOiAgLyogd2Ugb25seSBnZXQgdGhlc2UgZXZlbnRzIGlmIHdlIGFza2VkIGZvciB0aGVtICovCi0gICAgICAgIGlmIChzZWxmLT5saW5ldGltaW5ncykKLSAgICAgICAgICAgIHJldHVybiBwYWNrX2xpbmVub190ZGVsdGEoc2VsZiwgZnJhbWUtPmZfbGluZW5vLAotCQkJCSAgICAgIGdldF90ZGVsdGEoc2VsZikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcGFja19saW5lbm8oc2VsZiwgZnJhbWUtPmZfbGluZW5vKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIGlnbm9yZSBQeVRyYWNlX0VYQ0VQVElPTiAqLwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyogQSBjb3VwbGUgb2YgdXNlZnVsIGhlbHBlciBmdW5jdGlvbnMuICovCi0KLSNpZmRlZiBNU19XSU5ET1dTCi1zdGF0aWMgTEFSR0VfSU5URUdFUiBmcmVxdWVuY3kgPSB7MCwgMH07Ci0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZW9mZGF5X2RpZmYgPSAwOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVzYWdlX2RpZmYgPSAwOwotCi1zdGF0aWMgdm9pZAotY2FsaWJyYXRlKHZvaWQpCi17Ci0gICAgaHNfdGltZSB0djEsIHR2MjsKLQotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBoc190aW1lIGRpZmY7Ci0gICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcXVlbmN5KTsKLSNlbmRpZgotCi0gICAgR0VUVElNRU9GREFZKCZ0djEpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEdFVFRJTUVPRkRBWSgmdHYyKTsKLSNpZmRlZiBNU19XSU5ET1dTCi0gICAgICAgIGRpZmYgPSB0djIgLSB0djE7Ci0gICAgICAgIGlmIChkaWZmICE9IDApIHsKLSAgICAgICAgICAgIHRpbWVvZmRheV9kaWZmID0gKHVuc2lnbmVkIGxvbmcpZGlmZjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAodHYxLnR2X3NlYyAhPSB0djIudHZfc2VjIHx8IHR2MS50dl91c2VjICE9IHR2Mi50dl91c2VjKSB7Ci0gICAgICAgICAgICBpZiAodHYxLnR2X3NlYyA9PSB0djIudHZfc2VjKQotICAgICAgICAgICAgICAgIHRpbWVvZmRheV9kaWZmID0gdHYyLnR2X3VzZWMgLSB0djEudHZfdXNlYzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aW1lb2ZkYXlfZGlmZiA9ICgxMDAwMDAwIC0gdHYxLnR2X3VzZWMpICsgdHYyLnR2X3VzZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChQWU9TX09TMikgfHwgXAotICAgIGRlZmluZWQoX19WTVMpIHx8IGRlZmluZWQgKF9fUU5YX18pCi0gICAgcnVzYWdlX2RpZmYgPSAtMTsKLSNlbHNlCi0gICAgewotICAgICAgICBzdHJ1Y3QgcnVzYWdlIHJ1MSwgcnUyOwotCi0gICAgICAgIGdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1MSk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydTIpOwotICAgICAgICAgICAgaWYgKHJ1MS5ydV91dGltZS50dl9zZWMgIT0gcnUyLnJ1X3V0aW1lLnR2X3NlYykgewotICAgICAgICAgICAgICAgIHJ1c2FnZV9kaWZmID0gKCgxMDAwMDAwIC0gcnUxLnJ1X3V0aW1lLnR2X3VzZWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBydTIucnVfdXRpbWUudHZfdXNlYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChydTEucnVfdXRpbWUudHZfdXNlYyAhPSBydTIucnVfdXRpbWUudHZfdXNlYykgewotICAgICAgICAgICAgICAgIHJ1c2FnZV9kaWZmID0gcnUyLnJ1X3V0aW1lLnR2X3VzZWMgLSBydTEucnVfdXRpbWUudHZfdXNlYzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHJ1MS5ydV9zdGltZS50dl9zZWMgIT0gcnUyLnJ1X3N0aW1lLnR2X3NlYykgewotICAgICAgICAgICAgICAgIHJ1c2FnZV9kaWZmID0gKCgxMDAwMDAwIC0gcnUxLnJ1X3N0aW1lLnR2X3VzZWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBydTIucnVfc3RpbWUudHZfdXNlYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChydTEucnVfc3RpbWUudHZfdXNlYyAhPSBydTIucnVfc3RpbWUudHZfdXNlYykgewotICAgICAgICAgICAgICAgIHJ1c2FnZV9kaWZmID0gcnUyLnJ1X3N0aW1lLnR2X3VzZWMgLSBydTEucnVfc3RpbWUudHZfdXNlYzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotZG9fc3RhcnQoUHJvZmlsZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgc2VsZi0+YWN0aXZlID0gMTsKLSAgICBHRVRUSU1FT0ZEQVkoJnNlbGYtPnByZXZfdGltZW9mZGF5KTsKLSAgICBpZiAoc2VsZi0+bGluZWV2ZW50cykKLSAgICAgICAgUHlFdmFsX1NldFRyYWNlKChQeV90cmFjZWZ1bmMpIHRyYWNlcl9jYWxsYmFjaywgKFB5T2JqZWN0ICopc2VsZik7Ci0gICAgZWxzZQotICAgICAgICBQeUV2YWxfU2V0UHJvZmlsZSgoUHlfdHJhY2VmdW5jKSB0cmFjZXJfY2FsbGJhY2ssIChQeU9iamVjdCAqKXNlbGYpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fc3RvcChQcm9maWxlck9iamVjdCAqc2VsZikKLXsKLSAgICBpZiAoc2VsZi0+YWN0aXZlKSB7Ci0gICAgICAgIHNlbGYtPmFjdGl2ZSA9IDA7Ci0gICAgICAgIGlmIChzZWxmLT5saW5lZXZlbnRzKQotICAgICAgICAgICAgUHlFdmFsX1NldFRyYWNlKE5VTEwsIE5VTEwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKHNlbGYtPmluZGV4ID4gMCkgewotICAgICAgICAvKiBCZXN0IGVmZm9ydCB0byBkdW1wIG91dCBhbnkgcmVtYWluaW5nIGRhdGEuICovCi0gICAgICAgIGZsdXNoX2RhdGEoc2VsZik7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1pc19hdmFpbGFibGUoUHJvZmlsZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgaWYgKHNlbGYtPmFjdGl2ZSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZmlsZXJFcnJvciwgInByb2ZpbGVyIGFscmVhZHkgYWN0aXZlIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoc2VsZi0+bG9nZnAgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZmlsZXJFcnJvciwgInByb2ZpbGVyIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKiBQcm9maWxlciBvYmplY3QgaW50ZXJmYWNlIG1ldGhvZHMuICovCi0KLVB5RG9jX1NUUlZBUihhZGRpbmZvX19kb2NfXywKLSJhZGRpbmZvKGtleSwgdmFsdWUpXG4iCi0iSW5zZXJ0IGFuIEFERF9JTkZPIHJlY29yZCBpbnRvIHRoZSBsb2cuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1wcm9maWxlcl9hZGRpbmZvKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLSAgICBjaGFyICprZXksICp2YWx1ZTsKLQotICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczphZGRpbmZvIiwgJmtleSwgJnZhbHVlKSkgewotICAgICAgICBpZiAoc2VsZi0+bG9nZnAgPT0gTlVMTCkKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9maWxlckVycm9yLCAicHJvZmlsZXIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGFja19hZGRfaW5mbyhzZWxmLCBrZXksIHZhbHVlKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1QeURvY19TVFJWQVIoY2xvc2VfX2RvY19fLAotImNsb3NlKClcbiIKLSJTaHV0IGRvd24gdGhpcyBwcm9maWxlciBhbmQgY2xvc2UgdGhlIGxvZyBmaWxlcywgZXZlbiBpZiBpdHMgYWN0aXZlLiIpOwotCi1zdGF0aWMgUHlPYmplY3QgKgotcHJvZmlsZXJfY2xvc2UoUHJvZmlsZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgZG9fc3RvcChzZWxmKTsKLSAgICBpZiAoc2VsZi0+bG9nZnAgIT0gTlVMTCkgewotICAgICAgICBmY2xvc2Uoc2VsZi0+bG9nZnApOwotICAgICAgICBzZWxmLT5sb2dmcCA9IE5VTEw7Ci0gICAgfQotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKLX0KLQotI2RlZmluZSBmaWxlbm9fX2RvY19fIGxvZ3JlYWRlcl9maWxlbm9fX2RvY19fCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1wcm9maWxlcl9maWxlbm8oUHJvZmlsZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgaWYgKHNlbGYtPmxvZ2ZwID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAicHJvZmlsZXIncyBmaWxlIG9iamVjdCBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZpbGVubyhzZWxmLT5sb2dmcCkpOwotfQotCi1QeURvY19TVFJWQVIocnVuY2FsbF9fZG9jX18sCi0icnVuY2FsbChjYWxsYWJsZVssIGFyZ3NbLCBrd11dKSAtPiBjYWxsYWJsZSgpXG4iCi0iUHJvZmlsZSBhIHNwZWNpZmljIGZ1bmN0aW9uIGNhbGwsIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoYXQgY2FsbC4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLXByb2ZpbGVyX3J1bmNhbGwoUHJvZmlsZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmNhbGxrdyA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmNhbGxhYmxlOwotCi0gICAgaWYgKFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJydW5jYWxsIiwgMSwgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGFibGUsICZjYWxsYXJncywgJmNhbGxrdykpIHsKLSAgICAgICAgaWYgKGlzX2F2YWlsYWJsZShzZWxmKSkgewotICAgICAgICAgICAgZG9fc3RhcnQoc2VsZik7Ci0gICAgICAgICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhjYWxsYWJsZSwgY2FsbGFyZ3MsIGNhbGxrdyk7Ci0gICAgICAgICAgICBkb19zdG9wKHNlbGYpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVB5RG9jX1NUUlZBUihydW5jb2RlX19kb2NfXywKLSJydW5jb2RlKGNvZGUsIGdsb2JhbHNbLCBsb2NhbHNdKVxuIgotIkV4ZWN1dGUgYSBjb2RlIG9iamVjdCB3aGlsZSBjb2xsZWN0aW5nIHByb2ZpbGUgZGF0YS4gIElmIGxvY2FscyBpc1xuIgotIm9taXR0ZWQsIGdsb2JhbHMgaXMgdXNlZCBmb3IgdGhlIGxvY2FscyBhcyB3ZWxsLiIpOwotCi1zdGF0aWMgUHlPYmplY3QgKgotcHJvZmlsZXJfcnVuY29kZShQcm9maWxlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0gICAgUHlDb2RlT2JqZWN0ICpjb2RlOwotICAgIFB5T2JqZWN0ICpnbG9iYWxzOwotICAgIFB5T2JqZWN0ICpsb2NhbHMgPSBOVUxMOwotCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hTyF8TzpydW5jb2RlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmUHlDb2RlX1R5cGUsICZjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSwgJmdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2FscykpIHsKLSAgICAgICAgaWYgKGlzX2F2YWlsYWJsZShzZWxmKSkgewotICAgICAgICAgICAgaWYgKGxvY2FscyA9PSBOVUxMIHx8IGxvY2FscyA9PSBQeV9Ob25lKQotICAgICAgICAgICAgICAgIGxvY2FscyA9IGdsb2JhbHM7Ci0gICAgICAgICAgICBlbHNlIGlmICghUHlEaWN0X0NoZWNrKGxvY2FscykpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxzIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvX3N0YXJ0KHNlbGYpOwotICAgICAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0V2YWxDb2RlKGNvZGUsIGdsb2JhbHMsIGxvY2Fscyk7Ci0gICAgICAgICAgICBkb19zdG9wKHNlbGYpOwotI2lmIDAKLSAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1QeURvY19TVFJWQVIoc3RhcnRfX2RvY19fLAotInN0YXJ0KClcbiIKLSJJbnN0YWxsIHRoaXMgcHJvZmlsZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLXByb2ZpbGVyX3N0YXJ0KFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQotICAgIGlmIChpc19hdmFpbGFibGUoc2VsZikpIHsKLSAgICAgICAgZG9fc3RhcnQoc2VsZik7Ci0gICAgICAgIHJlc3VsdCA9IFB5X05vbmU7Ci0gICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1QeURvY19TVFJWQVIoc3RvcF9fZG9jX18sCi0ic3RvcCgpXG4iCi0iUmVtb3ZlIHRoaXMgcHJvZmlsZXIgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1wcm9maWxlcl9zdG9wKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQotICAgIGlmICghc2VsZi0+YWN0aXZlKQotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZmlsZXJFcnJvciwgInByb2ZpbGVyIG5vdCBhY3RpdmUiKTsKLSAgICBlbHNlIHsKLSAgICAgICAgZG9fc3RvcChzZWxmKTsKLSAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKLSAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogUHl0aG9uIEFQSSBzdXBwb3J0LiAqLwotCi1zdGF0aWMgdm9pZAotcHJvZmlsZXJfZGVhbGxvYyhQcm9maWxlck9iamVjdCAqc2VsZikKLXsKLSAgICBkb19zdG9wKHNlbGYpOwotICAgIGlmIChzZWxmLT5sb2dmcCAhPSBOVUxMKQotICAgICAgICBmY2xvc2Uoc2VsZi0+bG9nZnApOwotICAgIFB5X1hERUNSRUYoc2VsZi0+ZmlsZW1hcCk7Ci0gICAgUHlfWERFQ1JFRihzZWxmLT5sb2dmaWxlbmFtZSk7Ci0gICAgUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKXNlbGYpOwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgcHJvZmlsZXJfbWV0aG9kc1tdID0gewotICAgIHsiYWRkaW5mbyIsIChQeUNGdW5jdGlvbilwcm9maWxlcl9hZGRpbmZvLCBNRVRIX1ZBUkFSR1MsIGFkZGluZm9fX2RvY19ffSwKLSAgICB7ImNsb3NlIiwgICAoUHlDRnVuY3Rpb24pcHJvZmlsZXJfY2xvc2UsICAgTUVUSF9OT0FSR1MsICBjbG9zZV9fZG9jX199LAotICAgIHsiZmlsZW5vIiwgIChQeUNGdW5jdGlvbilwcm9maWxlcl9maWxlbm8sICBNRVRIX05PQVJHUywgIGZpbGVub19fZG9jX199LAotICAgIHsicnVuY2FsbCIsIChQeUNGdW5jdGlvbilwcm9maWxlcl9ydW5jYWxsLCBNRVRIX1ZBUkFSR1MsIHJ1bmNhbGxfX2RvY19ffSwKLSAgICB7InJ1bmNvZGUiLCAoUHlDRnVuY3Rpb24pcHJvZmlsZXJfcnVuY29kZSwgTUVUSF9WQVJBUkdTLCBydW5jb2RlX19kb2NfX30sCi0gICAgeyJzdGFydCIsICAgKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX3N0YXJ0LCAgIE1FVEhfTk9BUkdTLCAgc3RhcnRfX2RvY19ffSwKLSAgICB7InN0b3AiLCAgICAoUHlDRnVuY3Rpb24pcHJvZmlsZXJfc3RvcCwgICAgTUVUSF9OT0FSR1MsICBzdG9wX19kb2NfX30sCi0gICAge05VTEwsIE5VTEx9Ci19OwotCi1zdGF0aWMgUHlNZW1iZXJEZWYgcHJvZmlsZXJfbWVtYmVyc1tdID0gewotICAgIHsiZnJhbWV0aW1pbmdzIiwgVF9MT05HLCBvZmZzZXRvZihQcm9maWxlck9iamVjdCwgbGluZXRpbWluZ3MpLCBSRUFET05MWX0sCi0gICAgeyJsaW5lZXZlbnRzIiwgICBUX0xPTkcsIG9mZnNldG9mKFByb2ZpbGVyT2JqZWN0LCBsaW5lZXZlbnRzKSwgUkVBRE9OTFl9LAotICAgIHsibGluZXRpbWluZ3MiLCAgVF9MT05HLCBvZmZzZXRvZihQcm9maWxlck9iamVjdCwgbGluZXRpbWluZ3MpLCBSRUFET05MWX0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgUHlPYmplY3QgKgotcHJvZmlsZXJfZ2V0X2Nsb3NlZChQcm9maWxlck9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKLXsKLSAgICBQeU9iamVjdCAqcmVzdWx0ID0gKHNlbGYtPmxvZ2ZwID09IE5VTEwpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotICAgIFB5X0lOQ1JFRihyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBQeUdldFNldERlZiBwcm9maWxlcl9nZXRzZXRzW10gPSB7Ci0gICAgeyJjbG9zZWQiLCAoZ2V0dGVyKXByb2ZpbGVyX2dldF9jbG9zZWQsIE5VTEwsCi0gICAgIFB5RG9jX1NUUigiVHJ1ZSBpZiB0aGUgcHJvZmlsZXIncyBvdXRwdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4iKX0sCi0gICAge05VTEx9Ci19OwotCi0KLVB5RG9jX1NUUlZBUihwcm9maWxlcl9vYmplY3RfX2RvY19fLAotIkhpZ2gtcGVyZm9ybWFuY2UgcHJvZmlsZXIgb2JqZWN0LlxuIgotIlxuIgotIk1ldGhvZHM6XG4iCi0iXG4iCi0iY2xvc2UoKTogICAgICBTdG9wIHRoZSBwcm9maWxlciBhbmQgY2xvc2UgdGhlIGxvZyBmaWxlcy5cbiIKLSJmaWxlbm8oKTogICAgIFJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgbG9nIGZpbGUuXG4iCi0icnVuY2FsbCgpOiAgICBSdW4gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbCB3aXRoIHByb2ZpbGluZyBlbmFibGVkLlxuIgotInJ1bmNvZGUoKTogICAgRXhlY3V0ZSBhIGNvZGUgb2JqZWN0IHdpdGggcHJvZmlsaW5nIGVuYWJsZWQuXG4iCi0ic3RhcnQoKTogICAgICBJbnN0YWxsIHRoZSBwcm9maWxlciBhbmQgcmV0dXJuLlxuIgotInN0b3AoKTogICAgICAgUmVtb3ZlIHRoZSBwcm9maWxlci5cbiIKLSJcbiIKLSJBdHRyaWJ1dGVzIChyZWFkLW9ubHkpOlxuIgotIlxuIgotImNsb3NlZDogICAgICAgVHJ1ZSBpZiB0aGUgcHJvZmlsZXIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuXG4iCi0iZnJhbWV0aW1pbmdzOiBUcnVlIGlmIEVOVEVSL0VYSVQgZXZlbnRzIGNvbGxlY3QgdGltaW5nIGluZm9ybWF0aW9uLlxuIgotImxpbmVldmVudHM6ICAgVHJ1ZSBpZiBsaW5lIGV2ZW50cyBhcmUgcmVwb3J0ZWQgdG8gdGhlIHByb2ZpbGVyLlxuIgotImxpbmV0aW1pbmdzOiAgVHJ1ZSBpZiBsaW5lIGV2ZW50cyBjb2xsZWN0IHRpbWluZyBpbmZvcm1hdGlvbi4iKTsKLQotc3RhdGljIFB5VHlwZU9iamVjdCBQcm9maWxlclR5cGUgPSB7Ci0gICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9ob3RzaG90LlByb2ZpbGVyVHlwZSIsCQkvKiB0cF9uYW1lCQkqLwotICAgIChpbnQpIHNpemVvZihQcm9maWxlck9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlbXNpemUJCSovCi0gICAgKGRlc3RydWN0b3IpcHJvZmlsZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfcHJpbnQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2dldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUJCSovCi0gICAgMCwJCQkJCS8qIHRwX3JlcHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlcgkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbWFwcGluZwkqLwotICAgIDAsCQkJCQkvKiB0cF9oYXNoCQkqLwotICAgIDAsCQkJCQkvKiB0cF9jYWxsCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIJCSovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybwkJKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cm8JCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlcgkJKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MJCSovCi0gICAgcHJvZmlsZXJfb2JqZWN0X19kb2NfXywJCS8qIHRwX2RvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZQkqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldAkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVybmV4dAkJKi8KLSAgICBwcm9maWxlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMJCSovCi0gICAgcHJvZmlsZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzCQkqLwotICAgIHByb2ZpbGVyX2dldHNldHMsCQkJLyogdHBfZ2V0c2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9iYXNlCQkqLwotICAgIDAsCQkJCQkvKiB0cF9kaWN0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9nZXQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2Rlc2NyX3NldAkJKi8KLX07Ci0KLQotc3RhdGljIFB5TWV0aG9kRGVmIGxvZ3JlYWRlcl9tZXRob2RzW10gPSB7Ci0gICAgeyJjbG9zZSIsICAgKFB5Q0Z1bmN0aW9uKWxvZ3JlYWRlcl9jbG9zZSwgIE1FVEhfTk9BUkdTLAotICAgICBsb2dyZWFkZXJfY2xvc2VfX2RvY19ffSwKLSAgICB7ImZpbGVubyIsICAoUHlDRnVuY3Rpb24pbG9ncmVhZGVyX2ZpbGVubywgTUVUSF9OT0FSR1MsCi0gICAgIGxvZ3JlYWRlcl9maWxlbm9fX2RvY19ffSwKLSAgICB7TlVMTCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBQeU1lbWJlckRlZiBsb2dyZWFkZXJfbWVtYmVyc1tdID0gewotICAgIHsiaW5mbyIsIFRfT0JKRUNULCBvZmZzZXRvZihMb2dSZWFkZXJPYmplY3QsIGluZm8pLCBSRUFET05MWSwKLSAgICAgUHlEb2NfU1RSKCJEaWN0aW9uYXJ5IG1hcHBpbmcgaW5mb3JtYXRpb25hbCBrZXlzIHRvIGxpc3RzIG9mIHZhbHVlcy4iKX0sCi0gICAge05VTEx9Ci19OwotCi0KLVB5RG9jX1NUUlZBUihsb2dyZWFkZXJfX2RvY19fLAotImxvZ3JlYWRlcihmaWxlbmFtZSkgLS0+IGxvZy1pdGVyYXRvclxuXAotQ3JlYXRlIGEgbG9nLXJlYWRlciBmb3IgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmaWxlLiIpOwotCi1zdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgbG9ncmVhZGVyX2FzX3NlcXVlbmNlID0gewotICAgIDAsCQkJCQkvKiBzcV9sZW5ndGggKi8KLSAgICAwLAkJCQkJLyogc3FfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotICAgIChzc2l6ZWFyZ2Z1bmMpbG9ncmVhZGVyX3NxX2l0ZW0sCS8qIHNxX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3Ffc2xpY2UgKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0gICAgMCwJCQkJCS8qIHNxX2NvbnRhaW5zICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCi19OwotCi1zdGF0aWMgUHlPYmplY3QgKgotbG9ncmVhZGVyX2dldF9jbG9zZWQoTG9nUmVhZGVyT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQotewotICAgIFB5T2JqZWN0ICpyZXN1bHQgPSAoc2VsZi0+bG9nZnAgPT0gTlVMTCkgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0gICAgUHlfSU5DUkVGKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFB5R2V0U2V0RGVmIGxvZ3JlYWRlcl9nZXRzZXRzW10gPSB7Ci0gICAgeyJjbG9zZWQiLCAoZ2V0dGVyKWxvZ3JlYWRlcl9nZXRfY2xvc2VkLCBOVUxMLAotICAgICBQeURvY19TVFIoIlRydWUgaWYgdGhlIGxvZ3JlYWRlcidzIGlucHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIil9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIFB5VHlwZU9iamVjdCBMb2dSZWFkZXJUeXBlID0gewotICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJfaG90c2hvdC5Mb2dSZWFkZXJUeXBlIiwJCS8qIHRwX25hbWUJCSovCi0gICAgKGludCkgc2l6ZW9mKExvZ1JlYWRlck9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlbXNpemUJCSovCi0gICAgKGRlc3RydWN0b3IpbG9ncmVhZGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MJCSovCi0gICAgMCwJCQkJCS8qIHRwX3ByaW50CQkqLwotICAgIDAsCQkJCQkvKiB0cF9nZXRhdHRyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9jb21wYXJlCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yZXByCQkqLwotICAgIDAsCQkJCQkvKiB0cF9hc19udW1iZXIJCSovCi0gICAgJmxvZ3JlYWRlcl9hc19zZXF1ZW5jZSwJCS8qIHRwX2FzX3NlcXVlbmNlCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcJKi8KLSAgICAwLAkJCQkJLyogdHBfaGFzaAkJKi8KLSAgICAwLAkJCQkJLyogdHBfY2FsbAkJKi8KLSAgICAwLAkJCQkJLyogdHBfc3RyCQkqLwotICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8JCSovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHJvCQkqLwotICAgIDAsCQkJCQkvKiB0cF9hc19idWZmZXIJCSovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxULAkJCS8qIHRwX2ZsYWdzCQkqLwotICAgIGxvZ3JlYWRlcl9fZG9jX18sCQkJLyogdHBfZG9jCQkqLwotICAgIDAsCQkJCQkvKiB0cF90cmF2ZXJzZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfY2xlYXIJCSovCi0gICAgMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlCSovCi0gICAgMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0CSovCi0gICAgUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlcgkJKi8KLSAgICAoaXRlcm5leHRmdW5jKWxvZ3JlYWRlcl90cF9pdGVybmV4dCwvKiB0cF9pdGVybmV4dAkJKi8KLSAgICBsb2dyZWFkZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzCQkqLwotICAgIGxvZ3JlYWRlcl9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMJCSovCi0gICAgbG9ncmVhZGVyX2dldHNldHMsCQkJLyogdHBfZ2V0c2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9iYXNlCQkqLwotICAgIDAsCQkJCQkvKiB0cF9kaWN0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9nZXQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2Rlc2NyX3NldAkJKi8KLX07Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1ob3RzaG90X2xvZ3JlYWRlcihQeU9iamVjdCAqdW51c2VkLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBMb2dSZWFkZXJPYmplY3QgKnNlbGYgPSBOVUxMOwotICAgIGNoYXIgKmZpbGVuYW1lOwotICAgIGludCBjOwotICAgIGludCBlcnIgPSAwOwotCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6bG9ncmVhZGVyIiwgJmZpbGVuYW1lKSkgewotICAgICAgICBzZWxmID0gUHlPYmplY3RfTmV3KExvZ1JlYWRlck9iamVjdCwgJkxvZ1JlYWRlclR5cGUpOwotICAgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzZWxmLT5mcmFtZXRpbWluZ3MgPSAxOwotICAgICAgICAgICAgc2VsZi0+bGluZXRpbWluZ3MgPSAwOwotICAgICAgICAgICAgc2VsZi0+aW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICBzZWxmLT5sb2dmcCA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLSAgICAgICAgICAgIGlmIChzZWxmLT5sb2dmcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgc2VsZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VsZi0+aW5mbyA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgICAgIGlmIChzZWxmLT5pbmZvID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogcmVhZCBpbml0aWFsIGluZm8gKi8KLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBpZiAoKGMgPSBmZ2V0YyhzZWxmLT5sb2dmcCkpID09IEVPRikgewotICAgICAgICAgICAgICAgICAgICBlb2ZfZXJyb3Ioc2VsZik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYyAhPSBXSEFUX0FERF9JTkZPKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZ2V0YyhjLCBzZWxmLT5sb2dmcCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB1bnBhY2tfYWRkX2luZm8oc2VsZik7Ci0gICAgICAgICAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUl9FT0YpCi0gICAgICAgICAgICAgICAgICAgICAgICBlb2ZfZXJyb3Ioc2VsZik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotIGZpbmFsbHk6Ci0gICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOwotfQotCi0KLS8qIFJldHVybiBhIFB5dGhvbiBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJzaW9uIG51bWJlciB3aXRob3V0IHRoZQotICogZXh0cmEgY3J1ZnQgYWRkZWQgYnkgcmV2aXNpb24gY29udHJvbCwgZXZlbiBpZiB0aGUgcmlnaHQgb3B0aW9ucyB3ZXJlCi0gKiBnaXZlbiB0byB0aGUgImN2cyBleHBvcnQiIGNvbW1hbmQgdG8gbWFrZSBpdCBub3QgaW5jbHVkZSB0aGUgZXh0cmEKLSAqIGNydWZ0LgotICovCi1zdGF0aWMgY2hhciAqCi1nZXRfdmVyc2lvbl9zdHJpbmcodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciAqcmNzaWQgPSAiJFJldmlzaW9uJCI7Ci0gICAgY2hhciAqcmV2ID0gcmNzaWQ7Ci0gICAgY2hhciAqYnVmZmVyOwotICAgIGludCBpID0gMDsKLQotICAgIHdoaWxlICgqcmV2ICYmICFpc2RpZ2l0KFB5X0NIQVJNQVNLKCpyZXYpKSkKLSAgICAgICAgKytyZXY7Ci0gICAgd2hpbGUgKHJldltpXSAhPSAnICcgJiYgcmV2W2ldICE9ICdcMCcpCi0gICAgICAgICsraTsKLSAgICBidWZmZXIgPSAoY2hhciAqKW1hbGxvYyhpICsgMSk7Ci0gICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1lbW1vdmUoYnVmZmVyLCByZXYsIGkpOwotICAgICAgICBidWZmZXJbaV0gPSAnXDAnOwotICAgIH0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi0vKiBXcml0ZSBvdXQgYSBSRkMgODIyLXN0eWxlIGhlYWRlciB3aXRoIHZhcmlvdXMgdXNlZnVsIGJpdHMgb2YKLSAqIGluZm9ybWF0aW9uIHRvIG1ha2UgdGhlIG91dHB1dCBlYXNpZXIgdG8gbWFuYWdlLgotICovCi1zdGF0aWMgaW50Ci13cml0ZV9oZWFkZXIoUHJvZmlsZXJPYmplY3QgKnNlbGYpCi17Ci0gICAgY2hhciAqYnVmZmVyOwotICAgIGNoYXIgY3dkYnVmZmVyW1BBVEhfTUFYXTsKLSAgICBQeU9iamVjdCAqdGVtcDsKLSAgICBQeV9zc2l6ZV90IGksIGxlbjsKLQotICAgIGJ1ZmZlciA9IGdldF92ZXJzaW9uX3N0cmluZygpOwotICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHBhY2tfYWRkX2luZm8oc2VsZiwgImhvdHNob3QtdmVyc2lvbiIsIGJ1ZmZlcik7Ci0gICAgcGFja19hZGRfaW5mbyhzZWxmLCAicmVxdWVzdGVkLWZyYW1lLXRpbWluZ3MiLAotICAgICAgICAgICAgICAgICAgKHNlbGYtPmZyYW1ldGltaW5ncyA/ICJ5ZXMiIDogIm5vIikpOwotICAgIHBhY2tfYWRkX2luZm8oc2VsZiwgInJlcXVlc3RlZC1saW5lLWV2ZW50cyIsCi0gICAgICAgICAgICAgICAgICAoc2VsZi0+bGluZWV2ZW50cyA/ICJ5ZXMiIDogIm5vIikpOwotICAgIHBhY2tfYWRkX2luZm8oc2VsZiwgInJlcXVlc3RlZC1saW5lLXRpbWluZ3MiLAotICAgICAgICAgICAgICAgICAgKHNlbGYtPmxpbmV0aW1pbmdzID8gInllcyIgOiAibm8iKSk7Ci0gICAgcGFja19hZGRfaW5mbyhzZWxmLCAicGxhdGZvcm0iLCBQeV9HZXRQbGF0Zm9ybSgpKTsKLSAgICBwYWNrX2FkZF9pbmZvKHNlbGYsICJleGVjdXRhYmxlIiwgUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKCkpOwotICAgIGZyZWUoYnVmZmVyKTsKLSAgICBidWZmZXIgPSAoY2hhciAqKSBQeV9HZXRWZXJzaW9uKCk7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgIGVsc2UKLSAgICAgICAgcGFja19hZGRfaW5mbyhzZWxmLCAiZXhlY3V0YWJsZS12ZXJzaW9uIiwgYnVmZmVyKTsKLQotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBQeU9TX3NucHJpbnRmKGN3ZGJ1ZmZlciwgc2l6ZW9mKGN3ZGJ1ZmZlciksICIlSTY0ZCIsIGZyZXF1ZW5jeS5RdWFkUGFydCk7Ci0gICAgcGFja19hZGRfaW5mbyhzZWxmLCAicmVwb3J0ZWQtcGVyZm9ybWFuY2UtZnJlcXVlbmN5IiwgY3dkYnVmZmVyKTsKLSNlbHNlCi0gICAgUHlPU19zbnByaW50Zihjd2RidWZmZXIsIHNpemVvZihjd2RidWZmZXIpLCAiJWx1IiwgcnVzYWdlX2RpZmYpOwotICAgIHBhY2tfYWRkX2luZm8oc2VsZiwgIm9ic2VydmVkLWludGVydmFsLWdldHJ1c2FnZSIsIGN3ZGJ1ZmZlcik7Ci0gICAgUHlPU19zbnByaW50Zihjd2RidWZmZXIsIHNpemVvZihjd2RidWZmZXIpLCAiJWx1IiwgdGltZW9mZGF5X2RpZmYpOwotICAgIHBhY2tfYWRkX2luZm8oc2VsZiwgIm9ic2VydmVkLWludGVydmFsLWdldHRpbWVvZmRheSIsIGN3ZGJ1ZmZlcik7Ci0jZW5kaWYKLQotICAgIHBhY2tfYWRkX2luZm8oc2VsZiwgImN1cnJlbnQtZGlyZWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgIGdldGN3ZChjd2RidWZmZXIsIHNpemVvZiBjd2RidWZmZXIpKTsKLQotICAgIHRlbXAgPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKLSAgICBpZiAodGVtcCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodGVtcCkpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3QiKTsKLSAgICAJcmV0dXJuIC0xOwotICAgIH0KLSAgICBsZW4gPSBQeUxpc3RfR0VUX1NJWkUodGVtcCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKHRlbXAsIGkpOwotICAgICAgICBidWZmZXIgPSBQeVN0cmluZ19Bc1N0cmluZyhpdGVtKTsKLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwYWNrX2FkZF9pbmZvKHNlbGYsICJzeXMtcGF0aC1lbnRyeSIsICI8bm9uLXN0cmluZy1wYXRoLWVudHJ5PiIpOwotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBhY2tfYWRkX2luZm8oc2VsZiwgInN5cy1wYXRoLWVudHJ5IiwgYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwYWNrX2ZyYW1lX3RpbWVzKHNlbGYpOwotICAgIHBhY2tfbGluZV90aW1lcyhzZWxmKTsKLQotICAgIHJldHVybiAwOwotfQotCi1QeURvY19TVFJWQVIocHJvZmlsZXJfX2RvY19fLAotInByb2ZpbGVyKGxvZ2ZpbGVuYW1lWywgbGluZWV2ZW50c1ssIGxpbmV0aW1lc11dKSAtPiBwcm9maWxlclxuXAotQ3JlYXRlIGEgbmV3IHByb2ZpbGVyIG9iamVjdC4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLWhvdHNob3RfcHJvZmlsZXIoUHlPYmplY3QgKnVudXNlZCwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgY2hhciAqbG9nZmlsZW5hbWU7Ci0gICAgUHJvZmlsZXJPYmplY3QgKnNlbGYgPSBOVUxMOwotICAgIGludCBsaW5lZXZlbnRzID0gMDsKLSAgICBpbnQgbGluZXRpbWluZ3MgPSAxOwotCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8aWk6cHJvZmlsZXIiLCAmbG9nZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmVldmVudHMsICZsaW5ldGltaW5ncykpIHsKLSAgICAgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhQcm9maWxlck9iamVjdCwgJlByb2ZpbGVyVHlwZSk7Ci0gICAgICAgIGlmIChzZWxmID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgc2VsZi0+ZnJhbWV0aW1pbmdzID0gMTsKLSAgICAgICAgc2VsZi0+bGluZWV2ZW50cyA9IGxpbmVldmVudHMgPyAxIDogMDsKLSAgICAgICAgc2VsZi0+bGluZXRpbWluZ3MgPSAobGluZWV2ZW50cyAmJiBsaW5ldGltaW5ncykgPyAxIDogMDsKLSAgICAgICAgc2VsZi0+aW5kZXggPSAwOwotICAgICAgICBzZWxmLT5hY3RpdmUgPSAwOwotICAgICAgICBzZWxmLT5uZXh0X2ZpbGVubyA9IDA7Ci0gICAgICAgIHNlbGYtPmxvZ2ZwID0gTlVMTDsKLSAgICAgICAgc2VsZi0+bG9nZmlsZW5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotICAgICAgICBQeV9JTkNSRUYoc2VsZi0+bG9nZmlsZW5hbWUpOwotICAgICAgICBzZWxmLT5maWxlbWFwID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoc2VsZi0+ZmlsZW1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBzZWxmLT5sb2dmcCA9IGZvcGVuKGxvZ2ZpbGVuYW1lLCAid2IiKTsKLSAgICAgICAgaWYgKHNlbGYtPmxvZ2ZwID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLCBsb2dmaWxlbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAodGltZW9mZGF5X2RpZmYgPT0gMCkgewotICAgICAgICAgICAgLyogUnVuIHRoaXMgc2V2ZXJhbCB0aW1lcyBzaW5jZSBzb21ldGltZXMgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgKiBkb2Vzbid0IGdpdmUgdGhlIGxvd2VzdCB2YWx1ZXMsIGFuZCB3ZSdyZSByZWFsbHkgdHJ5aW5nCi0gICAgICAgICAgICAgKiB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2FsaWJyYXRlKCk7Ci0gICAgICAgICAgICBjYWxpYnJhdGUoKTsKLSAgICAgICAgICAgIGNhbGlicmF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZV9oZWFkZXIoc2VsZikpIHsKLSAgICAgICAgICAgIC8qIHNvbWUgZXJyb3Igb2NjdXJyZWQsIGV4Y2VwdGlvbiBoYXMgYmVlbiBzZXQgKi8KLSAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgIHNlbGYgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKLX0KLQotUHlEb2NfU1RSVkFSKGNvdmVyYWdlX19kb2NfXywKLSJjb3ZlcmFnZShsb2dmaWxlbmFtZSkgLT4gcHJvZmlsZXJcblwKLVJldHVybnMgYSBwcm9maWxlciB0aGF0IGRvZXNuJ3QgY29sbGVjdCBhbnkgdGltaW5nIGluZm9ybWF0aW9uLCB3aGljaCBpc1xuXAotdXNlZnVsIGluIGJ1aWxkaW5nIGEgY292ZXJhZ2UgYW5hbHlzaXMgdG9vbC4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLWhvdHNob3RfY292ZXJhZ2UoUHlPYmplY3QgKnVudXNlZCwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgY2hhciAqbG9nZmlsZW5hbWU7Ci0gICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0KLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpjb3ZlcmFnZSIsICZsb2dmaWxlbmFtZSkpIHsKLSAgICAgICAgcmVzdWx0ID0gaG90c2hvdF9wcm9maWxlcih1bnVzZWQsIGFyZ3MpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIFByb2ZpbGVyT2JqZWN0ICpzZWxmID0gKFByb2ZpbGVyT2JqZWN0ICopIHJlc3VsdDsKLSAgICAgICAgICAgIHNlbGYtPmZyYW1ldGltaW5ncyA9IDA7Ci0gICAgICAgICAgICBzZWxmLT5saW5ldGltaW5ncyA9IDA7Ci0gICAgICAgICAgICBzZWxmLT5saW5lZXZlbnRzID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1QeURvY19WQVIocmVzb2x1dGlvbl9fZG9jX18pID0gCi0jaWZkZWYgTVNfV0lORE9XUwotUHlEb2NfU1RSKAotInJlc29sdXRpb24oKSAtPiAocGVyZm9ybWFuY2UtY291bnRlci10aWNrcywgdXBkYXRlLWZyZXF1ZW5jeSlcbiIKLSJSZXR1cm4gdGhlIHJlc29sdXRpb24gb2YgdGhlIHRpbWVyIHByb3ZpZGVkIGJ5IHRoZSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigpXG4iCi0iZnVuY3Rpb24uICBUaGUgZmlyc3QgdmFsdWUgaXMgdGhlIHNtYWxsZXN0IG9ic2VydmVkIGNoYW5nZSwgYW5kIHRoZSBzZWNvbmRcbiIKLSJpcyB0aGUgcmVzdWx0IG9mIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKS4iCi0pCi0jZWxzZQotUHlEb2NfU1RSKAotInJlc29sdXRpb24oKSAtPiAoZ2V0dGltZW9mZGF5LXVzZWNzLCBnZXRydXNhZ2UtdXNlY3MpXG4iCi0iUmV0dXJuIHRoZSByZXNvbHV0aW9uIG9mIHRoZSB0aW1lcnMgcHJvdmlkZWQgYnkgdGhlIGdldHRpbWVvZmRheSgpIGFuZFxuIgotImdldHJ1c2FnZSgpIHN5c3RlbSBjYWxscywgb3IgLTEgaWYgdGhlIGNhbGwgaXMgbm90IHN1cHBvcnRlZC4iCi0pCi0jZW5kaWYKLTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLWhvdHNob3RfcmVzb2x1dGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKLXsKLSAgICBpZiAodGltZW9mZGF5X2RpZmYgPT0gMCkgewotICAgICAgICBjYWxpYnJhdGUoKTsKLSAgICAgICAgY2FsaWJyYXRlKCk7Ci0gICAgICAgIGNhbGlicmF0ZSgpOwotICAgIH0KLSNpZmRlZiBNU19XSU5ET1dTCi0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgdGltZW9mZGF5X2RpZmYsIGZyZXF1ZW5jeS5Mb3dQYXJ0KTsKLSNlbHNlCi0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgdGltZW9mZGF5X2RpZmYsIHJ1c2FnZV9kaWZmKTsKLSNlbmRpZgotfQotCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBmdW5jdGlvbnNbXSA9IHsKLSAgICB7ImNvdmVyYWdlIiwgICBob3RzaG90X2NvdmVyYWdlLCAgIE1FVEhfVkFSQVJHUywgY292ZXJhZ2VfX2RvY19ffSwKLSAgICB7InByb2ZpbGVyIiwgICBob3RzaG90X3Byb2ZpbGVyLCAgIE1FVEhfVkFSQVJHUywgcHJvZmlsZXJfX2RvY19ffSwKLSAgICB7ImxvZ3JlYWRlciIsICBob3RzaG90X2xvZ3JlYWRlciwgIE1FVEhfVkFSQVJHUywgbG9ncmVhZGVyX19kb2NfX30sCi0gICAgeyJyZXNvbHV0aW9uIiwgaG90c2hvdF9yZXNvbHV0aW9uLCBNRVRIX05PQVJHUywgIHJlc29sdXRpb25fX2RvY19ffSwKLSAgICB7TlVMTCwgTlVMTH0KLX07Ci0KLQotdm9pZAotaW5pdF9ob3RzaG90KHZvaWQpCi17Ci0gICAgUHlPYmplY3QgKm1vZHVsZTsKLQotICAgIFB5X1R5cGUoJkxvZ1JlYWRlclR5cGUpID0gJlB5VHlwZV9UeXBlOwotICAgIFB5X1R5cGUoJlByb2ZpbGVyVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0gICAgbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX2hvdHNob3QiLCBmdW5jdGlvbnMpOwotICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgewotICAgICAgICBjaGFyICpzID0gZ2V0X3ZlcnNpb25fc3RyaW5nKCk7Ci0KLSAgICAgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobW9kdWxlLCAiX192ZXJzaW9uX18iLCBzKTsKLSAgICAgICAgZnJlZShzKTsKLSAgICAgICAgUHlfSU5DUkVGKCZMb2dSZWFkZXJUeXBlKTsKLSAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkxvZ1JlYWRlclR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJkxvZ1JlYWRlclR5cGUpOwotICAgICAgICBQeV9JTkNSRUYoJlByb2ZpbGVyVHlwZSk7Ci0gICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQcm9maWxlclR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJlByb2ZpbGVyVHlwZSk7Ci0KLSAgICAgICAgaWYgKFByb2ZpbGVyRXJyb3IgPT0gTlVMTCkKLSAgICAgICAgICAgIFByb2ZpbGVyRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImhvdHNob3QuUHJvZmlsZXJFcnJvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoUHJvZmlsZXJFcnJvciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9JTkNSRUYoUHJvZmlsZXJFcnJvcik7Ci0gICAgICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUHJvZmlsZXJFcnJvciIsIFByb2ZpbGVyRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIldIQVRfRU5URVIiLCBXSEFUX0VOVEVSKTsKLSAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiV0hBVF9FWElUIiwgV0hBVF9FWElUKTsKLSAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiV0hBVF9MSU5FTk8iLCBXSEFUX0xJTkVOTyk7Ci0gICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIldIQVRfT1RIRVIiLCBXSEFUX09USEVSKTsKLSAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiV0hBVF9BRERfSU5GTyIsIFdIQVRfQUREX0lORk8pOwotICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJXSEFUX0RFRklORV9GSUxFIiwgV0hBVF9ERUZJTkVfRklMRSk7Ci0gICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIldIQVRfREVGSU5FX0ZVTkMiLCBXSEFUX0RFRklORV9GVU5DKTsKLSAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiV0hBVF9MSU5FX1RJTUVTIiwgV0hBVF9MSU5FX1RJTUVTKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2hvdHNob3RtYWluLnB5IGIvVG9vbHMvc2NyaXB0cy9ob3RzaG90bWFpbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzOWQ5OC4uMDAwMDAwMAotLS0gYS9Ub29scy9zY3JpcHRzL2hvdHNob3RtYWluLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCi0KLSIiIgotUnVuIGEgUHl0aG9uIHNjcmlwdCB1bmRlciBob3RzaG90J3MgY29udHJvbC4KLQotQWRhcHRlZCBmcm9tIGEgcG9zdGluZyBvbiBweXRob24tZGV2IGJ5IFdhbHRlciBE9nJ3YWxkCi0KLXVzYWdlICVwcm9nIFsgJXByb2cgYXJncyBdIGZpbGVuYW1lIFsgZmlsZW5hbWUgYXJncyBdCi0KLUFueSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZpbGVuYW1lIGFyZSB1c2VkIGFzIHN5cy5hcmd2IGZvciB0aGUgZmlsZW5hbWUuCi0iIiIKLQotaW1wb3J0IHN5cwotaW1wb3J0IG9wdHBhcnNlCi1pbXBvcnQgb3MKLWltcG9ydCBob3RzaG90Ci1pbXBvcnQgaG90c2hvdC5zdGF0cwotCi1QUk9GSUxFID0gImhvdHNob3QucHJvZiIKLQotZGVmIHJ1bl9ob3RzaG90KGZpbGVuYW1lLCBwcm9maWxlLCBhcmdzKToKLSAgICBwcm9mID0gaG90c2hvdC5Qcm9maWxlKHByb2ZpbGUpCi0gICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkpCi0gICAgc3lzLmFyZ3YgPSBbZmlsZW5hbWVdICsgYXJncwotICAgIGZwID0gb3BlbihmaWxlbmFtZSkKLSAgICB0cnk6Ci0gICAgICAgIHNjcmlwdCA9IGZwLnJlYWQoKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIGZwLmNsb3NlKCkKLSAgICBwcm9mLnJ1bigiZXhlYyglcikiICUgc2NyaXB0KQotICAgIHByb2YuY2xvc2UoKQotICAgIHN0YXRzID0gaG90c2hvdC5zdGF0cy5sb2FkKHByb2ZpbGUpCi0gICAgc3RhdHMuc29ydF9zdGF0cygidGltZSIsICJjYWxscyIpCi0KLSAgICAjIHByaW50X3N0YXRzIHVzZXMgdW5hZG9ybmVkIHByaW50IHN0YXRlbWVudHMsIHNvIHRoZSBvbmx5IHdheQotICAgICMgdG8gZm9yY2Ugb3V0cHV0IHRvIHN0ZGVyciBpcyB0byByZWFzc2lnbiBzeXMuc3Rkb3V0IHRlbXBvcmFyaWx5Ci0gICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0Ci0gICAgc3lzLnN0ZG91dCA9IHN5cy5zdGRlcnIKLSAgICBzdGF0cy5wcmludF9zdGF0cygpCi0gICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0Ci0KLSAgICByZXR1cm4gMAotCi1kZWYgbWFpbihhcmdzKToKLSAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoX19kb2NfXykKLSAgICBwYXJzZXIuZGlzYWJsZV9pbnRlcnNwZXJzZWRfYXJncygpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcHJvZmlsZSIsIGFjdGlvbj0ic3RvcmUiLCBkZWZhdWx0PVBST0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgZGVzdD0icHJvZmlsZSIsIGhlbHA9J1NwZWNpZnkgcHJvZmlsZSBmaWxlIHRvIHVzZScpCi0gICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKLQotICAgIGlmIGxlbihhcmdzKSA9PSAwOgotICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgibWlzc2luZyBzY3JpcHQgdG8gZXhlY3V0ZSIpCi0gICAgICAgIHJldHVybiAxCi0KLSAgICBmaWxlbmFtZSA9IGFyZ3NbMF0KLSAgICByZXR1cm4gcnVuX2hvdHNob3QoZmlsZW5hbWUsIG9wdGlvbnMucHJvZmlsZSwgYXJnc1sxOl0pCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQppbmRleCBlNDQxZDA2Li5iMzVmNmQ0IDEwMDY0NAotLS0gYS9zZXR1cC5weQorKysgYi9zZXR1cC5weQpAQCAtNDEzLDggKzQxMyw3IEBACiAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oImF0ZXhpdCIsIFsiYXRleGl0bW9kdWxlLmMiXSkgKQogICAgICAgICAjIFB5dGhvbiBDIEFQSSB0ZXN0IG1vZHVsZQogICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfdGVzdGNhcGknLCBbJ190ZXN0Y2FwaW1vZHVsZS5jJ10pICkKLSAgICAgICAgIyBwcm9maWxlcnMgKF9sc3Byb2YgaXMgZm9yIGNQcm9maWxlLnB5KQotICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfaG90c2hvdCcsIFsnX2hvdHNob3QuYyddKSApCisgICAgICAgICMgcHJvZmlsZXIgKF9sc3Byb2YgaXMgZm9yIGNQcm9maWxlLnB5KQogICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfbHNwcm9mJywgWydfbHNwcm9mLmMnLCAncm90YXRpbmd0cmVlLmMnXSkgKQogICAgICAgICAjIHN0YXRpYyBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZQogICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCd1bmljb2RlZGF0YScsIFsndW5pY29kZWRhdGEuYyddKSApCg==