LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL2xvd2xldmVsX2luaXQuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcwogKiBtdWNoIGNsZWFuZXIuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KCkRSQU1fU0laRTogIC5sb25nICAgQ0ZHX0RSQU1fU0laRQoKLyogd2FpdCBmb3IgY29wcm9jZXNzb3Igd3JpdGUgY29tcGxldGUgKi8KICAgLm1hY3JvIENQV0FJVCByZWcKICAgbXJjICBwMTUsMCxccmVnLGMyLGMwLDAKICAgbW92ICBccmVnLFxyZWcKICAgc3ViICBwYyxwYywjNAogICAuZW5kbQoKCi8qCiAqIAlNZW1vcnkgc2V0dXAKICovCgouZ2xvYmwgbG93bGV2ZWxfaW5pdApsb3dsZXZlbF9pbml0OgoKICAgIG1vdiAgICAgIHIxMCwgbHIKCgkvKiBTZXQgdXAgR1BJTyBwaW5zIGZpcnN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyCQlyMCwJPUdQU1IwCglsZHIJCXIxLAk9Q0ZHX0dQU1IwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQU1IxCglsZHIJCXIxLAk9Q0ZHX0dQU1IxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQU1IyCglsZHIJCXIxLAk9Q0ZHX0dQU1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IwCglsZHIJCXIxLAk9Q0ZHX0dQQ1IwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IxCglsZHIJCXIxLAk9Q0ZHX0dQQ1IxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IyCglsZHIJCXIxLAk9Q0ZHX0dQQ1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIwCglsZHIJCXIxLAk9Q0ZHX0dQRFIwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIxCglsZHIJCXIxLAk9Q0ZHX0dQRFIxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIyCglsZHIJCXIxLAk9Q0ZHX0dQRFIyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX0wKCWxkcgkJcjEsCT1DRkdfR0FGUjBfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMF9VCglsZHIJCXIxLAk9Q0ZHX0dBRlIwX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjFfTAoJbGRyCQlyMSwJPUNGR19HQUZSMV9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX1UKCWxkcgkJcjEsCT1DRkdfR0FGUjFfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9MCglsZHIJCXIxLAk9Q0ZHX0dBRlIyX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjJfVQoJbGRyCQlyMSwJPUNGR19HQUZSMl9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCXIwLAk9UFNTUgkJLyogZW5hYmxlIEdQSU8gcGlucyAqLwoJbGRyCQlyMSwJPUNGR19QU1NSX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRW5hYmxlIG1lbW9yeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogVGhlIHNlcXVlbmNlIGJlbG93IGlzIGJhc2VkIG9uIHRoZSByZWNvbW1lbmRlZCBpbml0IHN0ZXBzICAgICAgICAqLwoJLyogZGV0YWlsZWQgaW4gdGhlIEludGVsIFBYQTI1MCBPcGVyYXRpbmcgU3lzdGVtcyBEZXZlbG9wZXJzIEd1aWRlLCAqLwoJLyogQ2hhcHRlciAxMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMTogV2FpdCBmb3IgYXQgbGVhc3QgMjAwIG1pY3Jvc2Vkb25kcyB0byBhbGxvdyBpbnRlcm5hbCAgICAgKi8KCS8qICAgICAgICAgY2xvY2tzIHRvIHNldHRsZS4gT25seSBuZWNlc3NhcnkgYWZ0ZXIgaGFyZCByZXNldC4uLiAgICAgKi8KCS8qICAgICAgICAgRklYTUU6IGNhbiBiZSBvcHRpbWl6ZWQgbGF0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCglsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KCW1vdiByMiwgIzAKCXN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CglsZHIgcjIsIFtyM10KCWNtcCByNCwgcjIKCWJndCAxYgoKbWVtX2luaXQ6CgoJbGRyICAgICByMSwgID1NRU1DX0JBU0UJCS8qIGdldCBtZW1vcnkgY29udHJvbGxlciBiYXNlIGFkZHIuICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyYTogSW5pdGlhbGl6ZSBBc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeSBjb250cm9sbGVyICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIE1TQyByZWdpc3RlcnM6IHRpbWluZywgYnVzIHdpZHRoLCBtZW0gdHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KCgkvKiBNU0MwOiBuQ1MoMCwxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgID1DRkdfTVNDMF9WQUwKCXN0ciAgICAgcjIsICAgW3IxLCAjTVNDMF9PRkZTRVRdCglsZHIgICAgIHIyLCAgIFtyMSwgI01TQzBfT0ZGU0VUXQkvKiByZWFkIGJhY2sgdG8gZW5zdXJlICAgICAgKi8KCQkJCQkJLyogdGhhdCBkYXRhIGxhdGNoZXMgICAgICAgICovCgkvKiBNU0MxOiBuQ1MoMiwzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NU0MxX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoJbGRyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoKCS8qIE1TQzI6IG5DUyg0LDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01TQzJfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCglsZHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyYjogSW5pdGlhbGl6ZSBDYXJkIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIE1FQ1I6IE1lbW9yeSBFeHBhbnNpb24gQ2FyZCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01FQ1JfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUVDUl9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01FQ1JfT0ZGU0VUXQoKCS8qIE1DTUVNMDogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAwIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DTUVNMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ01FTTBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ01FTTBfT0ZGU0VUXQoKCS8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DTUVNMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ01FTTFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ01FTTFfT0ZGU0VUXQoKCS8qIE1DQVRUMDogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAwICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DQVRUMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQoKCS8qIE1DQVRUMTogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DQVRUMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDFfT0ZGU0VUXQoKCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DSU8wX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01DSU8wX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzBfT0ZGU0VUXQoKCS8qIE1DSU8xOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDEgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DSU8xX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01DSU8xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmM6IFdyaXRlIEZMWUNORkcgIEZJWE1FOiB3aGF0J3MgdGhhdD8/PyAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyZDogSW5pdGlhbGl6ZSBUaW1pbmcgZm9yIFN5bmMgTWVtb3J5IChTRENMSzApICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIEJlZm9yZSBhY2Nlc3NpbmcgTURSRUZSIHdlIG5lZWQgYSB2YWxpZCBEUkkgZmllbGQsIHNvIHdlIHNldCAgICAgKi8KCS8qIHRoaXMgdG8gcG93ZXIgb24gZGVmYXVsdHMgKyBEUkkgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIzLCAgICAgPUNGR19NRFJFRlJfVkFMCglsZHIgICAgIHIyLCAgICAgPTB4RkZGCglhbmQgICAgIHIzLCAgICAgcjMsICByMgoJbGRyCXI0LAk9MHgwM2NhNDAwMAoJb3JyICAgICByNCwgICAgIHI0LCAgcjMKCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgkvKiBOb3RlOiBwcmVzZXJ2ZSB0aGUgbWRyZWZyIHZhbHVlIGluIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMzogSW5pdGlhbGl6ZSBTeW5jaHJvbm91cyBTdGF0aWMgTWVtb3J5IChGbGFzaC9QZXJpcGhlcmFscykgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBJbml0aWFsaXplIFNYQ05GRyByZWdpc3Rlci4gQXNzZXJ0IHRoZSBlbmFibGUgYml0cyAgICAgICAgICAgICAgICovCgoJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1hbmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YgICAgICAqLwoJLyogc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeS4gTm90ZSB0aGF0IFNYTENSIG5lZWQgbm90IGJlIHdyaXR0ZW4gICAqLwoJLyogYXQgdGhpcyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIEZJWE1FOiB3ZSB1c2UgYXN5bmMgbW9kZSBmb3Igbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCA0OiBJbml0aWFsaXplIFNEUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIHNldCBNRFJFRlIgYWNjb3JkaW5nIHRvIHVzZXIgZGVmaW5lIHdpdGggZXhjZXB0aW9uIG9mIGEgZmV3IGJpdHMgKi8KCglsZHIgICAgIHI0LCAgICAgPUNGR19NRFJFRlJfVkFMCglvcnIJcjQsCXI0LAkjKE1EUkVGUl9TTEZSU0gpCgliaWMJcjQsCXI0LAkjKE1EUkVGUl9FMVBJTnxNRFJFRlJfRTBQSU4pCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgkvKiBTdGVwIDRiOiBkZS1hc3NlcnQgTURSRUZSOlNMRlJTSC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJYmljCXI0LAlyNCwJIyhNRFJFRlJfU0xGUlNIKQoJc3RyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdICAgIC8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoKCS8qIFN0ZXAgNGM6IGFzc2VydCBNRFJFRlI6RTFQSU4gYW5kIEUwUElPIGFzIGRlc2lyZWQgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHI0LCAgICAgPUNGR19NRFJFRlJfVkFMCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0ZDogd3JpdGUgTURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLwoJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLwoKCWxkcglyNCwJPUNGR19NRENORkdfVkFMCgliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0KCgoJLyogU3RlcCA0ZTogV2FpdCBmb3IgdGhlIGNsb2NrIHRvIHRoZSBTRFJBTXMgdG8gc3RhYmlsaXplLCAgICAgICAgICAqLwoJLyogICAgICAgICAgMTAwLi4yMDAgtXNlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciByMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IHIyLCAjMAoJICAgIHN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CgkgICAgbGRyIHIyLCBbcjNdCgkgICAgY21wIHI0LCByMgoJICAgIGJndCAxYgoKCgkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCgkvKiAgICAgICAgICBhdHRlbXB0aW5nIG5vbi1idXJzdCByZWFkIG9yIHdyaXRlIGFjY2Vzc2VzIHRvIGRpc2FibGVkICovCgkvKiAgICAgICAgICBTRFJBTSwgYXMgY29tbW9ubHkgc3BlY2lmaWVkIGluIHRoZSBwb3dlciB1cCBzZXF1ZW5jZSAgICovCgkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCgkvKiAgICAgICAgICBmb3IgdGhpcyBwdXJwb3NlIG11c3Qgbm90IGJlIGNhY2hlYWJsZS4gICAgICAgICAgICAgICAgICovCgoJbGRyCXIzLAk9Q0ZHX0RSQU1fQkFTRQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCgoJLyogU3RlcCA0ZzogV3JpdGUgTURDTkZHIHdpdGggZW5hYmxlIGJpdHMgYXNzZXJ0ZWQgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgICAgKE1EQ05GRzpERXggc2V0IHRvIDEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjMsICBbcjEsICNNRENORkdfT0ZGU0VUXQoJb3JyCXIzLAlyMywJIyhNRENORkdfREUwfE1EQ05GR19ERTEpCglzdHIgICAgIHIzLCAgW3IxLCAjTURDTkZHX09GRlNFVF0KCgkvKiBTdGVwIDRoOiBXcml0ZSBNRE1SUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJbGRyICAgICByMiwgID1DRkdfTURNUlNfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTURNUlNfT0ZGU0VUXQoKCgkvKiBXZSBhcmUgZmluaXNoZWQgd2l0aCBJbnRlbCdzIG1lbW9yeSBjb250cm9sbGVyIGluaXRpYWxpc2F0aW9uICAgICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIERpc2FibGUgKG1hc2spIGFsbCBpbnRlcnJ1cHRzIGF0IGludGVycnVwdCBjb250cm9sbGVyICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmluaXRpcnFzOgoKCW1vdiAgICAgcjEsICMwCQkvKiBjbGVhciBpbnQuIGxldmVsIHJlZ2lzdGVyIChJUlEsIG5vdCBGSVEpICovCglsZHIgICAgIHIyLCAgPUlDTFIKCXN0ciAgICAgcjEsICBbcjJdCgoJbGRyICAgICByMiwgID1JQ01SCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8KCXN0ciAgICAgcjEsICBbcjJdCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIENsb2NrIGluaXRpYWxpc2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmluaXRjbGtzOgoKCS8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2tzLCBhbmQgc2V0IHRoZSBjb3JlIGNsb2NrIGZyZXF1ZW5jeSAgKi8KCS8qIChoYXJkLWNvZGluZyBhdCAzOTguMTJNSHogZm9yIG5vdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgkvKiBUdXJuIE9mZiBBTEwgb24tY2hpcCBwZXJpcGhlcmFsIGNsb2NrcyBmb3IgcmUtY29uZmlndXJhdGlvbiAgICAgICovCgkvKiBOb3RlOiBTZWUgbGFiZWwgJ0VOQUJMRUNMS1MnIGZvciB0aGUgcmUtZW5hYmxpbmcgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIxLCAgPUNLRU4KCW1vdiAgICAgcjIsICAjMAoJc3RyICAgICByMiwgIFtyMV0KCgoJLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLwoJbGRyICAgICByMiwgPShDQ0NSX0wyN3xDQ0NSX00yfENDQ1JfTjEwKSAgLyogREVGQVVMVDogezIwMC8yMDAvMTAwfSAqLwoKCS8qIC4uLiBhbmQgd3JpdGUgdGhlIGNvcmUgY2xvY2sgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjEsICA9Q0NDUgoJc3RyICAgICByMiwgIFtyMV0KCiNpZmRlZiBSVEMKCS8qIGVuYWJsZSB0aGUgMzJLaHogb3NjaWxsYXRvciBmb3IgUlRDIGFuZCBQb3dlck1hbmFnZXIgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIxLCAgPU9TQ0MKCW1vdiAgICAgcjIsICAjT1NDQ19PT04KCXN0ciAgICAgcjIsICBbcjFdCgoJLyogTk9URTogIHNwaW4gaGVyZSB1bnRpbCBPU0NDLk9PSyBnZXQgc2V0LCBtZWFuaW5nIHRoZSBQTEwgICAgICAgICAqLwoJLyogaGFzIHNldHRsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwo2MDoKCWxkciAgICAgcjIsIFtyMV0KCWFuZHMgICAgcjIsIHIyLCAjMQoJYmVxICAgICA2MGIKI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIFNhdmUgU0RSQU0gc2l6ZSAqLwogICAgbGRyICAgICByMSwgPURSQU1fU0laRQoJIHN0cgkgICByOCwgW3IxXQoKCS8qIEludGVycnVwdCBpbml0OiBNYXNrIGFsbCBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGxkcglyMCwgPUlDTVIgLyogZW5hYmxlIG5vIHNvdXJjZXMgKi8KCW1vdiByMSwgIzAKICAgIHN0ciByMSwgW3IwXQoKCS8qIEZJWE1FICovCgojZGVmaW5lIE5PREVCVUcKI2lmZGVmIE5PREVCVUcKCS8qRGlzYWJsZSBzb2Z0d2FyZSBhbmQgZGF0YSBicmVha3BvaW50cyAqLwoJbW92CXIwLCMwCgltY3IJcDE1LDAscjAsYzE0LGM4LDAgIC8qIGliY3IwICovCgltY3IJcDE1LDAscjAsYzE0LGM5LDAgIC8qIGliY3IxICovCgltY3IJcDE1LDAscjAsYzE0LGM0LDAgIC8qIGRiY29uICovCgoJLypFbmFibGUgYWxsIGRlYnVnIGZ1bmN0aW9uYWxpdHkgKi8KCW1vdglyMCwjMHg4MDAwMDAwMAoJbWNyCXAxNCwwLHIwLGMxMCxjMCwwICAvKiBkY3NyICovCgojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBFbmQgbG93bGV2ZWxfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmVuZGxvd2xldmVsX2luaXQ6CgogICAgbW92ICAgICBwYywgbHIK